diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2f88b0cd6a19bacbc784e3b0e3d9daa82fe2f88e..4294ee79222a9df0785ade41a6e58a8b39d26a62 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,7 +1,7 @@
 ###############################################################################
 ##                       VirtualFluids CI Pipeline                           ##
 ###############################################################################
-image: git.rz.tu-bs.de:4567/irmb/virtualfluids/ubuntu20_04:1.3
+image: git.rz.tu-bs.de:4567/irmb/virtualfluids/ubuntu20_04:1.4
 
 stages:
   - build
@@ -133,27 +133,37 @@ gcc_9_python:
     - export CCACHE_DIR=$CI_PROJECT_DIR/cache
 
   script:
-    - python3 setup.py bdist_wheel build_ext --build-temp=_skbuild -- -DBUILD_VF_CPU=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CUDA_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache
+    - python3 setup.py bdist_wheel build_ext --build-temp=_skbuild -- -DBUILD_VF_CPU=ON -DBUILD_VF_DOUBLE_ACCURACY=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CUDA_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache
 
 ###############################################################################
 ##                            Container Upload                               ##
 ###############################################################################
-build_singularity_image:
+build_poiseuille_test_container:
+  image: 
+    name: quay.io/singularity/singularity:v3.10.2
+    entrypoint: [""]
+
   stage: container_upload
 
-  needs:
-    - gcc_9_python
+  rules:
+    - if: $REMOTE_USER && $REMOTE_HOST && $PRIVATE_KEY && $CI_PIPELINE_SOURCE == "schedule"
+      when: always
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
+    - when: manual
+      allow_failure: true
 
   tags:
     - linux
     - privileged
 
-  rules:
-    - if: $CI_COMMIT_TAG
+  artifacts:
+    expire_in: 1 hrs
+    paths:
+      - Containers/PoiseuilleTestContainer.sif
 
   script:
-    - singularity build Containers/VirtualFluidsPython.sif Containers/VirtualFluidsPython.def
-    - singularity push --docker-username "${CI_REGISTRY_USER}" --docker-password "${CI_REGISTRY_PASSWORD}" Containers/VirtualFluidsPython.sif oras://"$CI_REGISTRY_IMAGE"/"$CI_PROJECT_NAME":"$CI_COMMIT_TAG"
+    - singularity build "Containers/PoiseuilleTestContainer.sif" "Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def"
 
 ###############################################################################
 ##                                Tests                                      ##
@@ -203,6 +213,28 @@ gcc_9_python_bindings_test:
     - python3 -m unittest discover -s Python -v
 
 
+###############################################################################
+gcc_9_python_hpc_test:
+  image: python:latest
+  stage: test
+
+  needs: ["build_poiseuille_test_container"]
+
+  rules:
+    - if: $REMOTE_USER && $REMOTE_HOST && $PRIVATE_KEY && $CI_PIPELINE_SOURCE == "schedule"
+      when: always
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
+    - when: manual
+      allow_failure: true
+
+  before_script:
+    - pip install hpc-rocket
+
+  script:
+    - hpc-rocket launch --watch Python/SlurmTests/poiseuille/rocket.yml
+
+
 ###############################################################################
 ##                            Benchmark                                      ##
 ###############################################################################
@@ -320,8 +352,7 @@ clang_build_analyzer_clang_10:
     - mkdir -p $CI_PROJECT_DIR/build
     - cd $CI_PROJECT_DIR/build
     - cmake ..
-      -DBUILD_VF_CPU=ON
-      -DBUILD_VF_GPU=ON
+      --preset=all_make
       -DCMAKE_CUDA_ARCHITECTURES=60
       -DCMAKE_CXX_FLAGS=-ftime-trace
     - ClangBuildAnalyzer --start .
@@ -353,8 +384,7 @@ include_what_you_use_clang_10:
     - mkdir -p $CI_PROJECT_DIR/build
     - cd $CI_PROJECT_DIR/build
     - cmake ..
-      -DBUILD_VF_CPU=ON
-      -DBUILD_VF_GPU=ON
+      --preset=all_make
       -DCMAKE_CUDA_ARCHITECTURES=60
       -DBUILD_VF_INCLUDE_WHAT_YOU_USE=ON
     - make
@@ -474,6 +504,7 @@ clang-tidy:
     - cd $CI_PROJECT_DIR/build
     - cmake ..
       -DBUILD_VF_CPU=ON
+      -DBUILD_VF_DOUBLE_ACCURACY=ON
       -DBUILD_VF_GPU=OFF
     - python3 ../utilities/filterCompileCommands.py compile_commands.json
     - run-clang-tidy -quiet > clangtidy.txt
@@ -605,26 +636,3 @@ sonar-scanner:
   script:
     - cd $CI_PROJECT_DIR
     - sonar-scanner -X -Dsonar.verbose=true -Dsonar.login=$SONAR_SECURITY_TOKEN
-
-###############################################################################
-##                              Release                                      ##
-###############################################################################
-create_release:
-  stage: release
-
-  image: registry.gitlab.com/gitlab-org/release-cli:latest
-
-  needs: ["build_singularity_image"]
-
-  rules:
-    - if: $CI_COMMIT_TAG
-
-  script:
-    - echo "Creating release with tag $CI_COMMIT_TAG"
-    - release-cli create --name "VirtualFluids $CI_COMMIT_TAG" \
-      --description "VirtualFluids CFD Simulator" \
-      --tag-name "$CI_COMMIT_TAG" \
-      --ref "$CI_COMMIT_SHA" \
-      --job-token "$CI_JOB_TOKEN" \
-      --assets-link="{'name':'VirtualFluidsSingularityImage_OpenMPI','url':'','type':'other','filepath':'Containers/VirtualFluidsOpenMPI.sif'}"
-    - build/bin/basicsTests
diff --git a/CMake/cmake_config_files/BOMBADIL.config.cmake b/CMake/cmake_config_files/BOMBADIL.config.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..9c4bd4ecffab1e63161343ecc493eb9d9bc951a4
--- /dev/null
+++ b/CMake/cmake_config_files/BOMBADIL.config.cmake
@@ -0,0 +1,95 @@
+#################################################################################
+# VirtualFluids MACHINE FILE
+# Responsible: Konstantin Kutscher
+# OS:          Windows 10
+#################################################################################
+
+#################################################################################
+# MPI
+#################################################################################
+#SET(MPI_DIR  "C:/Program Files (x86)/mpich2")
+#SET(MPI_DIR  "C:/Program Files/mpich2")
+#SET(USE_MPI_CXX_SYNTAX OFF)
+#SET(MPI_COMPILER "C:/Program Files/mpich2/bin/mpicxx")
+#SET(MPI_INCLUDE_PATH "C:/Program Files (x86)/mpich2/include")
+#SET(MPI_LIBRARY "C:/Program Files/mpich2/lib/libmpi.a")
+#SET(MPI_CXX_LIBRARY "C:/Program Files/MPICH2/lib/cxx.lib")
+#################################################################################
+#  BOOST  
+#################################################################################
+SET(BOOST_VERSION "1.60.0")
+SET(BOOST_ROOT "d:/Tools/boost/boost_1_60_0")
+SET(BOOST_DIR ${BOOST_ROOT})
+SET(BOOST_LIBRARYDIR ${BOOST_ROOT}"/stageMSVC64/lib")  
+#################################################################################
+#  VTK  
+#################################################################################
+set(VTK_DIR "d:/Tools/VTK/build/VTK-8.0.0")
+
+#################################################################################
+#  LIGGGHTS  
+#################################################################################
+set(LIGGGHTS_SOURCE_DIR "d:/Tools/LIGGGHTS/src")
+set(LIGGGHTS_DEBUG_LIBRARY "d:/Tools/LIGGGHTS/build/Debug/liggghts.lib")
+set(LIGGGHTS_RELEASE_LIBRARY "d:/Tools/LIGGGHTS/build/Release/liggghts.lib")
+
+
+
+#################################################################################
+#  METIS  
+#################################################################################
+#IF(${USE_METIS})
+#  SET(METIS_INCLUDEDIR "d:/Tools/metis-5.1.0/include")
+#  SET(METIS_DEBUG_LIBRARY "d:/Tools/metis-5.1.0/build/libmetis/Debug/metis.lib") 
+#  SET(METIS_RELEASE_LIBRARY "d:/Tools/metis-5.1.0/build/libmetis/Release/metis.lib") 
+  
+  # SET(METIS_INCLUDEDIR "/mnt/d/Tools/metis-5.1.0/include")
+  # SET(METIS_DEBUG_LIBRARY "/mnt/d/Tools/metis-5.1.0/build/Linux-x86_64/libmetis/libmetis.a") 
+  # SET(METIS_RELEASE_LIBRARY "/mnt/d/Tools/metis-5.1.0/build/Linux-x86_64/libmetis/libmetis.a") 
+#ENDIF()
+
+#################################################################################
+#  PE  
+#################################################################################
+IF(${USE_DEM_COUPLING})
+  SET(PE_BINARY_DIR "d:/Tools/waLBerla/walberlaGit/build" CACHE PATH "pe binary dir")
+  SET(PE_ROOT "d:/Tools/waLBerla/walberlaGit" CACHE PATH "pe root")
+ 
+  SET(PE_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/pe/Debug/pe.lib) 
+  SET(PE_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/pe/Release/pe.lib)
+  SET(BLOCKFOREST_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/blockforest/Debug/blockforest.lib) 
+  SET(BLOCKFOREST_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/blockforest/Release/blockforest.lib)
+  SET(DOMAIN_DECOMPOSITION_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/domain_decomposition/Debug/domain_decomposition.lib) 
+  SET(DOMAIN_DECOMPOSITION_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/domain_decomposition/Release/domain_decomposition.lib)
+  SET(GEOMETRY_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/geometry/Debug/geometry.lib) 
+  SET(GEOMETRY_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/geometry/Release/geometry.lib)
+  SET(CORE_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/core/Debug/core.lib) 
+  SET(CORE_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/core/Release/core.lib)
+
+ ENDIF()
+
+##################################################################################
+#  FETOL
+##################################################################################
+IF(${USE_FETOL})
+  SET(FETOL_INCLUDEDIR "d:/Projects/FETOL/dev/CppFETOLlib")
+  SET(FETOL_DEBUG_LIBRARY "d:/Projects/FETOL/dev/CppFETOLlib/build/Debug/fetol.lib") 
+  SET(FETOL_RELEASE_LIBRARY "d:/Projects/FETOL/dev/CppFETOLlib/build/Release/fetol.lib") 
+  
+  SET(YAML_INCLUDEDIR "d:/Tools/yaml-cpp/include")
+  SET(YAML_DEBUG_LIBRARY "d:/Tools/yaml-cpp/buildVS11/Debug/libyaml-cppmdd.lib") 
+  SET(YAML_RELEASE_LIBRARY "d:/Tools/yaml-cpp/buildVS11/Release/libyaml-cppmd.lib") 
+  
+  SET(BOND_INCLUDEDIR "d:/Projects/FETOL/dev/bond_src/cpp/bond/fetol")
+  SET(BOND_DEBUG_LIBRARY "d:/Projects/FETOL/dev/bond_lib/Debug/bond.lib") 
+  SET(BOND_RELEASE_LIBRARY "d:/Projects/FETOL/dev/bond_lib/Release/bond.lib")   
+ENDIF()
+
+##################################################################################
+#  Java
+##############################################################################
+### FindJNI.cmake
+#find_package(JNI REQUIRED) 
+#SET(JNI_INCLUDE_DIRS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2} ${JAVA_AWT_INCLUDE_PATH})
+#SET(JNI_LIBRARIES ${JAVA_AWT_LIBRARY} ${JAVA_JVM_LIBRARY})
+#SET(JNI_FOUND 1) 
\ No newline at end of file
diff --git a/CMake/cmake_config_files/MOLLOK.config.cmake b/CMake/cmake_config_files/MOLLOK.config.cmake
index f700f3cd7a4b5669ef6ffee9436a1528e50e9dc9..72470da1bc52a242cb8e3c341e0e7f87bb06ab26 100644
--- a/CMake/cmake_config_files/MOLLOK.config.cmake
+++ b/CMake/cmake_config_files/MOLLOK.config.cmake
@@ -12,4 +12,5 @@ set(PATH_NUMERICAL_TESTS "D:/out/numericalTests/")
 list(APPEND VF_COMPILER_DEFINITION "PATH_NUMERICAL_TESTS=${PATH_NUMERICAL_TESTS}")
 
 # add invidual apps here
-list(APPEND USER_APPS "apps/gpu/LBM/WTG_RUB")
\ No newline at end of file
+list(APPEND USER_APPS "apps/gpu/LBM/WTG_RUB")
+list(APPEND USER_APPS "apps/gpu/LBM/TGV_3D_GridRef")
diff --git a/CMake/cmake_config_files/PHOENIX.config.cmake b/CMake/cmake_config_files/PHOENIX.config.cmake
index 12355ebb32bacd3251e95b434207ac2820c6bf77..d31d8684a53a769e48408ad5febe7d2c6b22c623 100644
--- a/CMake/cmake_config_files/PHOENIX.config.cmake
+++ b/CMake/cmake_config_files/PHOENIX.config.cmake
@@ -29,6 +29,6 @@ set(CMAKE_CUDA_ARCHITECTURES 60) # NVIDIA Tesla P100
 set(GPU_APP "apps/gpu/LBM/")
 list(APPEND USER_APPS 
     # "${GPU_APP}DrivenCavityMultiGPU"
-    "${GPU_APP}SphereScaling"
+    # "${GPU_APP}SphereScaling"
     # "${GPU_APP}MusselOyster"
     )
diff --git a/Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def b/Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def
index a3836e7906b9be66ec79f68bf53ccc079db9d9ef..d31a7b82a4e9e988f815139fb46318d231d450f8 100644
--- a/Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def
+++ b/Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def
@@ -1,11 +1,13 @@
 BootStrap: docker
 From: ubuntu:20.04
+Stage: build
 
 %files
     3rdParty 3rdParty
     apps apps
     CMake CMake
     Python Python
+    pythonbindings pythonbindings
     src src
     CMakeLists.txt CMakeLists.txt
     cpu.cmake cpu.cmake
@@ -19,7 +21,8 @@ From: ubuntu:20.04
     apt-get update &&          \
     apt-get install -y         \
     build-essential            \
-    cmake=3.16.3-1ubuntu1      \
+    ccache                     \
+    git                        \
     python3                    \
     python3-dev                \
     python3-pip                \
@@ -27,10 +30,32 @@ From: ubuntu:20.04
     libomp-dev                 \
     libgl1
 
-    pip3 install setuptools wheel numpy scipy pyvista
+    pip3 install setuptools wheel cmake numpy scipy pyvista scikit-build
 
     export PYTHONPATH=Python
-    python3 /setup.py install
+    python3 /setup.py bdist_wheel build_ext --build-temp=_skbuild -- -DBUILD_VF_CPU=ON -DBUILD_VF_DOUBLE_ACCURACY=ON
+
+    pip3 install $(find dist/*.whl)
+
+
+BootStrap: docker
+From: ubuntu:20.04
+Stage: runtime
+
+%files from build
+    Python Python
+    dist dist
+
+%post
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update &&          \
+    apt-get install -y         \
+    python3                    \
+    python3-pip                \
+    mpich                      \
+    libgl1
+
+    pip3 install $(find dist/*.whl)
 
 %environment
     export PYTHONPATH=/Python
diff --git a/Python/SlurmTests/poiseuille/rocket.yml b/Python/SlurmTests/poiseuille/rocket.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b186469a4d3fd4b8edfafa4fc3f6dcd64e311d70
--- /dev/null
+++ b/Python/SlurmTests/poiseuille/rocket.yml
@@ -0,0 +1,23 @@
+host: $REMOTE_HOST
+user: $REMOTE_USER
+private_keyfile: $PRIVATE_KEY
+
+copy:
+  - from: Python/SlurmTests/poiseuille/slurm.job
+    to: poiseuille_test/slurm.job
+    overwrite: true
+
+  - from: Containers/PoiseuilleTestContainer.sif
+    to: poiseuille_test/PoiseuilleTestContainer.sif
+    overwrite: true
+
+collect:
+  - from: poiseuille_test/POISEUILLE_TEST.out
+    to: POISEUILLE_TEST.out
+    overwrite: true
+
+#clean:
+#  - poiseuille_test/PoiseuilleTestContainer.sif
+
+sbatch: poiseuille_test/slurm.job
+continue_if_job_fails: true
diff --git a/Python/SlurmTests/poiseuille/simulation_runner.py b/Python/SlurmTests/poiseuille/simulation_runner.py
index 03fb24be7ea1a6468ae25ec3aa40ab59962ef91e..d54a35e72b298562f8ccec82677089f3898eec9b 100644
--- a/Python/SlurmTests/poiseuille/simulation_runner.py
+++ b/Python/SlurmTests/poiseuille/simulation_runner.py
@@ -5,7 +5,7 @@ from poiseuille.simulation import run_simulation
 from pyfluids.cpu.writer import Writer, OutputFormat
 
 
-scale_level = int(os.environ["PYFLUIDS_SCALE_LEVEL"])
+scale_level = int(os.environ.get("PYFLUIDS_SCALE_LEVEL", 1))
 grid_params, physical_params, runtime_params, kernel = Scaling.configuration_for_scale_level(scale_level)
 
 writer = Writer()
diff --git a/Python/SlurmTests/poiseuille/slurm.job b/Python/SlurmTests/poiseuille/slurm.job
index 488fc9a42f261d69a8212cff389721fdfb9cbf6e..b4e4da271920479ade008b28d4d2e6ce6343c3d3 100644
--- a/Python/SlurmTests/poiseuille/slurm.job
+++ b/Python/SlurmTests/poiseuille/slurm.job
@@ -1,5 +1,6 @@
 #!/bin/bash
 #SBATCH -J PyFluidsTest
+#SBATCH -o poiseuille_test/POISEUILLE_TEST.out
 #SBATCH --nodes=1
 #SBATCH --ntasks-per-node=1
 #SBATCH --cpus-per-task=20
@@ -9,6 +10,9 @@
 #SBATCH --partition=standard
 
 source $HOME/.bashrc
+module load singularity/3.9.9
+
+cd poiseuille_test
 
 echo "PyFluids Poiseuille Test Case"
 echo "Number of tasks: ${SLURM_NTASKS}"
diff --git a/apps/cpu/Applications.cmake b/apps/cpu/Applications.cmake
index e8902e5ffbb3720365476afef50a4f3fbd0ddf76..68dfeb3ed7687da74d49a35337b0bae92798e80d 100644
--- a/apps/cpu/Applications.cmake
+++ b/apps/cpu/Applications.cmake
@@ -9,6 +9,16 @@ add_subdirectory(${APPS_ROOT_CPU}/sphere)
 add_subdirectory(${APPS_ROOT_CPU}/FlowAroundCylinder)
 add_subdirectory(${APPS_ROOT_CPU}/LaminarTubeFlow)
 add_subdirectory(${APPS_ROOT_CPU}/MultiphaseDropletTest)
+add_subdirectory(${APPS_ROOT_CPU}/RisingBubble2D)
+add_subdirectory(${APPS_ROOT_CPU}/JetBreakup)
+
+add_subdirectory(${APPS_ROOT_CPU}/ConvectionOfVortex)
+
+IF(${USE_LIGGGHTS})
+	add_subdirectory(${APPS_ROOT_CPU}/LiggghtsApp)
+	add_subdirectory(${APPS_ROOT_CPU}/FallingSphere)
+	add_subdirectory(${APPS_ROOT_CPU}/Nozzle)
+ENDIF()
 
 #add_subdirectory(tests)
 #add_subdirectory(Applications/gridRf)
diff --git a/apps/cpu/ConvectionOfVortex/CMakeLists.txt b/apps/cpu/ConvectionOfVortex/CMakeLists.txt
index 671dfcfeb944ed53dbe6192461db463f97a4e6f8..33d60676c7e0dfdde411c3c5b92a2534ea54fbfe 100644
--- a/apps/cpu/ConvectionOfVortex/CMakeLists.txt
+++ b/apps/cpu/ConvectionOfVortex/CMakeLists.txt
@@ -1,25 +1,8 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
-
 ########################################################
 ## C++ PROJECT                                       ###
 ########################################################
 PROJECT(ConvectionOfVortex)
 
-INCLUDE(${APPS_ROOT}/IncludsList.cmake) 
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES cov.cpp )
 
-#################################################################
-###   LOCAL FILES                                             ###
-#################################################################
-FILE(GLOB SPECIFIC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h
-                         ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
-                         ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp  )
- 
-SET(ALL_SOURCES ${ALL_SOURCES} ${SPECIFIC_FILES})
-SOURCE_GROUP(src FILES ${SPECIFIC_FILES})
-  
-SET(CAB_ADDITIONAL_LINK_LIBRARIES VirtualFluids)
 
-#################################################################
-###   CREATE PROJECT                                          ###
-#################################################################
-CREATE_CAB_PROJECT(cov BINARY)
diff --git a/apps/cpu/ConvectionOfVortex/cov.cpp b/apps/cpu/ConvectionOfVortex/cov.cpp
index 4e1f592b896c21da5bc6bc59f3b2bfb584650374..627f5d03abe32f43cf3eb33649e0f209595b8b6a 100644
--- a/apps/cpu/ConvectionOfVortex/cov.cpp
+++ b/apps/cpu/ConvectionOfVortex/cov.cpp
@@ -56,7 +56,7 @@ void run()
       //LBMReal nuLB = 8.66025e-6*4.0;
       //double yFactor = 4.0;
 
-      string  pathname = "d:/temp/ConvectionOfVortex_0.00075_moments";
+      //string  pathname = "d:/temp/ConvectionOfVortex_0.00075_moments";
       //double  endTime = 160;
       //double  outTime = 160;
       //LBMReal dx =  0.00075;
@@ -75,7 +75,7 @@ void run()
 
       SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter());
 
-      int baseLevel = 0;
+      //int baseLevel = 0;
       int refineLevel = 1;
 
       //bounding box
@@ -150,7 +150,7 @@ void run()
       if (myid==0) GbSystem3D::writeGeoObject(geoOutflow4.get(), pathname+"/geo/geoOutflow4", WbWriterVtkXmlASCII::getInstance());
       SPtr<D3Q27Interactor> outflowIntr4 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow4, grid, outflowBCAdapter, Interactor3D::SOLID));
 
-      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B));
+      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M));
       InteractorsHelper intHelper(grid, metisVisitor);
       //intHelper.addInteractor(outflowIntr1);
       //intHelper.addInteractor(outflowIntr2);
@@ -163,10 +163,16 @@ void run()
 
       //set connectors  
       //SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetInterpolationProcessor());
-      SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetMomentsInterpolationProcessor());
+      //SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetMomentsInterpolationProcessor());
       //dynamicPointerCast<CompressibleOffsetMomentsInterpolationProcessor>(iProcessor)->setBulkOmegaToOmega(true);
       //SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetSquarePressureInterpolationProcessor());
-      SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor);
+
+      OneDistributionSetConnectorsBlockVisitor setConnsVisitor(comm);
+      grid->accept(setConnsVisitor);
+
+      SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetMomentsInterpolationProcessor());
+      SetInterpolationConnectorsBlockVisitor setInterConnsVisitor(comm, nuLB, iProcessor);
+      grid->accept(setInterConnsVisitor);
 
       UBLOG(logINFO, "SetConnectorsBlockVisitor:start");
       grid->accept(setConnsVisitor);
diff --git a/apps/cpu/CouetteFlow/cflow.cpp b/apps/cpu/CouetteFlow/cflow.cpp
index 276fbe125b5b3cd0271542f7e9d8ab9f9abca518..3de4a3b36f7453eaafca24648d0aa770fb954d63 100644
--- a/apps/cpu/CouetteFlow/cflow.cpp
+++ b/apps/cpu/CouetteFlow/cflow.cpp
@@ -184,7 +184,7 @@ void bflow(string configname)
 
       ////////////////////////////////////////////
       //METIS
-      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY));
+      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY));
       ////////////////////////////////////////////
       /////delete solid blocks
       if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start");
diff --git a/apps/cpu/FallingSphere/CMakeLists.txt b/apps/cpu/FallingSphere/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..94eab3ae0601daaaf1dbe9053ec163058b88186b
--- /dev/null
+++ b/apps/cpu/FallingSphere/CMakeLists.txt
@@ -0,0 +1,3 @@
+PROJECT(FallingSphere)
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} LiggghtsCoupling FILES FallingSphere.cpp )
diff --git a/apps/cpu/FallingSphere/FallingSphere.cpp b/apps/cpu/FallingSphere/FallingSphere.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5f399c547e697199cbbde82b906169a8c1d5fd59
--- /dev/null
+++ b/apps/cpu/FallingSphere/FallingSphere.cpp
@@ -0,0 +1,174 @@
+#include <iostream>
+#include <string>
+#include <memory>
+
+#include "VirtualFluids.h"
+
+#include "LiggghtsCouplingCoProcessor.h"
+#include "LiggghtsCouplingWrapper.h"
+#include "IBcumulantK17LBMKernel.h"
+
+using namespace std;
+
+
+int main(int argc, char *argv[])
+{
+    std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+    int myid                                        = comm->getProcessID();
+
+
+    // bounding box
+    double g_minX1 = 0;
+    double g_minX2 = 0;
+    double g_minX3 = 0;
+
+    double g_maxX1 = 1;
+    double g_maxX2 = 1;
+    double g_maxX3 = 10;
+
+    int blockNX[3] = { 16, 16, 16 };
+    double dx = 1./32.;
+
+    double d_part = 0.25;
+    double r_p    = d_part / 2.0;
+
+    //int blockNX[3] = { 10, 10, 10 };
+    //double dx      = 0.05;
+
+
+    double nuLB = 1e-2;
+
+    SPtr<LBMKernel> kernel   = make_shared<IBcumulantK17LBMKernel>();
+    SPtr<BCProcessor> bcProc = make_shared<BCProcessor>();
+    kernel->setBCProcessor(bcProc);
+
+    SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+    noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
+    //////////////////////////////////////////////////////////////////////////////////
+    // BC visitor
+    BoundaryConditionsBlockVisitor bcVisitor;
+    bcVisitor.addBC(noSlipBCAdapter);
+
+    SPtr<Grid3D> grid = make_shared<Grid3D>(comm);
+    grid->setPeriodicX1(true);
+    grid->setPeriodicX2(true);
+    grid->setPeriodicX3(false);
+    grid->setDeltaX(dx);
+    grid->setBlockNX(blockNX[0], blockNX[1], blockNX[2]);
+
+    string outputPath = "f:/temp/FallingSpheresTest";
+
+    UbSystem::makeDirectory(outputPath);
+    UbSystem::makeDirectory(outputPath + "/liggghts");
+
+    SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
+    
+    SPtr<GbObject3D> gridCube = make_shared <GbCuboid3D>(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3);
+    if (myid == 0)
+        GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance());
+
+    GenBlocksGridVisitor genBlocks(gridCube);
+    grid->accept(genBlocks);
+
+    SPtr<CoProcessor> ppblocks =
+        make_shared <WriteBlocksCoProcessor>(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
+                                                          WbWriterVtkXmlBinary::getInstance(), comm);
+    ppblocks->process(0);
+    ppblocks.reset();
+
+    double dx2 = 2.0 * dx;
+    GbCuboid3DPtr wallZmin(
+        new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_minX3));
+    GbSystem3D::writeGeoObject(wallZmin.get(), outputPath + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance());
+    GbCuboid3DPtr wallZmax(
+        new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_maxX3, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2));
+    GbSystem3D::writeGeoObject(wallZmax.get(), outputPath + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance());
+
+    SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+    SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+    InteractorsHelper intHelper(grid, metisVisitor, true);
+    intHelper.addInteractor(wallZminInt);
+    intHelper.addInteractor(wallZmaxInt);
+    intHelper.selectBlocks();
+
+    SetKernelBlockVisitor kernelVisitor(kernel, nuLB, 1e9, 1e9);
+    grid->accept(kernelVisitor);
+
+    intHelper.setBC();
+
+    InitDistributionsBlockVisitor initVisitor;
+    grid->accept(initVisitor);
+
+    SPtr<UbScheduler> lScheduler = make_shared<UbScheduler>(1);
+    string inFile1 = "d:/Projects/VirtualFluids_Develop/apps/cpu/FallingSphere/in.lbdem";
+    string inFile2 = "d:/Projects/VirtualFluids_Develop/apps/cpu/FallingSphere/in2.lbdem";
+    MPI_Comm mpi_comm = *(MPI_Comm*)(comm->getNativeCommunicator());
+    LiggghtsCouplingWrapper wrapper(argv, mpi_comm);
+
+
+ 
+    // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 1.480, 2060, r_p/dx);
+    //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, LBMUnitConverter::AIR_20C, r_p / dx);
+    SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 0.1, 1000, r_p / dx, 0.01);
+    std::cout << units->toString() << std::endl;
+
+    double v_frac = 0.1;
+    double dt_phys   = units->getFactorTimeLbToW();
+    int demSubsteps = 10;
+    double dt_dem   = dt_phys / (double)demSubsteps;
+    int vtkSteps    = 100;
+    string demOutDir = outputPath; 
+
+    wrapper.execCommand("echo none");
+
+    wrapper.setVariable("d_part", d_part);
+    //wrapper.setVariable("r_part", d_part/2.);
+    //wrapper.setVariable("v_frac", v_frac);
+
+    wrapper.execFile((char*)inFile1.c_str());
+ 
+    //// set timestep and output directory
+    wrapper.setVariable("t_step", dt_dem);
+    wrapper.setVariable("dmp_stp", vtkSteps * demSubsteps);
+    wrapper.setVariable("dmp_dir", demOutDir);
+
+    wrapper.execFile((char *)inFile2.c_str());
+    wrapper.runUpto(demSubsteps - 1);
+  
+    SPtr<LiggghtsCouplingCoProcessor> lcCoProcessor =
+        make_shared<LiggghtsCouplingCoProcessor>(grid, lScheduler, comm, wrapper, demSubsteps, units);
+
+    // boundary conditions grid
+    {
+        SPtr<UbScheduler> geoSch(new UbScheduler(1));
+        SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+            grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+        ppgeo->process(0);
+        ppgeo.reset();
+    }
+
+    grid->accept(bcVisitor);
+
+    OneDistributionSetConnectorsBlockVisitor setConnsVisitor(comm);
+    grid->accept(setConnsVisitor);
+
+
+    // write data for visualization of macroscopic quantities
+    SPtr<UbScheduler> visSch(new UbScheduler(vtkSteps));
+    SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(
+        new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(),
+                                                  SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+
+    int endTime = 3000; //20;
+    SPtr<Calculator> calculator(new BasicCalculator(grid, lScheduler, endTime));
+    calculator->addCoProcessor(lcCoProcessor);
+    calculator->addCoProcessor(writeMQCoProcessor);
+
+    if (myid == 0) UBLOG(logINFO, "Simulation-start");
+    calculator->calculate();
+    if (myid == 0) UBLOG(logINFO, "Simulation-end");
+
+
+    return 0;
+}
diff --git a/apps/cpu/FallingSphere/in.lbdem b/apps/cpu/FallingSphere/in.lbdem
new file mode 100644
index 0000000000000000000000000000000000000000..b47a85c997fce75ba082490b305bbe9b55caeb25
--- /dev/null
+++ b/apps/cpu/FallingSphere/in.lbdem
@@ -0,0 +1,75 @@
+echo none
+
+units		si
+atom_style	granular
+atom_modify	map array
+
+
+
+communicate	single vel yes
+
+boundary	f f f
+newton		off
+
+processors * * 1
+region		box block 0. 1. 0. 1. 0. 10. units box
+create_box	1 box
+
+variable	skin equal 0.01
+neighbor	${skin} bin
+neigh_modify	delay 0 binsize 0.01 one 1000
+
+fix grav all gravity 0.981 vector 0 0 -1
+
+
+fix 		m1 all property/global youngsModulus peratomtype 1e8
+fix 		m2 all property/global poissonsRatio peratomtype 0.4
+fix 		m3 all property/global coefficientRestitution peratomtypepair 1 0.95
+fix 		m4 all property/global coefficientFriction peratomtypepair 1 0.45
+fix 		m5 all property/global coefficientRollingFriction peratomtypepair 1 0.020
+
+# lb coupling fix
+fix lbcoupling all couple/lb/onetoone
+
+
+pair_style	gran model hertz tangential history rolling_friction cdt
+pair_coeff	* *
+
+fix		1 all nve/sphere
+
+fix xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.
+fix xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 1.
+fix ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.
+fix ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 1.
+fix zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.
+fix zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 2.
+
+create_atoms 1 single 0.5 0.5 9.75
+#create_atoms 1 single 0.38 0.05 0.05
+
+set group all diameter ${d_part} density 2400
+
+atom_modify sort 0 0.0
+
+#fix pts1 all particletemplate/sphere 1 atom_type 1 density constant 1000 radius constant 0.015 
+#fix pts2 all particletemplate/sphere 1 atom_type 1 density constant 1000 radius constant 0.01 
+#fix pts1 all particletemplate/sphere 1 atom_type 1 density constant 1100 radius constant ${r_part} 
+
+# fix pdd1 all particledistribution/discrete 6778  1 pts1 1.0
+# #fix pdd2 all particledistribution/discrete 6778  2 pts2 0.2 pts3 0.8
+
+# # region  insreg block 0.1 0.9 0.1 0.9 1.3 1.9 units box
+
+
+# #fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once &
+# #                         overlapcheck yes particles_in_region 350 region insreg ntry_mc 10000 
+# fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once &
+                        # overlapcheck yes volumefraction_region ${v_frac} region insreg ntry_mc 10000 
+# #fix ins all insert/pack seed 1001 distributiontemplate pdd2 insert_every once &
+# #                        overlapcheck yes volumefraction_region 0.05 region insreg ntry_mc 10000 
+# #fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once &
+# #                        overlapcheck yes particles_in_region 1 region insreg ntry_mc 10000 
+
+echo none
+
+run 1
diff --git a/apps/cpu/FallingSphere/in2.lbdem b/apps/cpu/FallingSphere/in2.lbdem
new file mode 100644
index 0000000000000000000000000000000000000000..f11767f12f37fd34e218c528761c8a09e968660c
--- /dev/null
+++ b/apps/cpu/FallingSphere/in2.lbdem
@@ -0,0 +1,25 @@
+
+echo none
+
+timestep        ${t_step}      
+
+# thermo settings
+fix		ts all check/timestep/gran 10000 0.1 0.1
+compute		1 all erotate/sphere
+thermo_style	custom step atoms ke c_1 f_ts[1] f_ts[2] cpu
+thermo		10000
+thermo_modify	lost ignore norm no flush yes
+compute_modify	thermo_temp dynamic yes
+
+# particle dump
+variable dmp_fname string ${dmp_dir}d_*.liggghts
+
+# dump		dmp all custom ${dmp_stp} ${dmp_fname} & 
+#		id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius 
+
+# dump		dmp all custom ${dmp_stp} ${dmp_dir}d_*.liggghts & 
+# 		id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius 
+	
+dump   dmp all custom/vtk ${dmp_stp} ${dmp_dir}/liggghts/atom_*.vtk id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius 	
+
+echo none
\ No newline at end of file
diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cfg b/apps/cpu/FlowAroundCylinder/cylinder.cfg
index 0a7066ed9bc3351736c511d7aaeecaa04604fe55..97ece40e65d4ffe47a75e5377db49bd0018bbff6 100644
--- a/apps/cpu/FlowAroundCylinder/cylinder.cfg
+++ b/apps/cpu/FlowAroundCylinder/cylinder.cfg
@@ -1,6 +1,6 @@
-pathOut = d:/temp/cylinder_test
+pathOut = d:/temp/cylinder_test_naming
 
-numOfThreads = 4
+numOfThreads = 8
 availMem = 15e9
 refineLevel = 0
 blockNx = 25 41 41
@@ -16,7 +16,7 @@ restartStep = 1000
 cpStart = 1000
 cpStep = 1000
 
-outTime = 10000
-endTime = 100000
+outTime = 10
+endTime = 100
 
 nupsStep = 100 100 10000000
\ No newline at end of file
diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cpp b/apps/cpu/FlowAroundCylinder/cylinder.cpp
index 2f470d17dbac3600b2c42acede2bba9e6c45f872..5578ecb56b37e3b489e4c60d9a26adfa05e9b3d3 100644
--- a/apps/cpu/FlowAroundCylinder/cylinder.cpp
+++ b/apps/cpu/FlowAroundCylinder/cylinder.cpp
@@ -203,7 +203,7 @@ void run(string configname)
          SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
 
          
-         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B));
+         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M));
          InteractorsHelper intHelper(grid, metisVisitor);
          intHelper.addInteractor(cylinderInt);
          intHelper.addInteractor(addWallYminInt);
diff --git a/apps/cpu/HerschelBulkleyModel/hbflow.cpp b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
index 8483883aca772693758b9f52fcee53c54b84a1d5..b97942a1cd78c4ea9a5c73b4f24ddf4f6ae2edf6 100644
--- a/apps/cpu/HerschelBulkleyModel/hbflow.cpp
+++ b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
@@ -218,7 +218,7 @@ void bflow(string configname)
 
       ////////////////////////////////////////////
       //METIS
-      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::RECURSIVE));
+      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
       ////////////////////////////////////////////
       /////delete solid blocks
       if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start");
diff --git a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
index d86424869d5598adb2dfa61c1da2f6590bd79401..67f5a00ad49dcbe16a018e402f85ed02b3848650 100644
--- a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
+++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
@@ -159,10 +159,14 @@ void bflow(string configname)
       GbSystem3D::writeGeoObject(sphere.get(), outputPath + "/geo/sphere", WbWriterVtkXmlBinary::getInstance());
       SPtr<D3Q27Interactor> sphereInt(new D3Q27Interactor(sphere, grid, noSlipBCAdapter, Interactor3D::SOLID));
 
+      ////////////////////////////////////////////
+      //METIS
+      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY));
+      ////////////////////////////////////////////
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, outputPath, comm));
+      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm));
       restartCoProcessor->setLBMKernel(kernel);
       restartCoProcessor->setBCProcessor(bcProc);
       //restartCoProcessor->setNu(k);
@@ -239,7 +243,7 @@ void bflow(string configname)
 
          ////////////////////////////////////////////
          //METIS
-         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY));
+         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY));
          ////////////////////////////////////////////
          /////delete solid blocks
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start");
diff --git a/apps/cpu/JetBreakup/JetBreakup.cfg b/apps/cpu/JetBreakup/JetBreakup.cfg
index 22d20f7d5667ae30c2f3405334566c4d109e7d9f..eef35c305065efe01befab99f96f385a32d932bc 100644
--- a/apps/cpu/JetBreakup/JetBreakup.cfg
+++ b/apps/cpu/JetBreakup/JetBreakup.cfg
@@ -1,39 +1,35 @@
-pathname = d:/temp/Multiphase
-pathGeo = d:/Projects/VirtualFluids-Multiphase/source/Applications/Multiphase/backup
-geoFile = JetBreakup2.ASCII.stl
-numOfThreads = 4
+pathname = f:/Multiphase/JetBreakupCaseCSThreeNonConservativePressShortCorrPhaseOutflow1
+#pathGeo = d:/Projects/VirtualFluids-Multiphase/source/Applications/Multiphase/backup
+pathGeo = d:/Projects/VirtualFluidsCombined/apps/cpu/Multiphase/backup
+#geoFile = JetBreakupR.ASCII.stl
+#geoFile = inlet1.stl
+geoFile = tubeTransformed.stl
+
+numOfThreads = 16
 availMem = 10e9
 
 #Grid
-
-#boundingBox = -1.0 121.0 0.5 629.0 -1.0 121.0 #(Jet Breakup) (Original with inlet length)
-#boundingBox = -60.5 60.5 -1.0 -201.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length)
-#blocknx = 22 20 22
-
-boundingBox = -60.5 60.5 -1.0 -21.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length)
-blocknx = 22 20 22
-
-
-dx = 0.5
-refineLevel = 0
+blocknx = 25 25 25
 
 #Simulation
-uLB = 0.05 #inlet velocity
-uF2 = 0.0001
-Re = 10
-nuL = 1.0e-5  #!1e-2
-nuG = 1.16e-4 #!1e-2
-densityRatio = 10 #30
-sigma = 4.66e-3 #surface tension 1e-4 ./. 1e-5
-interfaceThickness = 5
-radius = 615.0   (Jet Breakup)
+case = 3
+U_LB = 0.01 #inlet velocity
+#uF2 = 0.0001
+#Re = 10
+#nuL =0.00016922169811320757# 1.0e-5 #!1e-2
+#nuG =0.00016922169811320757# 1.16e-4 #!1e-2
+#densityRatio = 24.579710144927535
+#sigma = 1.7688679245283022e-07 
+interfaceWidth = 5
+
+D = 0.0001 # m
+D_LB = 50
+
 contactAngle = 110.0
-gravity = 0.0
-#gravity = -5.04e-6
 phi_L = 0.0
 phi_H = 1.0
 Phase-field Relaxation = 0.6
-Mobility = 0.02 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1 
+Mobility = 0.02 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1
 
 
 logToFile = false
@@ -44,5 +40,5 @@ restartStep = 100000
 cpStart = 100000
 cpStep = 100000
 
-outTime = 1
-endTime = 200000000
\ No newline at end of file
+outTime = 1 #205
+endTime = 100000#36000
\ No newline at end of file
diff --git a/apps/cpu/JetBreakup/JetBreakup.cpp b/apps/cpu/JetBreakup/JetBreakup.cpp
index eb7d705537e4307e4ca1066ac9d06dafb72449f4..01d4cc3eb5b7d46118d40bc5fbb98b16e57d82eb 100644
--- a/apps/cpu/JetBreakup/JetBreakup.cpp
+++ b/apps/cpu/JetBreakup/JetBreakup.cpp
@@ -1,516 +1,626 @@
 #include <iostream>
+#include <memory>
 #include <string>
 
 #include "VirtualFluids.h"
 
 using namespace std;
 
+void setInflowBC(double x1, double x2, double x3, double radius, int dir)
+{
+
+}
 
 void run(string configname)
 {
-   try
-   {
-      vf::basics::ConfigurationFile   config;
-      config.load(configname);
-
-      string          pathname = config.getString("pathname");
-      string		  pathGeo = config.getString("pathGeo");
-      string		  geoFile = config.getString("geoFile");
-      int             numOfThreads = config.getInt("numOfThreads");
-      vector<int>     blocknx = config.getVector<int>("blocknx");
-      vector<double>  boundingBox = config.getVector<double>("boundingBox");
-      //vector<double>  length = config.getVector<double>("length");
-      double          uLB = config.getDouble("uLB");
-      double          uF2 = config.getDouble("uF2");
-      double		  nuL = config.getDouble("nuL");
-      double		  nuG = config.getDouble("nuG");
-      double		  densityRatio = config.getDouble("densityRatio");
-      double		  sigma = config.getDouble("sigma");
-      int		      interfaceThickness = config.getInt("interfaceThickness");
-      double		  radius = config.getDouble("radius");
-      double		  theta = config.getDouble("contactAngle");
-      double		  gr = config.getDouble("gravity");
-      double		  phiL = config.getDouble("phi_L");
-      double		  phiH = config.getDouble("phi_H");
-      double		  tauH = config.getDouble("Phase-field Relaxation");
-      double		  mob = config.getDouble("Mobility");
-
-
-      double          endTime = config.getDouble("endTime");
-      double          outTime = config.getDouble("outTime");
-      double          availMem = config.getDouble("availMem");
-      int             refineLevel = config.getInt("refineLevel");
-      double          Re = config.getDouble("Re");
-      double          dx = config.getDouble("dx");
-      bool            logToFile = config.getBool("logToFile");
-      double          restartStep = config.getDouble("restartStep");
-      double          cpStart = config.getValue<double>("cpStart");
-      double          cpStep = config.getValue<double>("cpStep");
-      bool            newStart = config.getValue<bool>("newStart");
-
-      double beta = 12 * sigma / interfaceThickness;
-      double kappa = 1.5 * interfaceThickness * sigma;
-
-      CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance();
-      int myid = comm->getProcessID();
-
-      if (logToFile)
-      {
+    try {
+
+        // Sleep(30000);
+
+        vf::basics::ConfigurationFile config;
+        config.load(configname);
+
+        string pathname = config.getValue<string>("pathname");
+        //string pathGeo = config.getValue<string>("pathGeo");
+        //string geoFile = config.getValue<string>("geoFile");
+        int numOfThreads = config.getValue<int>("numOfThreads");
+        vector<int> blocknx = config.getVector<int>("blocknx");
+        //vector<double> boundingBox = config.getVector<double>("boundingBox");
+        // vector<double>  length = config.getVector<double>("length");
+        double U_LB = config.getValue<double>("U_LB");
+        // double uF2                         = config.getValue<double>("uF2");
+        //double nuL = config.getValue<double>("nuL");
+        //double nuG = config.getValue<double>("nuG");
+        //double densityRatio = config.getValue<double>("densityRatio");
+        //double sigma = config.getValue<double>("sigma");
+        int interfaceWidth = config.getValue<int>("interfaceWidth");
+        //double D          = config.getValue<double>("D");
+        double theta = config.getValue<double>("contactAngle");
+        double D_LB = config.getValue<double>("D_LB");
+        double phiL = config.getValue<double>("phi_L");
+        double phiH = config.getValue<double>("phi_H");
+        double tauH = config.getValue<double>("Phase-field Relaxation");
+        double mob = config.getValue<double>("Mobility");
+
+        double endTime = config.getValue<double>("endTime");
+        double outTime = config.getValue<double>("outTime");
+        double availMem = config.getValue<double>("availMem");
+        //int refineLevel = config.getValue<int>("refineLevel");
+        //double Re = config.getValue<double>("Re");
+        
+        bool logToFile = config.getValue<bool>("logToFile");
+        double restartStep = config.getValue<double>("restartStep");
+        double cpStart = config.getValue<double>("cpStart");
+        double cpStep = config.getValue<double>("cpStep");
+        bool newStart = config.getValue<bool>("newStart");
+
+
+
+        int caseN = config.getValue<int>("case");
+
+        SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+        int myid = comm->getProcessID();
+
+        if (myid == 0)
+            UBLOG(logINFO, "Jet Breakup: Start!");
+
+        if (logToFile) {
 #if defined(__unix__)
-         if (myid == 0)
-         {
-            const char* str = pathname.c_str();
-            mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
-         }
-#endif 
-
-         if (myid == 0)
-         {
-            stringstream logFilename;
-            logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt";
-            UbLog::output_policy::setStream(logFilename.str());
-         }
-      }
-
-      //Sleep(30000);
-
-      LBMReal dLB; // = length[1] / dx;
-      LBMReal rhoLB = 0.0;
-      LBMReal nuLB = nuL; //(uLB*dLB) / Re;
-
-      LBMUnitConverterPtr conv = LBMUnitConverterPtr(new LBMUnitConverter());
-
-      const int baseLevel = 0;
-
-
-
-      Grid3DPtr grid(new Grid3D(comm));
-      //grid->setPeriodicX1(true);
-     //grid->setPeriodicX2(true);
-     //grid->setPeriodicX3(true);
-      //////////////////////////////////////////////////////////////////////////
-      //restart
-      UbSchedulerPtr rSch(new UbScheduler(cpStep, cpStart));
-      //RestartCoProcessor rp(grid, rSch, comm, pathname, RestartCoProcessor::TXT);
-      MPIIORestart1CoProcessor rcp(grid, rSch, pathname, comm);
-      //////////////////////////////////////////////////////////////////////////
-
-
-
-
-
-      mu::Parser fctF1;
-      //fctF1.SetExpr("vy1*(1-((x1-x0)^2+(x3-z0)^2)/(R^2))");
-      //fctF1.SetExpr("vy1*(1-(sqrt((x1-x0)^2+(x3-z0)^2)/R))^0.1");
-      fctF1.SetExpr("vy1");
-      fctF1.DefineConst("vy1", -uLB);
-      fctF1.DefineConst("R", 8.0);
-      fctF1.DefineConst("x0", 0.0);
-      fctF1.DefineConst("z0", 0.0);
-
-
-      if (newStart)
-      {
-
-         //bounding box
-         /*double g_minX1 = 0.0;
-         double g_minX2 = -length[1] / 2.0;
-         double g_minX3 = -length[2] / 2.0;
-
-         double g_maxX1 = length[0];
-         double g_maxX2 = length[1] / 2.0;
-         double g_maxX3 = length[2] / 2.0;*/
-
-         double g_minX1 = boundingBox[0];
-         double g_minX2 = boundingBox[2];
-         double g_minX3 = boundingBox[4];
-
-         double g_maxX1 = boundingBox[1];
-         double g_maxX2 = boundingBox[3];
-         double g_maxX3 = boundingBox[5];
-
-         //geometry
-
-         //GbObject3DPtr innerCube(new GbCuboid3D(g_minX1+2, g_minX2+2, g_minX3+2, g_maxX1-2, g_maxX2-2, g_maxX3-2));
-
-       //GbObject3DPtr cylinder1(new GbCylinder3D(g_minX1 - 2.0*dx, g_maxX2/2, g_maxX3/2, g_minX1 + 12.0*dx, g_maxX2/2, g_maxX3/2, radius));
-       //GbObject3DPtr cylinder2(new GbCylinder3D(g_minX1 + 12.0*dx, g_maxX2/2, g_maxX3/2, g_maxX1 + 2.0*dx, g_maxX2/2, g_maxX3/2, dLB / 2.0));
-
-       //GbObject3DPtr cylinder(new GbCylinder3D(g_minX1 - 2.0*dx, g_maxX2/2, g_maxX3/2, g_maxX1 + 2.0*dx, g_maxX2/2, g_maxX3/2, dLB / 2.0));
-       //GbObject3DPtr cylinders(new GbObject3DManager());
-       //GbObject3DPtr cylinders1(new GbObjectGroup3D());
-
-
-
-
-         GbObject3DPtr gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3));
-         if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance());
-
-         GbTriFaceMesh3DPtr cylinder;
-         if (myid == 0) UBLOG(logINFO, "Read geoFile:start");
-         //cylinder = GbTriFaceMesh3DPtr(GbTriFaceMesh3DCreator::getInstance()->readMeshFromSTLFile2(pathGeo+"/"+geoFile, "geoCylinders", GbTriFaceMesh3D::KDTREE_SAHPLIT, false));
-         cylinder = GbTriFaceMesh3DPtr(GbTriFaceMesh3DCreator::getInstance()->readMeshFromSTLFile(pathGeo + "/" + geoFile, "geoCylinders", GbTriFaceMesh3D::KDTREE_SAHPLIT));
-         GbSystem3D::writeGeoObject(cylinder.get(), pathname + "/geo/Stlgeo", WbWriterVtkXmlBinary::getInstance());
-
-
-
-         //inflow
-      //GbCuboid3DPtr geoInflowF1(new GbCuboid3D(40.0, 628.0, 40.0, 80, 631.0, 80.0));  // For JetBreakup (Original)
-         //GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1-2.0*dx, g_minX2-2.0*dx, g_minX3-2.0*dx, g_maxX1+2.0*dx, g_minX2+2.0*dx, g_maxX3+2.0*dx));
-         //if (myid == 0) GbSystem3D::writeGeoObject(geoInflowF1.get(), pathname + "/geo/geoInflowF1", WbWriterVtkXmlASCII::getInstance());
-
-
-         ////outflow
-         ////GbCuboid3DPtr geoOutflow(new GbCuboid3D(-1.0, -1, -1.0, 121.0, 1.0, 121.0)); // For JetBreakup (Original)
-         //GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_minX1-2.0*dx, g_maxX2, g_minX3-2.0*dx, g_maxX1+2.0*dx, g_maxX2+2.0*dx, g_maxX3+2.0*dx));
-         //if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance());
-
-         GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1, g_minX2-0.5*dx, g_minX3, g_maxX1, g_minX2 - 1.0*dx, g_maxX3));
-         if (myid==0) GbSystem3D::writeGeoObject(geoInflowF1.get(), pathname+"/geo/geoInflowF1", WbWriterVtkXmlASCII::getInstance());
-
-
-         //outflow
-         //GbCuboid3DPtr geoOutflow(new GbCuboid3D(-1.0, -1, -1.0, 121.0, 1.0, 121.0)); // For JetBreakup (Original)
-         GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_minX1, g_maxX2-1*dx, g_minX3, g_maxX1, g_maxX2, g_maxX3));
-         if (myid==0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname+"/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance());
-
-         double blockLength = blocknx[0] * dx;
-
-
-
-         if (myid == 0)
-         {
-            UBLOG(logINFO, "uLb = " << uLB);
-            UBLOG(logINFO, "rho = " << rhoLB);
-            UBLOG(logINFO, "nuLb = " << nuLB);
-            UBLOG(logINFO, "Re = " << Re);
-            UBLOG(logINFO, "dx = " << dx);
-            UBLOG(logINFO, "Preprocess - start");
-         }
-
-         grid->setDeltaX(dx);
-         grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]);
-
-         grid->setPeriodicX1(false);
-         grid->setPeriodicX2(false);
-         grid->setPeriodicX3(false);
-
-
-
-         GenBlocksGridVisitor genBlocks(gridCube);
-         grid->accept(genBlocks);
-
-
-
-
-         //BC Adapter
-         //////////////////////////////////////////////////////////////////////////////
-         BCAdapterPtr noSlipBCAdapter(new NoSlipBCAdapter());
-         noSlipBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new NoSlipBCAlgorithmMultiphase()));
-
-
-         BCAdapterPtr denBCAdapter(new DensityBCAdapter(rhoLB));
-         denBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new NonReflectingOutflowBCAlgorithmMultiphase()));
-
-         double r = 5.0; //boost::dynamic_pointer_cast<GbCylinder3D>(cylinder)->getRadius();
-         double cx1 = g_minX1;
-         double cx2 = 0.0; //cylinder->getX2Centroid();
-         double cx3 = 0.0; //cylinder->getX3Centroid();
-
-
-
-         mu::Parser fctPhi_F1;
-         fctPhi_F1.SetExpr("phiH");
-         fctPhi_F1.DefineConst("phiH", phiH);
-
-         mu::Parser fctPhi_F2;
-         fctPhi_F2.SetExpr("phiL");
-         fctPhi_F2.DefineConst("phiL", phiL);
-
-         mu::Parser fctvel_F2_init;
-         fctvel_F2_init.SetExpr("U");
-         fctvel_F2_init.DefineConst("U", 0);
-
-         //fct.SetExpr("U");
-         //fct.DefineConst("U", uLB);
-         //BCAdapterPtr velBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
-
-         BCAdapterPtr velBCAdapterF1(new VelocityBCAdapterMultiphase(false, true, false, fctF1, phiH, 0.0, endTime));
-
-         //BCAdapterPtr velBCAdapterF2_1_init(new VelocityBCAdapterMultiphase(false, false, true, fctF2_1, phiH, 0.0, endTime));
-         //BCAdapterPtr velBCAdapterF2_2_init(new VelocityBCAdapterMultiphase(false, false, true, fctF2_2, phiH, 0.0, endTime));
-
-         //BCAdapterPtr velBCAdapterF2_1_init(new VelocityBCAdapterMultiphase(false, false, true, fctvel_F2_init, phiL, 0.0, endTime));
-         //BCAdapterPtr velBCAdapterF2_2_init(new VelocityBCAdapterMultiphase(false, false, true, fctvel_F2_init, phiL, 0.0, endTime));
-
-         velBCAdapterF1->setBcAlgorithm(BCAlgorithmPtr(new VelocityBCAlgorithmMultiphase()));
-         //velBCAdapterF2_1_init->setBcAlgorithm(BCAlgorithmPtr(new VelocityBCAlgorithmMultiphase()));
-         //velBCAdapterF2_2_init->setBcAlgorithm(BCAlgorithmPtr(new VelocityBCAlgorithmMultiphase()));
-
-
-          //velBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new VelocityWithDensityBCAlgorithm()));
-          //mu::Parser fct;
-          //fct.SetExpr("U");
-          //fct.DefineConst("U", uLB);
-          //BCAdapterPtr velBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
-          //velBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new NonReflectingVelocityBCAlgorithm()));
-
-
-          //////////////////////////////////////////////////////////////////////////////////
-          //BC visitor
-         BoundaryConditionsBlockVisitorMultiphase bcVisitor;
-         bcVisitor.addBC(noSlipBCAdapter);
-         bcVisitor.addBC(denBCAdapter);
-         bcVisitor.addBC(velBCAdapterF1);
-         //bcVisitor.addBC(velBCAdapterF2_1_init);
-         //bcVisitor.addBC(velBCAdapterF2_2_init);
-
-
-
-         WriteBlocksCoProcessorPtr ppblocks(new WriteBlocksCoProcessor(grid, UbSchedulerPtr(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
-
-         ppblocks->process(0);
-
-         Interactor3DPtr tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBCAdapter, Interactor3D::SOLID));
-
-         D3Q27InteractorPtr inflowF1Int = D3Q27InteractorPtr(new D3Q27Interactor(geoInflowF1, grid, velBCAdapterF1, Interactor3D::SOLID));
-
-         //D3Q27InteractorPtr inflowF2_1Int_init = D3Q27InteractorPtr(new D3Q27Interactor(geoInflowF2_1, grid, velBCAdapterF2_1_init, Interactor3D::SOLID));
-
-         //D3Q27InteractorPtr inflowF2_2Int_init = D3Q27InteractorPtr(new D3Q27Interactor(geoInflowF2_2, grid, velBCAdapterF2_2_init, Interactor3D::SOLID));
-
-         D3Q27InteractorPtr outflowInt = D3Q27InteractorPtr(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
-
-         //SetSolidBlockVisitor visitor1(inflowF2_1Int, SetSolidBlockVisitor::BC);
-         //grid->accept(visitor1);
-         //SetSolidBlockVisitor visitor2(inflowF2_2Int, SetSolidBlockVisitor::BC);
-         //grid->accept(visitor2);
-
-
-         Grid3DVisitorPtr metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW));
-         InteractorsHelper intHelper(grid, metisVisitor);
-         intHelper.addInteractor(tubes);
-         intHelper.addInteractor(inflowF1Int);
-         intHelper.addInteractor(outflowInt);
-         intHelper.selectBlocks();
-
-
-         ppblocks->process(0);
-         ppblocks.reset();
-
-         unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
-         int ghostLayer = 3;
-         unsigned long long numberOfNodesPerBlock = (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]);
-         unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock;
-         unsigned long long numberOfNodesPerBlockWithGhostLayer = numberOfBlocks * (blocknx[0] + ghostLayer) * (blocknx[1] + ghostLayer) * (blocknx[2] + ghostLayer);
-         double needMemAll = double(numberOfNodesPerBlockWithGhostLayer * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4));
-         double needMem = needMemAll / double(comm->getNumberOfProcesses());
-
-         if (myid == 0)
-         {
-            UBLOG(logINFO, "Number of blocks = " << numberOfBlocks);
-            UBLOG(logINFO, "Number of nodes  = " << numberOfNodes);
-            int minInitLevel = grid->getCoarsestInitializedLevel();
-            int maxInitLevel = grid->getFinestInitializedLevel();
-            for (int level = minInitLevel; level <= maxInitLevel; level++)
-            {
-               int nobl = grid->getNumberOfBlocks(level);
-               UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl);
-               UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock);
+            if (myid == 0) {
+                const char *str = pathname.c_str();
+                mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
             }
-            UBLOG(logINFO, "Necessary memory  = " << needMemAll << " bytes");
-            UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes");
-            UBLOG(logINFO, "Available memory per process = " << availMem << " bytes");
-         }
-
-         LBMKernelPtr kernel;
-
-         kernel = LBMKernelPtr(new MultiphaseCumulantLBMKernel(blocknx[0], blocknx[1], blocknx[2], MultiphaseCumulantLBMKernel::NORMAL));
-
-         kernel->setWithForcing(true);
-         kernel->setForcingX1(0.0);
-         kernel->setForcingX2(gr);
-         kernel->setForcingX3(0.0);
-
-         kernel->setPhiL(phiL);
-         kernel->setPhiH(phiH);
-         kernel->setPhaseFieldRelaxation(tauH);
-         kernel->setMobility(mob);
-
-         BCProcessorPtr bcProc(new BCProcessor());
-         //BCProcessorPtr bcProc(new ThinWallBCProcessor());
-
-         kernel->setBCProcessor(bcProc);
-
-         SetKernelBlockVisitorMultiphase kernelVisitor(kernel, nuL, nuG, densityRatio, beta, kappa, theta, availMem, needMem);
-
-         grid->accept(kernelVisitor);
-
-         if (refineLevel > 0)
-         {
-            SetUndefinedNodesBlockVisitor undefNodesVisitor;
-            grid->accept(undefNodesVisitor);
-         }
-
-         //inflowF2_1Int->initInteractor();
-         //inflowF2_2Int->initInteractor();
-
-         intHelper.setBC();
+#endif
 
-
-         grid->accept(bcVisitor);
-
-         //initialization of distributions
-         LBMReal x1c = radius; //g_minX1; //radius; //19; //(g_maxX1+g_minX1)/2;
-         LBMReal x2c = (g_maxX2 + g_minX2) / 2; //g_minX2 + 2;
-         LBMReal x3c = (g_maxX3 + g_minX3) / 2;
-         mu::Parser fct1;
-
-         //fct1.SetExpr("0.5-0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)");
-         //fct1.SetExpr("phiM-phiM*tanh((sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/(interfaceThickness*phiM))");
-
-         //fct1.SetExpr("0.5*(phiH + phiL)-0.5*(phiH - phiL)*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)");
-
-
-         //fct1.SetExpr("0.5*(phiH + phiL) + 0.5*(phiH - phiL)*tanh(2*((x2-radius))/interfaceThickness)");
-         fct1.SetExpr("phiL");
-         fct1.DefineConst("x1c", x1c);
-         fct1.DefineConst("x2c", x2c);
-         fct1.DefineConst("x3c", x3c);
-         fct1.DefineConst("phiL", phiL);
-         fct1.DefineConst("phiH", phiH);
-         fct1.DefineConst("radius", radius);
-         fct1.DefineConst("interfaceThickness", interfaceThickness);
-
-         mu::Parser fct2;
-         //fct2.SetExpr("vx1*(1-((x2-y0)^2+(x3-z0)^2)/(R^2))");
-         fct2.SetExpr("vx1");
-         fct2.DefineConst("R", 10.0);
-         fct2.DefineConst("vx1", uLB);
-         fct2.DefineConst("y0", 1.0);
-         fct2.DefineConst("z0", 31.0);
-         /*fct2.SetExpr("0.5*uLB-uLB*0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)");
-         fct2.DefineConst("uLB", uLB);
-         fct2.DefineConst("x1c", x1c);
-         fct2.DefineConst("x2c", x2c);
-         fct2.DefineConst("x3c", x3c);
-         fct2.DefineConst("radius", radius);
-         fct2.DefineConst("interfaceThickness", interfaceThickness);*/
-
-
-         InitDistributionsBlockVisitorMultiphase initVisitor(densityRatio, interfaceThickness, radius);
-         initVisitor.setPhi(fct1);
-         //initVisitor.setVx1(fct2);
-         grid->accept(initVisitor);
-
-         //set connectors
-         InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor());
-         //InterpolationProcessorPtr iProcessor(new CompressibleOffsetInterpolationProcessor());
-         SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor);
-         //ConnectorFactoryPtr factory(new Block3DConnectorFactory());
-         //ConnectorBlockVisitor setConnsVisitor(comm, nuLB, iProcessor, factory);
-         grid->accept(setConnsVisitor);
-
-         //domain decomposition for threads
-         //PQueuePartitioningGridVisitor pqPartVisitor(numOfThreads);
-         //grid->accept(pqPartVisitor);
-
-
-
-
-         //boundary conditions grid
-         {
-            UbSchedulerPtr geoSch(new UbScheduler(1));
-            WriteBoundaryConditionsCoProcessorPtr ppgeo(
-               new WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
-            ppgeo->process(0);
-            ppgeo.reset();
-         }
-
-         if (myid == 0) UBLOG(logINFO, "Preprocess - end");
-      }
-      else
-      {
-         if (myid == 0)
-         {
+            if (myid == 0) {
+                stringstream logFilename;
+                logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt";
+                UbLog::output_policy::setStream(logFilename.str());
+            }
+        }
+
+        // Sleep(30000);
+
+        double rho_h=0, rho_l=0, r_rho=0, mu_h=0, /*mu_l,*/ Uo=0, D=0, sigma=0;
+
+        switch (caseN) {
+            case 1: 
+                //density of heavy fluid (kg/m^3)
+                rho_h = 848; 
+                //density of light fluid (kg/m^3)
+                rho_l = 34.5;
+                //density ratio
+                r_rho = rho_h / rho_l;
+                //dynamic viscosity of heavy fluid (Pa � s)
+                mu_h = 2.87e-3;
+                //dynamic viscosity of light fluid (Pa � s)
+                //mu_l = 1.97e-5;
+                //velocity (m/s)
+                Uo = 100;
+                //diameter of jet (m)
+                D = 0.0001;
+                //surface tension (N/m)
+                sigma = 0.03;
+                break;
+            case 2:
+                // density of heavy fluid (kg/m^3)
+                rho_h = 848;
+                // density of light fluid (kg/m^3)
+                rho_l = 1.205;
+                // density ratio
+                r_rho = rho_h / rho_l;
+                // dynamic viscosity of heavy fluid (Pa � s)
+                mu_h = 2.87e-3;
+                // dynamic viscosity of light fluid (Pa � s)
+                //mu_l = 1.84e-5;
+                // velocity (m/s)
+                Uo = 200;
+                // diameter of jet (m)
+                D = 0.0001;
+                // surface tension (N/m)
+                sigma = 0.03;
+                break;
+            case 3:
+                // density of heavy fluid (kg/m^3)
+                rho_h = 1000;
+                // density of light fluid (kg/m^3)
+                rho_l = 1.0;
+                // density ratio
+                r_rho = rho_h / rho_l;
+                // dynamic viscosity of heavy fluid (Pa � s)
+                mu_h = 2.87e-3;
+                // dynamic viscosity of light fluid (Pa � s)
+                //mu_l = 1.84e-5;
+                // velocity (m/s)
+                Uo = 200;
+                // diameter of jet (m)
+                D = 0.0001;
+                // surface tension (N/m)
+                sigma = 0.03;
+                break;                
+        }
+
+        double Re = rho_h * Uo * D / mu_h;
+        double We = rho_h * Uo * Uo * D / sigma;
+
+        double dx = D / D_LB;
+        double nu_h = U_LB * D_LB / Re;
+        double nu_l = nu_h;
+
+        double rho_h_LB = 1;
+        //surface tension
+        double sigma_LB = rho_h_LB * U_LB * U_LB * D_LB / We;
+
+        // LBMReal dLB = 0; // = length[1] / dx;
+        LBMReal rhoLB = 0.0;
+        //LBMReal nuLB = nu_l; //(uLB*dLB) / Re;
+
+        double beta = 12.0 * sigma_LB / interfaceWidth;
+        double kappa = 1.5 * interfaceWidth * sigma_LB;
+
+        if (myid == 0) {
             UBLOG(logINFO, "Parameters:");
-            UBLOG(logINFO, "uLb = " << uLB);
+            UBLOG(logINFO, "U_LB = " << U_LB);
             UBLOG(logINFO, "rho = " << rhoLB);
-            UBLOG(logINFO, "nuLb = " << nuLB);
+            UBLOG(logINFO, "nu_l = " << nu_l);
+            UBLOG(logINFO, "nu_h = " << nu_h);
             UBLOG(logINFO, "Re = " << Re);
+            UBLOG(logINFO, "We = " << We);
             UBLOG(logINFO, "dx = " << dx);
-            UBLOG(logINFO, "number of levels = " << refineLevel + 1);
+            UBLOG(logINFO, "sigma = " << sigma);
+            UBLOG(logINFO, "density ratio = " << r_rho);
+            // UBLOG(logINFO, "number of levels = " << refineLevel + 1);
             UBLOG(logINFO, "numOfThreads = " << numOfThreads);
             UBLOG(logINFO, "path = " << pathname);
-         }
-
-         rcp.restart((int)restartStep);
-         grid->setTimeStep(restartStep);
-
-         //BCAdapterPtr velBCAdapter(new VelocityBCAdapter());
-         //velBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new VelocityBCAlgorithm()));
-         //velBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new VelocityWithDensityBCAlgorithm()));
-         //bcVisitor.addBC(velBCAdapter);
-         //grid->accept(bcVisitor);
-
-         //set connectors
-         //InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor());
-         InterpolationProcessorPtr iProcessor(new CompressibleOffsetInterpolationProcessor());
-         SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor);
-         grid->accept(setConnsVisitor);
-
-         if (myid == 0) UBLOG(logINFO, "Restart - end");
-      }
-      UbSchedulerPtr visSch(new UbScheduler(outTime));
-      WriteMacroscopicQuantitiesCoProcessor pp(grid, visSch, pathname, WbWriterVtkXmlASCII::getInstance(), conv, comm);
-
-      UbSchedulerPtr nupsSch(new UbScheduler(10, 30, 100));
-      NUPSCounterCoProcessor npr(grid, nupsSch, numOfThreads, comm);
-
-
-
-
-
+        }
+
+        SPtr<LBMUnitConverter> conv(new LBMUnitConverter());
+
+        // const int baseLevel = 0;
+
+        SPtr<LBMKernel> kernel;
+
+        // kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel());
+        // kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel());
+        // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsCumulantLBMKernel());
+        // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel());
+        // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel());
+        //kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel());
+        kernel = SPtr<LBMKernel>(new MultiphaseSimpleVelocityBaseExternalPressureLBMKernel());
+
+        kernel->setWithForcing(true);
+        kernel->setForcingX1(0.0);
+        kernel->setForcingX2(0.0);
+        kernel->setForcingX3(0.0);
+
+        kernel->setPhiL(phiL);
+        kernel->setPhiH(phiH);
+        kernel->setPhaseFieldRelaxation(tauH);
+        kernel->setMobility(mob);
+
+        // nuL, nuG, densityRatio, beta, kappa, theta,
+
+        kernel->setCollisionFactorMultiphase(nu_h, nu_l);
+        kernel->setDensityRatio(r_rho);
+        kernel->setMultiphaseModelParameters(beta, kappa);
+        kernel->setContactAngle(theta);
+        kernel->setInterfaceWidth(interfaceWidth);
+        //dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(0.0);
+
+        SPtr<BCProcessor> bcProc(new BCProcessor());
+        // BCProcessorPtr bcProc(new ThinWallBCProcessor());
+
+        kernel->setBCProcessor(bcProc);
+
+        SPtr<Grid3D> grid(new Grid3D(comm));
+        // grid->setPeriodicX1(true);
+        // grid->setPeriodicX2(true);
+        // grid->setPeriodicX3(true);
+        grid->setGhostLayerWidth(2);
+
+        SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(
+            comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
+
+        //////////////////////////////////////////////////////////////////////////
+        // restart
+        SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
+        // SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
+        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
+        // SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        // rcp->setNu(nuLB);
+        // rcp->setNuLG(nuL, nuG);
+        // rcp->setDensityRatio(densityRatio);
+
+        rcp->setLBMKernel(kernel);
+        rcp->setBCProcessor(bcProc);
+        //////////////////////////////////////////////////////////////////////////
+        // BC Adapter
+        //////////////////////////////////////////////////////////////////////////////
+        mu::Parser fctF1;
+        // fctF1.SetExpr("vy1*(1-((x1-x0)^2+(x3-z0)^2)/(R^2))");
+        // fctF1.SetExpr("vy1*(1-(sqrt((x1-x0)^2+(x3-z0)^2)/R))^0.1");
+        fctF1.SetExpr("vy1");
+        fctF1.DefineConst("vy1", 0.0);
+        fctF1.DefineConst("R", 8.0);
+        fctF1.DefineConst("x0", 0.0);
+        fctF1.DefineConst("z0", 0.0);
+        // SPtr<BCAdapter> velBCAdapterF1(
+        //    new MultiphaseVelocityBCAdapter(false, true, false, fctF1, phiH, 0.0, BCFunction::INFCONST));
+
+        mu::Parser fctF2;
+        fctF2.SetExpr("vy1");
+        fctF2.DefineConst("vy1", U_LB);
+
+        double startTime = 1;
+        SPtr<BCAdapter> velBCAdapterF1(
+            new MultiphaseVelocityBCAdapter(true, false, false, fctF1, phiH, 0.0, startTime));
+        SPtr<BCAdapter> velBCAdapterF2(
+            new MultiphaseVelocityBCAdapter(true, false, false, fctF2, phiH, startTime, endTime));
+
+        SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+        noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+
+        SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
+        denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm()));
+
+        mu::Parser fctPhi_F1;
+        fctPhi_F1.SetExpr("phiH");
+        fctPhi_F1.DefineConst("phiH", phiH);
+
+        mu::Parser fctPhi_F2;
+        fctPhi_F2.SetExpr("phiL");
+        fctPhi_F2.DefineConst("phiL", phiL);
+
+        mu::Parser fctvel_F2_init;
+        fctvel_F2_init.SetExpr("U");
+        fctvel_F2_init.DefineConst("U", 0);
+
+        velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
+        //////////////////////////////////////////////////////////////////////////////////
+        // BC visitor
+        MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
+        bcVisitor.addBC(noSlipBCAdapter);
+        bcVisitor.addBC(denBCAdapter); // Ohne das BB?
+        bcVisitor.addBC(velBCAdapterF1);
+
+        //SPtr<D3Q27Interactor> inflowF1Int;
+        //SPtr<D3Q27Interactor> cylInt;
+
+        SPtr<D3Q27Interactor> inflowInt;
+
+        if (newStart) {
+
+            //  if (newStart) {
+
+            // bounding box
+            double g_minX1 = 0;
+            double g_minX2 = 0;
+            double g_minX3 = 0;
+
+            //double g_maxX1 = 8.0*D;
+            //double g_maxX2 = 2.5*D;
+            //double g_maxX3 = 2.5*D;
+
+             double g_maxX1 = 1.0 * D; // 8.0 * D;
+             double g_maxX2 = 2.0 * D;
+             double g_maxX3 = 2.0 * D;
+
+            // geometry
+            SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3));
+            if (myid == 0)
+                GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube",
+                                           WbWriterVtkXmlBinary::getInstance());
+
+            //if (myid == 0)
+            //    UBLOG(logINFO, "Read geoFile:start");
+            //SPtr<GbTriFaceMesh3D> cylinder = make_shared<GbTriFaceMesh3D>();
+            //cylinder->readMeshFromSTLFileBinary(pathGeo + "/" + geoFile, false);
+            //GbSystem3D::writeGeoObject(cylinder.get(), pathname + "/geo/Stlgeo", WbWriterVtkXmlBinary::getInstance());
+            //if (myid == 0)
+            //    UBLOG(logINFO, "Read geoFile:stop");
+            // inflow
+            // GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1, g_minX2 - 0.5 * dx, g_minX3, g_maxX1, g_minX2 - 1.0 *
+            // dx, g_maxX3));
+            //GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1 * 0.5 - dx, g_minX2 - dx, g_minX3 * 0.5 - dx,
+            //                                         g_maxX1 * 0.5 + dx, g_minX2, g_maxX3 * 0.5 + dx));
+            //if (myid == 0)
+            //    GbSystem3D::writeGeoObject(geoInflowF1.get(), pathname + "/geo/geoInflowF1",
+            //                               WbWriterVtkXmlASCII::getInstance());
+
+            GbCylinder3DPtr geoInflow(new GbCylinder3D(g_minX1 - 2.0*dx, g_maxX2 / 2.0, g_maxX3 / 2.0, g_minX1,
+                                                       g_maxX2 / 2.0,
+                                                       g_maxX3 / 2.0, D / 2.0));
+            if (myid == 0)
+                GbSystem3D::writeGeoObject(geoInflow.get(), pathname + "/geo/geoInflow",
+                                           WbWriterVtkXmlASCII::getInstance());
+
+            GbCylinder3DPtr geoSolid(new GbCylinder3D(g_minX1 - 2.0 * dx, g_maxX2 / 2.0, g_maxX3 / 2.0, g_minX1-dx,
+                                                       g_maxX2 / 2.0, g_maxX3 / 2.0, 1.5*D / 2.0));
+            if (myid == 0)
+                GbSystem3D::writeGeoObject(geoSolid.get(), pathname + "/geo/geoSolid",
+                                           WbWriterVtkXmlASCII::getInstance());
+
+
+            // GbCylinder3DPtr cylinder2(
+            //    new GbCylinder3D(0.0, g_minX2 - 2.0 * dx / 2.0, 0.0, 0.0, g_minX2 + 4.0 * dx, 0.0, 8.0+2.0*dx));
+            // if (myid == 0)
+            //    GbSystem3D::writeGeoObject(cylinder2.get(), pathname + "/geo/cylinder2",
+            //                               WbWriterVtkXmlASCII::getInstance());
+            // outflow
+            // GbCuboid3DPtr geoOutflow(new GbCuboid3D(-1.0, -1, -1.0, 121.0, 1.0, 121.0)); // For JetBreakup (Original)
+            // GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_minX1, g_maxX2 - 40 * dx, g_minX3, g_maxX1, g_maxX2, g_maxX3));
+            GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_maxX1, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3));
+            if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname + "/geo/geoOutflow",                                         WbWriterVtkXmlASCII::getInstance());
+
+            // double blockLength = blocknx[0] * dx;
+
+            if (myid == 0) {
+                UBLOG(logINFO, "Preprocess - start");
+            }
 
-      //UbSchedulerPtr bcSch(new UbScheduler(1, 12000, 12000));
-      //TimeDependentBCCoProcessorPtr inflowF2 (new TimeDependentBCCoProcessor(grid,bcSch));
-      //inflowF2->addInteractor(inflowF2_1Int);
-      //inflowF2->addInteractor(inflowF2_2Int);
+            grid->setDeltaX(dx);
+            grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]);
+
+            grid->setPeriodicX1(false);
+            grid->setPeriodicX2(false);
+            grid->setPeriodicX3(false);
+
+            GenBlocksGridVisitor genBlocks(gridCube);
+            grid->accept(genBlocks);
+
+            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+                grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+
+            //SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBCAdapter,
+            //                                                        Interactor3D::SOLID, Interactor3D::POINTS));
+
+            // inflowF1Int =
+            //    SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            // inflowF1Int->addBCAdapter(velBCAdapterF2);
+
+            SPtr<D3Q27Interactor> outflowInt(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
+
+            // Create boundary conditions geometry
+            GbCuboid3DPtr wallXmin(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_minX1, g_maxX2 + 2.0*dx, g_maxX3));
+            GbSystem3D::writeGeoObject(wallXmin.get(), pathname + "/geo/wallXmin", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallXmax(
+                new GbCuboid3D(g_maxX1, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3));
+            GbSystem3D::writeGeoObject(wallXmax.get(), pathname + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallZmin(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_minX3));
+            GbSystem3D::writeGeoObject(wallZmin.get(), pathname + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallZmax(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_maxX3, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3 + 2.0*dx));
+            GbSystem3D::writeGeoObject(wallZmax.get(), pathname + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallYmin(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_minX2, g_maxX3));
+            GbSystem3D::writeGeoObject(wallYmin.get(), pathname + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallYmax(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_maxX2, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3));
+            GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance());
+
+            // Add boundary conditions to grid generator
+            SPtr<D3Q27Interactor> wallXminInt(
+                new D3Q27Interactor(wallXmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallXmaxInt(
+                new D3Q27Interactor(wallXmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallZminInt(
+                new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallZmaxInt(
+                new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYminInt(
+                new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYmaxInt(
+                new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+            //cylInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, velBCAdapterF1, Interactor3D::SOLID));
+            //cylInt->addBCAdapter(velBCAdapterF2);
+            // SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBCAdapter,
+            // Interactor3D::SOLID));
+
+            inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapterF1, Interactor3D::SOLID));
+            inflowInt->addBCAdapter(velBCAdapterF2);
+
+            SPtr<D3Q27Interactor> solidInt =
+                SPtr<D3Q27Interactor>(new D3Q27Interactor(geoSolid, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+            InteractorsHelper intHelper(grid, metisVisitor, true);
+            //intHelper.addInteractor(cylInt);
+            //intHelper.addInteractor(tubes);
+            intHelper.addInteractor(outflowInt);
+            // intHelper.addInteractor(cyl2Int);
+
+            intHelper.addInteractor(wallXminInt);
+            //intHelper.addInteractor(wallXmaxInt);
+            intHelper.addInteractor(wallZminInt);
+            intHelper.addInteractor(wallZmaxInt);
+            intHelper.addInteractor(wallYminInt);
+            intHelper.addInteractor(wallYmaxInt);
+            intHelper.addInteractor(inflowInt);
+            //intHelper.addInteractor(solidInt);
+
+            intHelper.selectBlocks();
+
+            ppblocks->process(0);
+            ppblocks.reset();
+
+            unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
+            int ghostLayer = 3;
+            unsigned long long numberOfNodesPerBlock =
+                (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]);
+            unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock;
+            unsigned long long numberOfNodesPerBlockWithGhostLayer =
+                numberOfBlocks * (blocknx[0] + ghostLayer) * (blocknx[1] + ghostLayer) * (blocknx[2] + ghostLayer);
+            double needMemAll =
+                double(numberOfNodesPerBlockWithGhostLayer * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4));
+            double needMem = needMemAll / double(comm->getNumberOfProcesses());
+
+            if (myid == 0) {
+                UBLOG(logINFO, "Number of blocks = " << numberOfBlocks);
+                UBLOG(logINFO, "Number of nodes  = " << numberOfNodes);
+                int minInitLevel = grid->getCoarsestInitializedLevel();
+                int maxInitLevel = grid->getFinestInitializedLevel();
+                for (int level = minInitLevel; level <= maxInitLevel; level++) {
+                    int nobl = grid->getNumberOfBlocks(level);
+                    UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl);
+                    UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock);
+                }
+                UBLOG(logINFO, "Necessary memory  = " << needMemAll << " bytes");
+                UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes");
+                UBLOG(logINFO, "Available memory per process = " << availMem << " bytes");
+            }
 
-       //CalculationManagerPtr calculation(new CalculationManager(grid, numOfThreads, endTime, visSch,CalculationManager::MPI));
-      CalculationManagerPtr calculation(new CalculationManager(grid, numOfThreads, endTime, visSch));
-      if (myid == 0) UBLOG(logINFO, "Simulation-start");
-      calculation->calculate();
-      if (myid == 0) UBLOG(logINFO, "Simulation-end");
-   }
-   catch (std::exception& e)
-   {
-      cerr << e.what() << endl << flush;
-   }
-   catch (std::string& s)
-   {
-      cerr << s << endl;
-   }
-   catch (...)
-   {
-      cerr << "unknown exception" << endl;
-   }
+            MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nu_h, nu_l, availMem, needMem);
+
+            grid->accept(kernelVisitor);
+
+            //if (refineLevel > 0) {
+            //    SetUndefinedNodesBlockVisitor undefNodesVisitor;
+            //    grid->accept(undefNodesVisitor);
+            //}
+
+            intHelper.setBC();
+
+            // initialization of distributions
+            //mu::Parser fct1;
+            //fct1.SetExpr("phiL");
+            //fct1.DefineConst("phiL", phiL);
+            LBMReal x1c = 0;  // (g_maxX1 - g_minX1-1)/2; //
+            LBMReal x2c = (g_maxX2 - g_minX2)/2;
+            LBMReal x3c = (g_maxX3 - g_minX3)/2;
+            
+            mu::Parser fct1;
+            fct1.SetExpr("0.5-0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)");
+            fct1.DefineConst("x1c", x1c);
+            fct1.DefineConst("x2c", x2c);
+            fct1.DefineConst("x3c", x3c);
+            fct1.DefineConst("radius", 0.5*D);
+            fct1.DefineConst("interfaceThickness", interfaceWidth*dx);
+
+            MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor;
+            initVisitor.setPhi(fct1);
+            grid->accept(initVisitor);
+            ///////////////////////////////////////////////////////////////////////////////////////////
+            //{
+            // std::vector<std::vector<SPtr<Block3D>>> blockVector;
+            // int gridRank = comm->getProcessID();
+            // int minInitLevel = grid->getCoarsestInitializedLevel();
+            // int maxInitLevel = grid->getFinestInitializedLevel();
+            // blockVector.resize(maxInitLevel + 1);
+            // for (int level = minInitLevel; level <= maxInitLevel; level++) {
+            //    grid->getBlocks(level, gridRank, true, blockVector[level]);
+            //}
+            //    for (int level = minInitLevel; level <= maxInitLevel; level++) {
+            //    for (SPtr<Block3D> block : blockVector[level]) {
+            //        if (block) {
+            //            int ix1 = block->getX1();
+            //            int ix2 = block->getX2();
+            //            int ix3 = block->getX3();
+            //            int level = block->getLevel();
+
+            //            for (int dir = 0; dir < D3Q27System::ENDDIR; dir++) {
+            //                SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level);
+
+            //                if (!neighBlock) {
+
+            //                }
+            //            }
+            //        }
+            //    }
+            //}
+            //    SPtr<Block3D> block = grid->getBlock(0, 0, 0, 0);
+            //    SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel());
+            //    SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+
+            //    for (int ix3 = 0; ix3 <= 13; ix3++) {
+            //        for (int ix2 = 0; ix2 <= 13; ix2++) {
+            //            for (int ix1 = 0; ix1 <= 13; ix1++) {
+            //                if (ix1 == 0 || ix2 == 0 || ix3 == 0 || ix1 == 13 || ix2 == 13 || ix3 == 13)
+            //                    bcArray->setUndefined(ix1, ix2, ix3);
+            //            }
+            //        }
+            //    }
+            //}
+            ////////////////////////////////////////////////////////////////////////////////////////////
+            // boundary conditions grid
+            {
+                SPtr<UbScheduler> geoSch(new UbScheduler(1));
+                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                    grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+                ppgeo->process(0);
+                ppgeo.reset();
+            }
 
+            if (myid == 0)
+                UBLOG(logINFO, "Preprocess - end");
+        } else {
+            rcp->restart((int)restartStep);
+            grid->setTimeStep(restartStep);
+
+            if (myid == 0)
+                UBLOG(logINFO, "Restart - end");
+        }
+        
+        //  TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
+        //  grid->accept(setConnsVisitor);
+
+        // ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
+
+        grid->accept(bcVisitor);
+
+        ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+        //TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+        grid->accept(setConnsVisitor);
+
+        SPtr<UbScheduler> visSch(new UbScheduler(outTime));
+        double t_ast, t;
+        t_ast = 7.19;
+        t = (int)(t_ast/(U_LB/(D_LB)));
+        visSch->addSchedule(t,t,t); //t=7.19
+        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
+            grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+        pp->process(0);
+
+        SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
+        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+
+        SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
+        auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
+        timeDepBC->addInteractor(inflowInt);
+
+#ifdef _OPENMP
+        omp_set_num_threads(numOfThreads);
+#endif
+
+        SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
+        SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
+        calculator->addCoProcessor(npr);
+        calculator->addCoProcessor(pp);
+        calculator->addCoProcessor(timeDepBC);
+        calculator->addCoProcessor(rcp);
+
+        if (myid == 0)
+            UBLOG(logINFO, "Simulation-start");
+        calculator->calculate();
+        if (myid == 0)
+            UBLOG(logINFO, "Simulation-end");
+    } catch (std::exception &e) {
+        cerr << e.what() << endl << flush;
+    } catch (std::string &s) {
+        cerr << s << endl;
+    } catch (...) {
+        cerr << "unknown exception" << endl;
+    }
 }
-int main(int argc, char* argv[])
+int main(int argc, char *argv[])
 {
-   //Sleep(30000);
-   if (argv != NULL)
-   {
-      if (argv[1] != NULL)
-      {
-         run(string(argv[1]));
-      }
-      else
-      {
-         cout << "Configuration file is missing!" << endl;
-      }
-   }
-
+    // Sleep(30000);
+    if (argv != NULL) {
+        if (argv[1] != NULL) {
+            run(string(argv[1]));
+        } else {
+            cout << "Configuration file is missing!" << endl;
+        }
+    }
 }
-
diff --git a/apps/cpu/JetBreakup/JetBreakup.cpp.new b/apps/cpu/JetBreakup/JetBreakup.cpp.new
new file mode 100644
index 0000000000000000000000000000000000000000..953a8dee8caf0e7972b79138c8480f1883ebdfec
--- /dev/null
+++ b/apps/cpu/JetBreakup/JetBreakup.cpp.new
@@ -0,0 +1,638 @@
+#include <iostream>
+#include <memory>
+#include <string>
+
+#include "VirtualFluids.h"
+
+using namespace std;
+
+void setInflowBC(double x1, double x2, double x3, double radius, int dir)
+{
+
+}
+
+void run(string configname)
+{
+    try {
+
+        // Sleep(30000);
+
+        vf::basics::ConfigurationFile config;
+        config.load(configname);
+
+        string pathname = config.getValue<string>("pathname");
+        //string pathGeo = config.getValue<string>("pathGeo");
+        //string geoFile = config.getValue<string>("geoFile");
+        int numOfThreads = config.getValue<int>("numOfThreads");
+        vector<int> blocknx = config.getVector<int>("blocknx");
+        //vector<double> boundingBox = config.getVector<double>("boundingBox");
+        // vector<double>  length = config.getVector<double>("length");
+        double U_LB = config.getValue<double>("U_LB");
+        // double uF2                         = config.getValue<double>("uF2");
+        //double nuL = config.getValue<double>("nuL");
+        //double nuG = config.getValue<double>("nuG");
+        //double densityRatio = config.getValue<double>("densityRatio");
+        //double sigma = config.getValue<double>("sigma");
+        int interfaceWidth = config.getValue<int>("interfaceWidth");
+        //double D          = config.getValue<double>("D");
+        double theta = config.getValue<double>("contactAngle");
+        double D_LB = config.getValue<double>("D_LB");
+        double phiL = config.getValue<double>("phi_L");
+        double phiH = config.getValue<double>("phi_H");
+        double tauH = config.getValue<double>("Phase-field Relaxation");
+        double mob = config.getValue<double>("Mobility");
+
+        double endTime = config.getValue<double>("endTime");
+        double outTime = config.getValue<double>("outTime");
+        double availMem = config.getValue<double>("availMem");
+        //int refineLevel = config.getValue<int>("refineLevel");
+        //double Re = config.getValue<double>("Re");
+        
+        bool logToFile = config.getValue<bool>("logToFile");
+        double restartStep = config.getValue<double>("restartStep");
+        double cpStart = config.getValue<double>("cpStart");
+        double cpStep = config.getValue<double>("cpStep");
+        bool newStart = config.getValue<bool>("newStart");
+
+
+
+        int caseN = config.getValue<int>("case");
+
+        SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+        int myid = comm->getProcessID();
+
+        if (myid == 0)
+            UBLOG(logINFO, "Jet Breakup: Start!");
+
+        if (logToFile) {
+#if defined(__unix__)
+            if (myid == 0) {
+                const char *str = pathname.c_str();
+                mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+            }
+#endif
+
+            if (myid == 0) {
+                stringstream logFilename;
+                logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt";
+                UbLog::output_policy::setStream(logFilename.str());
+            }
+        }
+
+        // Sleep(30000);
+
+        double rho_h, rho_l, r_rho, mu_h, mu_l, Uo, D, sigma;
+
+        switch (caseN) {
+            case 1: 
+                //density of heavy fluid (kg/m^3)
+                rho_h = 848; 
+                //density of light fluid (kg/m^3)
+                rho_l =  34.5;
+                //density ratio
+                r_rho = rho_h / rho_l;
+                //dynamic viscosity of heavy fluid (Pa � s)
+                mu_h = 2.87e-3;
+                //dynamic viscosity of light fluid (Pa � s)
+                mu_l = 1.97e-5;
+                //velocity (m/s)
+                Uo = 100;
+                //diameter of jet (m)
+                D = 0.0001;
+                //surface tension (N/m)
+                sigma = 0.03;
+                break;
+            case 2:
+                // density of heavy fluid (kg/m^3)
+                rho_h = 848;
+                // density of light fluid (kg/m^3)
+                rho_l = 1.205;
+                // density ratio
+                r_rho = rho_h / rho_l;
+                // dynamic viscosity of heavy fluid (Pa � s)
+                mu_h = 2.87e-3;
+                // dynamic viscosity of light fluid (Pa � s)
+                mu_l = 1.84e-5;
+                // velocity (m/s)
+                Uo = 200;
+                // diameter of jet (m)
+                D = 0.0001;
+                // surface tension (N/m)
+                sigma = 0.03;
+                break;
+            case 3:
+                // density of heavy fluid (kg/m^3)
+                rho_h = 1000;
+                // density of light fluid (kg/m^3)
+                rho_l = 1.0;
+                // density ratio
+                r_rho = rho_h / rho_l;
+                // dynamic viscosity of heavy fluid (Pa � s)
+                mu_h = 2.87e-3;
+                // dynamic viscosity of light fluid (Pa � s)
+                mu_l = 1.84e-5;
+                // velocity (m/s)
+                Uo = 200;
+                // diameter of jet (m)
+                D = 0.0001;
+                // surface tension (N/m)
+                sigma = 0.03;
+                break;
+        }
+
+        double Re = rho_h * Uo * D / mu_h;
+        double We = rho_h * Uo * Uo * D / sigma;
+
+        double dx = D / D_LB;
+        double nu_h = U_LB * D_LB / Re;
+        double nu_l = nu_h;
+
+        double rho_h_LB = 1;
+        //surface tension
+        double sigma_LB = rho_h_LB * U_LB * U_LB * D_LB / We;
+
+        // LBMReal dLB = 0; // = length[1] / dx;
+        LBMReal rhoLB = 0.0;
+        LBMReal nuLB = nu_l; //(uLB*dLB) / Re;
+
+        double beta = 12.0 * sigma_LB / interfaceWidth;
+        double kappa = 1.5 * interfaceWidth * sigma_LB;
+
+        if (myid == 0) {
+            UBLOG(logINFO, "Parameters:");
+            UBLOG(logINFO, "U_LB = " << U_LB);
+            UBLOG(logINFO, "rho = " << rhoLB);
+            UBLOG(logINFO, "nu_l = " << nu_l);
+            UBLOG(logINFO, "nu_h = " << nu_h);
+            UBLOG(logINFO, "Re = " << Re);
+            UBLOG(logINFO, "We = " << We);
+            UBLOG(logINFO, "dx = " << dx);
+            UBLOG(logINFO, "sigma = " << sigma);
+            UBLOG(logINFO, "density ratio = " << r_rho);
+            // UBLOG(logINFO, "number of levels = " << refineLevel + 1);
+            UBLOG(logINFO, "numOfThreads = " << numOfThreads);
+            UBLOG(logINFO, "path = " << pathname);
+        }
+
+        SPtr<LBMUnitConverter> conv(new LBMUnitConverter());
+
+        // const int baseLevel = 0;
+
+        SPtr<LBMKernel> kernel;
+
+        // kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel());
+        // kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel());
+        // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsCumulantLBMKernel());
+        // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel());
+        // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel());
+        kernel = SPtr<LBMKernel>(new MultiphaseSimpleVelocityBaseExternalPressureLBMKernel());
+        //kernel = SPtr<LBMKernel>(new MultiphaseVelocityBaseSplitDistributionLBMKernel());
+        //kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel());
+
+        kernel->setWithForcing(true);
+        kernel->setForcingX1(0.0);
+        kernel->setForcingX2(0.0);
+        kernel->setForcingX3(0.0);
+
+        kernel->setPhiL(phiL);
+        kernel->setPhiH(phiH);
+        kernel->setPhaseFieldRelaxation(tauH);
+        kernel->setMobility(mob);
+
+        // nuL, nuG, densityRatio, beta, kappa, theta,
+
+        kernel->setCollisionFactorMultiphase(nu_h, nu_l);
+        kernel->setDensityRatio(r_rho);
+        kernel->setMultiphaseModelParameters(beta, kappa);
+        kernel->setContactAngle(theta);
+        kernel->setInterfaceWidth(interfaceWidth);
+        //dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(0.0);
+
+        SPtr<BCProcessor> bcProc(new BCProcessor());
+        // BCProcessorPtr bcProc(new ThinWallBCProcessor());
+
+        kernel->setBCProcessor(bcProc);
+
+        SPtr<Grid3D> grid(new Grid3D(comm));
+        // grid->setPeriodicX1(true);
+        // grid->setPeriodicX2(true);
+        // grid->setPeriodicX3(true);
+        grid->setGhostLayerWidth(2);
+
+        SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(
+            comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::RECURSIVE));
+
+        //////////////////////////////////////////////////////////////////////////
+        // restart
+        SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
+        // SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
+        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
+        // SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        // rcp->setNu(nuLB);
+        // rcp->setNuLG(nuL, nuG);
+        // rcp->setDensityRatio(densityRatio);
+
+        rcp->setLBMKernel(kernel);
+        rcp->setBCProcessor(bcProc);
+        //////////////////////////////////////////////////////////////////////////
+        // BC Adapter
+        //////////////////////////////////////////////////////////////////////////////
+            // bounding box
+        double g_minX1 = 0;
+        double g_minX2 = 0;
+        double g_minX3 = 0;
+
+        double g_maxX1 = 8.0 * D;//8.0 * D;
+        double g_maxX2 = 5.0 * D;
+        double g_maxX3 = 5.0 * D;
+
+        //double g_maxX1 = 1.0 * D; // 8.0 * D;
+        //double g_maxX2 = 2.0 * D;
+        //double g_maxX3 = 2.0 * D;
+
+
+        LBMReal x1c = 0;  // (g_maxX1 - g_minX1-1)/2; //
+        LBMReal x2c = (g_maxX2 - g_minX2) / 2;
+        LBMReal x3c = (g_maxX3 - g_minX3) / 2;
+        
+        mu::Parser fctF1;
+        // fctF1.SetExpr("vy1*(1-((x1-x0)^2+(x3-z0)^2)/(R^2))");
+        // fctF1.SetExpr("vy1*(1-(sqrt((x1-x0)^2+(x3-z0)^2)/R))^0.1");
+        fctF1.SetExpr("vy1");
+        fctF1.DefineConst("vy1", 0.0);
+        fctF1.DefineConst("R", 8.0);
+        fctF1.DefineConst("x0", 0.0);
+        fctF1.DefineConst("z0", 0.0);
+        // SPtr<BCAdapter> velBCAdapterF1(
+        //    new MultiphaseVelocityBCAdapter(false, true, false, fctF1, phiH, 0.0, BCFunction::INFCONST));
+
+        mu::Parser fctF2;
+        fctF2.SetExpr("vy1");//*(1-(sqrt((x2-x2c)*(x2-x2c)+(x3-x3c)*(x3-x3c))/R))");
+        fctF2.DefineConst("vy1", U_LB);
+        fctF2.DefineConst("R", D*0.5);
+        fctF2.DefineConst("x1c", x1c);
+        fctF2.DefineConst("x2c", x2c);
+        fctF2.DefineConst("x3c", x3c);
+
+
+        double startTime = 1;
+        SPtr<BCAdapter> velBCAdapterF1(
+            new MultiphaseVelocityBCAdapter(true, false, false, fctF1, phiH, 0.0, startTime));
+        SPtr<BCAdapter> velBCAdapterF2(
+            new MultiphaseVelocityBCAdapter(true, false, false, fctF2, phiH, startTime, endTime));
+
+        SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+        noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+
+        SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
+        denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm()));
+
+        mu::Parser fctPhi_F1;
+        fctPhi_F1.SetExpr("phiH");
+        fctPhi_F1.DefineConst("phiH", phiH);
+
+        mu::Parser fctPhi_F2;
+        fctPhi_F2.SetExpr("phiL");
+        fctPhi_F2.DefineConst("phiL", phiL);
+
+        mu::Parser fctvel_F2_init;
+        fctvel_F2_init.SetExpr("U");
+        fctvel_F2_init.DefineConst("U", 0);
+
+        velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
+        //////////////////////////////////////////////////////////////////////////////////
+        // BC visitor
+        MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
+        bcVisitor.addBC(noSlipBCAdapter);
+        bcVisitor.addBC(denBCAdapter); // Ohne das BB?
+        bcVisitor.addBC(velBCAdapterF1);
+
+        //SPtr<D3Q27Interactor> inflowF1Int;
+        //SPtr<D3Q27Interactor> cylInt;
+
+        SPtr<D3Q27Interactor> inflowInt;
+
+        if (newStart) {
+
+            //  if (newStart) {
+
+
+
+
+
+            // geometry
+            SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3));
+            if (myid == 0)
+                GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube",
+                                           WbWriterVtkXmlBinary::getInstance());
+
+            //if (myid == 0)
+            //    UBLOG(logINFO, "Read geoFile:start");
+            //SPtr<GbTriFaceMesh3D> cylinder = make_shared<GbTriFaceMesh3D>();
+            //cylinder->readMeshFromSTLFileBinary(pathGeo + "/" + geoFile, false);
+            //GbSystem3D::writeGeoObject(cylinder.get(), pathname + "/geo/Stlgeo", WbWriterVtkXmlBinary::getInstance());
+            //if (myid == 0)
+            //    UBLOG(logINFO, "Read geoFile:stop");
+            // inflow
+            // GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1, g_minX2 - 0.5 * dx, g_minX3, g_maxX1, g_minX2 - 1.0 *
+            // dx, g_maxX3));
+            //GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1 * 0.5 - dx, g_minX2 - dx, g_minX3 * 0.5 - dx,
+            //                                         g_maxX1 * 0.5 + dx, g_minX2, g_maxX3 * 0.5 + dx));
+            //if (myid == 0)
+            //    GbSystem3D::writeGeoObject(geoInflowF1.get(), pathname + "/geo/geoInflowF1",
+            //                               WbWriterVtkXmlASCII::getInstance());
+
+            GbCylinder3DPtr geoInflow(new GbCylinder3D(g_minX1 - 2.0*dx, g_maxX2 / 2.0, g_maxX3 / 2.0, g_minX1,
+                                                       g_maxX2 / 2.0,
+                                                       g_maxX3 / 2.0, D / 2.0));
+            if (myid == 0)
+                GbSystem3D::writeGeoObject(geoInflow.get(), pathname + "/geo/geoInflow",
+                                           WbWriterVtkXmlASCII::getInstance());
+
+            GbCylinder3DPtr geoSolid(new GbCylinder3D(g_minX1 - 2.0 * dx, g_maxX2 / 2.0, g_maxX3 / 2.0, g_minX1-dx,
+                                                       g_maxX2 / 2.0, g_maxX3 / 2.0, 1.5*D / 2.0));
+            if (myid == 0)
+                GbSystem3D::writeGeoObject(geoSolid.get(), pathname + "/geo/geoSolid",
+                                           WbWriterVtkXmlASCII::getInstance());
+
+
+            // GbCylinder3DPtr cylinder2(
+            //    new GbCylinder3D(0.0, g_minX2 - 2.0 * dx / 2.0, 0.0, 0.0, g_minX2 + 4.0 * dx, 0.0, 8.0+2.0*dx));
+            // if (myid == 0)
+            //    GbSystem3D::writeGeoObject(cylinder2.get(), pathname + "/geo/cylinder2",
+            //                               WbWriterVtkXmlASCII::getInstance());
+            // outflow
+            // GbCuboid3DPtr geoOutflow(new GbCuboid3D(-1.0, -1, -1.0, 121.0, 1.0, 121.0)); // For JetBreakup (Original)
+            // GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_minX1, g_maxX2 - 40 * dx, g_minX3, g_maxX1, g_maxX2, g_maxX3));
+            GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_maxX1, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3));
+            if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname + "/geo/geoOutflow",                                         WbWriterVtkXmlASCII::getInstance());
+
+            // double blockLength = blocknx[0] * dx;
+
+            if (myid == 0) {
+                UBLOG(logINFO, "Preprocess - start");
+            }
+
+            grid->setDeltaX(dx);
+            grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]);
+
+            grid->setPeriodicX1(false);
+            grid->setPeriodicX2(false);
+            grid->setPeriodicX3(false);
+
+            GenBlocksGridVisitor genBlocks(gridCube);
+            grid->accept(genBlocks);
+
+            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+                grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+
+            //SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBCAdapter,
+            //                                                        Interactor3D::SOLID, Interactor3D::POINTS));
+
+            // inflowF1Int =
+            //    SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            // inflowF1Int->addBCAdapter(velBCAdapterF2);
+
+            SPtr<D3Q27Interactor> outflowInt(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
+
+            // Create boundary conditions geometry
+            GbCuboid3DPtr wallXmin(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_minX1, g_maxX2 + 2.0*dx, g_maxX3));
+            GbSystem3D::writeGeoObject(wallXmin.get(), pathname + "/geo/wallXmin", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallXmax(
+                new GbCuboid3D(g_maxX1, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3));
+            GbSystem3D::writeGeoObject(wallXmax.get(), pathname + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallZmin(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_minX3));
+            GbSystem3D::writeGeoObject(wallZmin.get(), pathname + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallZmax(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_maxX3, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3 + 2.0*dx));
+            GbSystem3D::writeGeoObject(wallZmax.get(), pathname + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallYmin(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_minX2, g_maxX3));
+            GbSystem3D::writeGeoObject(wallYmin.get(), pathname + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallYmax(
+                new GbCuboid3D(g_minX1 - 2.0*dx, g_maxX2, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3));
+            GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance());
+
+            // Add boundary conditions to grid generator
+            SPtr<D3Q27Interactor> wallXminInt(
+                new D3Q27Interactor(wallXmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallXmaxInt(
+                new D3Q27Interactor(wallXmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallZminInt(
+                new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallZmaxInt(
+                new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYminInt(
+                new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYmaxInt(
+                new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+            //cylInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, velBCAdapterF1, Interactor3D::SOLID));
+            //cylInt->addBCAdapter(velBCAdapterF2);
+            // SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBCAdapter,
+            // Interactor3D::SOLID));
+
+            inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapterF1, Interactor3D::SOLID));
+            inflowInt->addBCAdapter(velBCAdapterF2);
+
+            SPtr<D3Q27Interactor> solidInt =
+                SPtr<D3Q27Interactor>(new D3Q27Interactor(geoSolid, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+            InteractorsHelper intHelper(grid, metisVisitor, true);
+            //intHelper.addInteractor(cylInt);
+            //intHelper.addInteractor(tubes);
+            intHelper.addInteractor(outflowInt);
+            // intHelper.addInteractor(cyl2Int);
+
+            intHelper.addInteractor(wallXminInt);
+            //intHelper.addInteractor(wallXmaxInt);
+            intHelper.addInteractor(wallZminInt);
+            intHelper.addInteractor(wallZmaxInt);
+            intHelper.addInteractor(wallYminInt);
+            intHelper.addInteractor(wallYmaxInt);
+            intHelper.addInteractor(inflowInt);
+            //intHelper.addInteractor(solidInt);
+
+            intHelper.selectBlocks();
+
+            ppblocks->process(0);
+            ppblocks.reset();
+
+            unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
+            int ghostLayer = 3;
+            unsigned long long numberOfNodesPerBlock =
+                (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]);
+            unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock;
+            unsigned long long numberOfNodesPerBlockWithGhostLayer =
+                numberOfBlocks * (blocknx[0] + ghostLayer) * (blocknx[1] + ghostLayer) * (blocknx[2] + ghostLayer);
+            double needMemAll =
+                double(numberOfNodesPerBlockWithGhostLayer * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4));
+            double needMem = needMemAll / double(comm->getNumberOfProcesses());
+
+            if (myid == 0) {
+                UBLOG(logINFO, "Number of blocks = " << numberOfBlocks);
+                UBLOG(logINFO, "Number of nodes  = " << numberOfNodes);
+                int minInitLevel = grid->getCoarsestInitializedLevel();
+                int maxInitLevel = grid->getFinestInitializedLevel();
+                for (int level = minInitLevel; level <= maxInitLevel; level++) {
+                    int nobl = grid->getNumberOfBlocks(level);
+                    UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl);
+                    UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock);
+                }
+                UBLOG(logINFO, "Necessary memory  = " << needMemAll << " bytes");
+                UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes");
+                UBLOG(logINFO, "Available memory per process = " << availMem << " bytes");
+            }
+
+            MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nu_h, nu_l,0,0,0,0, availMem, needMem);
+
+            grid->accept(kernelVisitor);
+
+            //if (refineLevel > 0) {
+            //    SetUndefinedNodesBlockVisitor undefNodesVisitor;
+            //    grid->accept(undefNodesVisitor);
+            //}
+
+            intHelper.setBC();
+
+            // initialization of distributions
+            //mu::Parser fct1;
+            //fct1.SetExpr("phiL");
+            //fct1.DefineConst("phiL", phiL);
+            
+            mu::Parser fct1;
+            fct1.SetExpr(" 0.5 - 0.5 * tanh(2 * (sqrt((x1 - x1c) ^ 2 + (x2 - x2c) ^ 2 + (x3 - x3c) ^ 2) - radius) / interfaceThickness)");
+            fct1.DefineConst("x1c", x1c);
+            fct1.DefineConst("x2c", x2c);
+            fct1.DefineConst("x3c", x3c);
+            fct1.DefineConst("radius", 0.5*D);
+            fct1.DefineConst("interfaceThickness", interfaceWidth*dx);
+
+            MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor;
+            initVisitor.setPhi(fct1);
+            grid->accept(initVisitor);
+            ///////////////////////////////////////////////////////////////////////////////////////////
+            //{
+            // std::vector<std::vector<SPtr<Block3D>>> blockVector;
+            // int gridRank = comm->getProcessID();
+            // int minInitLevel = grid->getCoarsestInitializedLevel();
+            // int maxInitLevel = grid->getFinestInitializedLevel();
+            // blockVector.resize(maxInitLevel + 1);
+            // for (int level = minInitLevel; level <= maxInitLevel; level++) {
+            //    grid->getBlocks(level, gridRank, true, blockVector[level]);
+            //}
+            //    for (int level = minInitLevel; level <= maxInitLevel; level++) {
+            //    for (SPtr<Block3D> block : blockVector[level]) {
+            //        if (block) {
+            //            int ix1 = block->getX1();
+            //            int ix2 = block->getX2();
+            //            int ix3 = block->getX3();
+            //            int level = block->getLevel();
+
+            //            for (int dir = 0; dir < D3Q27System::ENDDIR; dir++) {
+            //                SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level);
+
+            //                if (!neighBlock) {
+
+            //                }
+            //            }
+            //        }
+            //    }
+            //}
+            //    SPtr<Block3D> block = grid->getBlock(0, 0, 0, 0);
+            //    SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel());
+            //    SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+
+            //    for (int ix3 = 0; ix3 <= 13; ix3++) {
+            //        for (int ix2 = 0; ix2 <= 13; ix2++) {
+            //            for (int ix1 = 0; ix1 <= 13; ix1++) {
+            //                if (ix1 == 0 || ix2 == 0 || ix3 == 0 || ix1 == 13 || ix2 == 13 || ix3 == 13)
+            //                    bcArray->setUndefined(ix1, ix2, ix3);
+            //            }
+            //        }
+            //    }
+            //}
+            ////////////////////////////////////////////////////////////////////////////////////////////
+            // boundary conditions grid
+            {
+                SPtr<UbScheduler> geoSch(new UbScheduler(1));
+                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                    grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+                ppgeo->process(0);
+                ppgeo.reset();
+            }
+
+            if (myid == 0)
+                UBLOG(logINFO, "Preprocess - end");
+        } else {
+            rcp->restart((int)restartStep);
+            grid->setTimeStep(restartStep);
+
+            if (myid == 0)
+                UBLOG(logINFO, "Restart - end");
+        }
+        
+        //  TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
+        //  grid->accept(setConnsVisitor);
+
+        // ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
+
+        grid->accept(bcVisitor);
+
+         ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+        //TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+        grid->accept(setConnsVisitor);
+
+        SPtr<UbScheduler> visSch(new UbScheduler(outTime));
+        double t_ast, t;
+        t_ast = 7.19;
+        t = (int)(t_ast/(U_LB/(D_LB)));
+        visSch->addSchedule(t,t,t); //t=7.19
+        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
+            grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+        pp->process(0);
+
+        SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
+        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+
+        SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
+        auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
+        timeDepBC->addInteractor(inflowInt);
+
+#ifdef _OPENMP
+        omp_set_num_threads(numOfThreads);
+#endif
+
+        SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
+        SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
+        calculator->addCoProcessor(npr);
+        calculator->addCoProcessor(pp);
+        calculator->addCoProcessor(timeDepBC);
+        calculator->addCoProcessor(rcp);
+
+        if (myid == 0)
+            UBLOG(logINFO, "Simulation-start");
+        calculator->calculate();
+        if (myid == 0)
+            UBLOG(logINFO, "Simulation-end");
+    } catch (std::exception &e) {
+        cerr << e.what() << endl << flush;
+    } catch (std::string &s) {
+        cerr << s << endl;
+    } catch (...) {
+        cerr << "unknown exception" << endl;
+    }
+}
+int main(int argc, char *argv[])
+{
+    // Sleep(30000);
+    if (argv != NULL) {
+        if (argv[1] != NULL) {
+            run(string(argv[1]));
+        } else {
+            cout << "Configuration file is missing!" << endl;
+        }
+    }
+}
diff --git a/apps/cpu/LaminarTubeFlow/ltf.cfg b/apps/cpu/LaminarTubeFlow/ltf.cfg
index 8b8e33e4998835da80d2121925acc7d95c3ccd20..110b99d35005d90bfc869ff4f962b2e55560d543 100644
--- a/apps/cpu/LaminarTubeFlow/ltf.cfg
+++ b/apps/cpu/LaminarTubeFlow/ltf.cfg
@@ -17,10 +17,10 @@ Re = 10
 logToFile = false
 
 newStart = true
-restartStep = 100000
+restartStep = 10
 
-cpStart = 100000
-cpStep = 100000
+cpStart = 1000
+cpStep = 1000
 
-outTime = 1000
+outTime = 10
 endTime = 1000
\ No newline at end of file
diff --git a/apps/cpu/LaminarTubeFlow/ltf.cpp b/apps/cpu/LaminarTubeFlow/ltf.cpp
index c8951903084ccacf208718f25948206b1c98c1ab..93fd31083a1da92bc5fb73bb0606c7a8121bb5b8 100644
--- a/apps/cpu/LaminarTubeFlow/ltf.cpp
+++ b/apps/cpu/LaminarTubeFlow/ltf.cpp
@@ -72,27 +72,28 @@ void run(string configname)
       noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
 
       SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
-      //denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm()));
-      denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
+      denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm()));
+      //denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
 
-      double startTime = 5;
+      //double startTime = 5;
       mu::Parser fct1;
       fct1.SetExpr("U");
-      fct1.DefineConst("U", 0.00001);
-      SPtr<BCAdapter> velBCAdapter1(new VelocityBCAdapter(true, false, false, fct1, 0, startTime));
-      velBCAdapter1->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
+      fct1.DefineConst("U", uLB);
+      SPtr<BCAdapter> velBCAdapter1(new VelocityBCAdapter(true, false, false, fct1, 0, BCFunction::INFCONST));
+      //velBCAdapter1->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
+      velBCAdapter1->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
 
-      mu::Parser fct2;
-      fct2.SetExpr("U");
-      fct2.DefineConst("U", uLB);
-      SPtr<BCAdapter> velBCAdapter2(new VelocityBCAdapter(true, false, false, fct2, startTime, BCFunction::INFCONST));
+      //mu::Parser fct2;
+      //fct2.SetExpr("U");
+      //fct2.DefineConst("U", uLB);
+      //SPtr<BCAdapter> velBCAdapter2(new VelocityBCAdapter(true, false, false, fct2, startTime, BCFunction::INFCONST));
 
       //////////////////////////////////////////////////////////////////////////////////
       //BS visitor
       BoundaryConditionsBlockVisitor bcVisitor;
       bcVisitor.addBC(noSlipBCAdapter);
       bcVisitor.addBC(denBCAdapter);
-      //bcVisitor.addBC(velBCAdapter);
+      //bcVisitor.addBC(velBCAdapter1);
 
       SPtr<Grid3D> grid(new Grid3D(comm));
 
@@ -107,11 +108,16 @@ void run(string configname)
       kernel->setBCProcessor(bcProc);
 
       //////////////////////////////////////////////////////////////////////////
+      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M));
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> migCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, pathname + "/mig", comm));
+      //SPtr<MPIIOMigrationCoProcessor> migCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, pathname + "/mig", comm));
+      SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, metisVisitor, pathname + "/mig", comm));
       migCoProcessor->setLBMKernel(kernel);
       migCoProcessor->setBCProcessor(bcProc);
+      migCoProcessor->setNu(nuLB);
+      migCoProcessor->setNuLG(0.01, 0.01);
+      migCoProcessor->setDensityRatio(1);
       //////////////////////////////////////////////////////////////////////////
 
       SPtr<D3Q27Interactor> inflowInt;
@@ -157,7 +163,7 @@ void run(string configname)
          grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]);
 
          grid->setPeriodicX1(false);
-         grid->setPeriodicX2(true);
+         grid->setPeriodicX2(false);
          grid->setPeriodicX3(false);
 
          if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance());
@@ -208,13 +214,13 @@ void run(string configname)
          //velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
          
          inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapter1, Interactor3D::SOLID));
-         inflowInt->addBCAdapter(velBCAdapter2);
+         //inflowInt->addBCAdapter(velBCAdapter2);
 
 
          //outflow
          SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
 
-         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B));
+         //SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M));
          InteractorsHelper intHelper(grid, metisVisitor);
          intHelper.addInteractor(cylinderInt);
          intHelper.addInteractor(inflowInt);
@@ -313,9 +319,9 @@ void run(string configname)
       SPtr<UbScheduler> nupsSch(new UbScheduler(100, 100, 100000000));
       SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
 
-      SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
-      auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
-      timeDepBC->addInteractor(inflowInt);
+      //SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime));
+      //auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch));
+      //timeDepBC->addInteractor(inflowInt);
 
       omp_set_num_threads(numOfThreads);
       numOfThreads = 1;
@@ -324,7 +330,7 @@ void run(string configname)
       calculator->addCoProcessor(npr);
       calculator->addCoProcessor(pp);
       calculator->addCoProcessor(migCoProcessor);
-      calculator->addCoProcessor(timeDepBC);
+      //calculator->addCoProcessor(timeDepBC);
 
       if (myid == 0) VF_LOG_INFO("Simulation-start");
       calculator->calculate();
diff --git a/apps/cpu/LiggghtsApp/CMakeLists.txt b/apps/cpu/LiggghtsApp/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f3a2d925f1d082c8f2e9e52e31d8179fe82c9235
--- /dev/null
+++ b/apps/cpu/LiggghtsApp/CMakeLists.txt
@@ -0,0 +1,3 @@
+PROJECT(LiggghtsApp)
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} LiggghtsCoupling FILES LiggghtsApp.cpp )
diff --git a/apps/cpu/LiggghtsApp/LiggghtsApp.cpp b/apps/cpu/LiggghtsApp/LiggghtsApp.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b3c49ccaec94747efea9c28a1b1cb8a937c03444
--- /dev/null
+++ b/apps/cpu/LiggghtsApp/LiggghtsApp.cpp
@@ -0,0 +1,264 @@
+#include <iostream>
+#include <string>
+#include <memory>
+
+#include "VirtualFluids.h"
+
+//#include "lammps.h"
+//#include "input.h"
+//#include "atom.h"
+//#include "modify.h"
+//#include "fix_lb_coupling_onetoone.h"
+
+#include "LiggghtsCouplingCoProcessor.h"
+#include "LiggghtsCouplingWrapper.h"
+#include "IBcumulantK17LBMKernel.h"
+
+using namespace std;
+
+
+int main(int argc, char *argv[])
+{
+    //Sleep(30000);
+
+    std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+    int myid                                        = comm->getProcessID();
+
+
+    // bounding box
+    double g_minX1 = 0;
+    double g_minX2 = 0;
+    double g_minX3 = 0;
+
+    double g_maxX1 = 1;
+    double g_maxX2 = 1;
+    double g_maxX3 = 2;
+
+    int blockNX[3] = { 16, 16, 16 };
+
+    double dx = 1./32.;
+
+
+    double d_part = 0.25;
+    double r_p    = d_part / 2.0;
+
+    // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 1.480, 2060, r_p/dx);
+    // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, LBMUnitConverter::AIR_20C, r_p / dx);
+    // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 0.1, 1000, r_p / dx, 0.01);
+    SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 0.1, 1000, r_p / dx, 0.01);
+    //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, LBMUnitConverter::OIL, r_p / dx);
+    std::cout << units->toString() << std::endl;
+
+    //double Re   = 300;
+    double nuLB = 1e-2; // 5e-5;
+
+    SPtr<LBMKernel> kernel   = make_shared<IBcumulantK17LBMKernel>();
+    SPtr<BCProcessor> bcProc = make_shared<BCProcessor>();
+    kernel->setBCProcessor(bcProc);
+
+    SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+    noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
+    //////////////////////////////////////////////////////////////////////////////////
+    // BC visitor
+    BoundaryConditionsBlockVisitor bcVisitor;
+    bcVisitor.addBC(noSlipBCAdapter);
+
+
+
+
+    SPtr<Grid3D> grid = make_shared<Grid3D>(comm);
+    grid->setPeriodicX1(true);
+    grid->setPeriodicX2(true);
+    grid->setPeriodicX3(false);
+    grid->setDeltaX(dx);
+    grid->setBlockNX(blockNX[0], blockNX[1], blockNX[2]);
+
+    string outputPath = "d:/temp/LiggghtsCoupling";
+    UbSystem::makeDirectory(outputPath);
+    UbSystem::makeDirectory(outputPath + "/liggghts");
+
+    SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
+    
+    SPtr<GbObject3D> gridCube = make_shared <GbCuboid3D>(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3);
+    if (myid == 0)
+        GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance());
+
+    GenBlocksGridVisitor genBlocks(gridCube);
+    grid->accept(genBlocks);
+
+    SPtr<CoProcessor> ppblocks =
+        make_shared <WriteBlocksCoProcessor>(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
+                                                          WbWriterVtkXmlBinary::getInstance(), comm);
+    ppblocks->process(0);
+    ppblocks.reset();
+
+    double dx2 = 2.0 * dx;
+    GbCuboid3DPtr wallZmin(
+        new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_minX3));
+    GbSystem3D::writeGeoObject(wallZmin.get(), outputPath + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance());
+    GbCuboid3DPtr wallZmax(
+        new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_maxX3, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2));
+    GbSystem3D::writeGeoObject(wallZmax.get(), outputPath + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance());
+
+    SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+    SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+    InteractorsHelper intHelper(grid, metisVisitor, true);
+    intHelper.addInteractor(wallZminInt);
+    intHelper.addInteractor(wallZmaxInt);
+    intHelper.selectBlocks();
+
+    SetKernelBlockVisitor kernelVisitor(kernel, nuLB, 1e9, 1e9);
+    grid->accept(kernelVisitor);
+
+    intHelper.setBC();
+
+    InitDistributionsBlockVisitor initVisitor;
+    grid->accept(initVisitor);
+
+    SPtr<UbScheduler> lScheduler                    = make_shared<UbScheduler>(1);
+    string inFile1                                   = "d:/Projects/VirtualFluids_Develop/apps/cpu/LiggghtsApp/in.lbdem";
+    //string inFile1 = "d:/Tools/LIGGGHTS/examples/LIGGGHTS/Tutorials_public/chute_wear/in.chute_wear2";
+    string inFile2                                   = "d:/Projects/VirtualFluids_Develop/apps/cpu/LiggghtsApp/in2.lbdem";
+    MPI_Comm mpi_comm       = *(MPI_Comm*)(comm->getNativeCommunicator());
+    LiggghtsCouplingWrapper wrapper(argv, mpi_comm);
+
+
+    double v_frac = 0.1;
+    double dt_phys   = units->getFactorTimeLbToW();
+    int demSubsteps = 10;
+    double dt_dem   = dt_phys / (double)demSubsteps;
+    int vtkSteps    = 100;
+    string demOutDir = outputPath; //    "d:/temp/lll2/";
+
+    //wrapper.execCommand("echo none");
+
+    wrapper.setVariable("r_part", d_part / 2);
+    wrapper.setVariable("v_frac", v_frac);
+
+    wrapper.execFile((char*)inFile1.c_str());
+
+ 
+    //// set timestep and output directory
+    wrapper.setVariable("t_step", dt_dem);
+    wrapper.setVariable("dmp_stp", vtkSteps * demSubsteps);
+    wrapper.setVariable("dmp_dir", demOutDir);
+
+    wrapper.execFile((char *)inFile2.c_str());
+    wrapper.runUpto(demSubsteps - 1);
+
+  
+    SPtr<LiggghtsCouplingCoProcessor> lcCoProcessor =
+        make_shared<LiggghtsCouplingCoProcessor>(grid, lScheduler, comm, wrapper, demSubsteps, units);
+
+    // boundary conditions grid
+    {
+        SPtr<UbScheduler> geoSch(new UbScheduler(1));
+        SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+            grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+        ppgeo->process(0);
+        ppgeo.reset();
+    }
+
+    grid->accept(bcVisitor);
+
+    OneDistributionSetConnectorsBlockVisitor setConnsVisitor(comm);
+    grid->accept(setConnsVisitor);
+
+
+    // write data for visualization of macroscopic quantities
+    SPtr<UbScheduler> visSch(new UbScheduler(vtkSteps));
+    SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(
+        new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(),
+                                                  SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+
+    int endTime = 3000; //20;
+    SPtr<Calculator> calculator(new BasicCalculator(grid, lScheduler, endTime));
+    calculator->addCoProcessor(lcCoProcessor);
+    calculator->addCoProcessor(writeMQCoProcessor);
+
+    if (myid == 0) UBLOG(logINFO, "Simulation-start");
+    calculator->calculate();
+    if (myid == 0) UBLOG(logINFO, "Simulation-end");
+
+    //MPI_Init(&argc, &argv);
+    //MPI_Comm mpi_comm       = *(MPI_Comm*)(comm->getNativeCommunicator());
+    //LiggghtsCouplingWrapper wrapper(argv, mpi_comm);
+
+    //wrapper.execFile("in2.lbdem");
+    //wrapper.runUpto(demSubsteps - 1);
+
+	//LAMMPS_NS::LAMMPS *lmp;
+ //   // custom argument vector for LAMMPS library
+ //   const char *lmpargv[] {"liblammps", "-log", "none"};
+ //   int lmpargc = sizeof(lmpargv)/sizeof(const char *);
+
+ //   // explicitly initialize MPI
+ //   MPI_Init(&argc, &argv);
+
+ //   // create LAMMPS instance
+ //   lmp = new LAMMPS_NS::LAMMPS(lmpargc, (char **)lmpargv, MPI_COMM_WORLD);
+ //   lmp->input->file("in.lbdem");
+ //   //lmp->input->one("run 1");
+ //   
+ //   //# Try extracting a global value
+ //   //    print("")
+ //   //    print("Attempting to get the number of atoms in simulation")
+ //   //    numAtoms = lmp.extract_global("natoms", 0)
+ //   //    print("natoms =", numAtoms)
+
+ //   //    # Try extracting atom's positions
+ //   //    print("")
+ //   //    print("Attempting to get the atom's positions")
+ //   //    pos = lmp.extract_atom("x",3)
+ //   //    for k in range(0,numAtoms):
+ //   //        print("Pos[%i] = [%f, %f, %f]" % (k, pos[k][0], pos[k][1], pos[k][2]))
+
+ //   LAMMPS_NS::FixLbCouplingOnetoone 
+ //       *couplingFix 
+ //       = dynamic_cast<LAMMPS_NS::FixLbCouplingOnetoone*>
+ //       (lmp->modify->find_fix_style("couple/lb/onetoone",0));
+
+ //   cout << "test1\n";
+ //   
+ //   //double **t_liggghts = couplingFix->get_torque_ptr();
+ //   cout << "test2\n";
+
+ //   lmp->input->one("run 9 upto");
+
+ //   for (int step = 0; step < 10; step++)
+ //   {
+ //       
+
+ //       int numAtoms = lmp->atom->natoms;
+
+ //       //double** pos = (double**)lmp->atom->extract("x");
+ //       double** pos = lmp->atom->x;
+ //       
+ //       //double* forceX = lmp->atom->fx;
+
+ //       for (int i = 0; i < numAtoms; i++)
+ //       {
+ //           double **f_liggghts = couplingFix->get_force_ptr();
+ //           double** force = lmp->atom->f;
+ //           cout << "Pos[" << i << "] = [" << pos[i][0] << ", " << pos[i][1] << ", " << pos[i][2] << "]\n";
+ //           cout << "Force1[" << i << "] = [" << f_liggghts[i][0] << ", " << f_liggghts[i][1] << ", " << f_liggghts[i][2] << "]\n";
+ //           f_liggghts[i][0] += 0;
+ //           f_liggghts[i][1] += 0;
+ //           f_liggghts[i][2] += 500;
+ //           cout << "Force2[" << i << "] = [" << force[i][0] << ", " << force[i][1] << ", " << force[i][2] << "]\n";
+ //       }
+
+ //       couplingFix->comm_force_torque();
+
+ //       lmp->input->one("run 10000");
+ //      
+ //   }
+
+ //   // delete LAMMPS instance
+ //   delete lmp;
+
+ //   // stop MPI environment
+    //MPI_Finalize();
+    return 0;
+}
diff --git a/apps/cpu/LiggghtsApp/in.lbdem b/apps/cpu/LiggghtsApp/in.lbdem
new file mode 100644
index 0000000000000000000000000000000000000000..4c38d79268d38d284d536ea3d32b1038314e35ba
--- /dev/null
+++ b/apps/cpu/LiggghtsApp/in.lbdem
@@ -0,0 +1,76 @@
+#verbose no
+
+units		si
+atom_style	granular
+atom_modify	map array
+
+
+
+communicate	single vel yes
+
+boundary	f f f
+newton		off
+
+processors * * 1
+region		box block 0. 1. 0. 1. 0. 2. units box
+create_box	1 box
+
+variable	skin equal 0.01
+neighbor	${skin} bin
+neigh_modify	delay 0 binsize 0.01 one 1000
+
+fix grav all gravity 0.981 vector 0 0 -1
+
+
+fix 		m1 all property/global youngsModulus peratomtype 1e8
+fix 		m2 all property/global poissonsRatio peratomtype 0.4
+fix 		m3 all property/global coefficientRestitution peratomtypepair 1 0.95
+fix 		m4 all property/global coefficientFriction peratomtypepair 1 0.45
+fix 		m5 all property/global coefficientRollingFriction peratomtypepair 1 0.020
+
+# lb coupling fix
+fix lbcoupling all couple/lb/onetoone
+
+
+pair_style	gran model hertz tangential history rolling_friction cdt
+pair_coeff	* *
+
+fix		1 all nve/sphere
+
+fix xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.
+fix xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 1.
+fix ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.
+fix ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 1.
+fix zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.
+fix zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 2.
+
+#create_atoms 1 single 0.5 0.5 9.75
+#create_atoms 1 single 0.38 0.05 0.05
+
+#set group all diameter 0.25 density 2400
+
+#atom_modify sort 0 0.0
+
+#fix pts1 all particletemplate/sphere 1 atom_type 1 density constant 1000 radius constant 0.015 
+#fix pts2 all particletemplate/sphere 1 atom_type 1 density constant 1000 radius constant 0.01 
+#fix pts1 all particletemplate/sphere 1 atom_type 1 density constant 1100 radius constant ${r_part} 
+fix  pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2500 radius constant 0.01
+
+fix pdd1 all particledistribution/discrete 32452843  1 pts1 1.0
+#fix pdd2 all particledistribution/discrete 6778  2 pts2 0.2 pts3 0.8
+
+region  insreg block 0.1 0.9 0.1 0.9 1.3 1.9 units box
+
+
+#fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once &
+#                         overlapcheck yes particles_in_region 350 region insreg ntry_mc 10000 
+#fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once &
+#                        overlapcheck yes volumefraction_region ${v_frac} region insreg ntry_mc 10000 
+fix ins all insert/pack seed 32452867 distributiontemplate pdd1 insert_every once &
+                        overlapcheck yes volumefraction_region 0.1 region insreg ntry_mc 1001 
+#fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once &
+#                        overlapcheck yes particles_in_region 1 region insreg ntry_mc 10000 
+
+echo none
+
+run 1
diff --git a/apps/cpu/LiggghtsApp/in2.lbdem b/apps/cpu/LiggghtsApp/in2.lbdem
new file mode 100644
index 0000000000000000000000000000000000000000..aee0cc8dbdb5cd6bd72969343300eff2c2802a3d
--- /dev/null
+++ b/apps/cpu/LiggghtsApp/in2.lbdem
@@ -0,0 +1,27 @@
+
+echo none
+
+timestep        ${t_step}      
+
+# thermo settings
+fix		ts all check/timestep/gran 10000 0.1 0.1
+compute		1 all erotate/sphere
+thermo_style	custom step atoms ke c_1 f_ts[1] f_ts[2] cpu
+thermo		10000
+thermo_modify	lost ignore norm no flush yes
+compute_modify	thermo_temp dynamic yes
+
+# particle dump
+variable dmp_fname string ${dmp_dir}d_*.liggghts
+
+#dump		dmp all custom ${dmp_stp} ${dmp_fname} & 
+#		 id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius 
+
+#dump		dmp all custom ${dmp_stp} ${dmp_dir}d_*.liggghts & 
+# 		id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius 
+
+
+	
+dump   dmp all custom/vtk ${dmp_stp} ${dmp_dir}/liggghts/atom_*.vtk id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius 	
+
+echo none
\ No newline at end of file
diff --git a/apps/cpu/Multiphase/Multiphase.cfg b/apps/cpu/Multiphase/Multiphase.cfg
index c294ea68ce96c751030380d52d16eb35d06f9faa..b2f435db04ce51f915c3994b8418ba97b49c4843 100644
--- a/apps/cpu/Multiphase/Multiphase.cfg
+++ b/apps/cpu/Multiphase/Multiphase.cfg
@@ -1,11 +1,11 @@
-pathname = d:/temp/MultiphaseNew5
+pathname = d:/temp/JetBreakup
 #pathGeo = d:/Projects/VirtualFluids-Multiphase/source/Applications/Multiphase/backup
 pathGeo = d:/Projects/VirtualFluidsCombined/apps/cpu/Multiphase/backup
 #geoFile = JetBreakupR.ASCII.stl
 #geoFile = inlet1.stl
 geoFile = tubeTransformed.stl
 
-numOfThreads = 4
+numOfThreads = 1
 availMem = 10e9
 
 #Grid
@@ -22,21 +22,23 @@ availMem = 10e9
 #boundingBox = -40e-3 40e-3 1.0e-3 11.0e-3 -403-3 40e-3 #(Jet Breakup2) (Original without inlet length)
 #blocknx = 20 20 20
 
-boundingBox = 6.0e-3 46.0e-3 -5e-3 5e-3 -5e-3 5e-3
-blocknx = 20 20 20
+#boundingBox = 6.0e-3 46.0e-3 -5e-3 5e-3 -5e-3 5e-3
+#blocknx = 20 20 20
+boundingBox = 0 9 0 9 0 9
+blocknx = 10 10 10
 
-dx = 1.66666666667e-4
+dx = 1 #1.66666666667e-4
 refineLevel = 0
 
 #Simulation
 uLB = 0.005 #inlet velocity
 #uF2 = 0.0001
 Re = 10
-nuL =1e-2# 1.0e-5 #!1e-2
-nuG =1e-2# 1.16e-4 #!1e-2
+nuL =1e-3# 1.0e-5 #!1e-2
+nuG =1e-6# 1.16e-4 #!1e-2
 densityRatio = 1000
-sigma = 1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5
-interfaceThickness = 5
+sigma = 0 #1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5
+interfaceWidth = 5
 radius = 615.0 (Jet Breakup)
 contactAngle = 110.0
 gravity = 0.0
diff --git a/apps/cpu/Multiphase/Multiphase.cpp b/apps/cpu/Multiphase/Multiphase.cpp
index 9fd7110f25bddb2f23ef550bbb9a7c0754fab9d8..09d74e1473e9fef8e7f29343d758359eaf0752a2 100644
--- a/apps/cpu/Multiphase/Multiphase.cpp
+++ b/apps/cpu/Multiphase/Multiphase.cpp
@@ -10,7 +10,7 @@ void run(string configname)
 {
     try {
 
-        //Sleep(20000);
+        //Sleep(30000);
 
         vf::basics::ConfigurationFile config;
         config.load(configname);
@@ -28,8 +28,8 @@ void run(string configname)
         double nuG             = config.getValue<double>("nuG");
         double densityRatio    = config.getValue<double>("densityRatio");
         double sigma           = config.getValue<double>("sigma");
-        int interfaceThickness = config.getValue<int>("interfaceThickness");
-        double radius          = config.getValue<double>("radius");
+        int interfaceWidth = config.getValue<int>("interfaceWidth");
+        //double radius          = config.getValue<double>("radius");
         double theta           = config.getValue<double>("contactAngle");
         double gr              = config.getValue<double>("gravity");
         double phiL            = config.getValue<double>("phi_L");
@@ -49,8 +49,8 @@ void run(string configname)
         double cpStep      = config.getValue<double>("cpStep");
         bool newStart      = config.getValue<bool>("newStart");
 
-        double beta  = 12 * sigma / interfaceThickness;
-        double kappa = 1.5 * interfaceThickness * sigma;
+        double beta = 12 * sigma / interfaceWidth;
+        double kappa = 1.5 * interfaceWidth * sigma;
 
         SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
         int myid                = comm->getProcessID();
@@ -85,9 +85,12 @@ void run(string configname)
 
         SPtr<LBMKernel> kernel;
 
-        kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel());
+        //kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel());
         //kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel());
         //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsCumulantLBMKernel());
+        //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel());
+       // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel());
+        kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel());
 
         kernel->setWithForcing(true);
         kernel->setForcingX1(0.0);
@@ -99,29 +102,43 @@ void run(string configname)
         kernel->setPhaseFieldRelaxation(tauH);
         kernel->setMobility(mob);
 
+        //nuL, nuG, densityRatio, beta, kappa, theta,
+
+        kernel->setCollisionFactorMultiphase(nuL, nuG);
+        kernel->setDensityRatio(densityRatio);
+        kernel->setMultiphaseModelParameters(beta, kappa);
+        kernel->setContactAngle(theta);
+        kernel->setInterfaceWidth(interfaceWidth);
+
         SPtr<BCProcessor> bcProc(new BCProcessor());
         // BCProcessorPtr bcProc(new ThinWallBCProcessor());
 
         kernel->setBCProcessor(bcProc);
 
         SPtr<Grid3D> grid(new Grid3D(comm));
-        // grid->setPeriodicX1(true);
-        // grid->setPeriodicX2(true);
-        // grid->setPeriodicX3(true);
+         //grid->setPeriodicX1(true);
+         //grid->setPeriodicX2(true);
+         //grid->setPeriodicX3(true);
+        grid->setGhostLayerWidth(2);
+
+       
+        SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
+
         //////////////////////////////////////////////////////////////////////////
         // restart
         SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
         //SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        //SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, pathname, comm));
-        SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
-        rcp->setNu(nuLB);
-        rcp->setNuLG(nuL, nuG);
-        rcp->setDensityRatio(densityRatio);
+        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
+        //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        //rcp->setNu(nuLB);
+        //rcp->setNuLG(nuL, nuG);
+        //rcp->setDensityRatio(densityRatio);
 
         rcp->setLBMKernel(kernel);
         rcp->setBCProcessor(bcProc);
         //////////////////////////////////////////////////////////////////////////
-
+        // BC Adapter
+        //////////////////////////////////////////////////////////////////////////////
         mu::Parser fctF1;
         // fctF1.SetExpr("vy1*(1-((x1-x0)^2+(x3-z0)^2)/(R^2))");
         // fctF1.SetExpr("vy1*(1-(sqrt((x1-x0)^2+(x3-z0)^2)/R))^0.1");
@@ -137,10 +154,36 @@ void run(string configname)
         fctF2.SetExpr("vy1");
         fctF2.DefineConst("vy1", uLB);
 
-        double startTime = 500;
+        double startTime = 30;
         SPtr<BCAdapter> velBCAdapterF1(new MultiphaseVelocityBCAdapter(true, false, false, fctF1, phiH, 0.0, startTime));
         SPtr<BCAdapter> velBCAdapterF2(new MultiphaseVelocityBCAdapter(true, false, false, fctF2, phiH, startTime, endTime));
 
+        SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+        noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+
+        SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
+        denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm()));
+
+        mu::Parser fctPhi_F1;
+        fctPhi_F1.SetExpr("phiH");
+        fctPhi_F1.DefineConst("phiH", phiH);
+
+        mu::Parser fctPhi_F2;
+        fctPhi_F2.SetExpr("phiL");
+        fctPhi_F2.DefineConst("phiL", phiL);
+
+        mu::Parser fctvel_F2_init;
+        fctvel_F2_init.SetExpr("U");
+        fctvel_F2_init.DefineConst("U", 0);
+
+        velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
+        //////////////////////////////////////////////////////////////////////////////////
+        // BC visitor
+        MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
+        bcVisitor.addBC(noSlipBCAdapter);
+        bcVisitor.addBC(denBCAdapter); //Ohne das BB?
+        bcVisitor.addBC(velBCAdapterF1);
+
         SPtr<D3Q27Interactor> inflowF1Int;
         SPtr<D3Q27Interactor> cylInt;
         if (newStart) {
@@ -220,34 +263,6 @@ void run(string configname)
             GenBlocksGridVisitor genBlocks(gridCube);
             grid->accept(genBlocks);
 
-            // BC Adapter
-            //////////////////////////////////////////////////////////////////////////////
-            SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-            noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
-
-            SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB));
-            denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm()));
-
-            mu::Parser fctPhi_F1;
-            fctPhi_F1.SetExpr("phiH");
-            fctPhi_F1.DefineConst("phiH", phiH);
-
-            mu::Parser fctPhi_F2;
-            fctPhi_F2.SetExpr("phiL");
-            fctPhi_F2.DefineConst("phiL", phiL);
-
-            mu::Parser fctvel_F2_init;
-            fctvel_F2_init.SetExpr("U");
-            fctvel_F2_init.DefineConst("U", 0);
-
-            velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
-            //////////////////////////////////////////////////////////////////////////////////
-            // BC visitor
-            MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
-            bcVisitor.addBC(noSlipBCAdapter);
-            bcVisitor.addBC(denBCAdapter); //Ohne das BB?
-            bcVisitor.addBC(velBCAdapterF1);
-
             SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
@@ -286,8 +301,7 @@ void run(string configname)
             cylInt->addBCAdapter(velBCAdapterF2);
             //SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBCAdapter, Interactor3D::SOLID));
 
-            SPtr<Grid3DVisitor> metisVisitor(
-                new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW));
+
             InteractorsHelper intHelper(grid, metisVisitor, true);
             intHelper.addInteractor(cylInt);
             intHelper.addInteractor(tubes);
@@ -335,8 +349,7 @@ void run(string configname)
                 UBLOG(logINFO, "Available memory per process = " << availMem << " bytes");
             }
 
-            MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, densityRatio, beta, kappa, theta, availMem,
-                needMem);
+            MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, availMem, needMem);
 
             grid->accept(kernelVisitor);
 
@@ -347,16 +360,56 @@ void run(string configname)
 
             intHelper.setBC();
 
-            grid->accept(bcVisitor);
-
             // initialization of distributions
             mu::Parser fct1;
             fct1.SetExpr("phiL");
             fct1.DefineConst("phiL", phiL);
-            MultiphaseInitDistributionsBlockVisitor initVisitor(densityRatio, interfaceThickness, radius);
+            //MultiphaseInitDistributionsBlockVisitor initVisitor(interfaceThickness);
+            MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor;
             initVisitor.setPhi(fct1);
             grid->accept(initVisitor);
-
+///////////////////////////////////////////////////////////////////////////////////////////
+            //{
+                // std::vector<std::vector<SPtr<Block3D>>> blockVector;
+                // int gridRank = comm->getProcessID();
+                // int minInitLevel = grid->getCoarsestInitializedLevel();
+                // int maxInitLevel = grid->getFinestInitializedLevel();
+                // blockVector.resize(maxInitLevel + 1);
+                // for (int level = minInitLevel; level <= maxInitLevel; level++) {
+                //    grid->getBlocks(level, gridRank, true, blockVector[level]);
+                //}
+                //    for (int level = minInitLevel; level <= maxInitLevel; level++) {
+                //    for (SPtr<Block3D> block : blockVector[level]) {
+                //        if (block) {
+                //            int ix1 = block->getX1();
+                //            int ix2 = block->getX2();
+                //            int ix3 = block->getX3();
+                //            int level = block->getLevel();
+
+                //            for (int dir = 0; dir < D3Q27System::ENDDIR; dir++) {
+                //                SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level);
+
+                //                if (!neighBlock) {
+
+                //                }
+                //            }
+                //        }
+                //    }
+                //}
+            //    SPtr<Block3D> block = grid->getBlock(0, 0, 0, 0);
+            //    SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel());
+            //    SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+
+            //    for (int ix3 = 0; ix3 <= 13; ix3++) {
+            //        for (int ix2 = 0; ix2 <= 13; ix2++) {
+            //            for (int ix1 = 0; ix1 <= 13; ix1++) {
+            //                if (ix1 == 0 || ix2 == 0 || ix3 == 0 || ix1 == 13 || ix2 == 13 || ix3 == 13)
+            //                    bcArray->setUndefined(ix1, ix2, ix3);
+            //            }
+            //        }
+            //    }
+            //}
+            ////////////////////////////////////////////////////////////////////////////////////////////
             // boundary conditions grid
             {
                 SPtr<UbScheduler> geoSch(new UbScheduler(1));
@@ -388,11 +441,16 @@ void run(string configname)
                 UBLOG(logINFO, "Restart - end");
         }
 
-        TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
-        grid->accept(setConnsVisitor);
+      //  TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
+      //  grid->accept(setConnsVisitor);
 
-        //ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
-        //grid->accept(setConnsVisitor);
+       //ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
+
+        grid->accept(bcVisitor);
+
+        //ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+        TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+        grid->accept(setConnsVisitor);
 
         SPtr<UbScheduler> visSch(new UbScheduler(outTime));
         SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
diff --git a/apps/cpu/Multiphase/MultiphaseGeier.cfg b/apps/cpu/Multiphase/MultiphaseGeier.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d701725832cfd7337d383e9c98a60243c0c9b54e
--- /dev/null
+++ b/apps/cpu/Multiphase/MultiphaseGeier.cfg
@@ -0,0 +1,68 @@
+#pathname = E:/Multiphase/HesamCodeWithCumulantsDensRatio
+#pathname = E:/Multiphase/HesamCodeWithCumulantsQuartic
+#pathname = E:/Multiphase/HesamCode
+pathname = E:/Multiphase/VelocityFormSig1e-3SVarDens
+pathGeo = C:/Users/geier/Documents/VirtualFluids_dev_Kostya/apps/cpu/Multiphase/backup
+geoFile=tubeTransformed.stl
+#geoFile = JetBreakup2.ASCII.stl
+numOfThreads = 4
+availMem = 10e9
+
+#Grid
+
+#boundingBox = -1.0 121.0 0.5 629.0 -1.0 121.0 #(Jet Breakup) (Original with inlet length)
+#boundingBox = -60.5 60.5 -1.0 -201.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length)
+#blocknx = 22 20 22
+
+#boundingBox = -60.5 60.5 -1.0 -21.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length)
+#boundingBox = -60.5 60.5 -21.0 -1.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length)
+#blocknx = 22 20 22
+
+
+#dx = 0.5
+
+#boundingBox = 6.0e-3 46.0e-3 -5e-3 5e-3 -5e-3 5e-3
+#boundingBox = 6.0e-3 86.0e-3 -5e-3 5e-3 -5e-3 5e-3
+#blocknx = 480 60 60 #20 20 20
+
+boundingBox = 6.0e-3 16.0e-3 -5e-3 5e-3 -5e-3 5e-3
+blocknx = 20 20 20
+
+#boundingBox = 6.0e-3 16.0e-3 -5e-3 5e-3 -5e-3 5e-3
+#blocknx = 60 60 60 #20 20 20
+
+
+dx = 1.66666666667e-4
+
+refineLevel = 0
+
+#Simulation
+uLB =0.005# 0.0000005 #inlet velocity
+#uLB=0.001
+uF2 = 0.0001
+Re = 10
+nuL =1e-3#1e-2# 1.0e-5  #!1e-2
+nuG =1e-6#1e-2# 1.16e-4 #!1e-2
+densityRatio = 1000#1000#1000 #30
+sigma =1e-3# 1e-4 #4.66e-3 #surface tension 1e-4 ./. 1e-5
+interfaceThickness = 5
+radius = 615.0   (Jet Breakup)
+contactAngle = 110.0
+gravity = 0.0
+#gravity = -5.04e-6
+phi_L = 0.0
+phi_H = 1.0
+Phase-field Relaxation = 0.6
+Mobility = 0.1 #0.02 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1 
+
+
+logToFile = false
+
+newStart = true
+restartStep = 100000
+
+cpStart = 100000
+cpStep = 100000
+
+outTime = 100
+endTime = 200000000
\ No newline at end of file
diff --git a/apps/cpu/MultiphaseDropletTest/DropletTest.cfg b/apps/cpu/MultiphaseDropletTest/DropletTest.cfg
index 72c0144890c2fd8ba25fa0dfb7528fdbd1b889d8..016e34072c1ff69e284cc1743ad684cb1a382e82 100644
--- a/apps/cpu/MultiphaseDropletTest/DropletTest.cfg
+++ b/apps/cpu/MultiphaseDropletTest/DropletTest.cfg
@@ -1,32 +1,33 @@
-pathname = d:/temp/MultiphaseDropletTest
+#pathname = d:/temp/MultiphaseDropletTest
+pathname = E:/Multiphase/DropletTest_Test
 
 numOfThreads = 4
 availMem = 10e9
 
 #Grid
 
-boundingBox = 0 128 0 64 0 64
-blocknx = 8 8 8
+boundingBox = 0 256 512 768 0 3
+blocknx = 16 16 3
 
 dx = 1
 refineLevel = 0
 
 #Simulation
-uLB = 0.005 
+uLB = 0 #0.001#0.005#0.005 
 Re = 10
-nuL =1e-2# 1.0e-5 #!1e-2
-nuG =1e-2# 1.16e-4 #!1e-2
-densityRatio = 1000
-sigma = 1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5
-interfaceThickness = 5
-radius = 16
+nuL = 1e-2 #1e-5# 1.0e-5 #!1e-2
+nuG = 0.015811388300841892 #5e-2 #1e-4 # 1e-8 # 1.16e-4 #!1e-2
+densityRatio = 10
+sigma = 1.0850694444444444e-06 #1e-10 #1e-6  # 1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5
+interfaceThickness = 4.096
+radius = 25.6
 contactAngle = 110.0
 #gravity = 0.0
-gravity = -5.04e-6
+gravity = -1.0348028606838648e-08 #-5.04e-6
 phi_L = 0.0
 phi_H = 1.0
 Phase-field Relaxation = 0.6
-Mobility = 0.02 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1
+Mobility = 0.056 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1
 
 
 logToFile = false
@@ -34,8 +35,10 @@ logToFile = false
 newStart = true
 restartStep = 100000
 
-cpStart = 100000
-cpStep = 100000
+cpStart = 1000
+cpStep = 1000
 
-outTime = 1
-endTime = 10000
\ No newline at end of file
+outTime = 100
+endTime = 10000
+
+rStep = 159990 #160000
\ No newline at end of file
diff --git a/apps/cpu/MultiphaseDropletTest/droplet.cpp b/apps/cpu/MultiphaseDropletTest/droplet.cpp
index fe27ecce81cd97215600b54d613e7123cb80f261..54b59fcfd8bd93f220b3d3d4ebb5bb29881079e5 100644
--- a/apps/cpu/MultiphaseDropletTest/droplet.cpp
+++ b/apps/cpu/MultiphaseDropletTest/droplet.cpp
@@ -2,6 +2,11 @@
 #include <string>
 #include <memory>
 
+#if defined(__unix__)
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
 #include "VirtualFluids.h"
 
 using namespace std;
@@ -24,7 +29,7 @@ void run(string configname)
         int interfaceThickness = config.getValue<int>("interfaceThickness");
         double radius          = config.getValue<double>("radius");
         double theta           = config.getValue<double>("contactAngle");
-        double gr              = config.getValue<double>("gravity");
+        //double gr              = config.getValue<double>("gravity");
         double phiL            = config.getValue<double>("phi_L");
         double phiH            = config.getValue<double>("phi_H");
         double tauH            = config.getValue<double>("Phase-field Relaxation");
@@ -37,13 +42,11 @@ void run(string configname)
         double Re          = config.getValue<double>("Re");
         double dx          = config.getValue<double>("dx");
         bool logToFile     = config.getValue<bool>("logToFile");
-        //double restartStep = config.getValue<double>("restartStep");
-        //double cpStart     = config.getValue<double>("cpStart");
-        //double cpStep      = config.getValue<double>("cpStep");
+        double restartStep = config.getValue<double>("restartStep");
+        double cpStart     = config.getValue<double>("cpStart");
+        double cpStep      = config.getValue<double>("cpStep");
         bool newStart      = config.getValue<bool>("newStart");
-
-        double beta  = 12 * sigma / interfaceThickness;
-        double kappa = 1.5 * interfaceThickness * sigma;
+        //double rStep = config.getValue<double>("rStep");
 
         SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
         int myid                = comm->getProcessID();
@@ -65,6 +68,22 @@ void run(string configname)
                 UbLog::output_policy::setStream(logFilename.str());
             }
         }
+        
+        std::string fileName = "./LastTimeStep" + std::to_string((int)boundingBox[1]) + ".txt";
+
+//#if defined(__unix__)
+//         double lastTimeStep = 0;
+//         //if (!newStart) 
+//         {
+//             std::ifstream ifstr(fileName);
+//             ifstr >> lastTimeStep;
+//             restartStep = lastTimeStep;
+//             if(endTime >= lastTimeStep)
+//                endTime = lastTimeStep + rStep;
+//             else
+//                return;
+//         }    
+//#endif
 
         //Sleep(30000);
 
@@ -72,6 +91,49 @@ void run(string configname)
         LBMReal rhoLB = 0.0;
         LBMReal nuLB  = nuL; //(uLB*dLB) / Re;
 
+        //diameter of circular droplet
+        LBMReal D  = 2.0*radius;
+
+        //density retio
+        LBMReal r_rho = densityRatio;
+
+        //density of heavy fluid
+        LBMReal rho_h = 1.0;
+        //density of light fluid
+        LBMReal rho_l = rho_h / r_rho;
+
+        //kinimatic viscosity
+        LBMReal nu_h = nuL;
+        //LBMReal nu_l = nuG;
+        //#dynamic viscosity
+        LBMReal mu_h = rho_h * nu_h;
+        
+        //gravity
+        LBMReal g_y = Re* Re* mu_h* mu_h / (rho_h * (rho_h - rho_l) * D * D * D);
+        //Eotvos number
+        LBMReal Eo = 100;
+        //surface tension
+        sigma = rho_h* g_y* D* D / Eo;
+
+        //g_y = 0;
+
+        double beta  = 12.0 * sigma / interfaceThickness;
+        double kappa = 1.5 * interfaceThickness * sigma;
+
+        if (myid == 0) {
+                //UBLOG(logINFO, "uLb = " << uLB);
+                //UBLOG(logINFO, "rho = " << rhoLB);
+                UBLOG(logINFO, "D = " << D);
+                UBLOG(logINFO, "nuL = " << nuL);
+                UBLOG(logINFO, "nuG = " << nuG);
+                UBLOG(logINFO, "Re = " << Re);
+                UBLOG(logINFO, "Eo = " << Eo);
+                UBLOG(logINFO, "g_y = " << g_y);
+                UBLOG(logINFO, "sigma = " << sigma);
+                UBLOG(logINFO, "dx = " << dx);
+                UBLOG(logINFO, "Preprocess - start");
+        }
+
         SPtr<LBMUnitConverter> conv(new LBMUnitConverter());
 
         //const int baseLevel = 0;
@@ -79,43 +141,66 @@ void run(string configname)
         SPtr<LBMKernel> kernel;
 
         //kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel());
-        kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel());
-        //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsCumulantLBMKernel());
+       // kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel());
+        //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel());
+        kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel());
+
+        mu::Parser fgr;
+        fgr.SetExpr("-(rho-rho_l)*g_y");
+        fgr.DefineConst("rho_l", rho_l);
+        fgr.DefineConst("g_y", g_y);
 
         kernel->setWithForcing(true);
-        kernel->setForcingX1(gr);
-        kernel->setForcingX2(0.0);
+        kernel->setForcingX1(0.0);
+        kernel->setForcingX2(fgr);
         kernel->setForcingX3(0.0);
 
         kernel->setPhiL(phiL);
         kernel->setPhiH(phiH);
         kernel->setPhaseFieldRelaxation(tauH);
         kernel->setMobility(mob);
+        kernel->setInterfaceWidth(interfaceThickness);
+
+
+        kernel->setCollisionFactorMultiphase(nuL, nuG);
+        kernel->setDensityRatio(densityRatio);
+        kernel->setMultiphaseModelParameters(beta, kappa);
+        kernel->setContactAngle(theta);
 
         SPtr<BCProcessor> bcProc(new BCProcessor());
         // BCProcessorPtr bcProc(new ThinWallBCProcessor());
 
         kernel->setBCProcessor(bcProc);
 
+        SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+        noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+        //////////////////////////////////////////////////////////////////////////////////
+        // BC visitor
+        MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
+        bcVisitor.addBC(noSlipBCAdapter);
+
         SPtr<Grid3D> grid(new Grid3D(comm));
         grid->setDeltaX(dx);
         grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]);
         grid->setPeriodicX1(true);
-        grid->setPeriodicX2(true);
+        grid->setPeriodicX2(false);
         grid->setPeriodicX3(true);
+        grid->setGhostLayerWidth(2);
+
+        SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
 
         //////////////////////////////////////////////////////////////////////////
         // restart
-        //SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-        ////SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
-        ////SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, pathname, comm));
+        SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
+        //SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
+        SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
         //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
-        //rcp->setNu(nuLB);
-        //rcp->setNuLG(nuL, nuG);
-        //rcp->setDensityRatio(densityRatio);
+        // rcp->setNu(nuLB);
+        // rcp->setNuLG(nuL, nuG);
+        // rcp->setDensityRatio(densityRatio);
 
-        //rcp->setLBMKernel(kernel);
-        //rcp->setBCProcessor(bcProc);
+        rcp->setLBMKernel(kernel);
+        rcp->setBCProcessor(bcProc);
         //////////////////////////////////////////////////////////////////////////
 
         if (newStart) {
@@ -135,32 +220,33 @@ void run(string configname)
                 GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube",
                     WbWriterVtkXmlBinary::getInstance());
 
-            if (myid == 0) {
-                UBLOG(logINFO, "uLb = " << uLB);
-                UBLOG(logINFO, "rho = " << rhoLB);
-                UBLOG(logINFO, "nuLb = " << nuLB);
-                UBLOG(logINFO, "Re = " << Re);
-                UBLOG(logINFO, "dx = " << dx);
-                UBLOG(logINFO, "Preprocess - start");
-            }
+
 
             GenBlocksGridVisitor genBlocks(gridCube);
             grid->accept(genBlocks);
 
+            double dx2 = 2.0 * dx;
+            GbCuboid3DPtr wallYmin(new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_minX2, g_maxX3 + dx2));
+            GbSystem3D::writeGeoObject(wallYmin.get(), pathname + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallYmax(new GbCuboid3D(g_minX1 - dx2, g_maxX2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2));
+            GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance());
+
+            SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
  
             SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
-            //SPtr<Grid3DVisitor> metisVisitor(
-            //    new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW));
-            //InteractorsHelper intHelper(grid, metisVisitor);
-            //intHelper.selectBlocks();
+            InteractorsHelper intHelper(grid, metisVisitor, true);
+            intHelper.addInteractor(wallYminInt);
+            intHelper.addInteractor(wallYmaxInt);
+            intHelper.selectBlocks();
 
             ppblocks->process(0);
             ppblocks.reset();
 
             unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
-            int ghostLayer                    = 3;
+            int ghostLayer                    = 5;
             unsigned long long numberOfNodesPerBlock =
                 (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]);
             unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock;
@@ -185,8 +271,7 @@ void run(string configname)
                 UBLOG(logINFO, "Available memory per process = " << availMem << " bytes");
             }
 
-            MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, densityRatio, beta, kappa, theta, availMem,
-                needMem);
+            MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, availMem, needMem);
 
             grid->accept(kernelVisitor);
 
@@ -196,14 +281,13 @@ void run(string configname)
             }
 
 
-            //intHelper.setBC();
-
-            //grid->accept(bcVisitor);
+            intHelper.setBC();
 
             // initialization of distributions
-            LBMReal x1c = (g_maxX1 - g_minX1-1)/2;
-            LBMReal x2c = (g_maxX2 - g_minX2-1)/2;
-            LBMReal x3c = (g_maxX3 - g_minX3-1)/2;
+            LBMReal x1c = 2.5 * D; // (g_maxX1 - g_minX1-1)/2; //
+            LBMReal x2c = 12.5 * D; //(g_maxX2 - g_minX2-1)/2;
+            LBMReal x3c = 1.5; //2.5 * D; //(g_maxX3 - g_minX3-1)/2;
+            //LBMReal x3c = 2.5 * D;
             mu::Parser fct1;
             fct1.SetExpr("0.5-0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)");
             fct1.DefineConst("x1c", x1c);
@@ -214,6 +298,7 @@ void run(string configname)
 
             mu::Parser fct2;
             fct2.SetExpr("0.5*uLB-uLB*0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)");
+            //fct2.SetExpr("uLB");
             fct2.DefineConst("uLB", uLB);
             fct2.DefineConst("x1c", x1c);
             fct2.DefineConst("x2c", x2c);
@@ -221,7 +306,8 @@ void run(string configname)
             fct2.DefineConst("radius", radius);
             fct2.DefineConst("interfaceThickness", interfaceThickness);
 
-            MultiphaseInitDistributionsBlockVisitor initVisitor(densityRatio, interfaceThickness, radius);
+            //MultiphaseInitDistributionsBlockVisitor initVisitor(densityRatio);
+            MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor;
             initVisitor.setPhi(fct1);
             initVisitor.setVx1(fct2);
             grid->accept(initVisitor);
@@ -250,34 +336,63 @@ void run(string configname)
                 UBLOG(logINFO, "path = " << pathname);
             }
 
-            //rcp->restart((int)restartStep);
-            //grid->setTimeStep(restartStep);
+            rcp->restart((int)restartStep);
+            grid->setTimeStep(restartStep);
 
             if (myid == 0)
                 UBLOG(logINFO, "Restart - end");
         }
 
-        TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
-        grid->accept(setConnsVisitor);
+        grid->accept(bcVisitor);
+
+        //TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
+        //grid->accept(setConnsVisitor);
 
-        //ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
+        //ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
         //grid->accept(setConnsVisitor);
 
+        TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+        grid->accept(setConnsVisitor);
+
         SPtr<UbScheduler> visSch(new UbScheduler(outTime));
+        double t_ast, t;
+        t_ast = 2;
+        t = (int)(t_ast/std::sqrt(g_y/D));
+        visSch->addSchedule(t,t,t); //t=2
+        t_ast = 3;
+        t = (int)(t_ast/std::sqrt(g_y/D));        
+        visSch->addSchedule(t,t,t); //t=3
+        t_ast = 4;
+        t = (int)(t_ast/std::sqrt(g_y/D));        
+        visSch->addSchedule(t,t,t); //t=4
+        t_ast = 5;
+        t = (int)(t_ast/std::sqrt(g_y/D));        
+        visSch->addSchedule(t,t,t); //t=5
+        t_ast = 6;
+        t = (int)(t_ast/std::sqrt(g_y/D)); 
+        visSch->addSchedule(t,t,t); //t=6
+        t_ast = 7;
+        t = (int)(t_ast/std::sqrt(g_y/D));         
+        visSch->addSchedule(t,t,t); //t=7
+        t_ast = 9;
+        t = (int)(t_ast/std::sqrt(g_y/D));         
+        visSch->addSchedule(t,t,t); //t=9
+
         SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
-        //SPtr<WriteMacroscopicQuantitiesCoProcessor> pp(new WriteMacroscopicQuantitiesCoProcessor(
-        //    grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+        if(grid->getTimeStep() == 0) 
+            pp->process(0);
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
         SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
 
+        omp_set_num_threads(numOfThreads);
+
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
         SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
         calculator->addCoProcessor(npr);
         calculator->addCoProcessor(pp);
-        //calculator->addCoProcessor(rcp);
-
+        calculator->addCoProcessor(rcp);
 
 
         if (myid == 0)
@@ -285,6 +400,25 @@ void run(string configname)
         calculator->calculate();
         if (myid == 0)
             UBLOG(logINFO, "Simulation-end");
+            
+//#if defined(__unix__)
+//         //if (!newStart) 
+//         //{
+//            if (myid == 0) 
+//            {
+//                std::ofstream ostr(fileName);
+//                ostr << endTime;
+//                cout << "start sbatch\n";
+//                //system("./start.sh");
+//                //system("echo test!");
+//                std::string str = "sbatch startJob" + std::to_string((int)boundingBox[1]) + ".sh";
+//                //system("sbatch startJob512.sh");
+//                system(str.c_str());
+//            }   
+//            //MPI_Barrier((MPI_Comm)comm->getNativeCommunicator()); 
+//         //}
+//#endif
+
     } catch (std::exception &e) {
         cerr << e.what() << endl << flush;
     } catch (std::string &s) {
diff --git a/apps/cpu/Nozzle/CMakeLists.txt b/apps/cpu/Nozzle/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b653be79cefa91cb64408bdb7e7507bd79a57b26
--- /dev/null
+++ b/apps/cpu/Nozzle/CMakeLists.txt
@@ -0,0 +1,3 @@
+PROJECT(Nozzle)
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} LiggghtsCoupling FILES nozzle.cpp )
diff --git a/apps/cpu/Nozzle/in.nozzle b/apps/cpu/Nozzle/in.nozzle
new file mode 100644
index 0000000000000000000000000000000000000000..7b633f5538c72f164a7ddd25eedd0a20dc751467
--- /dev/null
+++ b/apps/cpu/Nozzle/in.nozzle
@@ -0,0 +1,127 @@
+# shotcrete nozzle simulation
+
+atom_style    granular
+atom_modify   map array
+boundary      f f f
+newton        off
+
+communicate   single vel yes
+
+units         si
+
+#region        domain block -1.35 -1.25 0.34 0.44 -0.25 0.25 units box
+region        domain block -1.35 -1.25 0.34 0.44 -0.4 0.25 units box
+create_box    1 domain
+
+neighbor      0.002 bin
+neigh_modify  delay 0
+
+
+#Material properties required for new pair styles
+
+fix  m1 all property/global youngsModulus peratomtype 5.e6
+fix  m2 all property/global poissonsRatio peratomtype 0.45
+fix  m3 all property/global coefficientRestitution peratomtypepair 1 0.3
+fix  m4 all property/global coefficientFriction peratomtypepair 1 0.5
+fix  m5 all property/global k_finnie peratomtypepair 1 1.0
+
+# lb coupling fix
+fix lbcoupling all couple/lb/onetoone
+
+#New pair style
+pair_style  gran model hertz tangential history #Hertzian without cohesion
+pair_coeff  * *
+
+timestep    ${t_step}
+
+fix  gravi all gravity 9.81 vector 0.0 0.0 -1.0
+
+#the chute
+#variable meshes_dir string d:/Projects/TRR277/Project/WP4/Liggghts/
+variable meshes_dir string d:/Projects/TRR277/Project/WP4/Liggghts/A04/
+
+fix  cad1 all mesh/surface file ${meshes_dir}Duese_Acc_Einlass.stl type 1 scale 0.001
+fix  cad2 all mesh/surface file ${meshes_dir}Duese_Acc_Verteiler.stl type 1 scale 0.001
+fix  cad3 all mesh/surface file ${meshes_dir}Duese_Air_Einlass.stl type 1 scale 0.001
+fix  cad4 all mesh/surface file ${meshes_dir}Duese_Air_Verteiler.stl type 1 scale 0.001
+fix  cad5 all mesh/surface file ${meshes_dir}Duese_Volcan_Duese.stl type 1 scale 0.001
+fix  cad6 all mesh/surface file ${meshes_dir}Duese_Zwischenstueck.stl type 1 element_exclusion_list read list.file scale 0.001 curvature_tolerant yes
+
+fix  inface all mesh/surface file ${meshes_dir}InsertDisk2.stl type 1 scale 0.001
+fix  wallTop all mesh/surface file ${meshes_dir}InsertDisk3.stl type 1 scale 0.001
+
+#fix  granwalls all wall/gran model hertz tangential history mesh n_meshes 7 meshes cad1 cad2 cad3 cad4 cad5 cad6 wallTop
+fix  granwalls all wall/gran model hertz tangential history mesh n_meshes 8 meshes cad1 cad2 cad3 cad4 cad5 cad6 wallTop inface
+
+#distributions for insertion
+
+fix  pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2500 radius constant 0.001
+fix  pts2 all particletemplate/sphere 15485867 atom_type 1 density constant 2500 radius constant 0.002
+fix  pdd1 all particledistribution/discrete 32452843  2 pts1 0.3 pts2 0.7
+
+#region and insertion
+group  nve_group region domain
+#region bc cylinder z 0.0 0.0 0.015 0.201 0.23 units box
+#region bc cylinder z 0.0 0.0 10 213 220 units box
+
+region bc cylinder z -1.3013105 0.388582 0.01275005 0.18055 0.20105 units box
+
+#particle insertion
+# fix    ins nve_group insert/stream seed 32452867 distributiontemplate pdd1 &
+       # nparticles 6000 massrate 0.1 insert_every 1000 overlapcheck yes all_in no vel constant 0.0 0.0 -1.0 &
+       # insertion_face inface 
+
+
+# fix    ins nve_group insert/stream seed 32452867 distributiontemplate pdd1 &
+       # nparticles 6000 massrate 0.1 insert_every 1000 overlapcheck yes all_in no vel constant 0.0 0.0 -1.0 &
+       # insertion_face inface 
+       
+ # fix    ins nve_group insert/stream seed 32452867 distributiontemplate pdd1 &
+        # nparticles 6000 massrate 0.1 insert_every ones overlapcheck yes all_in no vel constant 0.0 0.0 -1.0 &
+        # insertion_face inface 
+
+#working setup
+# fix ins nve_group insert/pack seed 32452867 distributiontemplate pdd1 insert_every 1000 &
+                       # overlapcheck yes vel constant 0.0 0.0 -1.0 volumefraction_region 0.1 region bc ntry_mc 1001
+fix ins nve_group insert/pack seed 32452867 distributiontemplate pdd1 insert_every 10 &
+                       overlapcheck yes vel constant 0.0 0.0 -1.0 volumefraction_region 0.1 region bc ntry_mc 1001   
+       
+# fix    ins all insert/stream seed 32452867 distributiontemplate pdd1 &
+       # nparticles INF massrate 0.1 overlapcheck yes all_in yes vel constant 0.0 0.0 -1.0 &
+       # insertion_face inface extrude_length 0.25   
+	   
+   
+
+#apply nve integration to all particles that are inserted as single particles
+fix    integr nve_group nve/sphere
+
+#output settings, include total thermal energy
+compute       1 all erotate/sphere
+thermo_style  custom step atoms ke c_1 vol
+thermo        1000
+thermo_modify lost ignore norm no
+
+variable dmp_time_cad equal 100000000
+
+dump   dumpcad1 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad1_*.stl cad1
+dump   dumpcad2 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad2_*.stl cad2
+dump   dumpcad3 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad3_*.stl cad3
+dump   dumpcad4 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad4_*.stl cad4
+dump   dumpcad5 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad5_*.stl cad5
+dump   dumpcad6 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad6_*.stl cad6
+dump   dumpinface all mesh/stl ${dmp_time_cad} ${dmp_dir}/inface_*.stl inface
+dump   dumpwallTop all mesh/stl ${dmp_time_cad} ${dmp_dir}/wallTop_*.stl wallTop
+
+#insert the first particles so that dump is not empty
+run    1
+dump   dmp all custom/vtk ${dmp_stp} ${dmp_dir}/particles_*.vtk id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius 
+
+
+#run 1
+#run 1
+
+#insert particles
+#run    100000 upto
+#unfix  ins
+
+ 
diff --git a/apps/cpu/Nozzle/nozzle.cpp b/apps/cpu/Nozzle/nozzle.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ab07f1f91ae20990d970e5850bec79607cf2b741
--- /dev/null
+++ b/apps/cpu/Nozzle/nozzle.cpp
@@ -0,0 +1,463 @@
+#include <iostream>
+#include <string>
+#include <memory>
+
+#include "VirtualFluids.h"
+
+#include "LiggghtsCouplingCoProcessor.h"
+#include "LiggghtsCouplingWrapper.h"
+#include "IBcumulantK17LBMKernel.h"
+
+using namespace std;
+
+
+int main(int argc, char *argv[])
+{
+    //Sleep(30000);
+
+    std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+    int myid = comm->getProcessID();
+
+
+    // bounding box
+    //double g_minX1 = -1341.81e-3;
+    //double g_minX2 =  348.087e-3;
+    //double g_minX3 = -210e-3;
+
+    //double g_maxX1 = -1260.81e-3;
+    //double g_maxX2 =  429.087e-3;
+    //double g_maxX3 =  214.5e-3;
+
+    double g_minX1 = -1341.81e-3 + 10e-3;
+    double g_minX2 =  0.360872;
+    double g_minX3 = 0;//-210e-3;
+
+    double g_maxX1 = -1260.81e-3 - 10e-3;
+    double g_maxX2 =  0.416302;
+    double g_maxX3 = 0.20105; //210e-3;
+
+    int blockNX[3] = { 10, 10, 10 };
+
+    double dx = 1e-3;
+
+    double uLB  = 0.0001;
+    //double rhoLB = 0.0;
+
+    // concrete 
+    double d_part = 1e-3;
+    double V = 0.4;     // flow rate [m^3/h]
+    double D = 0.026;   // shotcrete inlet diameter [m]
+    double R = D / 2.0; // radius [m]
+    double A = UbMath::PI * R * R;
+    double u = V / 3600 / A;
+    double muConcrete = 2.1133054011798826; // [Pa s]
+    double tau0 = 715.218181094648; //
+    double rhoConcrete = 2400; // [kg/m^3]
+    double nu = muConcrete / rhoConcrete;
+    double rhoAir = 1.2041; // [kg/m^3]
+    //double Re_D = d_part * u / nu;
+    //if (myid == 0) UBLOG(logINFO, "Re_D = " << Re_D);
+    //
+    SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(d_part, 1., 2400, d_part / dx, uLB);
+    //double nuLB = D*units->getFactorLentghWToLb() * u*units->getFactorVelocityWToLb() / Re_D;
+    //if (myid == 0) UBLOG(logINFO, "nuLB = " << nuLB);
+
+    double interfaceThickness = 4.096;
+    double sigma = 0.03;
+    double Re = rhoConcrete * u * d_part / muConcrete;
+    double We = rhoConcrete * u * u * d_part / sigma;
+
+    double nu_h_LB = uLB * d_part / Re;
+    double nu_l_LB = nu_h_LB;
+    if (myid == 0) UBLOG(logINFO, "nu_h = " << nu_h_LB << " nu_l = " << nu_l_LB);
+
+    double rho_h_LB = 1;
+
+    // surface tension
+    double sigma_LB = rho_h_LB * uLB * uLB * d_part / We;
+    if (myid == 0) UBLOG(logINFO, "sigma_LB = " << sigma_LB);
+
+    // LBMReal dLB = 0; // = length[1] / dx;
+    LBMReal rhoLB = 0.0;
+    //LBMReal nuLB = nu_l; //(uLB*dLB) / Re;
+
+    double beta = 12.0 * sigma_LB / interfaceThickness;
+    double kappa = 1.5 * interfaceThickness * sigma_LB;
+
+    double phiL = 0.0;
+    double phiH = 1.0;
+    double tauH = 0.6; // Phase - field Relaxation
+    double mob = 0.02; // Mobility
+    //double nuL = 1e-2;
+    //double nuG = 0.015811388300841892;
+    double densityRatio =  rhoConcrete / rhoAir;
+    //double sigma_old = 1.0850694444444444e-06;
+    //
+    //double beta_old = 12.0 * sigma / interfaceThickness;
+    //double kappa_old = 1.5 * interfaceThickness * sigma;
+    
+    double theta = 110; //contact angle
+
+    //https://civilsir.com/density-of-cement-sand-and-aggregate-in-kg-m3-list-of-material-density/
+
+    // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 1.480, 2060, r_p/dx);
+    // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, LBMUnitConverter::AIR_20C, r_p / dx);
+    //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(d_part, 1., 1000, d_part / dx, std::abs(uLB));
+    //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(d_part, 1., 1000, d_part / dx, std::abs(uLB));
+    //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(d_part, 1., 2400, d_part / dx, uRef);
+    if (myid == 0) std::cout << units->toString() << std::endl;
+
+    //SPtr<LBMKernel> kernel   = make_shared<IBcumulantK17LBMKernel>();
+    //SPtr<LBMKernel> kernel   = make_shared<CumulantK17LBMKernel>();
+    //SPtr<LBMKernel> kernel = make_shared<MultiphaseTwoPhaseFieldsPressureFilterLBMKernel>();
+    SPtr<LBMKernel> kernel = make_shared<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>();
+
+    kernel->setWithForcing(true);
+    kernel->setForcingX1(0.0);
+    kernel->setForcingX2(0.0);
+    kernel->setForcingX3(0.0);
+
+    kernel->setPhiL(phiL);
+    kernel->setPhiH(phiH);
+    kernel->setPhaseFieldRelaxation(tauH);
+    kernel->setMobility(mob);
+    kernel->setInterfaceWidth(interfaceThickness);
+
+    kernel->setCollisionFactorMultiphase(nu_h_LB, nu_l_LB);
+    kernel->setDensityRatio(densityRatio);
+    kernel->setMultiphaseModelParameters(beta, kappa);
+    kernel->setContactAngle(theta);
+ 
+    SPtr<BCProcessor> bcProc = make_shared<BCProcessor>();
+    kernel->setBCProcessor(bcProc);
+
+    //SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+    //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
+    SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+    noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+
+
+    mu::Parser fct;
+
+    {
+        // concrete inflow boundary condition
+        fct.SetExpr("U");
+        fct.DefineConst("U", -u*units->getFactorVelocityWToLb());
+        if (myid == 0) UBLOG(logINFO, "Concrete inflow velocity = " << u << " m/s");
+        if (myid == 0) UBLOG(logINFO, "Concrete inflow velocity = " << u*units->getFactorVelocityWToLb() << " dx/dt");
+    //    // Å tigler, J. (2014). Analytical velocity profile in tube for laminar and turbulent flow. Engineering
+    //    // Mechanics, 21(6), 371-379.
+    //    double cx1 = -1.31431 + R;
+    //    double cx2 = 0.375582 + R;
+    //    //double cx3 = 0.20105 + R;
+    //    double L = g_maxX1 - g_minX1;
+    //    double p_concrete = 7e5; // Pa = 7 Bar
+    //    double p1 = p_concrete * units->getFactorPressureWToLb();
+    //    double p2 = 0.0;
+    //    double drhoLB = 1.0 + rhoLB;
+    //    double muLB = drhoLB * nuLB;
+    //    double N = R * R / 2 * muLB * uLB * (p1 - p2) / L - 3;
+
+    //    // mu::Parser fct;
+    //    fct.SetExpr("U*(1-(((((x2-y0)^2+(x1-x0)^2)^0.5)/R)^NplusOne))");
+    //    fct.DefineConst("x0", cx1);
+    //    fct.DefineConst("y0", cx2);
+    //    //fct.DefineConst("z0", cx3);
+    //    fct.DefineConst("R", R);
+    //    fct.DefineConst("U", uLB * ((N + 3) / (N + 1)));
+    //    fct.DefineConst("NplusOne", N + 1.0);
+    }
+
+    //SPtr<BCAdapter> inflowConcreteBCAdapter(new VelocityBCAdapter(false, false, true, fct, 0, BCFunction::INFCONST));
+    //inflowConcreteBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
+    SPtr<BCAdapter> inflowConcreteBCAdapter(new MultiphaseVelocityBCAdapter(false, false, true, fct, phiH, 0, BCFunction::INFCONST));
+    inflowConcreteBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
+
+    {
+        //air inflow boundary condition
+        // Å tigler, J. (2014). Analytical velocity profile in tube for laminar and turbulent flow. Engineering
+        // Mechanics, 21(6), 371-379.
+        //SPtr<LBMUnitConverter> unitsAir = std::make_shared<LBMUnitConverter>(d_part, LBMUnitConverter::AIR_20C, d_part / dx);
+        SPtr<LBMUnitConverter> unitsAir = std::make_shared<LBMUnitConverter>(d_part, 1., 1.2041, d_part / dx, uLB);
+        double V = 40;     // flow rate [m^3/h]
+        double D = 0.0166;  // air inlet diameter [m]
+        double R = D / 2.0; // radius [m]
+        double A = UbMath::PI * R * R;
+        double u = V / 3600 / A;
+        double uLB = u * unitsAir->getFactorVelocityWToLb();
+        //double cx1 = -1.2788 + R;
+        double cx2 = 0.3803 + R;
+        double cx3 = 0.1517 + R;
+        double L = g_maxX1 - g_minX1;
+        double p_air = 7e5; // Pa = 7 Bar
+        double p1 = p_air;
+        double p2 = 0.0;
+        double mu = 17.2e-6; //Pa s, air 20° C
+        double N = R * R / 2 * mu * u * (p1 - p2) / L - 3;
+        if (myid == 0) UBLOG(logINFO, "Air inflow velocity = " << u << " m/s");
+        if (myid == 0) UBLOG(logINFO, "Air inflow velocity = " << uLB << " dx/dt");
+
+        double nu = mu / rhoConcrete;
+        double Re = D * u / nu;
+        if (myid == 0) UBLOG(logINFO, "Re_air = " << Re);
+
+        double nuLB = D * unitsAir->getFactorLentghWToLb() * uLB * unitsAir->getFactorVelocityWToLb() / Re;
+        if (myid == 0) UBLOG(logINFO, "nuLB_air = " << nuLB);
+
+        // mu::Parser fct;
+        fct.SetExpr("U");
+        fct.DefineConst("U", -uLB);
+        //fct.SetExpr("U*(1-(((((x2-y0)^2+(x3-z0)^2)^0.5)/R)^NplusOne))");
+        ////fct.DefineConst("x0", cx1);
+        //fct.DefineConst("y0", cx2);
+        //fct.DefineConst("z0", cx3);
+        //fct.DefineConst("R", R);
+        //fct.DefineConst("U", -uLB * ((N + 3) / (N + 1)));
+        //fct.DefineConst("NplusOne", N + 1.0);
+    }
+
+    //SPtr<BCAdapter> inflowAirBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
+    //inflowAirBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
+    SPtr<BCAdapter> inflowAirBCAdapter(new MultiphaseVelocityBCAdapter(true, false, false, fct, phiL, 0, BCFunction::INFCONST));
+    inflowAirBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm()));
+
+    SPtr<BCAdapter> outflowBCAdapter(new DensityBCAdapter(rhoLB));
+    //outflowBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
+    //SPtr<BCAdapter> outflowBCAdapter(new DensityBCAdapter(rhoLB));
+    outflowBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm()));
+    //////////////////////////////////////////////////////////////////////////////////
+    // BC visitor
+    //BoundaryConditionsBlockVisitor bcVisitor;♣
+    MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
+    bcVisitor.addBC(noSlipBCAdapter);
+    bcVisitor.addBC(inflowConcreteBCAdapter);
+    bcVisitor.addBC(inflowAirBCAdapter);
+    bcVisitor.addBC(outflowBCAdapter);
+
+    SPtr<Grid3D> grid = make_shared<Grid3D>(comm);
+    grid->setPeriodicX1(false);
+    grid->setPeriodicX2(false);
+    grid->setPeriodicX3(false);
+    grid->setDeltaX(dx);
+    grid->setBlockNX(blockNX[0], blockNX[1], blockNX[2]);
+    grid->setGhostLayerWidth(2);
+
+    string geoPath = "d:/Projects/TRR277/Project/WP4/NozzleGeo";
+
+    string outputPath = "d:/temp/NozzleFlowTest_Multiphase";
+    UbSystem::makeDirectory(outputPath);
+    UbSystem::makeDirectory(outputPath + "/liggghts");
+
+    //if (myid == 0) {
+    //    stringstream logFilename;
+    //    logFilename << outputPath + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt";
+    //    UbLog::output_policy::setStream(logFilename.str());
+    //}
+
+    SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
+    
+    SPtr<GbObject3D> gridCube = make_shared <GbCuboid3D>(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3);
+    if (myid == 0)
+        GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance());
+
+    GenBlocksGridVisitor genBlocks(gridCube);
+    grid->accept(genBlocks);
+
+    //geo
+    //////////////////////////////////////////////////////////
+    int accuracy = Interactor3D::EDGES;
+    ///////////////////////////////////
+    SPtr<GbTriFaceMesh3D> meshNozzleAirDistributor = std::make_shared<GbTriFaceMesh3D>();
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirDistributor:start");
+    meshNozzleAirDistributor->readMeshFromSTLFileASCII(geoPath + "/01_Nozzle_Air_Distributor.stl", false);
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirDistributor:end");
+    if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAirDistributor.get(), outputPath + "/geo/meshNozzleAirDistributor", WbWriterVtkXmlBinary::getInstance());
+    SPtr<Interactor3D> intrNozzleAirDistributor = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAirDistributor, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    ///////////////////////////////////////////////////////////
+    SPtr<GbTriFaceMesh3D> meshNozzleAirInlet = std::make_shared<GbTriFaceMesh3D>();
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirInlet:start");
+    meshNozzleAirInlet->readMeshFromSTLFileASCII(geoPath + "/02_Nozzle_Air_Inlet.stl", false);
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirInlet:end");
+    if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAirInlet.get(), outputPath + "/geo/meshNozzleAirInlet", WbWriterVtkXmlBinary::getInstance());
+    SPtr<Interactor3D> intrNozzleAirInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAirInlet, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    ///////////////////////////////////////////////////////////
+    SPtr<GbTriFaceMesh3D> meshNozzleSpacer = std::make_shared<GbTriFaceMesh3D>();
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleSpacer:start");
+    meshNozzleSpacer->readMeshFromSTLFileASCII(geoPath + "/03_Nozzle_Spacer.stl", true);
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleSpacer:end");
+    if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleSpacer.get(), outputPath + "/geo/meshNozzleSpacer", WbWriterVtkXmlBinary::getInstance());
+    SPtr<Interactor3D> intrNozzleSpacer = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleSpacer, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    ///////////////////////////////////////////////////////////
+    SPtr<GbTriFaceMesh3D> meshNozzleAccDistributor = std::make_shared<GbTriFaceMesh3D>();
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccDistributor:start");
+    meshNozzleAccDistributor->readMeshFromSTLFileASCII(geoPath + "/04_Nozzle_Acc_Distributor.stl", false);
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccDistributor:end");
+    if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAccDistributor.get(), outputPath + "/geo/meshNozzleAccDistributor", WbWriterVtkXmlBinary::getInstance());
+    SPtr<Interactor3D> intrNozzleAccDistributor = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAccDistributor, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    ///////////////////////////////////////////////////////////
+    SPtr<GbTriFaceMesh3D> meshNozzleAccInlet = std::make_shared<GbTriFaceMesh3D>();
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccInlet:start");
+    meshNozzleAccInlet->readMeshFromSTLFileASCII(geoPath + "/05_Nozzle_Acc_Inlet.stl", false);
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccInlet:end");
+    if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAccInlet.get(), outputPath + "/geo/meshNozzleAccInlet", WbWriterVtkXmlBinary::getInstance());
+    SPtr<Interactor3D> intrNozzleAccInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAccInlet, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy);
+    ///////////////////////////////////////////////////////////
+    SPtr<GbTriFaceMesh3D> meshNozzleVolcanNozzle1 = std::make_shared<GbTriFaceMesh3D>();
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle1:start");
+    meshNozzleVolcanNozzle1->readMeshFromSTLFileBinary(geoPath + "/06_1_Nozzle_Volcan_Nozzle.stl", true);
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle1:end");
+    if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleVolcanNozzle1.get(), outputPath + "/geo/meshNozzleVolcanNozzle1", WbWriterVtkXmlBinary::getInstance());
+    SPtr<Interactor3D> intrNozzleVolcanNozzle1 = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleVolcanNozzle1, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES);
+    ///////////////////////////////////////////////////////////
+    SPtr<GbTriFaceMesh3D> meshNozzleVolcanNozzle2 = std::make_shared<GbTriFaceMesh3D>();
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle2:start");
+    meshNozzleVolcanNozzle2->readMeshFromSTLFileBinary(geoPath + "/06_2_Nozzle_Volcan_Nozzle.stl", true);
+    if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle2:end");
+    if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleVolcanNozzle2.get(), outputPath + "/geo/meshNozzleVolcanNozzle2", WbWriterVtkXmlBinary::getInstance());
+    SPtr<Interactor3D> intrNozzleVolcanNozzle2 = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleVolcanNozzle2, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES);
+    ///////////////////////////////////////////////////////////
+    //box
+    SPtr<D3Q27Interactor> intrBox = SPtr<D3Q27Interactor>(new D3Q27Interactor(gridCube, grid, noSlipBCAdapter, Interactor3D::INVERSESOLID));
+    ///////////////////////////////////////////////////////////
+    //inflow
+    GbCylinder3DPtr geoInflow(new GbCylinder3D(-1.30181+0.0005, 0.390872-0.00229, 0.20105, -1.30181+0.0005, 0.390872-0.00229, 0.23, 0.013));
+    if (myid == 0) GbSystem3D::writeGeoObject(geoInflow.get(), outputPath + "/geo/geoInflow", WbWriterVtkXmlASCII::getInstance());
+    SPtr<D3Q27Interactor> intrInflow = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, inflowConcreteBCAdapter, Interactor3D::SOLID));
+    ///////////////////////////////////////////////////////////
+    //outflow
+    GbCylinder3DPtr geoOutflow(new GbCylinder3D(-1.30181+0.0005, 0.390872-0.00229, -0.22, -1.30181+0.0005, 0.390872-0.00229, -0.21, 0.013));
+    if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), outputPath + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance());
+    SPtr<D3Q27Interactor> intrOutflow = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, outflowBCAdapter, Interactor3D::SOLID));
+    ///////////////////////////////////////////////////////////
+    SPtr<GbTriFaceMesh3D> geoAirInlet = std::make_shared<GbTriFaceMesh3D>();
+    if (myid == 0) UBLOG(logINFO, "Read Air_Inlet:start");
+    geoAirInlet->readMeshFromSTLFileASCII(geoPath + "/Air_Inlet.stl", true);
+    if (myid == 0) UBLOG(logINFO, "Read Air_Inlet:end");
+    if (myid == 0) GbSystem3D::writeGeoObject(geoAirInlet.get(), outputPath + "/geo/geoAirInlet", WbWriterVtkXmlBinary::getInstance());
+    SPtr<Interactor3D> intrAirInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(
+        geoAirInlet, grid, inflowAirBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES);
+    ///////////////////////////////////////////////////////////
+
+    InteractorsHelper intHelper(grid, metisVisitor, true);
+    intHelper.addInteractor(intrBox);
+    intHelper.addInteractor(intrInflow);
+    intHelper.addInteractor(intrAirInlet);
+    intHelper.addInteractor(intrOutflow);
+    intHelper.addInteractor(intrNozzleAirDistributor);
+    intHelper.addInteractor(intrNozzleAirInlet);
+    intHelper.addInteractor(intrNozzleSpacer);
+    intHelper.addInteractor(intrNozzleAccDistributor);
+    intHelper.addInteractor(intrNozzleAccInlet);
+    intHelper.addInteractor(intrNozzleVolcanNozzle1);
+    intHelper.addInteractor(intrNozzleVolcanNozzle2);
+
+
+    intHelper.selectBlocks();
+
+    SPtr<CoProcessor> ppblocks = make_shared<WriteBlocksCoProcessor>(
+         grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm);
+     ppblocks->process(0);
+     ppblocks.reset();
+
+     if (myid == 0) UBLOG(logINFO, Utilities::toString(grid, comm->getNumberOfProcesses()));
+
+
+    //SetKernelBlockVisitor kernelVisitor(kernel, nuLB, comm->getNumberOfProcesses());
+     MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nu_h_LB, nu_l_LB, 1e9, 1);
+    grid->accept(kernelVisitor);
+
+    intHelper.setBC();
+
+    //InitDistributionsBlockVisitor initVisitor;
+    //grid->accept(initVisitor);
+
+    double x1c = -1.31431 + R;
+    double x2c = 0.375582 + R;
+    double x3c = 0.20105;
+
+    mu::Parser fct1;
+    //fct1.SetExpr(" 0.5 - 0.5 * tanh(2 * (sqrt((x1 - x1c) ^ 2 + (x2 - x2c) ^ 2 + (x3 - x3c) ^ 2) - radius) / interfaceThickness)");
+    fct1.SetExpr(" 0.5 - 0.5 * tanh(2 * (sqrt((x1 - x1c) ^ 2 + (x2 - x2c) ^ 2 + (x3 - x3c) ^ 2) - radius) / interfaceThickness)");
+    fct1.DefineConst("x1c", x1c);
+    fct1.DefineConst("x2c", x2c);
+    fct1.DefineConst("x3c", x3c);
+    fct1.DefineConst("radius", R);
+    fct1.DefineConst("interfaceThickness", interfaceThickness * dx);
+
+    MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor;
+    initVisitor.setPhi(fct1);
+    grid->accept(initVisitor);
+
+  
+    string inFile1 = "d:/Projects/VirtualFluids_Develop/apps/cpu/Nozzle/in.nozzle";
+    //string inFile2 = "d:/Projects/VirtualFluids_LIGGGHTS_coupling/apps/cpu/LiggghtsApp/in2.lbdem";
+    MPI_Comm mpi_comm = *(MPI_Comm*)(comm->getNativeCommunicator());
+    LiggghtsCouplingWrapper wrapper(argv, mpi_comm);
+
+    double v_frac = 0.1;
+    double dt_phys   = units->getFactorTimeLbToW();
+    int demSubsteps = 10;
+    double dt_dem   = dt_phys / (double)demSubsteps;
+    int vtkSteps    = 1000;
+    string demOutDir = outputPath + "/liggghts";
+
+    //wrapper.execCommand("echo none");
+
+    //wrapper.execFile((char*)inFile1.c_str());
+
+    //// set timestep and output directory
+    wrapper.setVariable("t_step", dt_dem);
+    wrapper.setVariable("dmp_stp", vtkSteps * demSubsteps);
+    wrapper.setVariable("dmp_dir", demOutDir);
+
+    //wrapper.execFile((char *)inFile1.c_str());
+    //wrapper.runUpto(demSubsteps - 1);
+    //wrapper.runUpto(1000);
+
+    SPtr<UbScheduler> lScheduler = make_shared<UbScheduler>(1); 
+    SPtr<LiggghtsCouplingCoProcessor> lcCoProcessor =
+        make_shared<LiggghtsCouplingCoProcessor>(grid, lScheduler, comm, wrapper, demSubsteps, units);
+
+    // boundary conditions grid
+    {
+        SPtr<UbScheduler> geoSch(new UbScheduler(1));
+        SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+        ppgeo->process(0);
+        ppgeo.reset();
+    }
+
+    grid->accept(bcVisitor);
+
+    //OneDistributionSetConnectorsBlockVisitor setConnsVisitor(comm);
+    //TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+    ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+    grid->accept(setConnsVisitor);
+
+    int numOfThreads          = 18;
+    omp_set_num_threads(numOfThreads);
+
+    SPtr<UbScheduler> nupsSch = std::make_shared<UbScheduler>(10, 10, 100);
+    SPtr<NUPSCounterCoProcessor> nupsCoProcessor = make_shared<NUPSCounterCoProcessor>(grid, nupsSch, numOfThreads, comm);
+
+    //// write data for visualization of macroscopic quantities
+    SPtr < UbScheduler> visSch(new UbScheduler(vtkSteps));
+    //SPtr<UbScheduler> visSch(new UbScheduler(1, 8700, 8800));
+   // visSch->addSchedule(1, 8700, 8800);
+    SPtr<WriteMultiphaseQuantitiesCoProcessor> writeMQCoProcessor(
+        new WriteMultiphaseQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlASCII::getInstance(),
+                                                  SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+    writeMQCoProcessor->process(0);
+
+    int endTime = 1000000;
+    SPtr<Calculator> calculator(new BasicCalculator(grid, lScheduler, endTime));
+    calculator->addCoProcessor(nupsCoProcessor);
+   // calculator->addCoProcessor(lcCoProcessor);
+    calculator->addCoProcessor(writeMQCoProcessor);
+
+    if (myid == 0) UBLOG(logINFO, "Simulation-start");
+    calculator->calculate();
+    if (myid == 0) UBLOG(logINFO, "Simulation-end");
+
+
+    return 0;
+}
diff --git a/apps/cpu/PoiseuilleFlow/pf1.cpp b/apps/cpu/PoiseuilleFlow/pf1.cpp
index 4e4d87ecc797db7545b2dae84e1f76220a02cc33..d4d856d51f66a1ac6800e1f2f78da5b219b54488 100644
--- a/apps/cpu/PoiseuilleFlow/pf1.cpp
+++ b/apps/cpu/PoiseuilleFlow/pf1.cpp
@@ -11,7 +11,7 @@ void pf1()
    int myid = comm->getProcessID();
 
    //parameters
-   string          pathOut = "/gfs1/work/niikonst/pflow_pipe_forcing";
+   string          pathOut = "d:/temp/test_dir_naming";  //"/gfs1/work/niikonst/pflow_pipe_forcing";
    int             numOfThreads = 1;
    int             blocknx[3] ={ 10,10,10 };
    double          endTime = 10;
@@ -27,12 +27,12 @@ void pf1()
 
    //simulation bounding box
    double g_minX1 = 0.0;
-   double g_minX2 = -50.0;
-   double g_minX3 = -50.0;
+   double g_minX2 = -10.0;
+   double g_minX3 = -10.0;
 
-   double g_maxX1 = 2000;
-   double g_maxX2 = 50;
-   double g_maxX3 = 50;
+   double g_maxX1 = 50;
+   double g_maxX2 = 10;
+   double g_maxX3 = 10;
 
    //Sleep(15000);
 
@@ -76,7 +76,7 @@ void pf1()
 
    //set boundary conditions for blocks and create process decomposition for MPI
    SPtr<D3Q27Interactor> cylinderInt(new D3Q27Interactor(cylinder, grid, noSlipBCAdapter, Interactor3D::INVERSESOLID));
-   SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B));
+   SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M));
    InteractorsHelper intHelper(grid, metisVisitor);
    intHelper.addInteractor(cylinderInt);
    intHelper.selectBlocks();
@@ -169,11 +169,11 @@ void pf1()
 
    //grid=SPtr<Grid3D>(new Grid3D(comm));
    //restartCoProcessor->restart(200);
-   SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, pathOut + "/mig", comm));
-   migCoProcessor->setLBMKernel(kernel);
-   migCoProcessor->setBCProcessor(bcProc);
-   migCoProcessor->setNu(nuLB);
-   migCoProcessor->restart(10);
+   //SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, metisVisitor, pathOut + "/mig", comm));
+   //migCoProcessor->setLBMKernel(kernel);
+   //migCoProcessor->setBCProcessor(bcProc);
+   //migCoProcessor->setNu(nuLB);
+   //migCoProcessor->restart(10);
 
    ppblocks->process(1);
 
@@ -192,7 +192,7 @@ void pf1()
    SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
    calculator->addCoProcessor(npr);
    calculator->addCoProcessor(writeMQCoProcessor);
-   calculator->addCoProcessor(migCoProcessor);
+   //calculator->addCoProcessor(migCoProcessor);
    //calculator->addCoProcessor(restartCoProcessor);
 
    if (myid == 0) UBLOG(logINFO, "Simulation-start");
diff --git a/apps/cpu/RisingBubble2D/CMakeLists.txt b/apps/cpu/RisingBubble2D/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5741f1441d806d59a9efd1dd689e5ddba0e5eafc
--- /dev/null
+++ b/apps/cpu/RisingBubble2D/CMakeLists.txt
@@ -0,0 +1,3 @@
+PROJECT(RisingBubble2D)
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES RisingBubble2D.cpp )
diff --git a/apps/cpu/RisingBubble2D/RisingBubble2D.cfg b/apps/cpu/RisingBubble2D/RisingBubble2D.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d0635ea272199311a6e09a68e77ae7ca59a239f0
--- /dev/null
+++ b/apps/cpu/RisingBubble2D/RisingBubble2D.cfg
@@ -0,0 +1,47 @@
+pathname = E:/Multiphase/RisingBubble2D_dr10_test
+
+numOfThreads = 4
+availMem = 10e9
+
+#Grid
+
+#boundingBox = 0 160 0 320 0 3
+#blocknx = 16 16 3
+#blocknx = 80 80 3
+
+boundingBox = 0 20 0 20 0 3
+blocknx = 20 20 3
+
+dx = 1
+refineLevel = 0
+
+#Simulation
+uLB = 0 #0.001#0.005#0.005 
+Re = 35
+#Eotvos number
+Eo = 10;
+nuL = 1e-3 
+nuG = 1e-3 
+densityRatio = 10
+sigma = 1.0850694444444444e-06 #1e-10 #1e-6  # 1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5
+interfaceThickness = 4.096
+radius = 5 #40
+contactAngle = 110.0
+phi_L = 0.0
+phi_H = 1.0
+Phase-field Relaxation = 0.6
+Mobility = 0.056 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1
+
+
+logToFile = false
+
+newStart = false
+restartStep = 10
+
+cpStart = 10
+cpStep = 10
+
+outTime = 100000
+endTime = 13
+
+rStep = 159990 #160000
\ No newline at end of file
diff --git a/apps/cpu/RisingBubble2D/RisingBubble2D.cpp b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..19677aac71768b7cc0a5acba13e06c22dd6f4658
--- /dev/null
+++ b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp
@@ -0,0 +1,455 @@
+#include <iostream>
+#include <string>
+#include <memory>
+
+#if defined(__unix__)
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
+#include "VirtualFluids.h"
+
+using namespace std;
+
+void run(string configname)
+{
+    try {
+        vf::basics::ConfigurationFile  config;
+        config.load(configname);
+
+        string pathname            = config.getValue<string>("pathname");
+        int numOfThreads           = config.getValue<int>("numOfThreads");
+        vector<int> blocknx        = config.getVector<int>("blocknx");
+        vector<double> boundingBox = config.getVector<double>("boundingBox");
+        double uLB             = config.getValue<double>("uLB");
+        double nuL             = config.getValue<double>("nuL");
+        double nuG             = config.getValue<double>("nuG");
+        double densityRatio    = config.getValue<double>("densityRatio");
+        //double sigma           = config.getValue<double>("sigma");
+        int interfaceThickness = config.getValue<int>("interfaceThickness");
+        double radius          = config.getValue<double>("radius");
+        double theta           = config.getValue<double>("contactAngle");
+        double phiL            = config.getValue<double>("phi_L");
+        double phiH            = config.getValue<double>("phi_H");
+        double tauH            = config.getValue<double>("Phase-field Relaxation");
+        double mob             = config.getValue<double>("Mobility");
+
+        double endTime     = config.getValue<double>("endTime");
+        double outTime     = config.getValue<double>("outTime");
+        double availMem    = config.getValue<double>("availMem");
+        int refineLevel    = config.getValue<int>("refineLevel");
+        double Re          = config.getValue<double>("Re");
+        double Eo          = config.getValue<double>("Eo");
+        double dx          = config.getValue<double>("dx");
+        bool logToFile     = config.getValue<bool>("logToFile");
+        double restartStep = config.getValue<double>("restartStep");
+        double cpStart     = config.getValue<double>("cpStart");
+        double cpStep      = config.getValue<double>("cpStep");
+        bool newStart      = config.getValue<bool>("newStart");
+        //double rStep = config.getValue<double>("rStep");
+
+        std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+        int myid                = comm->getProcessID();
+
+        if (myid == 0)
+            UBLOG(logINFO, "2D Rising Bubble: Start!");
+
+        if (logToFile) {
+#if defined(__unix__)
+            if (myid == 0) {
+                const char *str = pathname.c_str();
+                mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+            }
+#endif
+
+            if (myid == 0) {
+                stringstream logFilename;
+                logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt";
+                UbLog::output_policy::setStream(logFilename.str());
+            }
+        }
+        
+        std::string fileName = "./LastTimeStep" + std::to_string((int)boundingBox[1]) + ".txt";
+
+//#if defined(__unix__)
+//         double lastTimeStep = 0;
+//         if (!newStart) 
+//         {
+//             std::ifstream ifstr(fileName);
+//             ifstr >> lastTimeStep;
+//             restartStep = lastTimeStep;
+//             if(endTime >= lastTimeStep)
+//                endTime = lastTimeStep + rStep;
+//             else
+//                return;
+//         }    
+//#endif
+
+        //Sleep(20000);
+
+        // LBMReal dLB = 0; // = length[1] / dx;
+        LBMReal rhoLB = 0.0;
+        LBMReal nuLB  = nuL; //(uLB*dLB) / Re;
+
+        //diameter of circular droplet
+        LBMReal D  = 2.0*radius;
+
+        //density retio
+        //LBMReal r_rho = densityRatio;
+
+        //density of heavy fluid
+        LBMReal rho_h = 1.0;
+        //density of light fluid
+        //LBMReal rho_l = rho_h / r_rho;
+
+        //kinimatic viscosity
+        LBMReal nu_h = nuL;
+        //LBMReal nu_l = nuG;
+        //#dynamic viscosity
+        //LBMReal mu_h = rho_h * nu_h;
+        
+        //gravity
+        LBMReal g_y = Re * Re * nu_h * nu_h / (D*D*D);
+        //Eotvos number
+        //LBMReal Eo = 100;
+        //surface tension
+        LBMReal sigma = rho_h * g_y * D * D / Eo;
+
+        //g_y = 0;
+
+        double beta  = 12.0 * sigma / interfaceThickness;
+        double kappa = 1.5 * interfaceThickness * sigma;
+
+        if (myid == 0) {
+                //UBLOG(logINFO, "uLb = " << uLB);
+                //UBLOG(logINFO, "rho = " << rhoLB);
+                UBLOG(logINFO, "D = " << D);
+                UBLOG(logINFO, "nuL = " << nuL);
+                UBLOG(logINFO, "nuG = " << nuG);
+                UBLOG(logINFO, "Re = " << Re);
+                UBLOG(logINFO, "Eo = " << Eo);
+                UBLOG(logINFO, "g_y = " << g_y);
+                UBLOG(logINFO, "sigma = " << sigma);
+                UBLOG(logINFO, "dx = " << dx);
+                UBLOG(logINFO, "Preprocess - start");
+        }
+
+        SPtr<LBMUnitConverter> conv(new LBMUnitConverter());
+
+        //const int baseLevel = 0;
+
+        SPtr<LBMKernel> kernel;
+
+        //kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel());
+       // kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel());
+        //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel());
+        kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel());
+
+        mu::Parser fgr;
+        fgr.SetExpr("-rho*g_y");
+        fgr.DefineConst("g_y", g_y);
+
+        kernel->setWithForcing(true);
+        kernel->setForcingX1(0.0);
+        kernel->setForcingX2(fgr);
+        kernel->setForcingX3(0.0);
+
+        kernel->setPhiL(phiL);
+        kernel->setPhiH(phiH);
+        kernel->setPhaseFieldRelaxation(tauH);
+        kernel->setMobility(mob);
+        kernel->setInterfaceWidth(interfaceThickness);
+
+
+        kernel->setCollisionFactorMultiphase(nuL, nuG);
+        kernel->setDensityRatio(densityRatio);
+        kernel->setMultiphaseModelParameters(beta, kappa);
+        kernel->setContactAngle(theta);
+        dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(1.0);
+
+        SPtr<BCProcessor> bcProc(new BCProcessor());
+
+        kernel->setBCProcessor(bcProc);
+
+        SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+        noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm()));
+        SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter());
+        slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseSlipBCAlgorithm()));
+        //////////////////////////////////////////////////////////////////////////////////
+        // BC visitor
+        MultiphaseBoundaryConditionsBlockVisitor bcVisitor;
+        bcVisitor.addBC(noSlipBCAdapter);
+        bcVisitor.addBC(slipBCAdapter);
+
+        SPtr<Grid3D> grid(new Grid3D(comm));
+        grid->setDeltaX(dx);
+        grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]);
+        grid->setPeriodicX1(false);
+        grid->setPeriodicX2(false);
+        grid->setPeriodicX3(true);
+        grid->setGhostLayerWidth(2);
+
+        SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
+
+        //////////////////////////////////////////////////////////////////////////
+        // restart
+        SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
+        SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm));
+        //SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm));
+        //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm));
+        // rcp->setNu(nuLB);
+       //  rcp->setNuLG(nuL, nuG);
+        //rcp->setDensityRatio(densityRatio);
+
+        rcp->setLBMKernel(kernel);
+        rcp->setBCProcessor(bcProc);
+        //////////////////////////////////////////////////////////////////////////
+
+        if (newStart) {
+
+            // bounding box
+            double g_minX1 = boundingBox[0];
+            double g_minX2 = boundingBox[2];
+            double g_minX3 = boundingBox[4];
+
+            double g_maxX1 = boundingBox[1];
+            double g_maxX2 = boundingBox[3];
+            double g_maxX3 = boundingBox[5];
+
+            // geometry
+            SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3));
+            if (myid == 0)
+                GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube",
+                    WbWriterVtkXmlBinary::getInstance());
+
+
+
+            GenBlocksGridVisitor genBlocks(gridCube);
+            grid->accept(genBlocks);
+
+            double dx2 = 2.0 * dx;
+            GbCuboid3DPtr wallXmin(new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_minX1, g_maxX2 + dx2, g_maxX3 + dx2));
+            GbSystem3D::writeGeoObject(wallXmin.get(), pathname + "/geo/wallXmin", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallXmax(new GbCuboid3D(g_maxX1, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2));
+            GbSystem3D::writeGeoObject(wallXmax.get(), pathname + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance());
+
+            GbCuboid3DPtr wallYmin(new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_minX2, g_maxX3 + dx2));
+            GbSystem3D::writeGeoObject(wallYmin.get(), pathname + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance());
+            GbCuboid3DPtr wallYmax(new GbCuboid3D(g_minX1 - dx2, g_maxX2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2));
+            GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance());
+
+            SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, slipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, slipBCAdapter, Interactor3D::SOLID));
+
+            SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+            SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+ 
+            SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
+                grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+
+            InteractorsHelper intHelper(grid, metisVisitor, true);
+            intHelper.addInteractor(wallXminInt);
+            intHelper.addInteractor(wallXmaxInt);
+            intHelper.addInteractor(wallYminInt);
+            intHelper.addInteractor(wallYmaxInt);
+            intHelper.selectBlocks();
+
+            ppblocks->process(0);
+            ppblocks.reset();
+
+            unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
+            int ghostLayer                    = 5;
+            unsigned long long numberOfNodesPerBlock =
+                (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]);
+            unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock;
+            unsigned long long numberOfNodesPerBlockWithGhostLayer =
+                numberOfBlocks * (blocknx[0] + ghostLayer) * (blocknx[1] + ghostLayer) * (blocknx[2] + ghostLayer);
+            double needMemAll =
+                double(numberOfNodesPerBlockWithGhostLayer * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4));
+            double needMem = needMemAll / double(comm->getNumberOfProcesses());
+
+            if (myid == 0) {
+                UBLOG(logINFO, "Number of blocks = " << numberOfBlocks);
+                UBLOG(logINFO, "Number of nodes  = " << numberOfNodes);
+                int minInitLevel = grid->getCoarsestInitializedLevel();
+                int maxInitLevel = grid->getFinestInitializedLevel();
+                for (int level = minInitLevel; level <= maxInitLevel; level++) {
+                    int nobl = grid->getNumberOfBlocks(level);
+                    UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl);
+                    UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock);
+                }
+                UBLOG(logINFO, "Necessary memory  = " << needMemAll << " bytes");
+                UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes");
+                UBLOG(logINFO, "Available memory per process = " << availMem << " bytes");
+            }
+
+            MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, availMem, needMem);
+
+            grid->accept(kernelVisitor);
+
+            if (refineLevel > 0) {
+                SetUndefinedNodesBlockVisitor undefNodesVisitor;
+                grid->accept(undefNodesVisitor);
+            }
+
+
+            intHelper.setBC();
+
+            // initialization of distributions
+            LBMReal x1c = D; 
+            LBMReal x2c = D; 
+            LBMReal x3c = 1.5; 
+            //LBMReal x3c = 2.5 * D;
+            mu::Parser fct1;
+            fct1.SetExpr("0.5+0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)");
+            fct1.DefineConst("x1c", x1c);
+            fct1.DefineConst("x2c", x2c);
+            fct1.DefineConst("x3c", x3c);
+            fct1.DefineConst("radius", radius);
+            fct1.DefineConst("interfaceThickness", interfaceThickness);
+
+            mu::Parser fct2;
+            fct2.SetExpr("0.5*uLB+uLB*0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)");
+            //fct2.SetExpr("uLB");
+            fct2.DefineConst("uLB", uLB);
+            fct2.DefineConst("x1c", x1c);
+            fct2.DefineConst("x2c", x2c);
+            fct2.DefineConst("x3c", x3c);
+            fct2.DefineConst("radius", radius);
+            fct2.DefineConst("interfaceThickness", interfaceThickness);
+
+            //MultiphaseInitDistributionsBlockVisitor initVisitor(densityRatio);
+            MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor;
+            initVisitor.setPhi(fct1);
+            initVisitor.setVx1(fct2);
+            grid->accept(initVisitor);
+
+            // boundary conditions grid
+            {
+                SPtr<UbScheduler> geoSch(new UbScheduler(1));
+                SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(
+                    grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm));
+                ppgeo->process(0);
+                ppgeo.reset();
+            }
+
+            if (myid == 0)
+                UBLOG(logINFO, "Preprocess - end");
+        } else {
+            if (myid == 0) {
+                UBLOG(logINFO, "Parameters:");
+                UBLOG(logINFO, "uLb = " << uLB);
+                UBLOG(logINFO, "rho = " << rhoLB);
+                UBLOG(logINFO, "nuLb = " << nuLB);
+                UBLOG(logINFO, "Re = " << Re);
+                UBLOG(logINFO, "dx = " << dx);
+                UBLOG(logINFO, "number of levels = " << refineLevel + 1);
+                UBLOG(logINFO, "numOfThreads = " << numOfThreads);
+                UBLOG(logINFO, "path = " << pathname);
+            }
+
+            rcp->restart((int)restartStep);
+            grid->setTimeStep(restartStep);
+
+            if (myid == 0)
+                UBLOG(logINFO, "Restart - end");
+        }
+
+        grid->accept(bcVisitor);
+
+        //TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm);
+        //grid->accept(setConnsVisitor);
+
+        //ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+        //grid->accept(setConnsVisitor);
+
+        TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm);
+        grid->accept(setConnsVisitor);
+
+        SPtr<UbScheduler> visSch(new UbScheduler(outTime));
+        //visSch->addSchedule(307200,307200,307200); //t=2 
+        visSch->addSchedule(1228185,1228185,1228185);
+        //double t_ast, t;
+        //t_ast = 2;
+        //t = (int)(t_ast/std::sqrt(g_y/D));
+        //visSch->addSchedule(t,t,t); //t=2
+        //t_ast = 3;
+        //t = (int)(t_ast/std::sqrt(g_y/D));        
+        //visSch->addSchedule(t,t,t); //t=3
+        //t_ast = 4;
+        //t = (int)(t_ast/std::sqrt(g_y/D));        
+        //visSch->addSchedule(t,t,t); //t=4
+        //t_ast = 5;
+        //t = (int)(t_ast/std::sqrt(g_y/D));        
+        //visSch->addSchedule(t,t,t); //t=5
+        //t_ast = 6;
+        //t = (int)(t_ast/std::sqrt(g_y/D)); 
+        //visSch->addSchedule(t,t,t); //t=6
+        //t_ast = 7;
+        //t = (int)(t_ast/std::sqrt(g_y/D));         
+        //visSch->addSchedule(t,t,t); //t=7
+        //t_ast = 9;
+        //t = (int)(t_ast/std::sqrt(g_y/D));         
+        //visSch->addSchedule(t,t,t); //t=9
+
+
+        SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
+            grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
+        if(grid->getTimeStep() == 0) 
+            pp->process(0);
+
+        SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
+        SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+
+        //omp_set_num_threads(numOfThreads);
+
+        SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
+        SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
+        calculator->addCoProcessor(npr);
+        calculator->addCoProcessor(pp);
+        calculator->addCoProcessor(rcp);
+
+
+        if (myid == 0)
+            UBLOG(logINFO, "Simulation-start");
+        calculator->calculate();
+        if (myid == 0)
+            UBLOG(logINFO, "Simulation-end");
+            
+//#if defined(__unix__)
+//         //if (!newStart) 
+//         //{
+//            if (myid == 0) 
+//            {
+//                std::ofstream ostr(fileName);
+//                ostr << endTime;
+//                cout << "start sbatch\n";
+//                //system("./start.sh");
+//                //system("echo test!");
+//                std::string str = "sbatch startJob" + std::to_string((int)boundingBox[1]) + ".sh";
+//                //system("sbatch startJob512.sh");
+//                system(str.c_str());
+//            }   
+//            //MPI_Barrier((MPI_Comm)comm->getNativeCommunicator()); 
+//         //}
+//#endif
+
+    } catch (std::exception &e) {
+        cerr << e.what() << endl << flush;
+    } catch (std::string &s) {
+        cerr << s << endl;
+    } catch (...) {
+        cerr << "unknown exception" << endl;
+    }
+}
+int main(int argc, char *argv[])
+{
+    // Sleep(30000);
+    if (argv != NULL) {
+        if (argv[1] != NULL) {
+            run(string(argv[1]));
+        } else {
+            cout << "Configuration file is missing!" << endl;
+        }
+    }
+}
diff --git a/apps/cpu/ViskomatXL/viskomat.cfg b/apps/cpu/ViskomatXL/viskomat.cfg
index 4227ba9f821cfa9336a69c14b828829c6ff2ccb1..626948407375ec46c5f4d350416225f4159bb319 100644
--- a/apps/cpu/ViskomatXL/viskomat.cfg
+++ b/apps/cpu/ViskomatXL/viskomat.cfg
@@ -1,50 +1,38 @@
-outputPath = d:/temp/viskomatCylinderRestartTest3_Migration
+outputPath = d:/temp/viskomatXL_restart_test
 geoPath = d:/Projects/TRR277/Project/WP1/Rheometer/Aileen
-geoFile = fishbone.stl
+#geoPath = d:/Projects/TRR277/Project/WP1/Rheometer
+geoFile = fishboneT.stl
+#geoFile = cylinder.stl
 
-numOfThreads = 4
-availMem = 8e9
+numOfThreads = 1
+availMem = 15e9
 logToFile = false
 
-blocknx = 16 16 16
-#blocknx = 1 8 8
-#boundingBox = -4 171 -9.5 155.5 -76.5 82.5
-#boundingBox = -4 166 -9.5 155.5 -76.5 82.5
-
-#boundingBox = -4 166 0 165 0 165
-
-#boundingBox = -4 166 -82.5 82.5 -82.5 82.5
-
+blocknx = 14 14 14
+#blocknx = 14 15 15
+#blocknx = 35 83 83
 boundingBox = 0 140 -82.5 82.5 -82.5 82.5
 
-# around X
-#blocknx = 1 16 16
-#boundingBox = 0 1 0 165 0 165
-
-# around Y
-#blocknx = 16 1 16
-#boundingBox =  0 165 0 1 0 165
-
-#zero test
-#blocknx = 8 8 8
-#boundingBox =  0 8 0 8 0 8
+#blocknx = 32 12 12
+#boundingBox = 0 32 -12 12 -12 12
+#boundingBox = 0 64 -24 24 -24 24
+#boundingBox = 0 64 -24 24 -24 24
 
 deltax = 1
 
 refineLevel = 0
 
-#nuLB = 1.5e-4
-OmegaLB = 1e-4
+OmegaLB = 1e-5
+mu = 5 # Pa s
+N = 80 # rpm
 tau0 = 20e-7
+N = 30
 
-resolution = 32
-scaleFactor = 1
-
-newStart = true
-restartStep = 10000
+newStart = false
+restartStep = 10
 
-cpStart = 10000
-cpStep = 10000
+cpStart = 10
+cpStep  = 10
 
-outTime = 1000
-endTime = 1000000
\ No newline at end of file
+outTime = 10000
+endTime = 20
\ No newline at end of file
diff --git a/apps/cpu/ViskomatXL/viskomat.cpp b/apps/cpu/ViskomatXL/viskomat.cpp
index be7d3e850b633f7f40b24eaffd024487447d0c12..0b20e9367f446f0f8d194e59d026d5a91f3e32e9 100644
--- a/apps/cpu/ViskomatXL/viskomat.cpp
+++ b/apps/cpu/ViskomatXL/viskomat.cpp
@@ -19,7 +19,6 @@ void bflow(string configname)
       int             numOfThreads = config.getValue<int>("numOfThreads");
       vector<int>     blocknx = config.getVector<int>("blocknx");
       vector<double>  boundingBox = config.getVector<double>("boundingBox");
-      //double          nuLB = config.getValue<double>("nuLB");
       double          endTime = config.getValue<double>("endTime");
       double          outTime = config.getValue<double>("outTime");
       double          availMem = config.getValue<double>("availMem");
@@ -32,16 +31,13 @@ void bflow(string configname)
       bool            newStart = config.getValue<bool>("newStart");
       double          OmegaLB = config.getValue<double>("OmegaLB");
       double          tau0 = config.getValue<double>("tau0");
-      double          scaleFactor = config.getValue<double>("scaleFactor");
-      double          resolution = config.getValue<double>("resolution");
+      double          N = config.getValue<double>("N");
+      double          mu = config.getValue<double>("mu");
 
-      vf::basics::ConfigurationFile   viscosity;
-      //viscosity.load(viscosityPath + "/viscosity.cfg");
-      //double nuLB = viscosity.getValue<double>("nuLB");
 
-      //outputPath = outputPath + "/rheometerBingham_" + config.getValue<string>("resolution") + "_" + config.getValue<string>("OmegaLB");
+      vf::basics::ConfigurationFile   viscosity;
 
-      SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
+      std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance();
       int myid = comm->getProcessID();
 
       if (logToFile)
@@ -64,39 +60,32 @@ void bflow(string configname)
 
       LBMReal rhoLB = 0.0;
 
-      //akoustic
-       //OmegaLB /= scaleFactor;
-       //nuLB *=scaleFactor;
-       //endTime *= scaleFactor;
-       ////outTime = endTime;
-       //cpStart = endTime;
-       //cpStep  = endTime;
-
-//diffusive
-      //OmegaLB /= scaleFactor * scaleFactor;
-      //tau0 /= scaleFactor * scaleFactor;
-      //endTime *= scaleFactor * scaleFactor;
-      //outTime = endTime;
-      //cpStart = endTime;
-      //cpStep = endTime;
-
-      //double Re = 1.38230076758;
-      double N  = 80; //rpm
+      //double N  = 70; //rpm
       double Omega = 2 * UbMath::PI / 60.0 * N; //rad/s
-      double mu    = 1; //Pa s
+      //double mu    = 5; //Pa s
       double R     = 0.165 / 2.0; //m
       double rho   = 970; //kg/m^3
       double Re    = Omega * R * R * rho / mu;
 
-      double nuLB = OmegaLB * R * 1e3 * R * 1e3 / Re;
+      //double nuLB = OmegaLB * R * 1e3 * R * 1e3 / Re;
 
-      SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter());
-      // double uWorld = (N * PI) / 30.0; //0.0037699111843
-      // double rhoWorld = 2350.0; //kg/m^3
-      //double R0 = boundingBox[0] * 0.5;
+      double dx = deltax * 1e-3;
+      double nuLB = OmegaLB * (R / dx)*(R / dx) / Re;
+
+      double Bm = tau0/(mu*Omega);
+      double tau0LB = Bm*nuLB*OmegaLB;
 
-      //SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter(deltax, uWorld*R0, rhoWorld, 1.0, uLB));
-      //if (myid == 0) UBLOG(logINFO, conv->toString());
+
+      //double dx = 1.0 * 1e-3;
+      //double nuLB = OmegaLB * (R / dx)*(R / dx) / Re;
+
+      //acustic scaling
+      // OmegaLB /= 2.0;
+      // nuLB    *= 2.0;
+
+      SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter());
+      //SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter(1, 1461, 970, 1e3));
+      //UBLOG(logINFO, conv->toString());
 
       //bounding box
 
@@ -109,60 +98,35 @@ void bflow(string configname)
       double g_minX3 = boundingBox[4];
       double g_maxX3 = boundingBox[5];
 
-      //double g_minX1 = -boundingBox[0]/2.0;
-      //double g_minX2 = -boundingBox[1] / 2.0;
-      //double g_minX3 = -boundingBox[2]/2.0;
-
-      //double g_maxX1 = boundingBox[0]/2.0;
-      //double g_maxX2 = boundingBox[1]/2.0;
-      //double g_maxX3 = boundingBox[2]/2.0;
-
-//      double blockLength = 3.0 * deltax;
-
-      // double d = 2.0 * radius;
-      // double U = uLB;
-      // double Gamma = U / d;
-
-      // double muWorld = 20; //Pa*s
-      // double k = 0.0015; // muWorld / rhoWorld * conv->getFactorViscosityWToLb(); //(U * d) / (Re);
-
-      // //double k = (U * d) / (Re * std::pow(Gamma, n - 1));
-      // double yielStressWorld = 20; //Pa
-      // double tau0 = 1e-6;// 3e-6;//yielStressWorld * conv->getFactorPressureWToLb(); //Bn * k * std::pow(Gamma, n);
-
-      //double k = 0.05; // (U * d) / (Re * std::pow(Gamma, n - 1));
-      //double tau0 = 3e-6; //Bn * k * std::pow(Gamma, n);
-
-      //double forcing = 8e-7;
-
-      //double omegaMin = 1.0e-8;
-
       SPtr<Rheology> thix = Rheology::getInstance();
       //thix->setPowerIndex(n);
       //thix->setViscosityParameter(k);
-      thix->setYieldStress(tau0);
+      thix->setYieldStress(tau0LB);
       //thix->setOmegaMin(omegaMin);
 
       SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
       noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
       //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyHerschelBulkleyModelNoSlipBCAlgorithm()));
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelNoSlipBCAlgorithm()));
+      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelNoSlipBCAlgorithm()));
 
       SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter());
       slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm()));
+      //slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SlipBCAlgorithm()));
 
       //// rotation around X-axis
       mu::Parser fctVy;
-      fctVy.SetExpr("-Omega*(x3-z0-r)");
+      fctVy.SetExpr("-Omega*(x3-z0-r)/deltax");
       fctVy.DefineConst("Omega", OmegaLB);
       fctVy.DefineConst("r", 0.5 * (g_maxX3 - g_minX3));
       fctVy.DefineConst("z0", g_minX3);
+      fctVy.DefineConst("deltax", deltax);
 
       mu::Parser fctVz;
-      fctVz.SetExpr("Omega*(x2-y0-r)");
+      fctVz.SetExpr("Omega*(x2-y0-r)/deltax");
       fctVz.DefineConst("Omega", OmegaLB);
       fctVz.DefineConst("r", 0.5 * (g_maxX2 - g_minX2));
       fctVz.DefineConst("y0", g_minX2);
+      fctVz.DefineConst("deltax", deltax);
 
       mu::Parser fctVx;
       fctVx.SetExpr("0.0");
@@ -183,8 +147,8 @@ void bflow(string configname)
       //fctVy.SetExpr("0.0");
 
       SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, true, true, fctVx, fctVy, fctVz, 0, BCFunction::INFCONST));
-      velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm()));
+      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
+      velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm()));
       //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
       //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelVelocityBCAlgorithm()));
 
@@ -195,7 +159,7 @@ void bflow(string configname)
 
       //BS visitor
       BoundaryConditionsBlockVisitor bcVisitor;
-      bcVisitor.addBC(noSlipBCAdapter);
+      //bcVisitor.addBC(noSlipBCAdapter);
       bcVisitor.addBC(slipBCAdapter);
       bcVisitor.addBC(velocityBCAdapter);
       //bcVisitor.addBC(densityBCAdapter);
@@ -207,8 +171,8 @@ void bflow(string configname)
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new IncompressibleCumulantLBMKernel()); 
-      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantK17LBMKernel()); 
-      //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyBinghamModelLBMKernel());
+      //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantK17LBMKernel()); 
+      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyBinghamModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel());
       kernel->setBCProcessor(bcProc);
@@ -225,10 +189,14 @@ void bflow(string configname)
       SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3));
       if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance());
 
+      ////////////////////////////////////////////
+      //METIS
+      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE));
+      ////////////////////////////////////////////
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, outputPath, comm));
+      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm));
       //SPtr<MPIIORestartCoProcessor> restartCoProcessor(new MPIIORestartCoProcessor(grid, mSch, outputPath, comm));
       restartCoProcessor->setLBMKernel(kernel);
       restartCoProcessor->setBCProcessor(bcProc);
@@ -237,26 +205,33 @@ void bflow(string configname)
 
       ////stator
       // rotation around X-axis 
-      SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 - 3.0 * deltax, g_minX2 + 0.5 * (g_maxX2 - g_minX2),
-                                               g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_maxX1 + 3.0 * deltax,
-          g_minX2 + 0.5 * (g_maxX2 - g_minX2), g_minX3 + 0.5 * (g_maxX3 - g_minX3), 0.5 * (g_maxX3 - g_minX3) * 0.5));
-
-       // rotation around Y-axis 
-      //SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 + 0.5 * (g_maxX1 - g_minX1), g_minX2 - 3.0 * deltax, 
-      //                                         g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_minX1 + 0.5 * (g_maxX1 - g_minX1),
-      //                                         g_maxX2 + 3.0 * deltax, g_minX3 + 0.5 * (g_maxX3 - g_minX3),
-      //                                         0.5 * (g_maxX3 - g_minX3) * 0.5));
-
-      SPtr<D3Q27Interactor> statorInt =
-          SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID));
+       //SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 - 3.0 * deltax, g_minX2 + 0.5 * (g_maxX2 - g_minX2),
+       //                                         g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_maxX1 + 3.0 * deltax,
+       //    g_minX2 + 0.5 * (g_maxX2 - g_minX2), g_minX3 + 0.5 * (g_maxX3 - g_minX3), 0.5 * (g_maxX3 - g_minX3) * 0.5));
+
+      // SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 - 4.0 * deltax, g_minX2 + 0.5 * (g_maxX2 - g_minX2),
+      //                                          g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_maxX1 + 3.0 * deltax,
+      //     g_minX2 + 0.5 * (g_maxX2 - g_minX2), g_minX3 + 0.5 * (g_maxX3 - g_minX3), 12.0*0.5));
+
+      ////  // rotation around Y-axis 
+      //// //SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 + 0.5 * (g_maxX1 - g_minX1), g_minX2 - 3.0 * deltax, 
+      //// //                                         g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_minX1 + 0.5 * (g_maxX1 - g_minX1),
+      //// //                                         g_maxX2 + 3.0 * deltax, g_minX3 + 0.5 * (g_maxX3 - g_minX3),
+      //// //                                         0.5 * (g_maxX3 - g_minX3) * 0.5));
+
+      // SPtr<D3Q27Interactor> statorInt =
+      //    SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID));
       
-      //SPtr<GbTriFaceMesh3D> stator = make_shared<GbTriFaceMesh3D>();
-      //stator->readMeshFromSTLFileBinary(geoPath + "/" + geoFile, false);
+      SPtr<GbTriFaceMesh3D> stator = make_shared<GbTriFaceMesh3D>();
+      stator->readMeshFromSTLFileBinary(geoPath + "/" + geoFile, false);
+      //stator->scale(2.0, 2.0, 2.0);
+      //stator->translate(16.0, 0.0, 0.0);
       //stator->translate(4.0, -73.0, -6.0);
+
+      SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27TriFaceMeshInteractor>(
+         new D3Q27TriFaceMeshInteractor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES));
+
       GbSystem3D::writeGeoObject(stator.get(), outputPath + "/geo/stator", WbWriterVtkXmlBinary::getInstance());
-      
-      //SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27TriFaceMeshInteractor>(
-      //    new D3Q27TriFaceMeshInteractor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES));
 
       ////rotor (cylinder)
       // rotation around X-axis 
@@ -291,27 +266,22 @@ void bflow(string configname)
       if (myid == 0)
       {
          UBLOG(logINFO, "Parameters:");
-         //UBLOG(logINFO, "forcing = " << forcing);
          UBLOG(logINFO, "N = " << N << " rpm");
          UBLOG(logINFO, "Omega = " << Omega << " rad/s");
+         UBLOG(logINFO, "mu = " << mu << " Pa s");
+         UBLOG(logINFO, "tau0 = " << tau0<< " Pa");
+         UBLOG(logINFO, "rho = " << rho<< " kg/m^3");
          UBLOG(logINFO, "Re = " << Re);
-         UBLOG(logINFO, "rho = " << rhoLB);
+         UBLOG(logINFO, "Bm = " << Bm);
+         UBLOG(logINFO, "rhoLB = " << rhoLB);
          UBLOG(logINFO, "uLB = " << OmegaLB);
          UBLOG(logINFO, "nuLB = " << nuLB);
-         // UBLOG(logINFO, "Re = " << (U * d) / (k * std::pow(Gamma, n - 1)));
-         // UBLOG(logINFO, "Bn = " << tau0 /(k * std::pow(Gamma, n)));
-         // UBLOG(logINFO, "k = " << k);
-         // UBLOG(logINFO, "n = " << n);
-         UBLOG(logINFO, "tau0 = " << tau0);
-         UBLOG(logINFO, "scaleFactor = " << scaleFactor);
-         UBLOG(logINFO, "deltax = " << deltax);
+         UBLOG(logINFO, "tau0LB = " << tau0LB);
+         UBLOG(logINFO, "deltax = " << deltax << " mm");
          UBLOG(logINFO, "number of levels = " << refineLevel + 1);
          UBLOG(logINFO, "number of threads = " << numOfThreads);
          UBLOG(logINFO, "number of processes = " << comm->getNumberOfProcesses());
          UBLOG(logINFO, "blocknx = " << blocknx[0] << " " << blocknx[1] << " " << blocknx[2]);
-         UBLOG(logINFO, "resolution = " << resolution);
-         // UBLOG(logINFO, "boundingBox = " << boundingBox[0] << " " << boundingBox[1] << " " << boundingBox[2]);
-         // UBLOG(logINFO, "sphereCenter = " << sphereCenter[0] << " " << sphereCenter[1] << " " << sphereCenter[2]);
          UBLOG(logINFO, "output path = " << outputPath);
          UBLOG(logINFO, "Preprozess - start");
       }
@@ -335,17 +305,15 @@ void bflow(string configname)
          }
 
 
-         ////////////////////////////////////////////
-         //METIS
-         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY));
-         ////////////////////////////////////////////
+
          /////delete solid blocks
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start");
          InteractorsHelper intHelper(grid, metisVisitor);
-         intHelper.addInteractor(wallXminInt);
          intHelper.addInteractor(wallXmaxInt);
          intHelper.addInteractor(statorInt);
          intHelper.addInteractor(rotorInt);
+         intHelper.addInteractor(wallXminInt);
+         
          intHelper.selectBlocks();
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
          //////////////////////////////////////
@@ -403,16 +371,16 @@ void bflow(string configname)
       else
       {
          restartCoProcessor->restart((int)restartStep);
-         grid->setTimeStep(restartStep);
          
-         //SetBcBlocksBlockVisitor v1(wallXminInt);
-         //grid->accept(v1);
-         //wallXminInt->initInteractor();
-         //
-         //SetBcBlocksBlockVisitor v2(wallXmaxInt);
-         //grid->accept(v2);
-         //wallXmaxInt->initInteractor();
+         //restartCoProcessor->readBlocks((int)restartStep);
+         //restartCoProcessor->readDataSet((int)restartStep);
+         ////restartCoProcessor->readBoundaryConds((int)restartStep);
+         //grid->setTimeStep((int)restartStep);
          
+         SetBcBlocksBlockVisitor v2(wallXmaxInt);
+         grid->accept(v2);
+         wallXmaxInt->initInteractor();
+
          SetBcBlocksBlockVisitor v3(statorInt);
          grid->accept(v3);
          statorInt->initInteractor();
@@ -421,10 +389,16 @@ void bflow(string configname)
          grid->accept(v4);
          rotorInt->initInteractor();
 
+         SetBcBlocksBlockVisitor v1(wallXminInt);
+         grid->accept(v1);
+         wallXminInt->initInteractor();
 
+         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath,
+                                                               WbWriterVtkXmlBinary::getInstance(), comm));
+         ppblocks->process(1);
       }
       
-      omp_set_num_threads(numOfThreads);
+      //omp_set_num_threads(numOfThreads);
 
       //set connectors
       //InterpolationProcessorPtr iProcessor(new ThixotropyInterpolationProcessor());
@@ -446,7 +420,7 @@ void bflow(string configname)
       SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
       //writeMQCoProcessor->process(100);
 
-      SPtr<UbScheduler> forceSch(new UbScheduler(100));
+      SPtr<UbScheduler> forceSch(new UbScheduler(1000));
       SPtr<CalculateTorqueCoProcessor> fp = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueRotor.csv", comm);
       fp->addInteractor(rotorInt);
       SPtr<CalculateTorqueCoProcessor> fp2 = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueStator.csv", comm);
@@ -457,9 +431,9 @@ void bflow(string configname)
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
       calculator->addCoProcessor(npr);
-      calculator->addCoProcessor(fp);
+      //calculator->addCoProcessor(fp);
       calculator->addCoProcessor(fp2);
-      calculator->addCoProcessor(writeMQCoProcessor);
+      //calculator->addCoProcessor(writeMQCoProcessor);
       //calculator->addCoProcessor(writeThixotropicMQCoProcessor);
       calculator->addCoProcessor(restartCoProcessor);
 
diff --git a/apps/cpu/rheometer/rheometer.cfg b/apps/cpu/rheometer/rheometer.cfg
index 9eec8c6ded9b7a5ab8d1e6177c43354a4514ccc3..9b739bc67ed42d46c89adaefab1b020ad67da660 100644
--- a/apps/cpu/rheometer/rheometer.cfg
+++ b/apps/cpu/rheometer/rheometer.cfg
@@ -1,4 +1,4 @@
-#outputPath = d:/temp/rheometer/rheometerBinghamqQBB/rheometerBingham_tau_20e-7_nu_1.5e-3_new_lim_test
+#outputPath = d:/temp/rheometerTest
 outputPath = d:/temp/Taylor-CouetteFlowIncompCum
 viscosityPath = d:/Projects/VirtualFluidsCombined/apps/cpu/rheometer
 
@@ -8,7 +8,7 @@ logToFile = false
 
 blocknx = 16 16 1  #8 8 1
 #boundingBox = 32 32 1
-deltax = 1
+deltax = 0.5
 
 #boundingBox = 0.02 0.02 0.00125
 #deltax = 0.000625
diff --git a/apps/cpu/rheometer/rheometer.cpp b/apps/cpu/rheometer/rheometer.cpp
index c972d8fec3da4c6d4191948c7fcaafc9f061d13b..e79d9d13a3763cb5502c24f12fb6ec4d27651814 100644
--- a/apps/cpu/rheometer/rheometer.cpp
+++ b/apps/cpu/rheometer/rheometer.cpp
@@ -221,10 +221,14 @@ void bflow(string configname)
       SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3));
       if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance());
 
+      ////////////////////////////////////////////
+      //METIS
+      SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY));
+      ////////////////////////////////////////////
       //////////////////////////////////////////////////////////////////////////
       //restart
       SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
-      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, outputPath, comm));
+      SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm));
       restartCoProcessor->setLBMKernel(kernel);
       restartCoProcessor->setBCProcessor(bcProc);
       //restartCoProcessor->setNu(k);
@@ -309,7 +313,7 @@ void bflow(string configname)
 
          ////////////////////////////////////////////
          //METIS
-         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY));
+         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY));
          ////////////////////////////////////////////
          /////delete solid blocks
          if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start");
diff --git a/apps/cpu/sphere/sphere.cpp b/apps/cpu/sphere/sphere.cpp
index 5ab9a2a70f59273c326d7757faf13e4e338c6614..bad77ee999d96b89fea43183929ecf4a3b920588 100644
--- a/apps/cpu/sphere/sphere.cpp
+++ b/apps/cpu/sphere/sphere.cpp
@@ -180,7 +180,7 @@ void run(string configname)
          //outflow
          SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
 
-         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B));
+         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M));
          InteractorsHelper intHelper(grid, metisVisitor);
          intHelper.addInteractor(sphereInt);
          intHelper.addInteractor(addWallYminInt);
diff --git a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp
index 5fc31904433bfe2df0722ab1c63f574d3fcb9a35..55a77a341d90769e3bca5fa7b16ce5371333386f 100644
--- a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp
+++ b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp
@@ -350,7 +350,8 @@ void multipleLevel(const std::string& configPath)
 
     gridBuilder->setStressBoundaryCondition(SideType::MZ,
                                             0.0, 0.0, 1.0,              // wall normals
-                                            samplingOffset, z0, dx);     // wall model settinng
+                                            samplingOffset, z0, dx,     // wall model settinng
+                                            0.5f);                      // q
     para->setHasWallModelMonitor(true);   
     gridBuilder->setSlipBoundaryCondition(SideType::PZ,  0.0f,  0.0f, -1.0f); 
 
diff --git a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
index 69ecb3d8cbd45a8a7419437e934a57bd20b0bc9f..4ef9786cdd9130d4da7c459b4f83b468cc0d581a 100644
--- a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
+++ b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
@@ -154,7 +154,7 @@ int main()
         para->setTimestepOut(timeStepOut);
         para->setTimestepEnd(timeStepEnd);
 
-        para->setMainKernel("CumulantK17CompChimRedesigned");
+        para->setMainKernel("CumulantK17");
 
         //////////////////////////////////////////////////////////////////////////
         // set boundary conditions
diff --git a/apps/gpu/LBM/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp b/apps/gpu/LBM/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp
index 8ca6939924fcfba22c8b96f000b9d8d05a3f7f43..7735d27bc728b6f79a56269e279d3e6854538e1d 100644
--- a/apps/gpu/LBM/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp
+++ b/apps/gpu/LBM/DrivenCavityMultiGPU/DrivenCavityMultiGPU.cpp
@@ -50,6 +50,7 @@
 #include "VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.h"
 #include "VirtualFluids_GPU/PreProcessor/PreProcessorFactory/PreProcessorFactoryImp.h"
 #include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
+#include "VirtualFluids_GPU/Factories/GridScalingFactory.h"
 
 #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
 
@@ -92,7 +93,7 @@ void multipleLevel(std::filesystem::path& configPath)
     config.load(configPath.string());
     SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNummberOfProcess(), communicator.getPID(), &config);
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
-
+    GridScalingFactory scalingFactory = GridScalingFactory();
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -112,7 +113,7 @@ void multipleLevel(std::filesystem::path& configPath)
     const real Re       = 1000.0; // 1000
     const real velocity = 1.0;
     const real dt       = (real)1.0e-3; // 0.5e-3;
-    const uint nx       = 64;
+    const uint nx       = 128;
     std::string simulationName("DrivenCavityChimMultiGPU");
 
     // para->setTimestepOut(10000);   // set in config
@@ -149,6 +150,7 @@ void multipleLevel(std::filesystem::path& configPath)
 
     // para->setMainKernel("CumulantK17CompChim");
     para->setMainKernel("CumulantK17CompChimStream");
+    scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleRhoSq);
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -534,7 +536,7 @@ void multipleLevel(std::filesystem::path& configPath)
         gridGenerator = GridProvider::makeGridReader(FILEFORMAT::BINARY, para, cudaMemoryManager);
     }
 
-    Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory);
+    Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory, &scalingFactory);
     sim.run();
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp b/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
index efac863fc9efd446e5f266648ad4fa74c954634f..dc5eaf58aff9b4a1b87d70c187b81461330ee3da 100644
--- a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
+++ b/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
@@ -40,7 +40,6 @@
 
 //////////////////////////////////////////////////////////////////////////
 
-#include "VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h"
 #include "VirtualFluids_GPU/Communication/Communicator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
@@ -49,7 +48,7 @@
 #include "VirtualFluids_GPU/LBM/Simulation.h"
 #include "VirtualFluids_GPU/Output/FileWriter.h"
 #include "VirtualFluids_GPU/Parameter/Parameter.h"
-#include "VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h"
+#include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
 
 //////////////////////////////////////////////////////////////////////////
 
diff --git a/apps/gpu/LBM/MusselOyster/configPhoenix8GPU.txt b/apps/gpu/LBM/MusselOyster/configPhoenix8GPU.txt
index 4e2b0c91482b6a650ff28a210673cac097cb8c2d..2bf6955062da5c98f6a7b931c19821c52eaf15ea 100644
--- a/apps/gpu/LBM/MusselOyster/configPhoenix8GPU.txt
+++ b/apps/gpu/LBM/MusselOyster/configPhoenix8GPU.txt
@@ -7,14 +7,14 @@ NumberOfDevices=4
 ##################################################
 #informations for Writing
 ##################################################
-Path=/work/y0078217/Results/MusselOysterResults/8GPUOyster05/
+#Path=/work/y0078217/Results/MusselOysterResults/8GPUOyster05/
 #Path="F:/Work/Computations/out/MusselOyster/"
 #Prefix="MusselOyster" 
 #WriteGrid=true
 ##################################################
 #informations for reading
 ##################################################
-GridPath=/work/y0078217/Grids/GridMusselOyster/Oyster8GPU/
+#GridPath=/work/y0078217/Grids/GridMusselOyster/Oyster8GPU/
 #GridPath="C:"
 
 ##################################################
@@ -31,8 +31,8 @@ GridPath=/work/y0078217/Grids/GridMusselOyster/Oyster8GPU/
 ##################################################
 #simulation parameter
 ##################################################
-TimeEnd=400000 # 800000
-TimeOut=100000 # 400000
+TimeEnd=100000 # 800000
+TimeOut=10000 # 400000
 #TimeStartOut=0
 
 ##################################################
diff --git a/apps/gpu/LBM/TGV_3D/TGV_3D.cpp b/apps/gpu/LBM/TGV_3D/TGV_3D.cpp
index d8642c7b267bcad6c58ab2a9c178c2d9394ecf2a..7514c2b273bf60d6e2523f132911dde8839d296a 100644
--- a/apps/gpu/LBM/TGV_3D/TGV_3D.cpp
+++ b/apps/gpu/LBM/TGV_3D/TGV_3D.cpp
@@ -1,63 +1,95 @@
-//#define MPI_LOGGING
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 TGV_3D.cpp
+//! \ingroup Applications
+//! \author Martin Schoenherr
+//=======================================================================================
+#define _USE_MATH_DEFINES
+#include <exception>
+#include <filesystem>
+#include <fstream>
+#include <iostream>
+#include <math.h>
+#include <memory>
+#include <sstream>
+#include <stdexcept>
+#include <string>
 
-//Martin Branch
+#include "mpi.h"
 
-#include <mpi.h>
-#if defined( MPI_LOGGING )
-	#include <mpe.h>
-#endif
+//////////////////////////////////////////////////////////////////////////
 
-#include <string>
-#include <sstream>
-#include <iostream>
-#include <stdexcept>
-#include <fstream>
-#define _USE_MATH_DEFINES
-#include <math.h>
+#include "Core/DataTypes.h"
+#include "Core/LbmOrGks.h"
+#include "Core/Logger/Logger.h"
+#include "Core/VectorTypes.h"
+#include "PointerDefinitions.h"
 
-//#include "metis.h"
+//////////////////////////////////////////////////////////////////////////
 
-#include "basics/Core/LbmOrGks.h"
-#include "basics/Core/StringUtilities/StringUtil.h"
-#include <basics/config/ConfigurationFile.h>
+#include "GridGenerator/geometries/Conglomerate/Conglomerate.h"
+#include "GridGenerator/geometries/TriangularMesh/TriangularMesh.h"
+#include "GridGenerator/grid/BoundaryConditions/BoundaryCondition.h"
+#include "GridGenerator/grid/BoundaryConditions/Side.h"
+#include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
+#include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
+#include "GridGenerator/grid/GridFactory.h"
+
+#include "GridGenerator/io/GridVTKWriter/GridVTKWriter.h"
+#include "GridGenerator/io/STLReaderWriter/STLReader.h"
+#include "GridGenerator/io/STLReaderWriter/STLWriter.h"
+#include "GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h"
+
+//////////////////////////////////////////////////////////////////////////
 
-#include "VirtualFluids_GPU/LBM/Simulation.h"
 #include "VirtualFluids_GPU/Communication/Communicator.h"
-#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
 #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
-#include "VirtualFluids_GPU/Parameter/Parameter.h"
-#include "VirtualFluids_GPU/Output/FileWriter.h"
-
-#include "VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.h"
-#include "VirtualFluids_GPU/PreProcessor/PreProcessorFactory/PreProcessorFactoryImp.h"
+#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
 #include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
-
 #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
+#include "VirtualFluids_GPU/LBM/Simulation.h"
+#include "VirtualFluids_GPU/Output/FileWriter.h"
+#include "VirtualFluids_GPU/Parameter/Parameter.h"
 
-#include "global.h"
-
-#include "geometries/Sphere/Sphere.h"
-#include "geometries/VerticalCylinder/VerticalCylinder.h"
-#include "geometries/Cuboid/Cuboid.h"
-#include "geometries/TriangularMesh/TriangularMesh.h"
-#include "geometries/Conglomerate/Conglomerate.h"
-#include "geometries/TriangularMesh/TriangularMeshStrategy.h"
-
-#include "grid/GridBuilder/LevelGridBuilder.h"
-#include "grid/GridBuilder/MultipleGridBuilder.h"
-#include "grid/BoundaryConditions/Side.h"
-#include "grid/BoundaryConditions/BoundaryCondition.h"
-#include "grid/GridFactory.h"
+#include <logger/Logger.h>
 
-#include "io/SimulationFileWriter/SimulationFileWriter.h"
-#include "io/GridVTKWriter/GridVTKWriter.h"
-#include "io/STLReaderWriter/STLReader.h"
-#include "io/STLReaderWriter/STLWriter.h"
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+//          U s e r    s e t t i n g s
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-#include "utilities/math/Math.h"
-#include "utilities/communication.h"
-#include "utilities/transformator/TransformatorImp.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // from https://stackoverflow.com/questions/865668/how-to-parse-command-line-arguments-in-c
@@ -94,8 +126,8 @@ bool useWale = false;
 
 std::string kernel( "CumulantK17Comp" );
 
-std::string path("F:/Work/Computations/out/TaylorGreen3DNew/"); //LEGOLAS
-//std::string path("E:/DrivenCavity/results/"); //TESLA03
+//std::string path("F:/Work/Computations/out/TaylorGreen3DNew/"); //LEGOLAS
+std::string path("D:/out/TGV_3D/"); //TESLA03
 
 std::string simulationName("TGV_3D");
 //////////////////////////////////////////////////////////////////////////
diff --git a/apps/gpu/LBM/TGV_3D_GridRef/CMakeLists.txt b/apps/gpu/LBM/TGV_3D_GridRef/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..efb4310669f9c0de7aa5cf3f1e4dffa00bd66cbf
--- /dev/null
+++ b/apps/gpu/LBM/TGV_3D_GridRef/CMakeLists.txt
@@ -0,0 +1,7 @@
+PROJECT(TGV_3D_GridRef LANGUAGES CUDA CXX)
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES TGV_3D_GridRef.cpp)
+
+set_source_files_properties(TGV_3D_GridRef.cpp PROPERTIES LANGUAGE CUDA)
+
+set_target_properties(TGV_3D_GridRef PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
\ No newline at end of file
diff --git a/apps/gpu/LBM/TGV_3D_GridRef/TGV_3D_GridRef.cpp b/apps/gpu/LBM/TGV_3D_GridRef/TGV_3D_GridRef.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a88fee2e583a7cb227702ff19ada7daced1b1708
--- /dev/null
+++ b/apps/gpu/LBM/TGV_3D_GridRef/TGV_3D_GridRef.cpp
@@ -0,0 +1,399 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 TGV_3D.cpp
+//! \ingroup Applications
+//! \author Martin Schoenherr
+//=======================================================================================
+#define _USE_MATH_DEFINES
+#include <exception>
+#include <filesystem>
+#include <fstream>
+#include <iostream>
+#include <math.h>
+#include <memory>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+#include "mpi.h"
+
+//////////////////////////////////////////////////////////////////////////
+
+#include "Core/DataTypes.h"
+#include "Core/LbmOrGks.h"
+#include "Core/Logger/Logger.h"
+#include "Core/VectorTypes.h"
+#include "PointerDefinitions.h"
+
+//////////////////////////////////////////////////////////////////////////
+
+#include "GridGenerator/geometries/Conglomerate/Conglomerate.h"
+#include "GridGenerator/geometries/TriangularMesh/TriangularMesh.h"
+#include "GridGenerator/grid/BoundaryConditions/BoundaryCondition.h"
+#include "GridGenerator/grid/BoundaryConditions/Side.h"
+#include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
+#include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h"
+#include "GridGenerator/grid/GridFactory.h"
+
+#include "GridGenerator/io/GridVTKWriter/GridVTKWriter.h"
+#include "GridGenerator/io/STLReaderWriter/STLReader.h"
+#include "GridGenerator/io/STLReaderWriter/STLWriter.h"
+#include "GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h"
+
+//////////////////////////////////////////////////////////////////////////
+
+#include "VirtualFluids_GPU/Communication/Communicator.h"
+#include "VirtualFluids_GPU/DataStructureInitializer/GridProvider.h"
+#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h"
+#include "VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h"
+#include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h"
+#include "VirtualFluids_GPU/Factories/GridScalingFactory.h"
+#include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
+#include "VirtualFluids_GPU/LBM/Simulation.h"
+#include "VirtualFluids_GPU/Output/FileWriter.h"
+#include "VirtualFluids_GPU/Parameter/Parameter.h"
+
+#include <logger/Logger.h>
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+//          U s e r    s e t t i n g s
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// from https://stackoverflow.com/questions/865668/how-to-parse-command-line-arguments-in-c
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+char* getCmdOption(char ** begin, char ** end, const std::string & option)
+{
+    char ** itr = std::find(begin, end, option);
+    if (itr != end && ++itr != end)
+    {
+        return *itr;
+    }
+    return 0;
+}
+
+bool cmdOptionExists(char** begin, char** end, const std::string& option)
+{
+    return std::find(begin, end, option) != end;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+real Re =  1600.0;
+
+uint dtPerL = 500;
+
+uint nx = 64;
+uint gpuIndex = 0;
+
+bool useLimiter = false;
+bool useWale = false;
+
+std::string kernel( "CumulantK17CompChimRedesigned" );
+
+std::string path("D:/out/TGV_3D/"); //MOLLOK
+
+std::string simulationName("TGV_3D_Gridref_noSqPress");
+//////////////////////////////////////////////////////////////////////////
+
+void multipleLevel(const std::string& configPath)
+{
+    logging::Logger::addStream(&std::cout);
+    logging::Logger::setDebugLevel(logging::Logger::Level::INFO_LOW);
+    logging::Logger::timeStamp(logging::Logger::ENABLE);
+    logging::Logger::enablePrintedRankNumbers(logging::Logger::ENABLE);
+
+    vf::gpu::Communicator& communicator = vf::gpu::Communicator::getInstance();
+
+    auto gridFactory = GridFactory::make();
+    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::RAYCASTING);
+    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
+    //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_UNDER_TRIANGLE);
+
+    auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
+
+    vf::basics::ConfigurationFile config;
+    config.load(configPath);
+    SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNummberOfProcess(), communicator.getPID(), &config);
+    BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
+    GridScalingFactory scalingFactory = GridScalingFactory();
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+	const real PI = 3.141592653589793238462643383279;
+
+    real L = nx / ( 2.0 * PI );
+
+    const real velocity = 64.0 / ( dtPerL * 2.0 * PI );
+
+    const real viscosity = nx / ( 2.0 * PI ) * velocity / Re;
+
+    *logging::out << logging::Logger::INFO_HIGH << "velocity = " << velocity << " s\n";
+
+    *logging::out << logging::Logger::INFO_HIGH << "viscosity = " << viscosity << "\n";
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+	real dx = 2.0 * PI / real(nx);
+
+	gridBuilder->addCoarseGrid(-PI, -PI, -PI,
+								PI,  PI,  PI, dx);
+
+    gridBuilder->setNumberOfLayers(0, 0);
+
+    auto fineGrid = new Cuboid(-PI * 0.5, -PI * 0.5, -PI * 0.5, 
+                                     0.0,  PI * 0.5,       0.0);
+
+    gridBuilder->addGrid(fineGrid, 1);
+
+	gridBuilder->setPeriodicBoundaryCondition(true, true, true);
+
+	gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleCompressible);
+
+	//std::stringstream _path;
+ //   std::stringstream _prefix;
+
+ //   //_path << "F:/Work/Computations/TaylorGreenVortex_3D/TGV_LBM/" << nx << "_Re_1.6e4";
+ //   //_path << "F:/Work/Computations/TaylorGreenVortex_3D/TGV_LBM/" << nx << "_neqInit";
+ //   _path << "F:/Work/Computations/TaylorGreenVortex_3D/TGV_LBM/Re_1600/AA2016/" << nx << "_FD_O8";
+
+ //   //_path << "./results/AA2016/" << nx;
+ //   //_path << "./results/CumOne/" << nx;
+ //   //_path << "./results/F3_2018/" << nx;
+
+ //   _prefix << "TGV_3D_" << nx << "_" ;
+
+ //   para->setOutputPath(_path.str());
+ //   para->setOutputPrefix(_prefix.str());
+ //   para->setPathAndFilename(_path.str() + "/" + _prefix.str());
+
+    //////////////////////////////////////////////////////////////////////////
+
+    {
+        std::stringstream _path;
+
+        _path << path;
+        _path << kernel;
+        _path << "SingleGPU";
+
+        if (useLimiter) _path << "_Limiter";
+
+        path = _path.str();
+    }
+
+    //////////////////////////////////////////////////////////////////////////
+
+    {
+        std::stringstream _simulationName;
+
+        _simulationName << simulationName;
+        _simulationName << "_nx_" << nx;
+        _simulationName << "_dtPerL_" << dtPerL << "_";
+
+        simulationName = _simulationName.str();
+    }
+
+    //////////////////////////////////////////////////////////////////////////
+
+    para->setDevices(std::vector<uint>{gpuIndex});
+
+    //////////////////////////////////////////////////////////////////////////
+
+    para->setOutputPath( path );
+    para->setOutputPrefix( simulationName );
+
+    para->setPrintFiles(true);
+
+    para->setTimestepEnd(40 * lround(L / velocity));
+    para->setTimestepOut(5 * lround(L / velocity));
+    //para->setTimestepOut(lround(L / velocity));
+ //   para->setTimestepEnd(2048);
+	//para->setTimestepOut(512);
+ //   para->setTimestepStartOut(500);
+
+    para->setVelocityLB( velocity );
+
+    para->setViscosityLB( viscosity );
+
+    para->setVelocityRatio( 1.0 / velocity );
+
+    para->setDensityRatio(1.0);
+
+    para->setInitialCondition( [&]( real coordX, real coordY, real coordZ, real& rho, real& vx, real& vy, real& vz){
+
+        real a = 1.0;
+        real b = 1.0;
+        real c = 1.0;
+
+        rho = 3.0 * ((velocity * velocity) / 16.0 * ( cos( 2.0 * a * coordX ) + cos( 2.0 * b * coordY ) ) * ( cos( 2.0 * c * coordZ ) + 2.0 ) );
+        vx  =  velocity * sin( a * coordX ) * cos( b * coordY ) * cos( c * coordZ );
+        vy  = -velocity * cos( a * coordX ) * sin( b * coordY ) * cos( c * coordZ );
+        vz  = 0.0;
+
+    } );
+
+    para->setMainKernel( kernel );
+
+    if( !useLimiter )
+        para->setQuadricLimiters( 1000000.0, 1000000.0, 1000000.0 );
+
+    if( useWale )
+        para->setUseWale( true );
+
+    para->setUseInitNeq( true );
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    auto cudaMemoryManager = std::make_shared<CudaMemoryManager>(para);
+    SPtr<GridProvider> gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator);
+    //SPtr<GridProvider> gridGenerator = GridProvider::makeGridReader(FILEFORMAT::BINARY, para, cudaMemoryManager);
+
+    SPtr<FileWriter> fileWriter = SPtr<FileWriter>(new FileWriter());
+    Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory, &scalingFactory);
+    sim.run();
+
+    //sim.addKineticEnergyAnalyzer( 10 );
+    //sim.addEnstrophyAnalyzer( 10 );
+
+    //sim.run();
+}
+
+
+int main( int argc, char* argv[])
+{
+    MPI_Init(&argc, &argv);
+    std::string str, str2;
+    if ( argv != NULL )
+    {
+        //str = static_cast<std::string>(argv[0]);
+
+        try
+        {
+            //////////////////////////////////////////////////////////////////////////
+			std::string targetPath( __FILE__ );
+
+#ifdef _WIN32
+			targetPath = targetPath.substr(0, targetPath.find_last_of('\\') + 1);
+#else
+			targetPath = targetPath.substr(0, targetPath.find_last_of('/') + 1);
+#endif
+
+            //////////////////////////////////////////////////////////////////////////
+
+            if( cmdOptionExists( argv, argv+argc, "--Re" ) )
+                Re = atof( getCmdOption( argv, argv+argc, "--Re" ) );
+
+            if( cmdOptionExists( argv, argv+argc, "--nx" ) )
+                nx = atoi( getCmdOption( argv, argv+argc, "--nx" ) );
+
+            if( cmdOptionExists( argv, argv+argc, "--dtPerL" ) )
+                dtPerL = atoi( getCmdOption( argv, argv+argc, "--dtPerL" ) );
+
+            if( cmdOptionExists( argv, argv+argc, "--kernel" ) )
+                kernel = getCmdOption( argv, argv+argc, "--kernel" );
+
+            if( cmdOptionExists( argv, argv+argc, "--gpu" ) )
+                gpuIndex = atoi( getCmdOption( argv, argv+argc, "--gpu" ) );
+
+            if( cmdOptionExists( argv, argv+argc, "--useLimiter" ) )
+                useLimiter = true;
+
+            if( cmdOptionExists( argv, argv+argc, "--useWale" ) )
+                useWale = true;
+
+			multipleLevel(targetPath + "config.txt");
+
+            //////////////////////////////////////////////////////////////////////////
+		}
+        catch (const std::bad_alloc& e)
+        {
+
+            *logging::out << logging::Logger::LOGGER_ERROR << "Bad Alloc:" << e.what() << "\n";
+            //std::cout << e.what() << std::flush;
+            //MPI_Abort(MPI_COMM_WORLD, -1);
+        }
+        catch (const std::exception& e)
+        {
+
+            *logging::out << logging::Logger::LOGGER_ERROR << e.what() << "\n";
+            //std::cout << e.what() << std::flush;
+            //MPI_Abort(MPI_COMM_WORLD, -1);
+        }
+        catch (...)
+        {
+            *logging::out << logging::Logger::LOGGER_ERROR << "Unknown exception!\n";
+            //std::cout << "unknown exeption" << std::endl;
+        }
+
+        //std::cout << "\nConfiguration file must be set!: lbmgm <config file>" << std::endl << std::flush;
+        //MPI_Abort(MPI_COMM_WORLD, -1);
+    }
+
+
+   /*
+   MPE_Init_log() & MPE_Finish_log() are NOT needed when
+   liblmpe.a is linked with this program.  In that case,
+   MPI_Init() would have called MPE_Init_log() already.
+   */
+#if defined( MPI_LOGGING )
+   MPE_Init_log();
+#endif
+
+#if defined( MPI_LOGGING )
+   if ( argv != NULL )
+      MPE_Finish_log( argv[0] );
+   if ( str != "" )
+      MPE_Finish_log( str.c_str() );
+   else
+      MPE_Finish_log( "TestLog" );
+#endif
+
+   MPI_Finalize();
+   return 0;
+}
diff --git a/apps/gpu/LBM/TGV_3D_GridRef/config.txt b/apps/gpu/LBM/TGV_3D_GridRef/config.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ae6d3e9bc4be5403d151f3d59ffb13af7164abf0
--- /dev/null
+++ b/apps/gpu/LBM/TGV_3D_GridRef/config.txt
@@ -0,0 +1,36 @@
+##################################################
+#GPU Mapping
+##################################################
+#Devices="0 1 2 3"
+#NumberOfDevices=4
+
+##################################################
+#informations for Writing
+##################################################
+#Path="E:/DrivenCavity/results"
+#Path="F:/Work/Computations/out/DrivenCavity/"
+#Prefix="DrivenCavity" 
+#WriteGrid=true
+##################################################
+#informations for reading
+##################################################
+#GridPath="E:/DrivenCavity/dummy"
+GridPath="F:/Work/Computations/out/TaylorGreen3DNew/grid"
+
+##################################################
+#number of grid levels
+##################################################
+NOGL=2
+
+##################################################
+#LBM Version
+##################################################
+#D3Qxx=27
+#MainKernelName=CumulantAA2016CompSP27
+
+##################################################
+#simulation parameter
+##################################################
+#TimeEnd=100000
+#TimeOut=1000 
+#TimeStartOut=0
\ No newline at end of file
diff --git a/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp b/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp
index 06b3678d7c8ddd236c26a69686356fbe87c31db2..3e083afd690632dbaabdde5d00f2ab454d86032b 100644
--- a/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp
+++ b/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp
@@ -1,3 +1,35 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 WTG_RUB.cpp
+//! \ingroup Applications
+//! \author Martin Schoenherr
+//=======================================================================================
 #define _USE_MATH_DEFINES
 #include <math.h>
 #include <string>
@@ -15,15 +47,10 @@
 
 #include "Core/DataTypes.h"
 #include "PointerDefinitions.h"
-
 #include "Core/LbmOrGks.h"
-#include "Core/StringUtilities/StringUtil.h"
-
 #include "Core/VectorTypes.h"
 #include "Core/Logger/Logger.h"
 
-#include <basics/config/ConfigurationFile.h>
-
 //////////////////////////////////////////////////////////////////////////
 
 #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h"
diff --git a/cpu.cmake b/cpu.cmake
index a6220ec1ffb9641b824ee26b8be8497ea340173f..13f216203bfeefb9c550b8be470af4cf181a44b4 100644
--- a/cpu.cmake
+++ b/cpu.cmake
@@ -29,6 +29,8 @@ SET(USE_CATALYST OFF CACHE BOOL "include Paraview Catalyst support")
 SET(USE_HLRN_LUSTRE OFF CACHE BOOL "include HLRN Lustre support")
 SET(USE_DEM_COUPLING OFF CACHE BOOL "PE plugin")
 
+SET(USE_LIGGGHTS OFF CACHE BOOL "include LIGGGHTS library support")
+
 #MPI
 IF((NOT ${CMAKE_CXX_COMPILER} MATCHES mpicxx) AND (NOT ${CMAKE_CXX_COMPILER} MATCHES mpiicpc))# OR NOT ${CMAKE_CXX_COMPILER} MATCHES cc OR NOT ${CMAKE_CXX_COMPILER} MATCHES mpiCC)
     FIND_PACKAGE(MPI REQUIRED)
@@ -83,5 +85,9 @@ if(BUILD_VF_PYTHON_BINDINGS)
     add_subdirectory(src/cpu/simulationconfig)
 endif()
 
+if(USE_LIGGGHTS)
+    add_subdirectory(src/cpu/LiggghtsCoupling)
+endif()
+
 set (APPS_ROOT_CPU "${VF_ROOT_DIR}/apps/cpu/")
 include(${APPS_ROOT_CPU}/Applications.cmake)
\ No newline at end of file
diff --git a/pythonbindings/CMakeLists.txt b/pythonbindings/CMakeLists.txt
index 644b308c97760d6a8243ae7782f0737a1d168100..945dcd08b3bf13fb2e7c569aea811a16fd71f9f0 100644
--- a/pythonbindings/CMakeLists.txt
+++ b/pythonbindings/CMakeLists.txt
@@ -1,22 +1,31 @@
-project(VirtualFluidsPython LANGUAGES CUDA CXX)
+set(PYFLUIDS_LANGUAGES CXX)
+
+if(BUILD_VF_GPU)
+    set(PYFLUIDS_LANGUAGES CUDA CXX)
+endif()
+
+project(VirtualFluidsPython LANGUAGES ${PYFLUIDS_LANGUAGES})
+
 pybind11_add_module(python_bindings MODULE src/VirtualFluids.cpp)
 
 set_target_properties(  python_bindings PROPERTIES
                         LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/pythonbindings/pyfluids
                         OUTPUT_NAME "bindings")
 
+target_link_libraries(python_bindings PRIVATE basics logger mpi)
+
 IF(BUILD_VF_GPU)
     set_source_files_properties(src/VirtualFluids.cpp PROPERTIES LANGUAGE CUDA)
 
     target_include_directories(python_bindings PRIVATE ${VF_THIRD_DIR}/cuda_samples/)
     target_compile_definitions(python_bindings PRIVATE VF_GPU_PYTHONBINDINGS)
 
-    target_link_libraries(python_bindings PRIVATE GridGenerator VirtualFluids_GPU basics lbmCuda logger)
+    target_link_libraries(python_bindings PRIVATE GridGenerator VirtualFluids_GPU lbmCuda)
 ENDIF()
 
 IF(BUILD_VF_CPU)
     target_compile_definitions(python_bindings PRIVATE VF_METIS VF_MPI VF_CPU_PYTHONBINDINGS)
-    target_link_libraries(python_bindings PRIVATE simulationconfig VirtualFluidsCore muparser basics)
+    target_link_libraries(python_bindings PRIVATE simulationconfig VirtualFluidsCore muparser lbm)
 
     # include bindings for muparsers
     pybind11_add_module(pymuparser MODULE src/muParser.cpp)
@@ -31,5 +40,6 @@ IF(BUILD_VF_CPU)
     target_link_libraries(pymuparser PRIVATE muparser)
 ENDIF()
 
+
 target_include_directories(python_bindings PRIVATE ${CMAKE_SOURCE_DIR}/src/)
 target_include_directories(python_bindings PRIVATE ${CMAKE_BINARY_DIR})
\ No newline at end of file
diff --git a/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi b/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi
index 8d715e4b4cd49e6dbf92da3aedddbc4b869067c4..514dc5053e9574b452d80f61eb3d4e1ebb0f4396 100644
--- a/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi
+++ b/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi
@@ -67,7 +67,7 @@ class LevelGridBuilder(GridBuilder):
     def set_precursor_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, file_collection: pyfluids.bindings.gpu.VelocityFileCollection, n_t_read: int, velocity_x: float = ..., velocity_y: float = ..., velocity_z: float = ..., file_level_to_grid_level_map: List[int] = ...) -> None: ...
     def set_pressure_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, rho: float) -> None: ...
     def set_slip_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, normal_x: float, normal_y: float, normal_z: float) -> None: ...
-    def set_stress_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, normal_x: float, normal_y: float, normal_z: float, sampling_offset: int, z0: float, dx: float) -> None: ...
+    def set_stress_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, normal_x: float, normal_y: float, normal_z: float, sampling_offset: int, z0: float, dx: float, q: float) -> None: ...
     def set_velocity_boundary_condition(self, side_type: pyfluids.bindings.gpu.SideType, vx: float, vy: float, vz: float) -> None: ...
 
 class MultipleGridBuilder(LevelGridBuilder):
diff --git a/pythonbindings/src/gpu/submodules/grid_generator.cpp b/pythonbindings/src/gpu/submodules/grid_generator.cpp
index 3e9fb5655e26ffa6053a205da5a3e3f0f2ecd49f..5c2a4ca04e3cfd20ac7d33ab1af748615283bc6d 100644
--- a/pythonbindings/src/gpu/submodules/grid_generator.cpp
+++ b/pythonbindings/src/gpu/submodules/grid_generator.cpp
@@ -92,7 +92,7 @@ namespace grid_generator
         .def("set_periodic_boundary_condition", &LevelGridBuilder::setPeriodicBoundaryCondition, py::arg("periodic_x"), py::arg("periodic_y"), py::arg("periodic_z"))
         .def("set_no_slip_boundary_condition", &LevelGridBuilder::setNoSlipBoundaryCondition, py::arg("side_type"))
         .def("set_precursor_boundary_condition", &LevelGridBuilder::setPrecursorBoundaryCondition, py::arg("side_type"), py::arg("file_collection"), py::arg("n_t_read"), py::arg("velocity_x")=0.0f, py::arg("velocity_y")=0.0f, py::arg("velocity_z")=0.0f, py::arg("file_level_to_grid_level_map")=std::vector<uint>())
-        .def("set_stress_boundary_condition", &LevelGridBuilder::setStressBoundaryCondition, py::arg("side_type"), py::arg("normal_x"), py::arg("normal_y"), py::arg("normal_z"), py::arg("sampling_offset"), py::arg("z0"), py::arg("dx"));
+        .def("set_stress_boundary_condition", &LevelGridBuilder::setStressBoundaryCondition, py::arg("side_type"), py::arg("normal_x"), py::arg("normal_y"), py::arg("normal_z"), py::arg("sampling_offset"), py::arg("z0"), py::arg("dx"), py::arg("q"));
 
         py::class_<MultipleGridBuilder, LevelGridBuilder, std::shared_ptr<MultipleGridBuilder>>(gridGeneratorModule, "MultipleGridBuilder")
         .def_static("make_shared", &MultipleGridBuilder::makeShared, py::return_value_policy::reference, py::arg("grid_factory"))
diff --git a/regression-tests/driven_cavity_test.sh b/regression-tests/driven_cavity_test.sh
index e10a829d2680ab647ba0f66e0f2e85a70186007e..96490eb3e5c1f8d0e9c44d18d883d7dafcde77ed 100755
--- a/regression-tests/driven_cavity_test.sh
+++ b/regression-tests/driven_cavity_test.sh
@@ -7,7 +7,7 @@
 # build VirtualFluids accordingly to our specific test scenario.
 # in this case adding -DUSER_APPS="apps/gpu/LBM/DrivenCavity to the cmake command is not necessary, because the DrivenCavity is added to VirtualFluids by default.
 mkdir -p build
-cmake -B build --preset=gpu_make -DCMAKE_CUDA_ARCHITECTURES=75 #-DUSER_APPS="apps/gpu/LBM/DrivenCavity"
+cmake -B build --preset=release_make_gpu -DCMAKE_CUDA_ARCHITECTURES=75 #-DUSER_APPS="apps/gpu/LBM/DrivenCavity"
 cd build && make -j 8 && cd ..
 
 # execute VirtualFluids
@@ -21,4 +21,4 @@ PATH_TO_DIR=output/DrivenCavity
 PATH_TO_REFERENCE_DIR=regression-tests/reference_data/regression_tests/gpu/DrivenCavity_2Levels
 
 # execute fieldcompare (A more comprehensive manual can be found here https://gitlab.com/dglaeser/fieldcompare)
-fieldcompare dir $PATH_TO_DIR --reference $PATH_TO_REFERENCE_DIR --include-files "*.vtu"
\ No newline at end of file
+fieldcompare dir $PATH_TO_DIR $PATH_TO_REFERENCE_DIR --include-files "*.vtu"
diff --git a/src/basics/basics/writer/WbWriterVtkXmlImageBinary.cpp b/src/basics/basics/writer/WbWriterVtkXmlImageBinary.cpp
index 92434e18ba1a2d4b2bc2027c6697f2d1f8393cf5..798b55919df9e24dbc71ecfded5fb8a913cff8cf 100644
--- a/src/basics/basics/writer/WbWriterVtkXmlImageBinary.cpp
+++ b/src/basics/basics/writer/WbWriterVtkXmlImageBinary.cpp
@@ -40,7 +40,7 @@ using namespace std;
 const std::string WbWriterVtkXmlImageBinary::pvdEndTag = "   </Collection>\n</VTKFile>";
 /*===============================================================================*/
 string WbWriterVtkXmlImageBinary::writeCollection(const string &filename, const vector<string> &filenames,
-                                             const double &timeStep, const bool &sepGroups)
+                                                  const double &timeStep, const bool &sepGroups)
 {
     string vtkfilename = filename + ".pvd";
     ofstream out(vtkfilename.c_str());
@@ -79,7 +79,7 @@ string WbWriterVtkXmlImageBinary::writeCollection(const string &filename, const
 }
 /*===============================================================================*/
 string WbWriterVtkXmlImageBinary::addFilesToCollection(const string &filename, const vector<string> &filenames,
-                                                  const double &timeStep, const bool &sepGroups)
+                                                       const double &timeStep, const bool &sepGroups)
 {
     string vtkfilename = filename;
     fstream test(vtkfilename.c_str(), ios::in);
@@ -106,9 +106,10 @@ string WbWriterVtkXmlImageBinary::addFilesToCollection(const string &filename, c
     return vtkfilename;
 }
 /*===============================================================================*/
-string WbWriterVtkXmlImageBinary::writeParallelFile(const string &filename, const UbTupleInt6 &wholeExtent, const UbTupleFloat3 &origin, const UbTupleFloat3 &spacing, 
-                                                vector<string> &pieceSources, vector<UbTupleInt6> &pieceExtents,
-                                                vector<string> &pointDataNames, vector<string> &cellDataNames)
+string WbWriterVtkXmlImageBinary::writeParallelFile(const string &filename, const UbTupleInt6 &wholeExtent,
+                                                    const UbTupleFloat3 &origin, const UbTupleFloat3 &spacing,
+                                                    vector<string> &pieceSources, vector<UbTupleInt6> &pieceExtents,
+                                                    vector<string> &pointDataNames, vector<string> &cellDataNames)
 {
     string vtkfilename = filename + ".pvti";
     UBLOG(logDEBUG1, "WbWriterVtkXmlImageBinary::writeParallelFile to " << vtkfilename << " - start");
@@ -170,8 +171,8 @@ string WbWriterVtkXmlImageBinary::writeParallelFile(const string &filename, cons
 }
 /*===============================================================================*/
 string WbWriterVtkXmlImageBinary::writeOctsWithCellData(const string &filename, vector<UbTupleFloat3> &nodes,
-                                                   vector<UbTupleInt8> &cells, vector<string> &datanames,
-                                                   vector<vector<double>> &celldata)
+                                                        vector<UbTupleInt8> & /*cells*/, vector<string> &datanames,
+                                                        vector<vector<double>> &celldata)
 {
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlImageBinary::writeOctsWithCellData to " << vtkfilename << " - start");
@@ -191,8 +192,8 @@ string WbWriterVtkXmlImageBinary::writeOctsWithCellData(const string &filename,
 }
 /*===============================================================================*/
 string WbWriterVtkXmlImageBinary::writeOctsWithNodeData(const string &filename, vector<UbTupleFloat3> &nodes,
-                                                   vector<UbTupleUInt8> &cells, vector<string> &datanames,
-                                                   vector<vector<double>> &nodedata)
+                                                        vector<UbTupleUInt8> & /*cells*/, vector<string> &datanames,
+                                                        vector<vector<double>> &nodedata)
 {
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlImageBinary::writeOctsWithNodeData to " << vtkfilename << " - start");
@@ -213,8 +214,7 @@ string WbWriterVtkXmlImageBinary::writeOctsWithNodeData(const string &filename,
 }
 /*===============================================================================*/
 string WbWriterVtkXmlImageBinary::writeNodesWithNodeData(const string &filename, vector<UbTupleFloat3> &nodes,
-                                                    vector<string> &datanames,
-                                                    vector<vector<double>> &nodedata)
+                                                         vector<string> &datanames, vector<vector<double>> &nodedata)
 {
     string vtkfilename = filename + getFileExtension();
     UBLOG(logDEBUG1, "WbWriterVtkXmlImageBinary::writeNodesWithNodeData to " << vtkfilename << " - start");
@@ -231,7 +231,8 @@ string WbWriterVtkXmlImageBinary::writeNodesWithNodeData(const string &filename,
     return vtkfilename;
 }
 
-void WbWriterVtkXmlImageBinary::getMetaDataOfImage(vector<UbTupleFloat3> &nodes, UbTupleFloat3& origin, UbTupleFloat3& spacing, UbTupleInt6& extent)
+void WbWriterVtkXmlImageBinary::getMetaDataOfImage(vector<UbTupleFloat3> &nodes, UbTupleFloat3 &origin,
+                                                   UbTupleFloat3 &spacing, UbTupleInt6 &extent)
 {
     int nofNodes = (int)nodes.size();
     val<1>(origin) = val<1>(nodes[0]);
@@ -247,17 +248,17 @@ void WbWriterVtkXmlImageBinary::getMetaDataOfImage(vector<UbTupleFloat3> &nodes,
     int ny = (l_y) / val<2>(spacing);
     val<3>(spacing) = val<3>(nodes[nx*ny])-val<3>(nodes[0]);
 
-    val<1>(extent) = val<1>(origin)/val<1>(spacing); val<2>(extent) = val<1>(nodes[nofNodes-1])/val<1>(spacing);    
-    val<3>(extent) = val<2>(origin)/val<2>(spacing); val<4>(extent) = val<2>(nodes[nofNodes-1])/val<2>(spacing);    
-    val<5>(extent) = val<3>(origin)/val<3>(spacing); val<6>(extent) = val<3>(nodes[nofNodes-1])/val<3>(spacing);    
+    val<1>(extent) = val<1>(origin) / val<1>(spacing); val<2>(extent) = val<1>(nodes[nofNodes - 1]) / val<1>(spacing);    
+    val<3>(extent) = val<2>(origin) / val<2>(spacing); val<4>(extent) = val<2>(nodes[nofNodes - 1]) / val<2>(spacing);    
+    val<5>(extent) = val<3>(origin) / val<3>(spacing); val<6>(extent) = val<3>(nodes[nofNodes - 1]) / val<3>(spacing);    
 
 }
 
-void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename,
-                                            vector<string> &pointDataNames, vector<string> &cellDataNames,
-                                            vector<vector<double>> &nodedata, vector<vector<double>> &celldata,
-                                            UbTupleInt6& wholeExtent,
-                                            UbTupleFloat3& origin, UbTupleFloat3& spacing, UbTupleInt6& extent, unsigned int precision)
+void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename, vector<string> &pointDataNames,
+                                          vector<string> &cellDataNames, vector<vector<double>> &nodedata,
+                                          vector<vector<double>> &celldata, UbTupleInt6 &wholeExtent,
+                                          UbTupleFloat3 &origin, UbTupleFloat3 &spacing, UbTupleInt6 &extent,
+                                          unsigned int precision)
 {
     ofstream out(vtkfilename.c_str(), ios::out | ios::binary);
     out.precision(precision);
@@ -273,14 +274,14 @@ void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename,
             throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename);
     }
 
-    size_t nPoints = pointDataNames.size()>0 ? nodedata[0].size() : celldata[0].size();
+    size_t nPoints = pointDataNames.size() > 0 ? nodedata[0].size() : celldata[0].size();
 
-    int bytesPerByteVal      = 4; //==sizeof(int)
+    int bytesPerByteVal = 4; //==sizeof(int)
 
-    int bytesScalarData      = 1 /*scalar         */ * (int)nPoints * sizeof(double);
+    int bytesScalarData = 1 /*scalar         */ * (int)nPoints * sizeof(double);
 
     int offset = 0;
-    
+
     // VTK FILE
     out << "<?xml version=\"1.0\"?>\n";
     out << "<VTKFile type=\"ImageData\" version=\"0.1\" byte_order=\"LittleEndian\" >"
@@ -307,23 +308,21 @@ void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename,
                                     << val<6>(extent) << "\">\n";
 
     // DATA SECTION
-    if (pointDataNames.size()>0)
-    {
+    if (pointDataNames.size() > 0) {
         out << "         <PointData>\n";
         for (size_t s = 0; s < pointDataNames.size(); ++s) {
-            out << "            <DataArray type=\"Float64\" Name=\"" << pointDataNames[s] << "\" format=\"appended\" offset=\""
-                << offset << "\" /> \n";
+            out << "            <DataArray type=\"Float64\" Name=\"" << pointDataNames[s]
+                << "\" format=\"appended\" offset=\"" << offset << "\" /> \n";
             offset += (bytesPerByteVal + bytesScalarData);
         }
         out << "         </PointData>\n";
     }
 
-    if (cellDataNames.size()>0)
-    {
+    if (cellDataNames.size() > 0) {
         out << "         <CellData>\n";
         for (size_t s = 0; s < cellDataNames.size(); ++s) {
-            out << "            <DataArray type=\"Float64\" Name=\"" << cellDataNames[s] << "\" format=\"appended\" offset=\""
-                << offset << "\" /> \n";
+            out << "            <DataArray type=\"Float64\" Name=\"" << cellDataNames[s]
+                << "\" format=\"appended\" offset=\"" << offset << "\" /> \n";
             offset += (bytesPerByteVal + bytesScalarData);
         }
         out << "         </CellData>\n";
@@ -336,7 +335,6 @@ void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename,
     out << "   <AppendedData encoding=\"raw\">\n";
     out << "_";
 
-
     // DATA SECTION
     // pointData
     for (size_t s = 0; s < pointDataNames.size(); ++s) {
@@ -359,4 +357,4 @@ void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename,
     out << "</VTKFile>";
     out << endl;
     out.close();
-}
\ No newline at end of file
+}
diff --git a/src/cpu/LiggghtsCoupling/CMakeLists.txt b/src/cpu/LiggghtsCoupling/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ed9d1f0e2bd8d0302f1d37aa3bde8a120ceb2312
--- /dev/null
+++ b/src/cpu/LiggghtsCoupling/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+set(LIGGGHTS_LIBRARIES optimized ${LIGGGHTS_RELEASE_LIBRARY} debug ${LIGGGHTS_DEBUG_LIBRARY})
+
+vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser MPI::MPI_CXX VirtualFluidsCore ${LIGGGHTS_LIBRARIES})
+
+vf_get_library_name(library_name)
+
+#target_link_directories(${library_name} PUBLIC ${LIGGGHTS_BINARY_DIR})
+target_include_directories(${library_name} PUBLIC ${LIGGGHTS_SOURCE_DIR})
+
diff --git a/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7e36c2b9c8acd63af35d14ebcc7029a278977a4c
--- /dev/null
+++ b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp
@@ -0,0 +1,915 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 IBcumulantK17LBMKernel.cpp
+//! \ingroup LBM
+//! \author Konstantin Kutscher, Martin Geier
+//=======================================================================================
+#include "IBcumulantK17LBMKernel.h"
+#include "D3Q27System.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include <cmath>
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+#include "Block3D.h"
+#include "BCArray3D.h"
+
+#define PROOF_CORRECTNESS
+
+using namespace UbMath;
+
+//////////////////////////////////////////////////////////////////////////
+IBcumulantK17LBMKernel::IBcumulantK17LBMKernel()
+{
+    this->compressible = true;
+    forcingX1 = 0.0;
+    forcingX2 = 0.0;
+    forcingX3 = 0.0;
+}
+//////////////////////////////////////////////////////////////////////////
+void IBcumulantK17LBMKernel::initDataSet()
+{
+    SPtr<DistributionArray3D> d(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9));
+    dataSet->setFdistributions(d);
+
+    particleData = std::make_shared<CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>>(nx[0] + 2, nx[1] + 2, nx[2] + 2);
+
+    int minX1 = 0;
+    int minX2 = 0;
+    int minX3 = 0;
+    int maxX1 = nx[0]+2;
+    int maxX2 = nx[1]+2;
+    int maxX3 = nx[2]+2;
+
+    LBMReal omega = collFactor;
+
+    for (int x3 = minX3; x3 < maxX3; x3++) {
+        for (int x2 = minX2; x2 < maxX2; x2++) {
+            for (int x1 = minX1; x1 < maxX1; x1++) {
+                (*particleData)(x1, x2, x3) = std::make_shared<IBdynamicsParticleData>();
+            }
+        }
+    }
+
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> IBcumulantK17LBMKernel::clone()
+{
+    SPtr<LBMKernel> kernel(new IBcumulantK17LBMKernel());
+    kernel->setNX(nx);
+    std::dynamic_pointer_cast<IBcumulantK17LBMKernel>(kernel)->initDataSet();
+    kernel->setCollisionFactor(this->collFactor);
+    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setWithForcing(withForcing);
+    kernel->setForcingX1(muForcingX1);
+    kernel->setForcingX2(muForcingX2);
+    kernel->setForcingX3(muForcingX3);
+    kernel->setIndex(ix1, ix2, ix3);
+    kernel->setDeltaT(deltaT);
+    kernel->setBlock(block.lock());
+
+    return kernel;
+}
+//////////////////////////////////////////////////////////////////////////
+void IBcumulantK17LBMKernel::calculate(int step)
+{
+    //////////////////////////////////////////////////////////////////////////
+    //! Cumulant K17 Kernel is based on
+    //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+    //! and
+    //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a>
+    //!
+    //! The cumulant kernel is executed in the following steps
+    //!
+    ////////////////////////////////////////////////////////////////////////////////
+    //! - Get node index coordinates from thredIdx, blockIdx, blockDim and gridDim.
+    //!
+
+    using namespace std;
+
+    //initializing of forcing stuff
+    if (withForcing)
+    {
+        muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3);
+        muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3);
+        muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3);
+
+        muDeltaT = deltaT;
+
+        muForcingX1.DefineVar("dt", &muDeltaT);
+        muForcingX2.DefineVar("dt", &muDeltaT);
+        muForcingX3.DefineVar("dt", &muDeltaT);
+
+        muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
+
+        muForcingX1.DefineVar("nu", &muNu);
+        muForcingX2.DefineVar("nu", &muNu);
+        muForcingX3.DefineVar("nu", &muNu);
+    }
+    /////////////////////////////////////
+
+    localDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+    nonLocalDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+    restDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+
+    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+    const int bcArrayMaxX1 = (int)bcArray->getNX1();
+    const int bcArrayMaxX2 = (int)bcArray->getNX2();
+    const int bcArrayMaxX3 = (int)bcArray->getNX3();
+
+    int minX1 = ghostLayerWidth;
+    int minX2 = ghostLayerWidth;
+    int minX3 = ghostLayerWidth;
+    int maxX1 = bcArrayMaxX1 - ghostLayerWidth;
+    int maxX2 = bcArrayMaxX2 - ghostLayerWidth;
+    int maxX3 = bcArrayMaxX3 - ghostLayerWidth;
+
+    LBMReal omega = collFactor;
+
+
+
+    for (int x3 = minX3; x3 < maxX3; x3++)
+    {
+        for (int x2 = minX2; x2 < maxX2; x2++)
+        {
+            for (int x1 = minX1; x1 < maxX1; x1++)
+            {
+                if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+                    int x1p = x1 + 1;
+                    int x2p = x2 + 1;
+                    int x3p = x3 + 1;
+                    //////////////////////////////////////////////////////////////////////////
+                    //////////////////////////////////////////////////////////////////////////
+                    //! - Read distributions: style of reading and writing the distributions from/to stored arrays
+                    //! dependent on timestep is based on the esoteric twist algorithm <a
+                    //! href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.3390/computation5020019 ]</b></a>
+                    //!
+                    ////////////////////////////////////////////////////////////////////////////
+                    //////////////////////////////////////////////////////////////////////////
+
+                    // E   N  T
+                    // c   c  c
+                    //////////
+                    // W   S  B
+                    // a   a  a
+
+                    // Rest is b
+
+                    // mfxyz
+                    // a - negative
+                    // b - null
+                    // c - positive
+
+                    // a b c
+                    //-1 0 1
+
+                    LBMReal mfcbb = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
+                    LBMReal mfbcb = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
+                    LBMReal mfbbc = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
+                    LBMReal mfccb = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
+                    LBMReal mfacb = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3);
+                    LBMReal mfcbc = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
+                    LBMReal mfabc = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3);
+                    LBMReal mfbcc = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
+                    LBMReal mfbac = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3);
+                    LBMReal mfccc = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+                    LBMReal mfacc = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3);
+                    LBMReal mfcac = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3);
+                    LBMReal mfaac = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+                    LBMReal mfabb = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3);
+                    LBMReal mfbab = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3);
+                    LBMReal mfbba = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p);
+                    LBMReal mfaab = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3);
+                    LBMReal mfcab = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3);
+                    LBMReal mfaba = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p);
+                    LBMReal mfcba = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p);
+                    LBMReal mfbaa = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p);
+                    LBMReal mfbca = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p);
+                    LBMReal mfaaa = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                    LBMReal mfcaa = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                    LBMReal mfaca = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                    LBMReal mfcca = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                    LBMReal mfbbb = (*this->restDistributions)(x1, x2, x3);
+
+                    LBMReal f[D3Q27System::ENDF + 1];
+                    LBMReal fEq[D3Q27System::ENDF + 1];
+                    LBMReal fEqSolid[D3Q27System::ENDF + 1];
+                    LBMReal fPre[D3Q27System::ENDF + 1];
+
+                    f[D3Q27System::DIR_000] = mfbbb;
+
+                    f[D3Q27System::DIR_P00] = mfcbb;
+                    f[D3Q27System::DIR_0P0] = mfbcb;
+                    f[D3Q27System::DIR_00P] = mfbbc;
+                    f[D3Q27System::DIR_PP0] = mfccb;
+                    f[D3Q27System::DIR_MP0] = mfacb;
+                    f[D3Q27System::DIR_P0P] = mfcbc;
+                    f[D3Q27System::DIR_M0P] = mfabc;
+                    f[D3Q27System::DIR_0PP] = mfbcc;
+                    f[D3Q27System::DIR_0MP] = mfbac;
+                    f[D3Q27System::DIR_PPP] = mfccc;
+                    f[D3Q27System::DIR_MPP] = mfacc;
+                    f[D3Q27System::DIR_PMP] = mfcac;
+                    f[D3Q27System::DIR_MMP] = mfaac;
+
+                    f[D3Q27System::DIR_M00] = mfabb;
+                    f[D3Q27System::DIR_0M0] = mfbab;
+                    f[D3Q27System::DIR_00M] = mfbba;
+                    f[D3Q27System::DIR_MM0] = mfaab;
+                    f[D3Q27System::DIR_PM0] = mfcab;
+                    f[D3Q27System::DIR_M0M] = mfaba;
+                    f[D3Q27System::DIR_P0M] = mfcba;
+                    f[D3Q27System::DIR_0MM] = mfbaa;
+                    f[D3Q27System::DIR_0PM] = mfbca;
+                    f[D3Q27System::DIR_MMM] = mfaaa;
+                    f[D3Q27System::DIR_PMM] = mfcaa;
+                    f[D3Q27System::DIR_MPM] = mfaca;
+                    f[D3Q27System::DIR_PPM] = mfcca;
+
+                    if ((*particleData)(x1, x2, x3)->solidFraction > SOLFRAC_MIN) {
+                        fPre[D3Q27System::DIR_000] = mfbbb;
+
+                        fPre[D3Q27System::DIR_P00] = mfcbb;
+                        fPre[D3Q27System::DIR_0P0] = mfbcb;
+                        fPre[D3Q27System::DIR_00P] = mfbbc;
+                        fPre[D3Q27System::DIR_PP0] = mfccb;
+                        fPre[D3Q27System::DIR_MP0] = mfacb;
+                        fPre[D3Q27System::DIR_P0P] = mfcbc;
+                        fPre[D3Q27System::DIR_M0P] = mfabc;
+                        fPre[D3Q27System::DIR_0PP] = mfbcc;
+                        fPre[D3Q27System::DIR_0MP] = mfbac;
+                        fPre[D3Q27System::DIR_PPP] = mfccc;
+                        fPre[D3Q27System::DIR_MPP] = mfacc;
+                        fPre[D3Q27System::DIR_PMP] = mfcac;
+                        fPre[D3Q27System::DIR_MMP] = mfaac;
+
+                        fPre[D3Q27System::DIR_M00] = mfabb;
+                        fPre[D3Q27System::DIR_0M0] = mfbab;
+                        fPre[D3Q27System::DIR_00M] = mfbba;
+                        fPre[D3Q27System::DIR_MM0] = mfaab;
+                        fPre[D3Q27System::DIR_PM0] = mfcab;
+                        fPre[D3Q27System::DIR_M0M] = mfaba;
+                        fPre[D3Q27System::DIR_P0M] = mfcba;
+                        fPre[D3Q27System::DIR_0MM] = mfbaa;
+                        fPre[D3Q27System::DIR_0PM] = mfbca;
+                        fPre[D3Q27System::DIR_MMM] = mfaaa;
+                        fPre[D3Q27System::DIR_PMM] = mfcaa;
+                        fPre[D3Q27System::DIR_MPM] = mfaca;
+                        fPre[D3Q27System::DIR_PPM] = mfcca;
+                    }
+
+                    (*particleData)(x1, x2, x3)->hydrodynamicForce.fill(0.0);
+
+                    if ((*particleData)(x1, x2, x3)->solidFraction <= SOLFRAC_MAX) {
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq.
+                    //! (J1)-(J3) <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015),
+                    //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+                    //!
+                    LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+                                    (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) +
+                                     ((mfacb + mfcab) + (mfaab + mfccb))) +
+                                    ((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) +
+                                   mfbbb;
+
+                    LBMReal rho   = c1 + drho;
+                    LBMReal OOrho = c1 / rho;
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+                                   (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+                                   (mfcbb - mfabb)) /
+                                  rho;
+                    LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+                                   (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+                                   (mfbcb - mfbab)) /
+                                  rho;
+                    LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+                                   (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+                                   (mfbbc - mfbba)) /
+                                  rho;
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // forcing
+                    ///////////////////////////////////////////////////////////////////////////////////////////
+                    if (withForcing) {
+                        muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1);
+                        muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2);
+                        muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3);
+
+                        forcingX1 = muForcingX1.Eval();
+                        forcingX2 = muForcingX2.Eval();
+                        forcingX3 = muForcingX3.Eval();
+
+                        ////////////////////////////////////////////////////////////////////////////////////
+                        //! - Add half of the acceleration (body force) to the velocity as in Eq. (42)
+                        //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015),
+                        //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+                        //!
+                        vvx += forcingX1 * deltaT * c1o2; // X
+                        vvy += forcingX2 * deltaT * c1o2; // Y
+                        vvz += forcingX3 * deltaT * c1o2; // Z
+                    }
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // calculate the square of velocities for this lattice node
+                    LBMReal vx2 = vvx * vvx;
+                    LBMReal vy2 = vvy * vvy;
+                    LBMReal vz2 = vvz * vvz;
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Set relaxation limiters for third order cumulants to default value \f$ \lambda=0.001 \f$
+                    //! according to section 6 in <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et
+                    //! al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+                    //!
+                    LBMReal wadjust;
+                    LBMReal qudricLimitP = c1o100;
+                    LBMReal qudricLimitM = c1o100;
+                    LBMReal qudricLimitD = c1o100;
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Chimera transform from well conditioned distributions to central moments as defined in
+                    //! Appendix J in <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015),
+                    //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a> see also Eq. (6)-(14) in <a
+                    //! href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+                    //!
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // Z - Dir
+                    forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36, c1o36);
+                    forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9, c1o9);
+                    forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36, c1o36);
+                    forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9, c1o9);
+                    forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9);
+                    forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9, c1o9);
+                    forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36, c1o36);
+                    forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9, c1o9);
+                    forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36, c1o36);
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // Y - Dir
+                    forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6, c1o6);
+                    forwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
+                    forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18, c1o18);
+                    forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3);
+                    forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
+                    forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9);
+                    forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6, c1o6);
+                    forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
+                    forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18, c1o18);
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // X - Dir
+                    forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1, c1);
+                    forwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
+                    forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3, c1o3);
+                    forwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
+                    forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
+                    forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
+                    forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3, c1o3);
+                    forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
+                    forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9, c1o9);
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Setting relaxation rates for non-hydrodynamic cumulants (default values). Variable names and
+                    //! equations according to <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al.
+                    //! (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+                    //!  => [NAME IN PAPER]=[NAME IN CODE]=[DEFAULT VALUE].
+                    //!  - Trace of second order cumulants \f$ C_{200}+C_{020}+C_{002} \f$ used to adjust bulk
+                    //!  viscosity:\f$\omega_2=OxxPyyPzz=1.0 \f$.
+                    //!  - Third order cumulants \f$ C_{120}+C_{102} \f$, \f$ C_{210}+C_{012} \f$, \f$ C_{201}+C_{021}
+                    //!  \f$: \f$\omega_3=OxyyPxzz\f$ set according to Eq. (111) with simplifications assuming
+                    //!  \f$\omega_2=1.0\f$.
+                    //!  - Third order cumulants \f$ C_{120}-C_{102} \f$, \f$ C_{210}-C_{012} \f$, \f$ C_{201}-C_{021}
+                    //!  \f$: \f$\omega_4 = OxyyMxzz\f$ set according to Eq. (112) with simplifications assuming
+                    //!  \f$\omega_2 = 1.0\f$.
+                    //!  - Third order cumulants \f$ C_{111} \f$: \f$\omega_5 = Oxyz\f$ set according to Eq. (113) with
+                    //!  simplifications assuming \f$\omega_2 = 1.0\f$  (modify for different bulk viscosity).
+                    //!  - Fourth order cumulants \f$ C_{220} \f$, \f$ C_{202} \f$, \f$ C_{022} \f$, \f$ C_{211} \f$,
+                    //!  \f$ C_{121} \f$, \f$ C_{112} \f$: for simplification all set to the same default value \f$
+                    //!  \omega_6=\omega_7=\omega_8=O4=1.0 \f$.
+                    //!  - Fifth order cumulants \f$ C_{221}\f$, \f$C_{212}\f$, \f$C_{122}\f$: \f$\omega_9=O5=1.0\f$.
+                    //!  - Sixth order cumulant \f$ C_{222}\f$: \f$\omega_{10}=O6=1.0\f$.
+                    //!
+                    ////////////////////////////////////////////////////////////
+                    // 2.
+                    LBMReal OxxPyyPzz = c1;
+                    ////////////////////////////////////////////////////////////
+                    // 3.
+                    LBMReal OxyyPxzz =
+                        c8 * (-c2 + omega) * (c1 + c2 * omega) / (-c8 - c14 * omega + c7 * omega * omega);
+                    LBMReal OxyyMxzz =
+                        c8 * (-c2 + omega) * (-c7 + c4 * omega) / (c56 - c50 * omega + c9 * omega * omega);
+                    LBMReal Oxyz = c24 * (-c2 + omega) * (-c2 - c7 * omega + c3 * omega * omega) /
+                                   (c48 + c152 * omega - c130 * omega * omega + c29 * omega * omega * omega);
+                    ////////////////////////////////////////////////////////////
+                    // 4.
+                    LBMReal O4 = c1;
+                    ////////////////////////////////////////////////////////////
+                    // 5.
+                    LBMReal O5 = c1;
+                    ////////////////////////////////////////////////////////////
+                    // 6.
+                    LBMReal O6 = c1;
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - A and B: parameters for fourth order convergence of the diffusion term according to Eq. (114)
+                    //! and (115) <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> with simplifications assuming \f$\omega_2 = 1.0\f$
+                    //! (modify for different bulk viscosity).
+                    //!
+                    LBMReal A = (c4 + c2 * omega - c3 * omega * omega) / (c2 - c7 * omega + c5 * omega * omega);
+                    LBMReal B = (c4 + c28 * omega - c14 * omega * omega) / (c6 - c21 * omega + c15 * omega * omega);
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Compute cumulants from central moments according to Eq. (20)-(23) in
+                    //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+                    //!
+                    ////////////////////////////////////////////////////////////
+                    // 4.
+                    LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2 * mfbba * mfbab) * OOrho;
+                    LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2 * mfbba * mfabb) * OOrho;
+                    LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2 * mfbab * mfabb) * OOrho;
+
+                    LBMReal CUMcca = mfcca - (((mfcaa * mfaca + c2 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho -
+                                              c1o9 * (drho * OOrho));
+                    LBMReal CUMcac = mfcac - (((mfcaa * mfaac + c2 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho -
+                                              c1o9 * (drho * OOrho));
+                    LBMReal CUMacc = mfacc - (((mfaac * mfaca + c2 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho -
+                                              c1o9 * (drho * OOrho));
+                    ////////////////////////////////////////////////////////////
+                    // 5.
+                    LBMReal CUMbcc =
+                        mfbcc -
+                        ((mfaac * mfbca + mfaca * mfbac + c4 * mfabb * mfbbb + c2 * (mfbab * mfacb + mfbba * mfabc)) +
+                         c1o3 * (mfbca + mfbac)) *
+                            OOrho;
+                    LBMReal CUMcbc =
+                        mfcbc -
+                        ((mfaac * mfcba + mfcaa * mfabc + c4 * mfbab * mfbbb + c2 * (mfabb * mfcab + mfbba * mfbac)) +
+                         c1o3 * (mfcba + mfabc)) *
+                            OOrho;
+                    LBMReal CUMccb =
+                        mfccb -
+                        ((mfcaa * mfacb + mfaca * mfcab + c4 * mfbba * mfbbb + c2 * (mfbab * mfbca + mfabb * mfcba)) +
+                         c1o3 * (mfacb + mfcab)) *
+                            OOrho;
+                    ////////////////////////////////////////////////////////////
+                    // 6.
+                    LBMReal CUMccc =
+                        mfccc + ((-c4 * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) -
+                                  c4 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) -
+                                  c2 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) *
+                                     OOrho +
+                                 (c4 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +
+                                  c2 * (mfcaa * mfaca * mfaac) + c16 * mfbba * mfbab * mfabb) *
+                                     OOrho * OOrho -
+                                 c1o3 * (mfacc + mfcac + mfcca) * OOrho - c1o9 * (mfcaa + mfaca + mfaac) * OOrho +
+                                 (c2 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +
+                                  (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) *
+                                     OOrho * OOrho * c2o3 +
+                                 c1o27 * ((drho * drho - drho) * OOrho * OOrho));
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Compute linear combinations of second and third order cumulants
+                    //!
+                    ////////////////////////////////////////////////////////////
+                    // 2.
+                    LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+                    LBMReal mxxMyy    = mfcaa - mfaca;
+                    LBMReal mxxMzz    = mfcaa - mfaac;
+                    ////////////////////////////////////////////////////////////
+                    // 3.
+                    LBMReal mxxyPyzz = mfcba + mfabc;
+                    LBMReal mxxyMyzz = mfcba - mfabc;
+
+                    LBMReal mxxzPyyz = mfcab + mfacb;
+                    LBMReal mxxzMyyz = mfcab - mfacb;
+
+                    LBMReal mxyyPxzz = mfbca + mfbac;
+                    LBMReal mxyyMxzz = mfbca - mfbac;
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // incl. correction
+                    ////////////////////////////////////////////////////////////
+                    //! - Compute velocity  gradients from second order cumulants according to Eq. (27)-(32)
+                    //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> Further explanations of the correction in viscosity in
+                    //! Appendix H of <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015),
+                    //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a> Note that the division by rho is omitted here as we
+                    //! need rho times the gradients later.
+                    //!
+                    LBMReal Dxy  = -c3 * omega * mfbba;
+                    LBMReal Dxz  = -c3 * omega * mfbab;
+                    LBMReal Dyz  = -c3 * omega * mfabb;
+                    LBMReal dxux = c1o2 * (-omega) * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz);
+                    LBMReal dyuy = dxux + omega * c3o2 * mxxMyy;
+                    LBMReal dzuz = dxux + omega * c3o2 * mxxMzz;
+                    ////////////////////////////////////////////////////////////
+                    //! - Relaxation of second order cumulants with correction terms according to Eq. (33)-(35) in
+                    //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+                    //!
+                    mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) -
+                                 c3 * (c1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+                    mxxMyy += omega * (-mxxMyy) - c3 * (c1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
+                    mxxMzz += omega * (-mxxMzz) - c3 * (c1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz);
+
+                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+                    ////no correction
+                    // mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);
+                    // mxxMyy += -(-omega) * (-mxxMyy);
+                    // mxxMzz += -(-omega) * (-mxxMzz);
+                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+                    mfabb += omega * (-mfabb);
+                    mfbab += omega * (-mfbab);
+                    mfbba += omega * (-mfbba);
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // relax
+                    //////////////////////////////////////////////////////////////////////////
+                    // incl. limiter
+                    //! - Relaxation of third order cumulants including limiter according to Eq. (116)-(123)
+                    //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+                    //!
+                    wadjust = Oxyz + (c1 - Oxyz) * abs(mfbbb) / (abs(mfbbb) + qudricLimitD);
+                    mfbbb += wadjust * (-mfbbb);
+                    wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxxyPyzz) / (abs(mxxyPyzz) + qudricLimitP);
+                    mxxyPyzz += wadjust * (-mxxyPyzz);
+                    wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxxyMyzz) / (abs(mxxyMyzz) + qudricLimitM);
+                    mxxyMyzz += wadjust * (-mxxyMyzz);
+                    wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxxzPyyz) / (abs(mxxzPyyz) + qudricLimitP);
+                    mxxzPyyz += wadjust * (-mxxzPyyz);
+                    wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxxzMyyz) / (abs(mxxzMyyz) + qudricLimitM);
+                    mxxzMyyz += wadjust * (-mxxzMyyz);
+                    wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxyyPxzz) / (abs(mxyyPxzz) + qudricLimitP);
+                    mxyyPxzz += wadjust * (-mxyyPxzz);
+                    wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxyyMxzz) / (abs(mxyyMxzz) + qudricLimitM);
+                    mxyyMxzz += wadjust * (-mxyyMxzz);
+                    //////////////////////////////////////////////////////////////////////////
+                    // no limiter
+                    // mfbbb += OxyyMxzz * (-mfbbb);
+                    // mxxyPyzz += OxyyPxzz * (-mxxyPyzz);
+                    // mxxyMyzz += OxyyMxzz * (-mxxyMyzz);
+                    // mxxzPyyz += OxyyPxzz * (-mxxzPyyz);
+                    // mxxzMyyz += OxyyMxzz * (-mxxzMyyz);
+                    // mxyyPxzz += OxyyPxzz * (-mxyyPxzz);
+                    // mxyyMxzz += OxyyMxzz * (-mxyyMxzz);
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Compute inverse linear combinations of second and third order cumulants
+                    //!
+                    mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+                    mfaca = c1o3 * (-c2 * mxxMyy + mxxMzz + mxxPyyPzz);
+                    mfaac = c1o3 * (mxxMyy - c2 * mxxMzz + mxxPyyPzz);
+
+                    mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+                    mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+                    mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+                    mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+                    mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+                    mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+                    //////////////////////////////////////////////////////////////////////////
+
+                    //////////////////////////////////////////////////////////////////////////
+                    // 4.
+                    //  no limiter
+                    //! - Relax fourth order cumulants to modified equilibrium for fourth order convergence of diffusion
+                    //! according to Eq. (43)-(48) <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et
+                    //! al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+                    //!
+                    CUMacc = -O4 * (c1 / omega - c1o2) * (dyuy + dzuz) * c2o3 * A + (c1 - O4) * (CUMacc);
+                    CUMcac = -O4 * (c1 / omega - c1o2) * (dxux + dzuz) * c2o3 * A + (c1 - O4) * (CUMcac);
+                    CUMcca = -O4 * (c1 / omega - c1o2) * (dyuy + dxux) * c2o3 * A + (c1 - O4) * (CUMcca);
+                    CUMbbc = -O4 * (c1 / omega - c1o2) * Dxy * c1o3 * B + (c1 - O4) * (CUMbbc);
+                    CUMbcb = -O4 * (c1 / omega - c1o2) * Dxz * c1o3 * B + (c1 - O4) * (CUMbcb);
+                    CUMcbb = -O4 * (c1 / omega - c1o2) * Dyz * c1o3 * B + (c1 - O4) * (CUMcbb);
+
+                    //////////////////////////////////////////////////////////////////////////
+                    // 5.
+                    CUMbcc += O5 * (-CUMbcc);
+                    CUMcbc += O5 * (-CUMcbc);
+                    CUMccb += O5 * (-CUMccb);
+
+                    //////////////////////////////////////////////////////////////////////////
+                    // 6.
+                    CUMccc += O6 * (-CUMccc);
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Compute central moments from post collision cumulants according to Eq. (53)-(56) in
+                    //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+                    //!
+
+                    //////////////////////////////////////////////////////////////////////////
+                    // 4.
+                    mfcbb = CUMcbb + c1o3 * ((c3 * mfcaa + c1) * mfabb + c6 * mfbba * mfbab) * OOrho;
+                    mfbcb = CUMbcb + c1o3 * ((c3 * mfaca + c1) * mfbab + c6 * mfbba * mfabb) * OOrho;
+                    mfbbc = CUMbbc + c1o3 * ((c3 * mfaac + c1) * mfbba + c6 * mfbab * mfabb) * OOrho;
+
+                    mfcca = CUMcca + (((mfcaa * mfaca + c2 * mfbba * mfbba) * c9 + c3 * (mfcaa + mfaca)) * OOrho -
+                                      (drho * OOrho)) *
+                                         c1o9;
+                    mfcac = CUMcac + (((mfcaa * mfaac + c2 * mfbab * mfbab) * c9 + c3 * (mfcaa + mfaac)) * OOrho -
+                                      (drho * OOrho)) *
+                                         c1o9;
+                    mfacc = CUMacc + (((mfaac * mfaca + c2 * mfabb * mfabb) * c9 + c3 * (mfaac + mfaca)) * OOrho -
+                                      (drho * OOrho)) *
+                                         c1o9;
+
+                    //////////////////////////////////////////////////////////////////////////
+                    // 5.
+                    mfbcc = CUMbcc + c1o3 *
+                                         (c3 * (mfaac * mfbca + mfaca * mfbac + c4 * mfabb * mfbbb +
+                                                c2 * (mfbab * mfacb + mfbba * mfabc)) +
+                                          (mfbca + mfbac)) *
+                                         OOrho;
+                    mfcbc = CUMcbc + c1o3 *
+                                         (c3 * (mfaac * mfcba + mfcaa * mfabc + c4 * mfbab * mfbbb +
+                                                c2 * (mfabb * mfcab + mfbba * mfbac)) +
+                                          (mfcba + mfabc)) *
+                                         OOrho;
+                    mfccb = CUMccb + c1o3 *
+                                         (c3 * (mfcaa * mfacb + mfaca * mfcab + c4 * mfbba * mfbbb +
+                                                c2 * (mfbab * mfbca + mfabb * mfcba)) +
+                                          (mfacb + mfcab)) *
+                                         OOrho;
+
+                    //////////////////////////////////////////////////////////////////////////
+                    // 6.
+                    mfccc =
+                        CUMccc - ((-c4 * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) -
+                                   c4 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) -
+                                   c2 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) *
+                                      OOrho +
+                                  (c4 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +
+                                   c2 * (mfcaa * mfaca * mfaac) + c16 * mfbba * mfbab * mfabb) *
+                                      OOrho * OOrho -
+                                  c1o3 * (mfacc + mfcac + mfcca) * OOrho - c1o9 * (mfcaa + mfaca + mfaac) * OOrho +
+                                  (c2 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +
+                                   (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) *
+                                      OOrho * OOrho * c2o3 +
+                                  c1o27 * ((drho * drho - drho) * OOrho * OOrho));
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! -  Add acceleration (body force) to first order cumulants according to Eq. (85)-(87) in
+                    //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015),
+                    //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+                    //!
+                    mfbaa = -mfbaa;
+                    mfaba = -mfaba;
+                    mfaab = -mfaab;
+                    ////////////////////////////////////////////////////////////////////////////////////
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Chimera transform from central moments to well conditioned distributions as defined in
+                    //! Appendix J in <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015),
+                    //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a> see also Eq. (88)-(96) in <a
+                    //! href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+                    //!
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // X - Dir
+                    backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1, c1);
+                    backwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
+                    backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3, c1o3);
+                    backwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
+                    backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
+                    backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
+                    backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3, c1o3);
+                    backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
+                    backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9, c1o9);
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // Y - Dir
+                    backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6, c1o6);
+                    backwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
+                    backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18, c1o18);
+                    backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3);
+                    backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
+                    backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9);
+                    backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6, c1o6);
+                    backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
+                    backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18, c1o18);
+
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    // Z - Dir
+                    backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36, c1o36);
+                    backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9, c1o9);
+                    backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36, c1o36);
+                    backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9, c1o9);
+                    backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9);
+                    backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9, c1o9);
+                    backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36, c1o36);
+                    backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9, c1o9);
+                    backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36, c1o36);
+                    ////////////////////////////////////////////////////////////////////////////////////
+
+                    //////////////////////////////////////////////////////////////////////////
+                    // proof correctness
+                    //////////////////////////////////////////////////////////////////////////
+#ifdef PROOF_CORRECTNESS
+                    LBMReal drho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +
+                                        (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) +
+                                        (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) +
+                                        (mfbba + mfbbc) + mfbbb;
+                    LBMReal dif = drho - drho_post;
+#ifdef SINGLEPRECISION
+                    if (dif > 10.0E-7 || dif < -10.0E-7)
+#else
+                    if (dif > 10.0E-15 || dif < -10.0E-15)
+#endif
+                    {
+                        UB_THROW(UbException(
+                            UB_EXARGS,
+                            "rho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(drho_post) +
+                                " dif=" + UbSystem::toString(dif) + " rho is not correct for node " +
+                                UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3) +
+                                " in " + block.lock()->toString() + " step = " + UbSystem::toString(step)));
+                    }
+#endif
+                    ////////////////////////////////////////////////////////////////////////////////////
+                    //! - Write distributions: style of reading and writing the distributions from/to stored arrays
+                    //! dependent on timestep is based on the esoteric twist algorithm <a
+                    //! href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017),
+                    //! DOI:10.3390/computation5020019 ]</b></a>
+                    //!
+                    (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3)     = mfabb;
+                    (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3)     = mfbab;
+                    (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3)     = mfbba;
+                    (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3)    = mfaab;
+                    (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3)   = mfcab;
+                    (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3)    = mfaba;
+                    (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3)   = mfcba;
+                    (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3)    = mfbaa;
+                    (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3)   = mfbca;
+                    (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3)   = mfaaa;
+                    (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3)  = mfcaa;
+                    (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3)  = mfaca;
+                    (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+                    (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3)     = mfcbb;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3)     = mfbcb;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p)     = mfbbc;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3)   = mfccb;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3)    = mfacb;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p)   = mfcbc;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p)    = mfabc;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p)   = mfbcc;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p)    = mfbac;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p)  = mfacc;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p)  = mfcac;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p)   = mfaac;
+
+                    (*this->restDistributions)(x1, x2, x3) = mfbbb;
+                    //////////////////////////////////////////////////////////////////////////
+                    f[D3Q27System::DIR_000] = mfbbb;
+                     
+                    f[D3Q27System::DIR_P00]  = mfcbb;
+                    f[D3Q27System::DIR_0P0]  = mfbcb;
+                    f[D3Q27System::DIR_00P]  = mfbbc;
+                    f[D3Q27System::DIR_PP0]  = mfccb;
+                    f[D3Q27System::DIR_MP0]  = mfacb;
+                    f[D3Q27System::DIR_P0P]  = mfcbc;
+                    f[D3Q27System::DIR_M0P]  = mfabc;
+                    f[D3Q27System::DIR_0PP]  = mfbcc;
+                    f[D3Q27System::DIR_0MP]  = mfbac;
+                    f[D3Q27System::DIR_PPP]  = mfccc;
+                    f[D3Q27System::DIR_MPP]  = mfacc;
+                    f[D3Q27System::DIR_PMP]  = mfcac;
+                    f[D3Q27System::DIR_MMP]  = mfaac;
+                                     
+                    f[D3Q27System::DIR_M00]  = mfabb;
+                    f[D3Q27System::DIR_0M0]  = mfbab;
+                    f[D3Q27System::DIR_00M]  = mfbba;
+                    f[D3Q27System::DIR_MM0]  = mfaab;
+                    f[D3Q27System::DIR_PM0]  = mfcab;
+                    f[D3Q27System::DIR_M0M]  = mfaba;
+                    f[D3Q27System::DIR_P0M]  = mfcba;
+                    f[D3Q27System::DIR_0MM]  = mfbaa;
+                    f[D3Q27System::DIR_0PM]  = mfbca;
+                    f[D3Q27System::DIR_MMM]  = mfaaa;
+                    f[D3Q27System::DIR_PMM]  = mfcaa;
+                    f[D3Q27System::DIR_MPM]  = mfaca;
+                    f[D3Q27System::DIR_PPM]  = mfcca;
+                }
+                    if ((*particleData)(x1, x2, x3)->solidFraction < SOLFRAC_MIN)
+                        continue;
+
+                    LBMReal vx1, vx2, vx3, drho;
+                    D3Q27System::calcCompMacroscopicValues(f, drho, vx1, vx2, vx3);
+                    D3Q27System::calcCompFeq(fEq, drho, vx1, vx2, vx3);
+
+                    std::array<double, 3> uPart;
+                    uPart[0] = (*particleData)(x1, x2, x3)->uPart[0] * (1. + drho);
+                    uPart[1] = (*particleData)(x1, x2, x3)->uPart[1] * (1. + drho);
+                    uPart[2] = (*particleData)(x1, x2, x3)->uPart[2] * (1. + drho);
+
+                    D3Q27System::calcCompFeq(fEqSolid, drho, uPart[0], uPart[1], uPart[2]);
+
+                    if ((*particleData)(x1, x2, x3)->solidFraction > SOLFRAC_MAX) {
+                        double const bb0     = fEq[D3Q27System::DIR_000] - fEqSolid[D3Q27System::DIR_000];
+                        f[D3Q27System::DIR_000] = fPre[D3Q27System::DIR_000] + bb0;
+                        for (int iPop = D3Q27System::FSTARTDIR; iPop <= D3Q27System::FENDDIR; iPop++) {
+                            const int iOpp        = D3Q27System::INVDIR[iPop];
+                            double const bb       = ((fPre[iOpp] - fEq[iOpp]) - (fPre[iPop] - fEqSolid[iPop]));
+                            double const bbOpp    = ((fPre[iPop] - fEq[iPop]) - (fPre[iOpp] - fEqSolid[iOpp]));
+
+
+                            f[iPop] = fPre[iPop] + bb;
+                            f[iOpp] = fPre[iOpp] + bbOpp;
+
+                            (*particleData)(x1, x2, x3)->hydrodynamicForce[0] -= D3Q27System::DX1[iPop] * (bb - bbOpp);
+                            (*particleData)(x1, x2, x3)->hydrodynamicForce[1] -= D3Q27System::DX2[iPop] * (bb - bbOpp);
+                            (*particleData)(x1, x2, x3)->hydrodynamicForce[2] -= D3Q27System::DX3[iPop] * (bb - bbOpp);
+                        }
+                    } else { /* particleData.solidFraction < SOLFRAC_MAX */
+//#ifdef LBDEM_USE_WEIGHING
+                        double const ooo = 1. / omega - 0.5;
+                        double const B   = (*particleData)(x1, x2, x3)->solidFraction * ooo / ((1. - (*particleData)(x1, x2, x3)->solidFraction) + ooo);
+//#else
+//                        T const B = particleData.solidFraction;
+//#endif
+                        double const oneMinB = 1. - B;
+
+                        double const bb0 = fEq[D3Q27System::DIR_000] - fEqSolid[D3Q27System::DIR_000];
+                        f[D3Q27System::DIR_000] = fPre[D3Q27System::DIR_000] + oneMinB * (f[D3Q27System::DIR_000] - fPre[D3Q27System::DIR_000]) + B * bb0;
+
+                        for (int iPop = D3Q27System::FSTARTDIR; iPop <= D3Q27System::FENDDIR; iPop++) {
+                            int const iOpp = D3Q27System::INVDIR[iPop];
+                            double const bb       = B * ((fPre[iOpp] - fEq[iOpp]) - (fPre[iPop] - fEqSolid[iPop]));
+                            double const bbOpp    = B * ((fPre[iPop] - fEq[iPop]) - (fPre[iOpp] - fEqSolid[iOpp]));
+
+                            f[iPop] = fPre[iPop] + oneMinB * (f[iPop] - fPre[iPop]) + bb;
+                            f[iOpp] = fPre[iOpp] + oneMinB * (f[iOpp] - fPre[iOpp]) + bbOpp;
+
+                            (*particleData)(x1, x2, x3)->hydrodynamicForce[0] -= D3Q27System::DX1[iPop] * (bb - bbOpp);
+                            (*particleData)(x1, x2, x3)->hydrodynamicForce[1] -= D3Q27System::DX2[iPop] * (bb - bbOpp);
+                            (*particleData)(x1, x2, x3)->hydrodynamicForce[2] -= D3Q27System::DX3[iPop] * (bb - bbOpp);
+                        }
+                    } /* if solidFraction > SOLFRAC_MAX */
+
+                    (*this->restDistributions)(x1, x2, x3)                             = f[D3Q27System::DIR_000];
+                                                                                          
+                    (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3)         = f[D3Q27System::DIR_M00];
+                    (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3)         = f[D3Q27System::DIR_0M0];
+                    (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3)         = f[D3Q27System::DIR_00M];
+                    (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3)        = f[D3Q27System::DIR_MM0];
+                    (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3)       = f[D3Q27System::DIR_PM0];
+                    (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3)        = f[D3Q27System::DIR_M0M];
+                    (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3)       = f[D3Q27System::DIR_P0M];
+                    (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3)        = f[D3Q27System::DIR_0MM];
+                    (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3)       = f[D3Q27System::DIR_0PM];
+                    (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3)       = f[D3Q27System::DIR_MMM];
+                    (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3)      = f[D3Q27System::DIR_PMM];
+                    (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3)      = f[D3Q27System::DIR_MPM];
+                    (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3)     = f[D3Q27System::DIR_PPM];
+                                                                                                          
+                    (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3)     =  f[D3Q27System::DIR_P00];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3)     =  f[D3Q27System::DIR_0P0];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p)     =  f[D3Q27System::DIR_00P];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3)   =  f[D3Q27System::DIR_PP0];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3)    =  f[D3Q27System::DIR_MP0];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p)   =  f[D3Q27System::DIR_P0P];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p)    =  f[D3Q27System::DIR_M0P];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p)   =  f[D3Q27System::DIR_0PP];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p)    =  f[D3Q27System::DIR_0MP];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) =  f[D3Q27System::DIR_PPP];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p)  =  f[D3Q27System::DIR_MPP];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p)  =  f[D3Q27System::DIR_PMP];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p)   =  f[D3Q27System::DIR_MMP];
+                }
+            }
+        }
+    }
+}
+//////////////////////////////////////////////////////////////////////////
+
diff --git a/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..2d5216d3607e4489cc93a062f66efdb6f2c2457a
--- /dev/null
+++ b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h
@@ -0,0 +1,155 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 IBcumulantK17LBMKernel.h
+//! \ingroup LiggghtsCoupling
+//! \author Konstantin Kutscher, Martin Geier
+//=======================================================================================
+
+#ifndef IBcumulantK17LBMKernel_h__
+#define IBcumulantK17LBMKernel_h__
+
+#include "LBMKernel.h"
+#include "BCProcessor.h"
+#include "D3Q27System.h"
+#include "UbTiming.h"
+#include "CbArray4D.h"
+#include "CbArray3D.h"
+#include "IBdynamicsParticleData.h"
+
+
+//! \brief   Compressible cumulant LBM kernel.
+//! \details  LBM implementation that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model
+//!
+//! The model is publisched in
+//! <a href="http://dx.doi.org/10.1016/j.jcp.2017.05.040"><b>[ Geier et al., (2017), 10.1016/j.jcp.2017.05.040]</b></a>,
+//! <a href="http://dx.doi.org/10.1016/j.jcp.2017.07.004"><b>[ Geier et al., (2017), 10.1016/j.jcp.2017.07.004]</b></a>
+//!
+class IBcumulantK17LBMKernel : public LBMKernel
+{
+public:
+    IBcumulantK17LBMKernel();
+    ~IBcumulantK17LBMKernel() = default;
+    void calculate(int step) override;
+    SPtr<LBMKernel> clone() override;
+    double getCalculationTime() override { return .0; }
+    CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr getParticleData() { return particleData; };
+    void setParticleData(CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr particleData)
+    {
+        this->particleData = particleData;
+    };
+
+protected:
+    inline void forwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K);
+    inline void backwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K);
+    inline void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+    inline void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+
+    virtual void initDataSet();
+
+    CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions;
+    CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions;
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr restDistributions;
+
+    mu::value_type muX1, muX2, muX3;
+    mu::value_type muDeltaT;
+    mu::value_type muNu;
+    LBMReal forcingX1;
+    LBMReal forcingX2;
+    LBMReal forcingX3;
+
+    CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr particleData;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//! \brief forward chimera transformation \ref forwardInverseChimeraWithK 
+//! Transformation from distributions to central moments according to Eq. (6)-(14) in
+//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+//! Modified for lower round-off errors.
+////////////////////////////////////////////////////////////////////////////////
+inline void IBcumulantK17LBMKernel::forwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K)
+{
+    using namespace UbMath;
+    LBMReal m2 = mfa + mfc;
+    LBMReal m1 = mfc - mfa;
+    LBMReal m0 = m2 + mfb;
+    mfa = m0;
+    m0 *= Kinverse;
+    m0 += c1;
+    mfb = (m1 * Kinverse - m0 * vv) * K;
+    mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K;
+}
+////////////////////////////////////////////////////////////////////////////////
+//! \brief backward chimera transformation \ref backwardInverseChimeraWithK
+//! Transformation from central moments to distributions according to Eq. (57)-(65) in
+//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+//! ] Modified for lower round-off errors.
+////////////////////////////////////////////////////////////////////////////////
+inline void IBcumulantK17LBMKernel::backwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K)
+{
+    using namespace UbMath;
+    LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (v2 - vv) * c1o2) * K;
+    LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (-v2)) * K;
+    mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (v2 + vv) * c1o2) * K;
+    mfa = m0;
+    mfb = m1;
+}
+////////////////////////////////////////////////////////////////////////////////
+//! \brief forward chimera transformation \ref forwardChimera 
+//! Transformation from distributions to central moments according to Eq. (6)-(14) in
+//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+//! for \f$ K_{abc}=0 \f$. This is to avoid unnessary floating point operations.
+//! Modified for lower round-off errors.
+////////////////////////////////////////////////////////////////////////////////
+inline void IBcumulantK17LBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2)
+{
+    using namespace UbMath;
+    LBMReal m1 = (mfa + mfc) + mfb;
+    LBMReal m2 = mfc - mfa;
+    mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2);
+    mfb = m2 - vv * m1;
+    mfa = m1;
+}
+////////////////////////////////////////////////////////////////////////////////
+//! \brief backward chimera transformation \ref backwardChimera 
+//! Transformation from central moments to distributions according to Eq. (57)-(65) in
+//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+//! for \f$ K_{abc}=0 \f$. This is to avoid unnessary floating point operations.
+//! Modified for lower round-off errors.
+////////////////////////////////////////////////////////////////////////////////
+inline void IBcumulantK17LBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2)
+{
+    using namespace UbMath;
+    LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2);
+    LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv;
+    mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2);
+    mfb = mb;
+    mfa = ma;
+}
+
+#endif // IBcumulantK17LBMKernel_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.cpp b/src/cpu/LiggghtsCoupling/IBdynamicsParticleData.h
similarity index 62%
rename from src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.cpp
rename to src/cpu/LiggghtsCoupling/IBdynamicsParticleData.h
index 33db1b0cf0fd07e5ac1db313ace368a3da0c7aed..6593a96542bb21ba03bbc1f76f731a416f8314a5 100644
--- a/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.cpp
+++ b/src/cpu/LiggghtsCoupling/IBdynamicsParticleData.h
@@ -26,33 +26,36 @@
 //  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 Grid3DSystem.cpp
-//! \ingroup Grid
+//! \file DataSet3D.h
+//! \ingroup LiggghtsCoupling
 //! \author Konstantin Kutscher
 //=======================================================================================
 
-#include <Grid3DSystem.h>
+#ifndef IBdynamicsParticleData_h
+#define IBdynamicsParticleData_h
 
-namespace Grid3DSystem
-{
-const int INVDIR[] = { INV_E,   INV_W,   INV_N,   INV_S,   INV_T,   INV_B,   INV_NE,  INV_NW, INV_SE,
-                       INV_SW,  INV_TE,  INV_TW,  INV_BE,  INV_BW,  INV_TN,  INV_TS,  INV_BN, INV_BS,
-                       INV_TNE, INV_TNW, INV_TSE, INV_TSW, INV_BNE, INV_BNW, INV_BSE, INV_BSW };
+#include<array>
 
-// index             0   1   2   3   4   5  6   7   8    9  10  11  12  13  14  15  16  17  18
-// direction:        E,  W,  N,  S,  T,  B, NE, SW, SE, NW, TE, BW, BE, TW, TN, BS, BN, TS, TNE TNW TSE TSW BNE BNW BSE
-// BSW
-const int EX1[] = { 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1 };
-const int EX2[] = { 0, 0, 1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, -1 };
-const int EX3[] = { 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1 };
-} // namespace Grid3DSystem
+constexpr auto SOLFRAC_MIN = 0.001;
+constexpr auto SOLFRAC_MAX = 0.999;
+
+struct IBdynamicsParticleData {
+public:
+    IBdynamicsParticleData()
+        : partId(0), solidFraction(0.)
+    {
+        uPart[0] = 0.;
+        uPart[1] = 0.;
+        uPart[2] = 0.;
+
+        hydrodynamicForce[0] = 0.;
+        hydrodynamicForce[1] = 0.;
+        hydrodynamicForce[2] = 0.;
+    };
+    int partId;
+    double solidFraction;
+    std::array<double, 3> uPart;
+    std::array<double, 3> hydrodynamicForce;
+};
 
-//////////////////////////////////////////////////////////////////////////
-const int &Grid3DSystem::getInvertDirection(const int &direction)
-{
-#ifdef _DEBUG
-    if (direction < STARTDIR || direction > ENDDIR)
-        throw UbException(UB_EXARGS, "unknown direction");
 #endif
-    return INVDIR[direction];
-}
diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp b/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..51d451064ff1b2e45433997b0e3e771b22f19ffb
--- /dev/null
+++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp
@@ -0,0 +1,413 @@
+#include "LiggghtsCouplingCoProcessor.h"
+#include "GbSphere3D.h"
+#include "mpi/MPICommunicator.h"
+#include "CoProcessor.h"
+#include "LiggghtsCouplingWrapper.h"
+#include "Grid3D.h"
+#include "Block3D.h"
+#include "LBMKernel.h"
+#include "DistributionArray3D.h"
+#include "DataSet3D.h"
+#include "IBcumulantK17LBMKernel.h"
+#include "LBMUnitConverter.h"
+#include "fix_lb_coupling_onetoone.h"
+
+LiggghtsCouplingCoProcessor::LiggghtsCouplingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+                                                         SPtr<vf::mpi::Communicator> comm,
+                                                         LiggghtsCouplingWrapper &wrapper, int demSteps,
+                                                         SPtr<LBMUnitConverter> units)
+    : CoProcessor(grid, s), comm(comm), wrapper(wrapper), demSteps(demSteps), units(units)
+{
+
+}
+
+LiggghtsCouplingCoProcessor::~LiggghtsCouplingCoProcessor()
+{
+}
+
+void LiggghtsCouplingCoProcessor::process(double actualTimeStep)
+{ 
+    if (comm->getProcessID() == 0)
+        std::cout << "LiggghtsCouplingCoProcessor step: " << actualTimeStep << "\n";
+    
+    //comm->barrier();
+
+    getForcesFromLattice();
+
+    //comm->barrier();
+    
+    wrapper.run(demSteps);
+
+    //comm->barrier();
+    
+    setSpheresOnLattice();
+
+    //comm->barrier();
+}
+
+void LiggghtsCouplingCoProcessor::setSpheresOnLattice()
+{
+    std::vector<int> excludeType;
+
+    int nPart = wrapper.lmp->atom->nlocal + wrapper.lmp->atom->nghost;
+
+    for (int iS = 0; iS < nPart; iS++) 
+    {
+        int type = (int)wrapper.lmp->atom->type[iS];
+        bool excludeFlag(false);
+        for (int iT = 0; iT < excludeType.size(); iT++) {
+            //std::cout << iS << " " << type << " " << excludeType[iT] << std::endl;
+            if (type == excludeType[iT]) {
+                excludeFlag = true;
+                break;
+            }
+        }
+
+        if (excludeFlag)
+            continue;
+
+        double x[3], v[3], omega[3];
+        double r;
+        int id = wrapper.lmp->atom->tag[iS];
+
+        for (int i = 0; i < 3; i++) 
+        {
+            x[i]     = wrapper.lmp->atom->x[iS][i]; // * units->getFactorLentghWToLb(); // - 0.5; ????
+            v[i]     = wrapper.lmp->atom->v[iS][i] * units->getFactorVelocityWToLb();
+            omega[i] = wrapper.lmp->atom->omega[iS][i] / units->getFactorTimeWToLb();
+        }
+        
+        r = wrapper.lmp->atom->radius[iS]; // * units->getFactorLentghWToLb();
+
+        //std::cout << "x[0] = " << x[0] << ", x[1] = " << x[1] << ", x[2] = " << x[2] << std::endl;
+        //std::cout << "v[0] = " << v[0] << ", v[1] = " << v[1] << ", v[2] = " << v[2] << std::endl;
+        //std::cout << "omega[0] = " << omega[0] << ", omega[1] = " << omega[1] << ", omega[2] = " << omega[2] << std::endl;
+        //std::cout << "r = " << r << std::endl;
+        
+        setSingleSphere3D(x, v, omega, r, id);
+    }
+}
+
+void LiggghtsCouplingCoProcessor::setSingleSphere3D(double *x, double *v, double *omega, /* double *com,*/ double r,
+                                                    int id /*, bool initVelFlag*/)
+{
+    int level = 0;
+    //UbTupleInt3 bi = grid->getBlockIndexes(x[0], x[1], x[2], level);
+    //SPtr<Block3D> block = grid->getBlock(val<1>(bi), val<2>(bi), val<3>(bi), level);
+    
+    std::vector<SPtr<Block3D>> blocks;
+    grid->getBlocksByCuboid(level, x[0] - r, x[1] - r, x[2] - r, x[0] + r, x[1] + r, x[2] + r, blocks);
+
+    for (SPtr<Block3D> block : blocks) {
+        if (block) {
+            SPtr<ILBMKernel> kernel = block->getKernel();
+            SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
+
+            CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr particleData =
+                dynamicPointerCast<IBcumulantK17LBMKernel>(kernel)->getParticleData();
+
+            if (!particleData)
+                continue;
+
+            int minX1 = 1;
+            int minX2 = 1;
+            int minX3 = 1;
+
+            int maxX1 = (int)(distributions->getNX1()) - 1;
+            int maxX2 = (int)(distributions->getNX2()) - 1;
+            int maxX3 = (int)(distributions->getNX3()) - 1;
+
+            for (int ix3 = minX3; ix3 < maxX3; ix3++) {
+                for (int ix2 = minX2; ix2 < maxX2; ix2++) {
+                    for (int ix1 = minX1; ix1 < maxX1; ix1++) {
+
+                        //UbTupleInt3 blockNX = grid->getBlockNX();
+
+                        //double const dx = val<1>(blockNX) * block->getX1() + ix1 - x[0];
+                        //double const dy = val<2>(blockNX) * block->getX2() + ix2 - x[1];
+                        //double const dz = val<3>(blockNX) * block->getX3() + ix3 - x[2];
+
+                        Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3);
+
+                        double const dx = (worldCoordinates[0] - x[0]) * units->getFactorLentghWToLb();
+                        double const dy = (worldCoordinates[1] - x[1]) * units->getFactorLentghWToLb();
+                        double const dz = (worldCoordinates[2] - x[2]) * units->getFactorLentghWToLb();
+
+                        double const sf = calcSolidFraction(dx, dy, dz, r * units->getFactorLentghWToLb());
+
+                        double const sf_old = (*particleData)(ix1,ix2,ix3)->solidFraction;
+                        int const id_old = (int)(*particleData)(ix1,ix2,ix3)->partId;
+
+                        int const decFlag = (sf > SOLFRAC_MIN) + 2 * (sf_old > SOLFRAC_MIN);
+
+                        switch (decFlag) {
+                            case 0: // sf == 0 && sf_old == 0
+                                setToZero(*(*particleData)(ix1, ix2, ix3).get());
+                                break; // do nothing
+                            case 1:    // sf > 0 && sf_old == 0
+                                setValues(*(*particleData)(ix1, ix2, ix3).get(), id, sf, v, dx, dy, dz, omega);
+                                break;
+                            case 2:               // sf == 0 && sf_old > 0
+                                if (id_old == id) // then particle has left this cell
+                                    setToZero(*(*particleData)(ix1, ix2, ix3).get());
+                                break; // else do nothing
+                            case 3:    // sf > 0 && sf_old > 0
+                                if (sf > sf_old || id_old == id)
+                                    setValues(*(*particleData)(ix1, ix2, ix3).get(), id, sf, v, dx, dy, dz, omega);
+                                break; // else do nothing
+                        }
+                        // if desired, initialize interior of sphere with sphere velocity
+                       // if (initVelFlag && sf > SOLFRAC_MAX)
+                       //     cell.defineVelocity(particleData->uPart);
+
+                        //if (sf > 0) {
+                        //    std::cout << "sf = " << sf << std::endl;
+                        //    std::cout << "ix1 = " << ix1 << ", ix2 = " << ix2 << ", ix3 = " << ix3 << std::endl;
+                        //}
+                    }
+                }
+            }
+        }
+    }
+
+}
+
+double LiggghtsCouplingCoProcessor::calcSolidFraction(double const dx_, double const dy_, double const dz_,
+                                                      double const r_)
+{
+    static int const slicesPerDim = 5;
+    static double const sliceWidth       = 1. / ((double)slicesPerDim);
+    static double const fraction         = 1. / ((double)(slicesPerDim * slicesPerDim * slicesPerDim));
+
+    // should be sqrt(3.)/2.
+    // add a little to avoid roundoff errors
+    static const double sqrt3half = (double)sqrt(3.1) / 2.;
+
+    double const dist = dx_ * dx_ + dy_ * dy_ + dz_ * dz_;
+
+    double const r_p = r_ + sqrt3half;
+    if (dist > r_p * r_p)
+        return 0;
+
+    double const r_m = r_ - sqrt3half;
+    if (dist < r_m * r_m)
+        return 1;
+
+    double const r_sq = r_ * r_;
+    double dx_sq[slicesPerDim], dy_sq[slicesPerDim], dz_sq[slicesPerDim];
+
+    // pre-calculate d[xyz]_sq for efficiency
+    for (int i = 0; i < slicesPerDim; i++) {
+        double const delta = -0.5 + ((double)i + 0.5) * sliceWidth;
+        double const dx    = dx_ + delta;
+        dx_sq[i]      = dx * dx;
+        double const dy    = dy_ + delta;
+        dy_sq[i]      = dy * dy;
+        double const dz    = dz_ + delta;
+        dz_sq[i]      = dz * dz;
+    }
+
+    unsigned int n(0);
+    for (int i = 0; i < slicesPerDim; i++) {
+        for (int j = 0; j < slicesPerDim; j++) {
+            for (int k = 0; k < slicesPerDim; k++) {
+                n += (dx_sq[i] + dy_sq[j] + dz_sq[k] < r_sq);
+            }
+        }
+    }
+
+    return fraction * ((double)n);
+}
+
+  void LiggghtsCouplingCoProcessor::setValues(IBdynamicsParticleData &p, int const id, double const sf, double const *v, double const dx, double const dy, double const dz, double const *omega)
+{
+    p.uPart[0] = v[0];
+    p.uPart[1] = v[1];
+    p.uPart[2] = v[2];
+
+    if (omega != 0) {
+        p.uPart[0] += omega[1] * dz - omega[2] * dy;
+        p.uPart[1] += -omega[0] * dz + omega[2] * dx;
+        p.uPart[2] += omega[0] * dy - omega[1] * dx;
+    }
+    p.solidFraction = sf;
+    p.partId        = id;
+}
+
+
+void LiggghtsCouplingCoProcessor::setToZero(IBdynamicsParticleData &p)
+{
+    p.uPart[0]      = 0;
+    p.uPart[1]      = 0;
+    p.uPart[2]      = 0;
+    p.solidFraction = 0;
+    p.partId        = 0;
+}
+
+void LiggghtsCouplingCoProcessor::getForcesFromLattice()
+{
+    static std::vector<double> force, torque;
+    static typename ParticleData::ParticleDataArrayVector x_lb;
+
+    int const nPart   = wrapper.lmp->atom->nlocal + wrapper.lmp->atom->nghost;
+    int const n_force = nPart * 3;
+
+    if (nPart == 0)
+        return; // no particles - no work
+
+    if (nPart > x_lb.size()) {
+        for (int iPart = 0; iPart < x_lb.size(); iPart++) {
+            x_lb[iPart][0] = wrapper.lmp->atom->x[iPart][0];
+            x_lb[iPart][1] = wrapper.lmp->atom->x[iPart][1];
+            x_lb[iPart][2] = wrapper.lmp->atom->x[iPart][2];
+        }
+        for (int iPart = x_lb.size(); iPart < nPart; iPart++) {
+            std::array<double, 3> ar = {wrapper.lmp->atom->x[iPart][0],
+                                        wrapper.lmp->atom->x[iPart][1],
+                                        wrapper.lmp->atom->x[iPart][2]};
+            x_lb.push_back(ar);
+        }
+            
+
+    } else {
+        for (int iPart = 0; iPart < nPart; iPart++) {
+            x_lb[iPart][0] = wrapper.lmp->atom->x[iPart][0];
+            x_lb[iPart][1] = wrapper.lmp->atom->x[iPart][1];
+            x_lb[iPart][2] = wrapper.lmp->atom->x[iPart][2];
+        }
+    }
+
+    if (n_force > force.size()) {
+        for (int i = 0; i < force.size(); i++) {
+            force[i]  = 0;
+            torque[i] = 0;
+        }
+        for (int i = force.size(); i < n_force; i++) {
+            force.push_back(0.);
+            torque.push_back(0.);
+        }
+    } else {
+        for (int i = 0; i < n_force; i++) {
+            force[i]  = 0;
+            torque[i] = 0;
+        }
+    }
+
+    SumForceTorque3D(x_lb, &force.front(), &torque.front());
+
+    LAMMPS_NS::FixLbCouplingOnetoone *couplingFix =
+        dynamic_cast<LAMMPS_NS::FixLbCouplingOnetoone *>(wrapper.lmp->modify->find_fix_style("couple/lb/onetoone", 0));
+
+    double **f_liggghts = couplingFix->get_force_ptr();
+    double **t_liggghts = couplingFix->get_torque_ptr();
+
+    for (int iPart = 0; iPart < nPart; iPart++)
+        for (int j = 0; j < 3; j++) {
+            f_liggghts[iPart][j] = 0;
+            t_liggghts[iPart][j] = 0;
+        }
+
+    for (int iPart = 0; iPart < nPart; iPart++) {
+        int tag          = wrapper.lmp->atom->tag[iPart];
+        int liggghts_ind = wrapper.lmp->atom->map(tag);
+
+        for (int j = 0; j < 3; j++) {
+            f_liggghts[liggghts_ind][j] += force[3 * iPart + j] * units->getFactorForceLbToW();
+            t_liggghts[liggghts_ind][j] += torque[3 * iPart + j] * units->getFactorTorqueLbToW();
+        }
+    }
+    couplingFix->comm_force_torque();
+}
+
+void LiggghtsCouplingCoProcessor::SumForceTorque3D(ParticleData::ParticleDataArrayVector &x, double *force, double *torque)
+{
+    int nx = grid->getNX1(), ny = grid->getNX2(), nz = grid->getNX3();
+
+    std::vector < SPtr < Block3D > > blocks;
+    int level = 0;
+    grid->getBlocks(level, grid->getRank(), true, blocks);
+
+        
+    for (SPtr<Block3D> block : blocks) {
+        if (block) {
+            SPtr<ILBMKernel> kernel                 = block->getKernel();
+            SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
+
+            CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr particleData =
+                dynamicPointerCast<IBcumulantK17LBMKernel>(kernel)->getParticleData();
+
+            if (!particleData)
+                continue;
+
+            int minX1 = 1;
+            int minX2 = 1;
+            int minX3 = 1;
+
+            int maxX1 = (int)(distributions->getNX1()) - 1;
+            int maxX2 = (int)(distributions->getNX2()) - 1;
+            int maxX3 = (int)(distributions->getNX3()) - 1;
+
+            for (int ix3 = minX3; ix3 < maxX3; ix3++) {
+                for (int ix2 = minX2; ix2 < maxX2; ix2++) {
+                    for (int ix1 = minX1; ix1 < maxX1; ix1++) {
+
+                        // LIGGGHTS indices start at 1
+                        int const id = (*particleData)(ix1, ix2, ix3)->partId;
+                        if (id < 1)
+                            continue; // no particle here
+
+                        int const ind = wrapper.lmp->atom->map(id);
+
+                        Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3);
+
+                        double dx = (worldCoordinates[0] - x[ind][0]) * units->getFactorLentghWToLb();
+                        double dy = (worldCoordinates[1] - x[ind][1]) * units->getFactorLentghWToLb();
+                        double dz = (worldCoordinates[2] - x[ind][2]) * units->getFactorLentghWToLb();
+
+                        // minimum image convention, needed if
+                        // (1) PBC are used and
+                        // (2) both ends of PBC lie on the same processor
+                        if (dx > nx / 2)
+                            dx -= nx;
+                        else if (dx < -nx / 2)
+                            dx += nx;
+                        if (dy > ny / 2)
+                            dy -= ny;
+                        else if (dy < -ny / 2)
+                            dy += ny;
+                        if (dz > nz / 2)
+                            dz -= nz;
+                        else if (dz < -nz / 2)
+                            dz += nz;
+
+                        double const forceX = (*particleData)(ix1, ix2, ix3)->hydrodynamicForce[0];
+                        double const forceY = (*particleData)(ix1, ix2, ix3)->hydrodynamicForce[1];
+                        double const forceZ = (*particleData)(ix1, ix2, ix3)->hydrodynamicForce[2];
+
+                        double const torqueX = dy * forceZ - dz * forceY;
+                        double const torqueY = -dx * forceZ + dz * forceX;
+                        double const torqueZ = dx * forceY - dy * forceX;
+
+                        addForce(ind, 0, forceX, force);
+                        addForce(ind, 1, forceY, force);
+                        addForce(ind, 2, forceZ, force);
+
+                        addTorque(ind, 0, torqueX, torque);
+                        addTorque(ind, 1, torqueY, torque);
+                        addTorque(ind, 2, torqueZ, torque);
+                    }
+                }
+            }
+        }
+    }
+ }
+
+void LiggghtsCouplingCoProcessor::addForce(int const partId, int const coord, double const value, double *force)
+{
+    force[3 * partId + coord] += value;
+}
+
+void LiggghtsCouplingCoProcessor::addTorque(int const partId, int const coord, double const value, double *torque)
+{
+    torque[3 * partId + coord] += value;
+}
\ No newline at end of file
diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h b/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..3e87c89d2b92e2d34465cc41ddeab98eee85c5ed
--- /dev/null
+++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h
@@ -0,0 +1,104 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 LiggghtsCouplingCoProcessor.h
+//! \ingroup LiggghtsCoupling
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef LiggghtsCouplingCoProcessor_h
+#define LiggghtsCouplingCoProcessor_h
+
+#include "CoProcessor.h"
+
+#include "lammps.h"
+#include "input.h"
+#include "atom.h"
+#include "modify.h"
+
+#include <memory>
+#include <vector>
+
+
+class CoProcessor;
+namespace vf::mpi {class Communicator;}
+class LiggghtsCouplingWrapper;
+class Grid3D;
+class Block3D;
+struct IBdynamicsParticleData;
+class LBMUnitConverter;
+
+struct ParticleData {
+    typedef typename std::vector<std::array<double, 3>> ParticleDataArrayVector;
+    typedef typename std::vector<double> ParticleDataScalarVector;
+};
+
+class LiggghtsCouplingCoProcessor : public CoProcessor
+{
+public:
+    LiggghtsCouplingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<vf::mpi::Communicator> comm,
+                                LiggghtsCouplingWrapper &wrapper, int demSteps, SPtr<LBMUnitConverter> units);
+    virtual ~LiggghtsCouplingCoProcessor();
+
+    void process(double actualTimeStep) override;
+
+    
+protected:
+    void setSpheresOnLattice();
+    
+    void setSingleSphere3D(double *x, double *v, double *omega, double r, int id /*, bool initVelFlag*/);
+    
+    double calcSolidFraction(double const dx_, double const dy_, double const dz_, double const r_);
+    
+    void setValues(IBdynamicsParticleData &p, int const id, double const sf, double const *v, double const dx, double const dy, double const dz, double const *omega);
+    
+    void setToZero(IBdynamicsParticleData &p);
+    
+    void getForcesFromLattice();
+    
+    void SumForceTorque3D(ParticleData::ParticleDataArrayVector &x, double *force, double *torque);
+
+    void addForce(int const partId, int const coord, double const value, double *force);
+
+    void addTorque(int const partId, int const coord, double const value, double *torque);
+
+private:
+    SPtr<vf::mpi::Communicator> comm;
+    LiggghtsCouplingWrapper &wrapper;
+    SPtr<LBMUnitConverter> units;
+    int demSteps;
+    //std::vector<std::vector<SPtr<Block3D>>> blockVector;
+    //int minInitLevel;
+    //int maxInitLevel;
+    //int gridRank;
+
+    double *force, *torque;
+};
+
+#endif
+
diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.cpp b/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9be87887a26d654d03dc8a32ed9e456ec352fef2
--- /dev/null
+++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.cpp
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the LBDEMcoupling software.
+ *
+ * LBDEMcoupling 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, version 3.
+ *
+ * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2014 Johannes Kepler University Linz
+ *
+ * Author: Philippe Seil (philippe.seil@jku.at)
+ */
+
+#include "LiggghtsCouplingWrapper.h"
+#include "mpi.h"
+#include <iostream>
+#include <sstream>
+
+LiggghtsCouplingWrapper::LiggghtsCouplingWrapper(char **argv, MPI_Comm communicator)
+  : lmp(0)
+{
+  // todo: get LAMMPS to recognize command line options
+  int argc_lmp = 1;
+  char **argv_lmp = 0;
+  argv_lmp = new char*[1];
+  argv_lmp[0] = argv[0];
+
+  lmp = new LAMMPS_NS::LAMMPS(argc_lmp,argv_lmp,communicator);
+
+  //    delete[] argv_lmp[0];
+  delete[] argv_lmp;
+}
+void LiggghtsCouplingWrapper::execFile(char* const fname)
+{
+  lmp->input->file(fname);
+}
+void LiggghtsCouplingWrapper::execCommand(std::stringstream const &cmd)
+{
+  lmp->input->one(cmd.str().c_str());
+}
+void LiggghtsCouplingWrapper::execCommand(char* const cmd)
+{
+  lmp->input->one(cmd);
+}
+int LiggghtsCouplingWrapper::getNumParticles()
+{
+  return lammps_get_natoms(lmp);  
+}
+void LiggghtsCouplingWrapper::setVariable(char const *name, double value)
+{
+  std::stringstream cmd;
+  cmd << "variable " << name << " equal " << value;
+  std::cout << cmd.str() << std::endl;
+  execCommand(cmd);
+}
+void LiggghtsCouplingWrapper::setVariable(char const *name, std::string &value)
+{
+  std::stringstream cmd;
+  cmd << "variable " << name << " string " << value;
+  std::cout << cmd.str() << std::endl;
+  execCommand(cmd);
+}
+void LiggghtsCouplingWrapper::run(int nSteps)
+{
+  std::stringstream cmd;
+  cmd << "run " << nSteps;
+  execCommand(cmd);
+}
+void LiggghtsCouplingWrapper::runUpto(int nSteps)
+{
+  std::stringstream cmd;
+  cmd << "run " << nSteps << " upto";
+  execCommand(cmd);
+}
+
+                              
+                           
+                           
diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.h b/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.h
new file mode 100644
index 0000000000000000000000000000000000000000..a745a7e967ee7852a11cd37452012951e421c347
--- /dev/null
+++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.h
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the LBDEMcoupling software.
+ *
+ * LBDEMcoupling 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, version 3.
+ *
+ * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2014 Johannes Kepler University Linz
+ *
+ * Author: Philippe Seil (philippe.seil@jku.at)
+ */
+
+#ifndef LIGGGHTSCOUPLINGWRAPPER_H
+#define LIGGGHTSCOUPLINGWRAPPER_H
+
+// necessary LAMMPS/LIGGGHTS includes
+
+#include "lammps.h"
+#include "input.h"
+#include "library.h"
+#include "library_cfd_coupling.h"
+
+class LiggghtsCouplingWrapper {
+public:
+  LiggghtsCouplingWrapper(char **argv, MPI_Comm communicator);
+  void execFile(char* const fname);
+  void execCommand(std::stringstream const &cmd);
+  void execCommand(char* const cmd);
+  void run(int nSteps);
+  void runUpto(int nSteps);
+  int getNumParticles();
+  void setVariable(char const *name, double value);
+  void setVariable(char const *name, std::string &value);
+
+  //private:
+  LAMMPS_NS::LAMMPS *lmp;
+};
+
+#endif /* LIGGGHTSCOUPLINGWRAPPER_H */
diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h
index ee5f07a02552bbb04e21be2b3abd5b7015f14144..8aed1556b058c8420d79eab32646ae10112ec288 100644
--- a/src/cpu/VirtualFluids.h
+++ b/src/cpu/VirtualFluids.h
@@ -144,6 +144,7 @@
 #include <BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h>
 #include <BoundaryConditions/MultiphaseVelocityBCAdapter.h>
 #include <BoundaryConditions/MultiphaseVelocityBCAlgorithm.h>
+#include <BoundaryConditions/MultiphaseSlipBCAlgorithm.h> 
 
 #include <Connectors/Block3DConnector.h>
 //#include <Connectors/Block3DConnectorFactory.h>
@@ -161,6 +162,7 @@
 #include <Connectors/TwoDistributionsFullDirectConnector.h>
 #include <Connectors/TwoDistributionsFullVectorConnector.h>
 
+
 #include <Data/D3Q27EsoTwist3DSplittedVector.h>
 #include <Data/D3Q27EsoTwist3DSplittedVectorEx.h>
 #include <Data/DataSet3D.h>
@@ -173,7 +175,6 @@
 #include <Grid/Block3D.h>
 #include <Grid/Calculator.h>
 #include <Grid/Grid3D.h>
-#include <Grid/Grid3DSystem.h>
 
 #include <Interactors/D3Q27Interactor.h>
 #include <Interactors/D3Q27TriFaceMeshInteractor.h>
@@ -251,6 +252,11 @@
 #include <LBM/MultiphaseCumulantLBMKernel.h>
 #include <LBM/MultiphaseScratchCumulantLBMKernel.h>
 #include <LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h>
+#include <LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h>
+#include <LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h>
+#include <LBM/MultiphasePressureFilterLBMKernel.h>
+#include <LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h>
+#include <MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h>
 
 
 
@@ -341,6 +347,7 @@
 #include <Visitors/MultiphaseSetKernelBlockVisitor.h>
 #include <Visitors/MultiphaseBoundaryConditionsBlockVisitor.h>
 #include <Visitors/MultiphaseInitDistributionsBlockVisitor.h>
+#include <Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h>
 #include <Visitors/SetInterpolationConnectorsBlockVisitor.h>
 
 #include <RefineAroundGbObjectHelper.h>
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h
index 67a3620c0a37c623c697bf8ec6a3f70f2ba00247..f8e77af6d8280e61978740757c682fe9119d9710 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h
@@ -69,6 +69,8 @@ public:
     static const char RheologyPowellEyringModelNoSlipBCAlgorithm           = 18;
     static const char RheologyBinghamModelVelocityBCAlgorithm              = 19;
     static const char MultiphaseNoSlipBCAlgorithm                  = 20;
+    static const char MultiphaseVelocityBCAlgorithm = 21;
+
 
 
 public:
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.cpp
index d66094dcc2277e297f03da91fe885f7e569d3aa2..abaf5480802c384d963134580c2408808a0885cd 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.cpp
@@ -33,4 +33,4 @@
 
 #include "BoundaryConditions.h"
 
-const long long BoundaryConditions::maxOptionVal = (1 << optionDigits) - 1; // 2^3-1 -> 7
+const long long BoundaryConditions::maxOptionVal = (1 << optionDigits) - 1; // 2^2-1 -> 3
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
index f59a899495c72a3f401b238de871e47a0282590b..fa61e7224ede371f1c28d3eab8e0ba795ccfa3b1 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
@@ -193,59 +193,59 @@ public:
     float getBoundaryVelocity(const int &direction)
     {
         switch (direction) {
-            case D3Q27System::E:
+            case D3Q27System::DIR_P00:
                 return (float)(UbMath::c4o9 *
                                (+bcVelocityX1)); //(2/cs^2)(=6)*rho_0(=1 bei inkompr)*wi*u*ei mit cs=1/sqrt(3)
-            case D3Q27System::W:
+            case D3Q27System::DIR_M00:
                 return (float)(UbMath::c4o9 *
                                (-bcVelocityX1)); // z.B. aus paper manfred MRT LB models in three dimensions (2002)
-            case D3Q27System::N:
+            case D3Q27System::DIR_0P0:
                 return (float)(UbMath::c4o9 * (+bcVelocityX2));
-            case D3Q27System::S:
+            case D3Q27System::DIR_0M0:
                 return (float)(UbMath::c4o9 * (-bcVelocityX2));
-            case D3Q27System::T:
+            case D3Q27System::DIR_00P:
                 return (float)(UbMath::c4o9 * (+bcVelocityX3));
-            case D3Q27System::B:
+            case D3Q27System::DIR_00M:
                 return (float)(UbMath::c4o9 * (-bcVelocityX3));
-            case D3Q27System::NE:
+            case D3Q27System::DIR_PP0:
                 return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2));
-            case D3Q27System::SW:
+            case D3Q27System::DIR_MM0:
                 return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2));
-            case D3Q27System::SE:
+            case D3Q27System::DIR_PM0:
                 return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2));
-            case D3Q27System::NW:
+            case D3Q27System::DIR_MP0:
                 return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2));
-            case D3Q27System::TE:
+            case D3Q27System::DIR_P0P:
                 return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3));
-            case D3Q27System::BW:
+            case D3Q27System::DIR_M0M:
                 return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3));
-            case D3Q27System::BE:
+            case D3Q27System::DIR_P0M:
                 return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3));
-            case D3Q27System::TW:
+            case D3Q27System::DIR_M0P:
                 return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3));
-            case D3Q27System::TN:
+            case D3Q27System::DIR_0PP:
                 return (float)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3));
-            case D3Q27System::BS:
+            case D3Q27System::DIR_0MM:
                 return (float)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3));
-            case D3Q27System::BN:
+            case D3Q27System::DIR_0PM:
                 return (float)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3));
-            case D3Q27System::TS:
+            case D3Q27System::DIR_0MP:
                 return (float)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3));
-            case D3Q27System::TNE:
+            case D3Q27System::DIR_PPP:
                 return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3));
-            case D3Q27System::BSW:
+            case D3Q27System::DIR_MMM:
                 return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3));
-            case D3Q27System::BNE:
+            case D3Q27System::DIR_PPM:
                 return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3));
-            case D3Q27System::TSW:
+            case D3Q27System::DIR_MMP:
                 return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3));
-            case D3Q27System::TSE:
+            case D3Q27System::DIR_PMP:
                 return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3));
-            case D3Q27System::BNW:
+            case D3Q27System::DIR_MPM:
                 return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3));
-            case D3Q27System::BSE:
+            case D3Q27System::DIR_PMM:
                 return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3));
-            case D3Q27System::TNW:
+            case D3Q27System::DIR_MPP:
                 return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3));
             default:
                 throw UbException(UB_EXARGS, "unknown error");
@@ -280,30 +280,6 @@ public:
     void setBoundaryDensity(float density) { this->bcDensity = density; }
     float getBoundaryDensity() { return this->bcDensity; }
 
-    ////Lodi extension
-    void setDensityLodiDensity(const float &bcLodiDensity) { this->bcLodiDensity = bcLodiDensity; }
-    void setDensityLodiVelocityX1(const float &bcLodiVelocityX1) { this->bcLodiVelocityX1 = bcLodiVelocityX1; }
-    void setDensityLodiVelocityX2(const float &bcLodiVelocityX2) { this->bcLodiVelocityX2 = bcLodiVelocityX2; }
-    void setDensityLodiVelocityX3(const float &bcLodiVelocityX3) { this->bcLodiVelocityX3 = bcLodiVelocityX3; }
-    void setDensityLodiLength(const float &bcLodiLentgh) { this->bcLodiLentgh = bcLodiLentgh; }
-    float getDensityLodiDensity() const { return this->bcLodiDensity; }
-    float getDensityLodiVelocityX1() const { return this->bcLodiVelocityX1; }
-    float getDensityLodiVelocityX2() const { return this->bcLodiVelocityX2; }
-    float getDensityLodiVelocityX3() const { return this->bcLodiVelocityX3; }
-    float getDensityLodiLength() const { return this->bcLodiLentgh; }
-
-    float &densityLodiDensity() { return this->bcLodiDensity; }
-    float &densityLodiVelocityX1() { return this->bcLodiVelocityX1; }
-    float &densityLodiVelocityX2() { return this->bcLodiVelocityX2; }
-    float &densityLodiVelocityX3() { return this->bcLodiVelocityX3; }
-    float &densityLodiLentgh() { return this->bcLodiLentgh; }
-
-    const float &densityLodiDensity() const { return this->bcLodiDensity; }
-    const float &densityLodiVelocityX1() const { return this->bcLodiVelocityX1; }
-    const float &densityLodiVelocityX2() const { return this->bcLodiVelocityX2; }
-    const float &densityLodiVelocityX3() const { return this->bcLodiVelocityX3; }
-    const float &densityLodiLentgh() const { return this->bcLodiLentgh; }
-
     /*======================= Qs =============================*/
     void setQ(const float &val, const int &direction) { q[direction] = val; }
     float getQ(const int &direction) { return q[direction]; }
@@ -354,13 +330,6 @@ protected:
     float bcDensity{ 0.0f };
     float bcPhaseField{ 0.0f };
 
-    //FIXME: remove LODI variables, don't forget to adjust MPIIOCoProcessors
-    float bcLodiDensity{ 0.0f };
-    float bcLodiVelocityX1{ 0.0f };
-    float bcLodiVelocityX2{ 0.0f };
-    float bcLodiVelocityX3{ 0.0f };
-    float bcLodiLentgh{ 0.0f };
-
     float nx1{ 0.0f }, nx2{ 0.0f }, nx3{ 0.0f };
 
     char algorithmType { -1 };
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp
index 8551c4371fed0f2c5d710fcf30ecad2da80abef3..bdddd2369377f1e2b30c86eb243bf4d4a843e06c 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp
@@ -63,17 +63,17 @@ void EqDensityBCAlgorithm::applyBC()
     int nx3 = x3;
 
     // flag points in direction of fluid
-    if (bcPtr->hasDensityBoundaryFlag(D3Q27System::E)) {
+    if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_P00)) {
         nx1 -= 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::W)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_M00)) {
         nx1 += 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::N)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0P0)) {
         nx2 -= 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::S)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0M0)) {
         nx2 += 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::T)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00P)) {
         nx3 -= 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::B)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00M)) {
         nx3 += 1;
     } else
         UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary..."));
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp
index 51fc2d5abdfe7cfa5bafb7ae21571c684cd26b02..aafa0da55a085b1025c693cf29bfb18730b92882 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp
@@ -66,17 +66,20 @@ void MultiphaseNoSlipBCAlgorithm::applyBC()
 {
    LBMReal f[D3Q27System::ENDF+1];
    LBMReal h[D3Q27System::ENDF+1];
-   LBMReal feq[D3Q27System::ENDF+1];
-   LBMReal heq[D3Q27System::ENDF+1];
+   LBMReal h2[D3Q27System::ENDF + 1];
+   //LBMReal feq[D3Q27System::ENDF+1];
+   //LBMReal heq[D3Q27System::ENDF+1];
    distributions ->getDistributionInv(f, x1, x2, x3);
+   if (distributionsH2)
+       distributionsH2->getDistributionInv(h2, x1, x2, x3);
    distributionsH->getDistributionInv(h, x1, x2, x3);
-   LBMReal phi, vx1, vx2, vx3, p1;
+  // LBMReal phi, vx1, vx2, vx3, p1;
    
-   D3Q27System::calcDensity(h, phi);
+ //  D3Q27System::calcDensity(h, phi);
    
-   calcMacrosFct(f, p1, vx1, vx2, vx3);
-   D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
-   D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3); 
+ //  calcMacrosFct(f, p1, vx1, vx2, vx3);
+ //  D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
+ //  D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3); 
 
    for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
    {
@@ -85,9 +88,18 @@ void MultiphaseNoSlipBCAlgorithm::applyBC()
          //quadratic bounce back
          const int invDir = D3Q27System::INVDIR[fdir];
 		 LBMReal fReturn = f[invDir];
-         distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
-		 LBMReal hReturn = h[invDir];
-		 distributionsH->setDistributionForDirection(hReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
+         //distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
+         distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB 
+         LBMReal hReturn = h[invDir];
+		// distributionsH->setDistributionForDirection(hReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
+         distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB  
+         if (distributionsH2)
+         {
+             LBMReal h2Return = h2[invDir];
+             distributionsH2->setDistributionForDirection(h2Return, x1, x2, x3, invDir);//delay BB
+            // distributionsH2->setDistributionForDirection(h2Return, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+
+         }
       }
    }
 }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp
index d0a3b39c83c1d828801dd442fb387c4d4d33d589..054227ecd9f6d79b4f4f345335184e9da84359eb 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp
@@ -62,6 +62,11 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::addDistributionsH(SPtr<Distribut
 	this->distributionsH = distributionsH;
 }
 //////////////////////////////////////////////////////////////////////////
+void MultiphaseNonReflectingOutflowBCAlgorithm::addDistributionsH2(SPtr<DistributionArray3D> distributionsH2)
+{
+    this->distributionsH2 = distributionsH2;
+}
+//////////////////////////////////////////////////////////////////////////
 void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
 {
    using namespace D3Q27System;
@@ -70,6 +75,8 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
    LBMReal ftemp[ENDF+1];
    LBMReal h[D3Q27System::ENDF+1];
    LBMReal htemp[ENDF+1];
+   LBMReal h2[D3Q27System::ENDF + 1];
+   LBMReal h2temp[ENDF + 1];
 
    int nx1 = x1;
    int nx2 = x2;
@@ -77,277 +84,462 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC()
    int direction = -1;
 
    //flag points in direction of fluid
-   if      (bcPtr->hasDensityBoundaryFlag(E)) { nx1 += 1; direction = E; }
-   else if (bcPtr->hasDensityBoundaryFlag(W)) { nx1 -= 1; direction = W; }
-   else if (bcPtr->hasDensityBoundaryFlag(N)) { nx2 += 1; direction = N; }
-   else if (bcPtr->hasDensityBoundaryFlag(S)) { nx2 -= 1; direction = S; }
-   else if (bcPtr->hasDensityBoundaryFlag(T)) { nx3 += 1; direction = T; }
-   else if (bcPtr->hasDensityBoundaryFlag(B)) { nx3 -= 1; direction = B; }
+   if      (bcPtr->hasDensityBoundaryFlag(DIR_P00)) { nx1 += 1; direction = DIR_P00; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_M00)) { nx1 -= 1; direction = DIR_M00; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_0P0)) { nx2 += 1; direction = DIR_0P0; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_0M0)) { nx2 -= 1; direction = DIR_0M0; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_00P)) { nx3 += 1; direction = DIR_00P; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_00M)) { nx3 -= 1; direction = DIR_00M; }
    else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary..."));
 
    distributions->getDistribution(f, x1, x2, x3);
    distributions->getDistribution(ftemp, nx1, nx2, nx3);
    distributionsH->getDistribution(h, x1, x2, x3);
    distributionsH->getDistribution(htemp, nx1, nx2, nx3);
+   distributionsH2->getDistribution(h2, x1, x2, x3);
+   distributionsH2->getDistribution(h2temp, nx1, nx2, nx3);
 
-   LBMReal phi, p1, vx1, vx2, vx3;
+   LBMReal /* phi,*/ p1, vx1, vx2, vx3;
    
-   D3Q27System::calcDensity(h, phi);
+   //D3Q27System::calcDensity(h, phi);
    
    calcMacrosFct(f, p1, vx1, vx2, vx3);
 
    switch (direction)
    {
-   case E:
-      f[E]   = ftemp[E]   * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[E]   ;
-      f[NE]  = ftemp[NE]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[NE]  ;
-      f[SE]  = ftemp[SE]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[SE]  ;
-      f[TE]  = ftemp[TE]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[TE]  ;
-      f[BE]  = ftemp[BE]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[BE]  ;
-      f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[TNE] ;
-      f[TSE] = ftemp[TSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[TSE] ;
-      f[BNE] = ftemp[BNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[BNE] ;
-      f[BSE] = ftemp[BSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[BSE] ;
-
-      distributions->setDistributionInvForDirection(f[E],   x1+DX1[W],   x2+DX2[W],   x3+DX3[W],   W);
-      distributions->setDistributionInvForDirection(f[NE],  x1+DX1[SW],  x2+DX2[SW],  x3+DX3[SW],  SW);
-      distributions->setDistributionInvForDirection(f[SE],  x1+DX1[NW],  x2+DX2[NW],  x3+DX3[NW],  NW);
-      distributions->setDistributionInvForDirection(f[TE],  x1+DX1[BW],  x2+DX2[BW],  x3+DX3[BW],  BW);
-      distributions->setDistributionInvForDirection(f[BE],  x1+DX1[TW],  x2+DX2[TW],  x3+DX3[TW],  TW);
-      distributions->setDistributionInvForDirection(f[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW);
-      distributions->setDistributionInvForDirection(f[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW);
-      distributions->setDistributionInvForDirection(f[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW);
-      distributions->setDistributionInvForDirection(f[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW);
+   case DIR_P00:
+      f[DIR_P00]   = ftemp[DIR_P00]   * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_P00]   ;
+      f[DIR_PP0]  = ftemp[DIR_PP0]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PP0]  ;
+      f[DIR_PM0]  = ftemp[DIR_PM0]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PM0]  ;
+      f[DIR_P0P]  = ftemp[DIR_P0P]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_P0P]  ;
+      f[DIR_P0M]  = ftemp[DIR_P0M]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_P0M]  ;
+      f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PPP] ;
+      f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PMP] ;
+      f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PPM] ;
+      f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PMM] ;
+
+      distributions->setDistributionInvForDirection(f[DIR_P00],   x1+DX1[DIR_M00],   x2+DX2[DIR_M00],   x3+DX3[DIR_M00],   DIR_M00);
+      distributions->setDistributionInvForDirection(f[DIR_PP0],  x1+DX1[DIR_MM0],  x2+DX2[DIR_MM0],  x3+DX3[DIR_MM0],  DIR_MM0);
+      distributions->setDistributionInvForDirection(f[DIR_PM0],  x1+DX1[DIR_MP0],  x2+DX2[DIR_MP0],  x3+DX3[DIR_MP0],  DIR_MP0);
+      distributions->setDistributionInvForDirection(f[DIR_P0P],  x1+DX1[DIR_M0M],  x2+DX2[DIR_M0M],  x3+DX3[DIR_M0M],  DIR_M0M);
+      distributions->setDistributionInvForDirection(f[DIR_P0M],  x1+DX1[DIR_M0P],  x2+DX2[DIR_M0P],  x3+DX3[DIR_M0P],  DIR_M0P);
+      distributions->setDistributionInvForDirection(f[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM);
+      distributions->setDistributionInvForDirection(f[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM);
+      distributions->setDistributionInvForDirection(f[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP);
+      distributions->setDistributionInvForDirection(f[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP);
       
-	  h[E]   = htemp[E]   * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[E]   ;
-	  h[NE]  = htemp[NE]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[NE]  ;
-	  h[SE]  = htemp[SE]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[SE]  ;
-	  h[TE]  = htemp[TE]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[TE]  ;
-	  h[BE]  = htemp[BE]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[BE]  ;
-	  h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[TNE] ;
-	  h[TSE] = htemp[TSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[TSE] ;
-	  h[BNE] = htemp[BNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[BNE] ;
-	  h[BSE] = htemp[BSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[BSE] ;
-
-	  distributionsH->setDistributionInvForDirection(h[E],   x1+DX1[W],   x2+DX2[W],   x3+DX3[W],   W);
-	  distributionsH->setDistributionInvForDirection(h[NE],  x1+DX1[SW],  x2+DX2[SW],  x3+DX3[SW],  SW);
-	  distributionsH->setDistributionInvForDirection(h[SE],  x1+DX1[NW],  x2+DX2[NW],  x3+DX3[NW],  NW);
-	  distributionsH->setDistributionInvForDirection(h[TE],  x1+DX1[BW],  x2+DX2[BW],  x3+DX3[BW],  BW);
-	  distributionsH->setDistributionInvForDirection(h[BE],  x1+DX1[TW],  x2+DX2[TW],  x3+DX3[TW],  TW);
-	  distributionsH->setDistributionInvForDirection(h[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW);
-	  distributionsH->setDistributionInvForDirection(h[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW);
-	  distributionsH->setDistributionInvForDirection(h[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW);
-	  distributionsH->setDistributionInvForDirection(h[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW);
+	  h[DIR_P00]   = htemp[DIR_P00]   * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_P00]   ;
+	  h[DIR_PP0]  = htemp[DIR_PP0]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PP0]  ;
+	  h[DIR_PM0]  = htemp[DIR_PM0]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PM0]  ;
+	  h[DIR_P0P]  = htemp[DIR_P0P]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_P0P]  ;
+	  h[DIR_P0M]  = htemp[DIR_P0M]  * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_P0M]  ;
+	  h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PPP] ;
+	  h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PMP] ;
+	  h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PPM] ;
+	  h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PMM] ;
+
+	  distributionsH->setDistributionInvForDirection(h[DIR_P00],   x1+DX1[DIR_M00],   x2+DX2[DIR_M00],   x3+DX3[DIR_M00],   DIR_M00);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PP0],  x1+DX1[DIR_MM0],  x2+DX2[DIR_MM0],  x3+DX3[DIR_MM0],  DIR_MM0);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PM0],  x1+DX1[DIR_MP0],  x2+DX2[DIR_MP0],  x3+DX3[DIR_MP0],  DIR_MP0);
+	  distributionsH->setDistributionInvForDirection(h[DIR_P0P],  x1+DX1[DIR_M0M],  x2+DX2[DIR_M0M],  x3+DX3[DIR_M0M],  DIR_M0M);
+	  distributionsH->setDistributionInvForDirection(h[DIR_P0M],  x1+DX1[DIR_M0P],  x2+DX2[DIR_M0P],  x3+DX3[DIR_M0P],  DIR_M0P);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP);
+
+	  h2[DIR_P00] = h2temp[DIR_P00] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_P00];
+      h2[DIR_PP0] = h2temp[DIR_PP0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PP0];
+      h2[DIR_PM0] = h2temp[DIR_PM0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PM0];
+      h2[DIR_P0P] = h2temp[DIR_P0P] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_P0P];
+      h2[DIR_P0M] = h2temp[DIR_P0M] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_P0M];
+      h2[DIR_PPP] = h2temp[DIR_PPP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PPP];
+      h2[DIR_PMP] = h2temp[DIR_PMP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PMP];
+      h2[DIR_PPM] = h2temp[DIR_PPM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PPM];
+      h2[DIR_PMM] = h2temp[DIR_PMM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PMM];
+
+      distributionsH2->setDistributionInvForDirection(h2[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
 	  
 	  break;
-   case W:
-      f[W]   = ftemp[W]   * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[W]  ;
-      f[NW]  = ftemp[NW]  * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[NW] ;
-      f[SW]  = ftemp[SW]  * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[SW] ;
-      f[TW]  = ftemp[TW]  * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[TW] ;
-      f[BW]  = ftemp[BW]  * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[BW] ;
-      f[TNW] = ftemp[TNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[TNW];
-      f[TSW] = ftemp[TSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[TSW];
-      f[BNW] = ftemp[BNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[BNW];
-      f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[BSW];
-
-      distributions->setDistributionInvForDirection(f[W],   x1+DX1[E],   x2+DX2[E],   x3+DX3[E],     E);
-      distributions->setDistributionInvForDirection(f[NW],  x1+DX1[SE],  x2+DX2[SE],  x3+DX3[SE],   SE);
-      distributions->setDistributionInvForDirection(f[SW],  x1+DX1[NE],  x2+DX2[NE],  x3+DX3[NE],   NE);
-      distributions->setDistributionInvForDirection(f[TW],  x1+DX1[BE],  x2+DX2[BE],  x3+DX3[BE],   BE);
-      distributions->setDistributionInvForDirection(f[BW],  x1+DX1[TE],  x2+DX2[TE],  x3+DX3[TE],   TE);
-      distributions->setDistributionInvForDirection(f[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE);
-      distributions->setDistributionInvForDirection(f[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE);
-      distributions->setDistributionInvForDirection(f[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE);
-      distributions->setDistributionInvForDirection(f[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE);
-
-	  h[W]   = htemp[W]  * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[W]  ;
-	  h[NW]  = htemp[NW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[NW] ;
-	  h[SW]  = htemp[SW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[SW] ;
-	  h[TW]  = htemp[TW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[TW] ;
-	  h[BW]  = htemp[BW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[BW] ;
-	  h[TNW] = htemp[TNW]* (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[TNW];
-	  h[TSW] = htemp[TSW]* (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[TSW];
-	  h[BNW] = htemp[BNW]* (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[BNW];
-	  h[BSW] = htemp[BSW]* (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[BSW];
-
-	  distributionsH->setDistributionInvForDirection(h[W],   x1+DX1[E],   x2+DX2[E],   x3+DX3[E],     E);
-	  distributionsH->setDistributionInvForDirection(h[NW],  x1+DX1[SE],  x2+DX2[SE],  x3+DX3[SE],   SE);
-	  distributionsH->setDistributionInvForDirection(h[SW],  x1+DX1[NE],  x2+DX2[NE],  x3+DX3[NE],   NE);
-	  distributionsH->setDistributionInvForDirection(h[TW],  x1+DX1[BE],  x2+DX2[BE],  x3+DX3[BE],   BE);
-	  distributionsH->setDistributionInvForDirection(h[BW],  x1+DX1[TE],  x2+DX2[TE],  x3+DX3[TE],   TE);
-	  distributionsH->setDistributionInvForDirection(h[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE);
-	  distributionsH->setDistributionInvForDirection(h[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE);
-	  distributionsH->setDistributionInvForDirection(h[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE);
-	  distributionsH->setDistributionInvForDirection(h[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE);
+   case DIR_M00:
+      if (false /* vx1 >= 0*/) {
+
+          f[DIR_M00] = ftemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M00];
+          f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MP0];
+          f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MM0];
+          f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0P];
+          f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0M];
+          f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPP];
+          f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMP];
+          f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPM];
+          f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMM];
+
+          distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
+          distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+          distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+          distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+          distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+          distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+          distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+          distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+          distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
+
+          h[DIR_M00] = htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M00];
+          h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MP0];
+          h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MM0];
+          h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0P];
+          h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0M];
+          h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPP];
+          h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMP];
+          h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPM];
+          h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMM];
 
+          distributionsH->setDistributionInvForDirection(h[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
+          distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+          distributionsH->setDistributionInvForDirection(h[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+          distributionsH->setDistributionInvForDirection(h[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+          distributionsH->setDistributionInvForDirection(h[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+          distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+          distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+          distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+          distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
+
+          h2[DIR_M00] = htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M00];
+          h2[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MP0];
+          h2[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MM0];
+          h2[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M0P];
+          h2[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M0M];
+          h2[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPP];
+          h2[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMP];
+          h2[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPM];
+          h2[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMM];
+
+          distributionsH2->setDistributionInvForDirection(h2[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
+      } else {
+
+          f[DIR_M00]   = ftemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M00];
+          f[DIR_MP0]  = ftemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MP0];
+          f[DIR_MM0]  = ftemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MM0];
+          f[DIR_M0P]  = ftemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0P];
+          f[DIR_M0M]  = ftemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0M];
+          f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPP];
+          f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMP];
+          f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPM];
+          f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMM];
+
+          distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
+          distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+          distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+          distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+          distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+          distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+          distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+          distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+          distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
+
+          h[DIR_M00]   = htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M00];
+          h[DIR_MP0]  = htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MP0];
+          h[DIR_MM0]  = htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MM0];
+          h[DIR_M0P]  = htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0P];
+          h[DIR_M0M]  = htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0M];
+          h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPP];
+          h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMP];
+          h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPM];
+          h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMM];
+
+          distributionsH->setDistributionInvForDirection(h[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
+          distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+          distributionsH->setDistributionInvForDirection(h[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+          distributionsH->setDistributionInvForDirection(h[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+          distributionsH->setDistributionInvForDirection(h[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+          distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+          distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+          distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+          distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
+
+          h2[DIR_M00]   = 0.5 * (htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)   * h2[DIR_M00]);
+          h2[DIR_MP0]  = 0.5 * (htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)  * h2[DIR_MP0]);
+          h2[DIR_MM0]  = 0.5 * (htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)  * h2[DIR_MM0]);
+          h2[DIR_M0P]  = 0.5 * (htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)  * h2[DIR_M0P]);
+          h2[DIR_M0M]  = 0.5 * (htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)  * h2[DIR_M0M]);
+          h2[DIR_MPP] = 0.5 * (htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPP]);
+          h2[DIR_MMP] = 0.5 * (htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMP]);
+          h2[DIR_MPM] = 0.5 * (htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPM]);
+          h2[DIR_MMM] = 0.5 * (htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMM]);
+
+          distributionsH2->setDistributionInvForDirection(h2[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+          distributionsH2->setDistributionInvForDirection(h2[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);      
+      }
       break;
-   case N:
-      f[N]   = ftemp[N]   * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[N]   ;
-      f[NE]  = ftemp[NE]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[NE]  ;
-      f[NW]  = ftemp[NW]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[NW]  ;
-      f[TN]  = ftemp[TN]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[TN]  ;
-      f[BN]  = ftemp[BN]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[BN]  ;
-      f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[TNE] ;
-      f[TNW] = ftemp[TNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[TNW] ;
-      f[BNE] = ftemp[BNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[BNE] ;
-      f[BNW] = ftemp[BNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[BNW] ;
-
-      distributions->setDistributionInvForDirection(f[N],   x1+DX1[S],   x2+DX2[S],   x3+DX3[S],     S);
-      distributions->setDistributionInvForDirection(f[NE],  x1+DX1[SW],  x2+DX2[SW],  x3+DX3[SW],   SW);
-      distributions->setDistributionInvForDirection(f[NW],  x1+DX1[SE],  x2+DX2[SE],  x3+DX3[SE],   SE);
-      distributions->setDistributionInvForDirection(f[TN],  x1+DX1[BS],  x2+DX2[BS],  x3+DX3[BS],   BS);
-      distributions->setDistributionInvForDirection(f[BN],  x1+DX1[TS],  x2+DX2[TS],  x3+DX3[TS],   TS);
-      distributions->setDistributionInvForDirection(f[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW);
-      distributions->setDistributionInvForDirection(f[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE);
-      distributions->setDistributionInvForDirection(f[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW);
-      distributions->setDistributionInvForDirection(f[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE);
-
-	  h[N]   = htemp[N]   * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[N]   ;
-	  h[NE]  = htemp[NE]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[NE]  ;
-	  h[NW]  = htemp[NW]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[NW]  ;
-	  h[TN]  = htemp[TN]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[TN]  ;
-	  h[BN]  = htemp[BN]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[BN]  ;
-	  h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[TNE] ;
-	  h[TNW] = htemp[TNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[TNW] ;
-	  h[BNE] = htemp[BNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[BNE] ;
-	  h[BNW] = htemp[BNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[BNW] ;
-
-	  distributionsH->setDistributionInvForDirection(h[N],   x1+DX1[S],   x2+DX2[S],   x3+DX3[S],     S);
-	  distributionsH->setDistributionInvForDirection(h[NE],  x1+DX1[SW],  x2+DX2[SW],  x3+DX3[SW],   SW);
-	  distributionsH->setDistributionInvForDirection(h[NW],  x1+DX1[SE],  x2+DX2[SE],  x3+DX3[SE],   SE);
-	  distributionsH->setDistributionInvForDirection(h[TN],  x1+DX1[BS],  x2+DX2[BS],  x3+DX3[BS],   BS);
-	  distributionsH->setDistributionInvForDirection(h[BN],  x1+DX1[TS],  x2+DX2[TS],  x3+DX3[TS],   TS);
-	  distributionsH->setDistributionInvForDirection(h[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW);
-	  distributionsH->setDistributionInvForDirection(h[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE);
-	  distributionsH->setDistributionInvForDirection(h[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW);
-	  distributionsH->setDistributionInvForDirection(h[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE);
+   case DIR_0P0:
+      f[DIR_0P0]   = ftemp[DIR_0P0]   * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_0P0]   ;
+      f[DIR_PP0]  = ftemp[DIR_PP0]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_PP0]  ;
+      f[DIR_MP0]  = ftemp[DIR_MP0]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_MP0]  ;
+      f[DIR_0PP]  = ftemp[DIR_0PP]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_0PP]  ;
+      f[DIR_0PM]  = ftemp[DIR_0PM]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_0PM]  ;
+      f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_PPP] ;
+      f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_MPP] ;
+      f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_PPM] ;
+      f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_MPM] ;
+
+      distributions->setDistributionInvForDirection(f[DIR_0P0],   x1+DX1[DIR_0M0],   x2+DX2[DIR_0M0],   x3+DX3[DIR_0M0],     DIR_0M0);
+      distributions->setDistributionInvForDirection(f[DIR_PP0],  x1+DX1[DIR_MM0],  x2+DX2[DIR_MM0],  x3+DX3[DIR_MM0],   DIR_MM0);
+      distributions->setDistributionInvForDirection(f[DIR_MP0],  x1+DX1[DIR_PM0],  x2+DX2[DIR_PM0],  x3+DX3[DIR_PM0],   DIR_PM0);
+      distributions->setDistributionInvForDirection(f[DIR_0PP],  x1+DX1[DIR_0MM],  x2+DX2[DIR_0MM],  x3+DX3[DIR_0MM],   DIR_0MM);
+      distributions->setDistributionInvForDirection(f[DIR_0PM],  x1+DX1[DIR_0MP],  x2+DX2[DIR_0MP],  x3+DX3[DIR_0MP],   DIR_0MP);
+      distributions->setDistributionInvForDirection(f[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM);
+      distributions->setDistributionInvForDirection(f[DIR_MPP], x1+DX1[DIR_PMM], x2+DX2[DIR_PMM], x3+DX3[DIR_PMM], DIR_PMM);
+      distributions->setDistributionInvForDirection(f[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP);
+      distributions->setDistributionInvForDirection(f[DIR_MPM], x1+DX1[DIR_PMP], x2+DX2[DIR_PMP], x3+DX3[DIR_PMP], DIR_PMP);
+
+	  h[DIR_0P0]   = htemp[DIR_0P0]   * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_0P0]   ;
+	  h[DIR_PP0]  = htemp[DIR_PP0]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_PP0]  ;
+	  h[DIR_MP0]  = htemp[DIR_MP0]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_MP0]  ;
+	  h[DIR_0PP]  = htemp[DIR_0PP]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_0PP]  ;
+	  h[DIR_0PM]  = htemp[DIR_0PM]  * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_0PM]  ;
+	  h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_PPP] ;
+	  h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_MPP] ;
+	  h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_PPM] ;
+	  h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_MPM] ;
+
+	  distributionsH->setDistributionInvForDirection(h[DIR_0P0],   x1+DX1[DIR_0M0],   x2+DX2[DIR_0M0],   x3+DX3[DIR_0M0],     DIR_0M0);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PP0],  x1+DX1[DIR_MM0],  x2+DX2[DIR_MM0],  x3+DX3[DIR_MM0],   DIR_MM0);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MP0],  x1+DX1[DIR_PM0],  x2+DX2[DIR_PM0],  x3+DX3[DIR_PM0],   DIR_PM0);
+	  distributionsH->setDistributionInvForDirection(h[DIR_0PP],  x1+DX1[DIR_0MM],  x2+DX2[DIR_0MM],  x3+DX3[DIR_0MM],   DIR_0MM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_0PM],  x1+DX1[DIR_0MP],  x2+DX2[DIR_0MP],  x3+DX3[DIR_0MP],   DIR_0MP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1+DX1[DIR_PMM], x2+DX2[DIR_PMM], x3+DX3[DIR_PMM], DIR_PMM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1+DX1[DIR_PMP], x2+DX2[DIR_PMP], x3+DX3[DIR_PMP], DIR_PMP);
+
+	  h2[DIR_0P0] = htemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_0P0];
+      h2[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_PP0];
+      h2[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_MP0];
+      h2[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_0PP];
+      h2[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_0PM];
+      h2[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_PPP];
+      h2[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_MPP];
+      h2[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_PPM];
+      h2[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_MPM];
+
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
 
       break;
-   case S:
-      f[S]   = ftemp[S]   * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[S]   ;
-      f[SE]  = ftemp[SE]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[SE]  ;
-      f[SW]  = ftemp[SW]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[SW]  ;
-      f[TS]  = ftemp[TS]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[TS]  ;
-      f[BS]  = ftemp[BS]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[BS]  ;
-      f[TSE] = ftemp[TSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[TSE] ;
-      f[TSW] = ftemp[TSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[TSW] ;
-      f[BSE] = ftemp[BSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[BSE] ;
-      f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[BSW] ;
-
-      distributions->setDistributionInvForDirection(f[S],   x1+DX1[N],   x2+DX2[N],   x3+DX3[N],     N);
-      distributions->setDistributionInvForDirection(f[SE],  x1+DX1[NW],  x2+DX2[NW],  x3+DX3[NW],   NW);
-      distributions->setDistributionInvForDirection(f[SW],  x1+DX1[NE],  x2+DX2[NE],  x3+DX3[NE],   NE);
-      distributions->setDistributionInvForDirection(f[TS],  x1+DX1[BN],  x2+DX2[BN],  x3+DX3[BN],   BN);
-      distributions->setDistributionInvForDirection(f[BS],  x1+DX1[TN],  x2+DX2[TN],  x3+DX3[TN],   TN);
-      distributions->setDistributionInvForDirection(f[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW);
-      distributions->setDistributionInvForDirection(f[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE);
-      distributions->setDistributionInvForDirection(f[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW);
-      distributions->setDistributionInvForDirection(f[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE);
-
-	  h[S]   = htemp[S]   * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[S]   ;
-	  h[SE]  = htemp[SE]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[SE]  ;
-	  h[SW]  = htemp[SW]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[SW]  ;
-	  h[TS]  = htemp[TS]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[TS]  ;
-	  h[BS]  = htemp[BS]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[BS]  ;
-	  h[TSE] = htemp[TSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[TSE] ;
-	  h[TSW] = htemp[TSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[TSW] ;
-	  h[BSE] = htemp[BSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[BSE] ;
-	  h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[BSW] ;
-
-	  distributionsH->setDistributionInvForDirection(h[S],   x1+DX1[N],   x2+DX2[N],   x3+DX3[N],     N);
-	  distributionsH->setDistributionInvForDirection(h[SE],  x1+DX1[NW],  x2+DX2[NW],  x3+DX3[NW],   NW);
-	  distributionsH->setDistributionInvForDirection(h[SW],  x1+DX1[NE],  x2+DX2[NE],  x3+DX3[NE],   NE);
-	  distributionsH->setDistributionInvForDirection(h[TS],  x1+DX1[BN],  x2+DX2[BN],  x3+DX3[BN],   BN);
-	  distributionsH->setDistributionInvForDirection(h[BS],  x1+DX1[TN],  x2+DX2[TN],  x3+DX3[TN],   TN);
-	  distributionsH->setDistributionInvForDirection(h[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW);
-	  distributionsH->setDistributionInvForDirection(h[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE);
-	  distributionsH->setDistributionInvForDirection(h[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW);
-	  distributionsH->setDistributionInvForDirection(h[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE);
+   case DIR_0M0:
+      f[DIR_0M0]   = ftemp[DIR_0M0]   * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_0M0]   ;
+      f[DIR_PM0]  = ftemp[DIR_PM0]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_PM0]  ;
+      f[DIR_MM0]  = ftemp[DIR_MM0]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_MM0]  ;
+      f[DIR_0MP]  = ftemp[DIR_0MP]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_0MP]  ;
+      f[DIR_0MM]  = ftemp[DIR_0MM]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_0MM]  ;
+      f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_PMP] ;
+      f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_MMP] ;
+      f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_PMM] ;
+      f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_MMM] ;
+
+      distributions->setDistributionInvForDirection(f[DIR_0M0],   x1+DX1[DIR_0P0],   x2+DX2[DIR_0P0],   x3+DX3[DIR_0P0],     DIR_0P0);
+      distributions->setDistributionInvForDirection(f[DIR_PM0],  x1+DX1[DIR_MP0],  x2+DX2[DIR_MP0],  x3+DX3[DIR_MP0],   DIR_MP0);
+      distributions->setDistributionInvForDirection(f[DIR_MM0],  x1+DX1[DIR_PP0],  x2+DX2[DIR_PP0],  x3+DX3[DIR_PP0],   DIR_PP0);
+      distributions->setDistributionInvForDirection(f[DIR_0MP],  x1+DX1[DIR_0PM],  x2+DX2[DIR_0PM],  x3+DX3[DIR_0PM],   DIR_0PM);
+      distributions->setDistributionInvForDirection(f[DIR_0MM],  x1+DX1[DIR_0PP],  x2+DX2[DIR_0PP],  x3+DX3[DIR_0PP],   DIR_0PP);
+      distributions->setDistributionInvForDirection(f[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM);
+      distributions->setDistributionInvForDirection(f[DIR_MMP], x1+DX1[DIR_PPM], x2+DX2[DIR_PPM], x3+DX3[DIR_PPM], DIR_PPM);
+      distributions->setDistributionInvForDirection(f[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP);
+      distributions->setDistributionInvForDirection(f[DIR_MMM], x1+DX1[DIR_PPP], x2+DX2[DIR_PPP], x3+DX3[DIR_PPP], DIR_PPP);
+
+	  h[DIR_0M0]   = htemp[DIR_0M0]   * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_0M0]   ;
+	  h[DIR_PM0]  = htemp[DIR_PM0]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_PM0]  ;
+	  h[DIR_MM0]  = htemp[DIR_MM0]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_MM0]  ;
+	  h[DIR_0MP]  = htemp[DIR_0MP]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_0MP]  ;
+	  h[DIR_0MM]  = htemp[DIR_0MM]  * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_0MM]  ;
+	  h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_PMP] ;
+	  h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_MMP] ;
+	  h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_PMM] ;
+	  h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_MMM] ;
+
+	  distributionsH->setDistributionInvForDirection(h[DIR_0M0],   x1+DX1[DIR_0P0],   x2+DX2[DIR_0P0],   x3+DX3[DIR_0P0],     DIR_0P0);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PM0],  x1+DX1[DIR_MP0],  x2+DX2[DIR_MP0],  x3+DX3[DIR_MP0],   DIR_MP0);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MM0],  x1+DX1[DIR_PP0],  x2+DX2[DIR_PP0],  x3+DX3[DIR_PP0],   DIR_PP0);
+	  distributionsH->setDistributionInvForDirection(h[DIR_0MP],  x1+DX1[DIR_0PM],  x2+DX2[DIR_0PM],  x3+DX3[DIR_0PM],   DIR_0PM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_0MM],  x1+DX1[DIR_0PP],  x2+DX2[DIR_0PP],  x3+DX3[DIR_0PP],   DIR_0PP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1+DX1[DIR_PPM], x2+DX2[DIR_PPM], x3+DX3[DIR_PPM], DIR_PPM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1+DX1[DIR_PPP], x2+DX2[DIR_PPP], x3+DX3[DIR_PPP], DIR_PPP);
+
+	  h2[DIR_0M0] = htemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_0M0];
+      h2[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_PM0];
+      h2[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_MM0];
+      h2[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_0MP];
+      h2[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_0MM];
+      h2[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_PMP];
+      h2[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_MMP];
+      h2[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_PMM];
+      h2[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_MMM];
+
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
 
       break;
-   case T:
-      f[T]   = ftemp[T]   * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[T]   ;
-      f[TE]  = ftemp[TE]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TE]  ;
-      f[TW]  = ftemp[TW]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TW]  ;
-      f[TN]  = ftemp[TN]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TN]  ;
-      f[TS]  = ftemp[TS]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TS]  ;
-      f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TNE] ;
-      f[TNW] = ftemp[TNW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TNW] ;
-      f[TSE] = ftemp[TSE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TSE] ;
-      f[TSW] = ftemp[TSW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TSW] ;
-
-      distributions->setDistributionInvForDirection(f[T],   x1+DX1[B],   x2+DX2[B],   x3+DX3[B],     B);
-      distributions->setDistributionInvForDirection(f[TE],  x1+DX1[BW],  x2+DX2[BW],  x3+DX3[BW],   BW);
-      distributions->setDistributionInvForDirection(f[TW],  x1+DX1[BE],  x2+DX2[BE],  x3+DX3[BE],   BE);
-      distributions->setDistributionInvForDirection(f[TN],  x1+DX1[BS],  x2+DX2[BS],  x3+DX3[BS],   BS);
-      distributions->setDistributionInvForDirection(f[TS],  x1+DX1[BN],  x2+DX2[BN],  x3+DX3[BN],   BN);
-      distributions->setDistributionInvForDirection(f[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW);
-      distributions->setDistributionInvForDirection(f[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE);
-      distributions->setDistributionInvForDirection(f[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW);
-      distributions->setDistributionInvForDirection(f[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE);
-
-	  h[T]   = htemp[T]   * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[T]   ;
-	  h[TE]  = htemp[TE]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TE]  ;
-	  h[TW]  = htemp[TW]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TW]  ;
-	  h[TN]  = htemp[TN]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TN]  ;
-	  h[TS]  = htemp[TS]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TS]  ;
-	  h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TNE] ;
-	  h[TNW] = htemp[TNW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TNW] ;
-	  h[TSE] = htemp[TSE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TSE] ;
-	  h[TSW] = htemp[TSW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TSW] ;
-
-	  distributionsH->setDistributionInvForDirection(h[T],   x1+DX1[B],   x2+DX2[B],   x3+DX3[B],     B);
-	  distributionsH->setDistributionInvForDirection(h[TE],  x1+DX1[BW],  x2+DX2[BW],  x3+DX3[BW],   BW);
-	  distributionsH->setDistributionInvForDirection(h[TW],  x1+DX1[BE],  x2+DX2[BE],  x3+DX3[BE],   BE);
-	  distributionsH->setDistributionInvForDirection(h[TN],  x1+DX1[BS],  x2+DX2[BS],  x3+DX3[BS],   BS);
-	  distributionsH->setDistributionInvForDirection(h[TS],  x1+DX1[BN],  x2+DX2[BN],  x3+DX3[BN],   BN);
-	  distributionsH->setDistributionInvForDirection(h[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW);
-	  distributionsH->setDistributionInvForDirection(h[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE);
-	  distributionsH->setDistributionInvForDirection(h[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW);
-	  distributionsH->setDistributionInvForDirection(h[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE);
+   case DIR_00P:
+      f[DIR_00P]   = ftemp[DIR_00P]   * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_00P]   ;
+      f[DIR_P0P]  = ftemp[DIR_P0P]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_P0P]  ;
+      f[DIR_M0P]  = ftemp[DIR_M0P]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_M0P]  ;
+      f[DIR_0PP]  = ftemp[DIR_0PP]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_0PP]  ;
+      f[DIR_0MP]  = ftemp[DIR_0MP]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_0MP]  ;
+      f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_PPP] ;
+      f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_MPP] ;
+      f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_PMP] ;
+      f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_MMP] ;
+
+      distributions->setDistributionInvForDirection(f[DIR_00P],   x1+DX1[DIR_00M],   x2+DX2[DIR_00M],   x3+DX3[DIR_00M],     DIR_00M);
+      distributions->setDistributionInvForDirection(f[DIR_P0P],  x1+DX1[DIR_M0M],  x2+DX2[DIR_M0M],  x3+DX3[DIR_M0M],   DIR_M0M);
+      distributions->setDistributionInvForDirection(f[DIR_M0P],  x1+DX1[DIR_P0M],  x2+DX2[DIR_P0M],  x3+DX3[DIR_P0M],   DIR_P0M);
+      distributions->setDistributionInvForDirection(f[DIR_0PP],  x1+DX1[DIR_0MM],  x2+DX2[DIR_0MM],  x3+DX3[DIR_0MM],   DIR_0MM);
+      distributions->setDistributionInvForDirection(f[DIR_0MP],  x1+DX1[DIR_0PM],  x2+DX2[DIR_0PM],  x3+DX3[DIR_0PM],   DIR_0PM);
+      distributions->setDistributionInvForDirection(f[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM);
+      distributions->setDistributionInvForDirection(f[DIR_MPP], x1+DX1[DIR_PMM], x2+DX2[DIR_PMM], x3+DX3[DIR_PMM], DIR_PMM);
+      distributions->setDistributionInvForDirection(f[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM);
+      distributions->setDistributionInvForDirection(f[DIR_MMP], x1+DX1[DIR_PPM], x2+DX2[DIR_PPM], x3+DX3[DIR_PPM], DIR_PPM);
+
+	  h[DIR_00P]   = htemp[DIR_00P]   * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_00P]   ;
+	  h[DIR_P0P]  = htemp[DIR_P0P]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_P0P]  ;
+	  h[DIR_M0P]  = htemp[DIR_M0P]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_M0P]  ;
+	  h[DIR_0PP]  = htemp[DIR_0PP]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_0PP]  ;
+	  h[DIR_0MP]  = htemp[DIR_0MP]  * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_0MP]  ;
+	  h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_PPP] ;
+	  h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_MPP] ;
+	  h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_PMP] ;
+	  h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_MMP] ;
+
+	  distributionsH->setDistributionInvForDirection(h[DIR_00P],   x1+DX1[DIR_00M],   x2+DX2[DIR_00M],   x3+DX3[DIR_00M],     DIR_00M);
+	  distributionsH->setDistributionInvForDirection(h[DIR_P0P],  x1+DX1[DIR_M0M],  x2+DX2[DIR_M0M],  x3+DX3[DIR_M0M],   DIR_M0M);
+	  distributionsH->setDistributionInvForDirection(h[DIR_M0P],  x1+DX1[DIR_P0M],  x2+DX2[DIR_P0M],  x3+DX3[DIR_P0M],   DIR_P0M);
+	  distributionsH->setDistributionInvForDirection(h[DIR_0PP],  x1+DX1[DIR_0MM],  x2+DX2[DIR_0MM],  x3+DX3[DIR_0MM],   DIR_0MM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_0MP],  x1+DX1[DIR_0PM],  x2+DX2[DIR_0PM],  x3+DX3[DIR_0PM],   DIR_0PM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1+DX1[DIR_PMM], x2+DX2[DIR_PMM], x3+DX3[DIR_PMM], DIR_PMM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1+DX1[DIR_PPM], x2+DX2[DIR_PPM], x3+DX3[DIR_PPM], DIR_PPM);
+
+	  h2[DIR_00P] = htemp[DIR_00P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_00P];
+      h2[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_P0P];
+      h2[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_M0P];
+      h2[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_0PP];
+      h2[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_0MP];
+      h2[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_PPP];
+      h2[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_MPP];
+      h2[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_PMP];
+      h2[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_MMP];
+
+      distributionsH2->setDistributionInvForDirection(h2[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
 
       break;
-   case B:
-      f[B]   = ftemp[B]   * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[B]   ;
-      f[BE]  = ftemp[BE]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BE]  ;
-      f[BW]  = ftemp[BW]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BW]  ;
-      f[BN]  = ftemp[BN]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BN]  ;
-      f[BS]  = ftemp[BS]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BS]  ;
-      f[BNE] = ftemp[BNE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BNE] ;
-      f[BNW] = ftemp[BNW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BNW] ;
-      f[BSE] = ftemp[BSE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BSE] ;
-      f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BSW] ;
-
-      distributions->setDistributionInvForDirection(f[B],   x1+DX1[T],   x2+DX2[T],   x3+DX3[T],     T);
-      distributions->setDistributionInvForDirection(f[BE],  x1+DX1[TW],  x2+DX2[TW],  x3+DX3[TW],   TW);
-      distributions->setDistributionInvForDirection(f[BW],  x1+DX1[TE],  x2+DX2[TE],  x3+DX3[TE],   TE);
-      distributions->setDistributionInvForDirection(f[BN],  x1+DX1[TS],  x2+DX2[TS],  x3+DX3[TS],   TS);
-      distributions->setDistributionInvForDirection(f[BS],  x1+DX1[TN],  x2+DX2[TN],  x3+DX3[TN],   TN);
-      distributions->setDistributionInvForDirection(f[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW);
-      distributions->setDistributionInvForDirection(f[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE);
-      distributions->setDistributionInvForDirection(f[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW);
-      distributions->setDistributionInvForDirection(f[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE);
-
-	  h[B]   = htemp[B]   * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[B]   ;
-	  h[BE]  = htemp[BE]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BE]  ;
-	  h[BW]  = htemp[BW]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BW]  ;
-	  h[BN]  = htemp[BN]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BN]  ;
-	  h[BS]  = htemp[BS]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BS]  ;
-	  h[BNE] = htemp[BNE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BNE] ;
-	  h[BNW] = htemp[BNW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BNW] ;
-	  h[BSE] = htemp[BSE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BSE] ;
-	  h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BSW] ;
-
-	  distributionsH->setDistributionInvForDirection(h[B],   x1+DX1[T],   x2+DX2[T],   x3+DX3[T],     T);
-	  distributionsH->setDistributionInvForDirection(h[BE],  x1+DX1[TW],  x2+DX2[TW],  x3+DX3[TW],   TW);
-	  distributionsH->setDistributionInvForDirection(h[BW],  x1+DX1[TE],  x2+DX2[TE],  x3+DX3[TE],   TE);
-	  distributionsH->setDistributionInvForDirection(h[BN],  x1+DX1[TS],  x2+DX2[TS],  x3+DX3[TS],   TS);
-	  distributionsH->setDistributionInvForDirection(h[BS],  x1+DX1[TN],  x2+DX2[TN],  x3+DX3[TN],   TN);
-	  distributionsH->setDistributionInvForDirection(h[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW);
-	  distributionsH->setDistributionInvForDirection(h[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE);
-	  distributionsH->setDistributionInvForDirection(h[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW);
-	  distributionsH->setDistributionInvForDirection(h[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE);
+   case DIR_00M:
+      f[DIR_00M]   = ftemp[DIR_00M]   * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_00M]   ;
+      f[DIR_P0M]  = ftemp[DIR_P0M]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_P0M]  ;
+      f[DIR_M0M]  = ftemp[DIR_M0M]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_M0M]  ;
+      f[DIR_0PM]  = ftemp[DIR_0PM]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_0PM]  ;
+      f[DIR_0MM]  = ftemp[DIR_0MM]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_0MM]  ;
+      f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_PPM] ;
+      f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_MPM] ;
+      f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_PMM] ;
+      f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_MMM] ;
+
+      distributions->setDistributionInvForDirection(f[DIR_00M],   x1+DX1[DIR_00P],   x2+DX2[DIR_00P],   x3+DX3[DIR_00P],     DIR_00P);
+      distributions->setDistributionInvForDirection(f[DIR_P0M],  x1+DX1[DIR_M0P],  x2+DX2[DIR_M0P],  x3+DX3[DIR_M0P],   DIR_M0P);
+      distributions->setDistributionInvForDirection(f[DIR_M0M],  x1+DX1[DIR_P0P],  x2+DX2[DIR_P0P],  x3+DX3[DIR_P0P],   DIR_P0P);
+      distributions->setDistributionInvForDirection(f[DIR_0PM],  x1+DX1[DIR_0MP],  x2+DX2[DIR_0MP],  x3+DX3[DIR_0MP],   DIR_0MP);
+      distributions->setDistributionInvForDirection(f[DIR_0MM],  x1+DX1[DIR_0PP],  x2+DX2[DIR_0PP],  x3+DX3[DIR_0PP],   DIR_0PP);
+      distributions->setDistributionInvForDirection(f[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP);
+      distributions->setDistributionInvForDirection(f[DIR_MPM], x1+DX1[DIR_PMP], x2+DX2[DIR_PMP], x3+DX3[DIR_PMP], DIR_PMP);
+      distributions->setDistributionInvForDirection(f[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP);
+      distributions->setDistributionInvForDirection(f[DIR_MMM], x1+DX1[DIR_PPP], x2+DX2[DIR_PPP], x3+DX3[DIR_PPP], DIR_PPP);
+
+	  h[DIR_00M]   = htemp[DIR_00M]   * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_00M]   ;
+	  h[DIR_P0M]  = htemp[DIR_P0M]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_P0M]  ;
+	  h[DIR_M0M]  = htemp[DIR_M0M]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_M0M]  ;
+	  h[DIR_0PM]  = htemp[DIR_0PM]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_0PM]  ;
+	  h[DIR_0MM]  = htemp[DIR_0MM]  * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_0MM]  ;
+	  h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_PPM] ;
+	  h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_MPM] ;
+	  h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_PMM] ;
+	  h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_MMM] ;
+
+	  distributionsH->setDistributionInvForDirection(h[DIR_00M],   x1+DX1[DIR_00P],   x2+DX2[DIR_00P],   x3+DX3[DIR_00P],     DIR_00P);
+	  distributionsH->setDistributionInvForDirection(h[DIR_P0M],  x1+DX1[DIR_M0P],  x2+DX2[DIR_M0P],  x3+DX3[DIR_M0P],   DIR_M0P);
+	  distributionsH->setDistributionInvForDirection(h[DIR_M0M],  x1+DX1[DIR_P0P],  x2+DX2[DIR_P0P],  x3+DX3[DIR_P0P],   DIR_P0P);
+	  distributionsH->setDistributionInvForDirection(h[DIR_0PM],  x1+DX1[DIR_0MP],  x2+DX2[DIR_0MP],  x3+DX3[DIR_0MP],   DIR_0MP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_0MM],  x1+DX1[DIR_0PP],  x2+DX2[DIR_0PP],  x3+DX3[DIR_0PP],   DIR_0PP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1+DX1[DIR_PMP], x2+DX2[DIR_PMP], x3+DX3[DIR_PMP], DIR_PMP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP);
+	  distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1+DX1[DIR_PPP], x2+DX2[DIR_PPP], x3+DX3[DIR_PPP], DIR_PPP);
+
+	  h2[DIR_00M] = htemp[DIR_00M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_00M];
+      h2[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_P0M];
+      h2[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_M0M];
+      h2[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_0PM];
+      h2[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_0MM];
+      h2[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_PPM];
+      h2[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_MPM];
+      h2[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_PMM];
+      h2[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_MMM];
+
+      distributionsH2->setDistributionInvForDirection(h2[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
+      distributionsH2->setDistributionInvForDirection(h2[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
 
       break;
    default:
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h
index ee472e1664077a42e85cbc193725023a0e5edfb9..3fa67b2763eb5a3d6d456f72b2fdada5a6040782 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h
@@ -39,11 +39,12 @@
 class MultiphaseNonReflectingOutflowBCAlgorithm : public BCAlgorithm
 {
 public:
-   MultiphaseNonReflectingOutflowBCAlgorithm();
-   ~MultiphaseNonReflectingOutflowBCAlgorithm();
-   SPtr<BCAlgorithm> clone();
-   void addDistributions(SPtr<DistributionArray3D> distributions);
-   void addDistributionsH(SPtr<DistributionArray3D> distributionsH);
-   void applyBC();
+    MultiphaseNonReflectingOutflowBCAlgorithm();
+    ~MultiphaseNonReflectingOutflowBCAlgorithm();
+    SPtr<BCAlgorithm> clone();
+    void addDistributions(SPtr<DistributionArray3D> distributions);
+    void addDistributionsH(SPtr<DistributionArray3D> distributionsH);
+    void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2);
+    void applyBC();
 };
 #endif // MultiphaseNonReflectingOutflowBCAlgorithm_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp
index beba9a256b869a37828efe44e886bb988bf9fa71..230a543f120a8ca8d18c5d2bb6a1c27e550aae92 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp
@@ -102,39 +102,39 @@ void MultiphaseSlipBCAlgorithm::applyBC()
          LBMReal velocity = 0.0;
          switch (invDir)
          {
-         case D3Q27System::E: velocity = (UbMath::c4o9*(+vx1)); break;      //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3)
-         case D3Q27System::W: velocity = (UbMath::c4o9*(-vx1)); break;      //z.B. aus paper manfred MRT LB models in three dimensions (2002)   
-         case D3Q27System::N: velocity = (UbMath::c4o9*(+vx2)); break;
-         case D3Q27System::S: velocity = (UbMath::c4o9*(-vx2)); break;
-         case D3Q27System::T: velocity = (UbMath::c4o9*(+vx3)); break;
-         case D3Q27System::B: velocity = (UbMath::c4o9*(-vx3)); break;
-         case D3Q27System::NE: velocity = (UbMath::c1o9*(+vx1+vx2)); break;
-         case D3Q27System::SW: velocity = (UbMath::c1o9*(-vx1-vx2)); break;
-         case D3Q27System::SE: velocity = (UbMath::c1o9*(+vx1-vx2)); break;
-         case D3Q27System::NW: velocity = (UbMath::c1o9*(-vx1+vx2)); break;
-         case D3Q27System::TE: velocity = (UbMath::c1o9*(+vx1             +vx3)); break;
-         case D3Q27System::BW: velocity = (UbMath::c1o9*(-vx1             -vx3)); break;
-         case D3Q27System::BE: velocity = (UbMath::c1o9*(+vx1             -vx3)); break;
-         case D3Q27System::TW: velocity = (UbMath::c1o9*(-vx1             +vx3)); break;
-         case D3Q27System::TN: velocity = (UbMath::c1o9*(+vx2+vx3)); break;
-         case D3Q27System::BS: velocity = (UbMath::c1o9*(-vx2-vx3)); break;
-         case D3Q27System::BN: velocity = (UbMath::c1o9*(+vx2-vx3)); break;
-         case D3Q27System::TS: velocity = (UbMath::c1o9*(-vx2+vx3)); break;
-         case D3Q27System::TNE: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break;
-         case D3Q27System::BSW: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break;
-         case D3Q27System::BNE: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break;
-         case D3Q27System::TSW: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break;
-         case D3Q27System::TSE: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break;
-         case D3Q27System::BNW: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break;
-         case D3Q27System::BSE: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break;
-         case D3Q27System::TNW: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break;
+         case D3Q27System::DIR_P00: velocity = (UbMath::c4o9*(+vx1)); break;      //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3)
+         case D3Q27System::DIR_M00: velocity = (UbMath::c4o9*(-vx1)); break;      //z.B. aus paper manfred MRT LB models in three dimensions (2002)   
+         case D3Q27System::DIR_0P0: velocity = (UbMath::c4o9*(+vx2)); break;
+         case D3Q27System::DIR_0M0: velocity = (UbMath::c4o9*(-vx2)); break;
+         case D3Q27System::DIR_00P: velocity = (UbMath::c4o9*(+vx3)); break;
+         case D3Q27System::DIR_00M: velocity = (UbMath::c4o9*(-vx3)); break;
+         case D3Q27System::DIR_PP0: velocity = (UbMath::c1o9*(+vx1+vx2)); break;
+         case D3Q27System::DIR_MM0: velocity = (UbMath::c1o9*(-vx1-vx2)); break;
+         case D3Q27System::DIR_PM0: velocity = (UbMath::c1o9*(+vx1-vx2)); break;
+         case D3Q27System::DIR_MP0: velocity = (UbMath::c1o9*(-vx1+vx2)); break;
+         case D3Q27System::DIR_P0P: velocity = (UbMath::c1o9*(+vx1             +vx3)); break;
+         case D3Q27System::DIR_M0M: velocity = (UbMath::c1o9*(-vx1             -vx3)); break;
+         case D3Q27System::DIR_P0M: velocity = (UbMath::c1o9*(+vx1             -vx3)); break;
+         case D3Q27System::DIR_M0P: velocity = (UbMath::c1o9*(-vx1             +vx3)); break;
+         case D3Q27System::DIR_0PP: velocity = (UbMath::c1o9*(+vx2+vx3)); break;
+         case D3Q27System::DIR_0MM: velocity = (UbMath::c1o9*(-vx2-vx3)); break;
+         case D3Q27System::DIR_0PM: velocity = (UbMath::c1o9*(+vx2-vx3)); break;
+         case D3Q27System::DIR_0MP: velocity = (UbMath::c1o9*(-vx2+vx3)); break;
+         case D3Q27System::DIR_PPP: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break;
+         case D3Q27System::DIR_MMM: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break;
+         case D3Q27System::DIR_PPM: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break;
+         case D3Q27System::DIR_MMP: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break;
+         case D3Q27System::DIR_PMP: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break;
+         case D3Q27System::DIR_MPM: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break;
+         case D3Q27System::DIR_PMM: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break;
+         case D3Q27System::DIR_MPP: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break;
          default: throw UbException(UB_EXARGS, "unknown error");
          }
          LBMReal fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(1.0+q));
          distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
 
-		 LBMReal hReturn = ((1.0-q)/(1.0+q))*((h[invDir]-heq[invDir])/(1.0-collFactorPh)+heq[invDir])+((q/(1.0+q))*(h[invDir]+h[fdir]));
-		 //LBMReal hReturn = h[invDir];
+		 //LBMReal hReturn = ((1.0-q)/(1.0+q))*((h[invDir]-heq[invDir])/(1.0-collFactorPh)+heq[invDir])+((q/(1.0+q))*(h[invDir]+h[fdir]));
+		 LBMReal hReturn = h[invDir];
 		 distributionsH->setDistributionForDirection(hReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
       }
    }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp
index 58c359887fe8b4263d8140038dc03754aeab74bb..e4aaeeeb21a1e41617eed79ce05671c5425d01e4 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp
@@ -37,7 +37,7 @@
 
 MultiphaseVelocityBCAlgorithm::MultiphaseVelocityBCAlgorithm()
 {
-   BCAlgorithm::type = BCAlgorithm::VelocityBCAlgorithm;
+   BCAlgorithm::type = BCAlgorithm::MultiphaseVelocityBCAlgorithm;
    BCAlgorithm::preCollision = false;
 }
 //////////////////////////////////////////////////////////////////////////
@@ -84,6 +84,10 @@ void MultiphaseVelocityBCAlgorithm::applyBC()
    D3Q27System::calcDensity(h, phi);
 
    calcMacrosFct(f, p1, vx1, vx2, vx3);
+   vx1=bcPtr->getBoundaryVelocityX1();
+   vx2 = bcPtr->getBoundaryVelocityX2();
+   vx3 = bcPtr->getBoundaryVelocityX3();
+   p1 = 0.0;
    D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
    D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3);
 
@@ -94,30 +98,30 @@ void MultiphaseVelocityBCAlgorithm::applyBC()
    int nx3 = x3;
 
    //flag points in direction of fluid
-   if      (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; }
-   else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary..."));
+   if      (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; }
+   //else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary..."));
    
    phiBC = bcPtr->getBoundaryPhaseField();
    
    D3Q27System::calcMultiphaseHeq(htemp, phiBC, vx1, vx2, vx3);
    //D3Q27System::calcMultiphaseHeq(htemp, phiBC, bcPtr->getBoundaryVelocityX1(), bcPtr->getBoundaryVelocityX2(), bcPtr->getBoundaryVelocityX2());//30.03.2021 EQ phase field BC!
-   for (int fdir = D3Q27System::STARTF; fdir<=D3Q27System::ENDF; fdir++)
-   {
-	   if (bcPtr->hasVelocityBoundaryFlag(fdir))
-	   {
-		   LBMReal hReturn = htemp[fdir]+h[fdir]-heq[fdir];
-           //17.03.2021 Let us just set the plain eq
-           //LBMReal hReturn = htemp[fdir];
-		   distributionsH->setDistributionForDirection(hReturn, nx1, nx2, nx3, fdir);
-           if (distributionsH2)
-               distributionsH2->setDistributionForDirection(hReturn, nx1, nx2, nx3, fdir);
-	   }
-   }
+   //for (int fdir = D3Q27System::STARTF; fdir<=D3Q27System::ENDF; fdir++)
+   //{
+	  // if (bcPtr->hasVelocityBoundaryFlag(fdir))
+	  // {
+		 //  LBMReal hReturn = htemp[fdir]+h[fdir]-heq[fdir];
+   //        //17.03.2021 Let us just set the plain eq
+   //        //LBMReal hReturn = htemp[fdir];
+		 //  distributionsH->setDistributionForDirection(hReturn, nx1, nx2, nx3, fdir);
+   //      //  if (distributionsH2)
+   //      //      distributionsH2->setDistributionForDirection(0, nx1, nx2, nx3, fdir);
+	  // }
+   //}
    
    for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
    {
@@ -129,7 +133,17 @@ void MultiphaseVelocityBCAlgorithm::applyBC()
 		 //16.03.2021 quick fix for velocity BC
          LBMReal fReturn = f[invDir] - velocity;
          //LBMReal fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity)/(1.0+q));
-         distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
+        // distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);//no delay BB
+         distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB  
+
+         LBMReal hReturn = htemp[invDir]+h[invDir] - heq[invDir];
+         distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB  
+         if (distributionsH2) {
+             fReturn = h2[invDir] ;
+            // distributionsH2->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+             distributionsH2->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB 
+         }
+
       }
    }
 
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp.new b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp.new
new file mode 100644
index 0000000000000000000000000000000000000000..7c21b30c8931e6f321abc3c9822eadb678f842f3
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp.new
@@ -0,0 +1,151 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseVelocityBCAlgorithm.cpp
+//! \ingroup BoundarConditions
+//! \author Hesameddin Safari
+//=======================================================================================
+
+#include "MultiphaseVelocityBCAlgorithm.h"
+#include "DistributionArray3D.h"
+#include "BoundaryConditions.h"
+
+MultiphaseVelocityBCAlgorithm::MultiphaseVelocityBCAlgorithm()
+{
+    BCAlgorithm::type = BCAlgorithm::MultiphaseVelocityBCAlgorithm;
+   BCAlgorithm::preCollision = false;
+}
+//////////////////////////////////////////////////////////////////////////
+MultiphaseVelocityBCAlgorithm::~MultiphaseVelocityBCAlgorithm()
+{
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<BCAlgorithm> MultiphaseVelocityBCAlgorithm::clone()
+{
+   SPtr<BCAlgorithm> bc(new MultiphaseVelocityBCAlgorithm());
+   return bc;
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+{
+   this->distributions = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributionsH)
+{
+	this->distributionsH = distributionsH;
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityBCAlgorithm::addDistributionsH2(SPtr<DistributionArray3D> distributionsH)
+{
+    this->distributionsH2 = distributionsH;
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityBCAlgorithm::applyBC()
+{
+   LBMReal f[D3Q27System::ENDF+1];
+   LBMReal h[D3Q27System::ENDF+1];
+   LBMReal h2[D3Q27System::ENDF + 1];
+   LBMReal feq[D3Q27System::ENDF+1];
+   LBMReal heq[D3Q27System::ENDF+1];
+   LBMReal htemp[D3Q27System::ENDF+1];
+   
+   distributions->getDistributionInv(f, x1, x2, x3);
+   distributionsH->getDistributionInv(h, x1, x2, x3);
+   if (distributionsH2)
+       distributionsH2->getDistributionInv(h2, x1, x2, x3);
+   LBMReal phi, vx1, vx2, vx3, p1, phiBC;
+   
+   D3Q27System::calcDensity(h, phi);
+
+   calcMacrosFct(f, p1, vx1, vx2, vx3);
+   vx1=bcPtr->getBoundaryVelocityX1();
+   vx2 = bcPtr->getBoundaryVelocityX2();
+   vx3 = bcPtr->getBoundaryVelocityX3();
+   p1 = 0.0;
+   D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3);
+   D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3);
+
+   ///// added for phase field //////
+
+   int nx1 = x1;
+   int nx2 = x2;
+   int nx3 = x3;
+
+   //flag points in direction of fluid
+   if      (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; }
+   //else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary..."));
+   
+   phiBC = bcPtr->getBoundaryPhaseField();
+   
+   D3Q27System::calcMultiphaseHeq(htemp, phiBC, vx1, vx2, vx3);
+   //D3Q27System::calcMultiphaseHeq(htemp, phiBC, bcPtr->getBoundaryVelocityX1(), bcPtr->getBoundaryVelocityX2(), bcPtr->getBoundaryVelocityX2());//30.03.2021 EQ phase field BC!
+   //for (int fdir = D3Q27System::STARTF; fdir<=D3Q27System::ENDF; fdir++)
+   //{
+	  // if (bcPtr->hasVelocityBoundaryFlag(fdir))
+	  // {
+		 //  LBMReal hReturn = htemp[fdir]+h[fdir]-heq[fdir];
+   //        //17.03.2021 Let us just set the plain eq
+   //        //LBMReal hReturn = htemp[fdir];
+		 //  distributionsH->setDistributionForDirection(hReturn, nx1, nx2, nx3, fdir);
+   //      //  if (distributionsH2)
+   //      //      distributionsH2->setDistributionForDirection(0, nx1, nx2, nx3, fdir);
+	  // }
+   //}
+   
+   for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
+   {
+      if (bcPtr->hasVelocityBoundaryFlag(fdir))
+      {
+         const int invDir = D3Q27System::INVDIR[fdir];
+         //LBMReal q = bcPtr->getQ(invDir);// m+m q=0 stabiler
+         LBMReal velocity = bcPtr->getBoundaryVelocity(invDir);
+		 //16.03.2021 quick fix for velocity BC
+         LBMReal fReturn = f[invDir] - velocity;
+         //LBMReal fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity)/(1.0+q));
+        // distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);//no delay BB
+         distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB  
+
+         LBMReal hReturn = htemp[invDir]+h[invDir] - heq[invDir];
+         distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB  
+         if (distributionsH2) {
+             fReturn = h2[invDir] ;
+            // distributionsH2->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+             distributionsH2->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB 
+         }
+
+      }
+   }
+
+}
+
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp
index 9c4e47354f0d90a310030d848aa0cc5415567761..cf7a627b0c649aa0e1d00a8b137225b9e65b8476 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp
@@ -63,17 +63,17 @@ void NonEqDensityBCAlgorithm::applyBC()
     int nx3 = x3;
 
     // flag points in direction of fluid
-    if (bcPtr->hasDensityBoundaryFlag(D3Q27System::E)) {
+    if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_P00)) {
         nx1 -= 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::W)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_M00)) {
         nx1 += 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::N)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0P0)) {
         nx2 -= 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::S)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0M0)) {
         nx2 += 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::T)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00P)) {
         nx3 -= 1;
-    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::B)) {
+    } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00M)) {
         nx3 += 1;
     } else
         return; // UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary..."));
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp
index bb00c7bf2686628d4000c8b43ebfb8c5fd6c18ca..6fa4c7b5d85f4b1e5135f95b48f7d75a0cdbf3a4 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp
@@ -69,24 +69,24 @@ void NonReflectingOutflowBCAlgorithm::applyBC()
     int direction = -1;
 
     // flag points in direction of fluid
-    if (bcPtr->hasDensityBoundaryFlag(E)) {
+    if (bcPtr->hasDensityBoundaryFlag(DIR_P00)) {
         nx1 += 1;
-        direction = E;
-    } else if (bcPtr->hasDensityBoundaryFlag(W)) {
+        direction = DIR_P00;
+    } else if (bcPtr->hasDensityBoundaryFlag(DIR_M00)) {
         nx1 -= 1;
-        direction = W;
-    } else if (bcPtr->hasDensityBoundaryFlag(N)) {
+        direction = DIR_M00;
+    } else if (bcPtr->hasDensityBoundaryFlag(DIR_0P0)) {
         nx2 += 1;
-        direction = N;
-    } else if (bcPtr->hasDensityBoundaryFlag(S)) {
+        direction = DIR_0P0;
+    } else if (bcPtr->hasDensityBoundaryFlag(DIR_0M0)) {
         nx2 -= 1;
-        direction = S;
-    } else if (bcPtr->hasDensityBoundaryFlag(T)) {
+        direction = DIR_0M0;
+    } else if (bcPtr->hasDensityBoundaryFlag(DIR_00P)) {
         nx3 += 1;
-        direction = T;
-    } else if (bcPtr->hasDensityBoundaryFlag(B)) {
+        direction = DIR_00P;
+    } else if (bcPtr->hasDensityBoundaryFlag(DIR_00M)) {
         nx3 -= 1;
-        direction = B;
+        direction = DIR_00M;
     } else
         UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary..."));
 
@@ -97,131 +97,131 @@ void NonReflectingOutflowBCAlgorithm::applyBC()
     calcMacrosFct(f, rho, vx1, vx2, vx3);
 
     switch (direction) {
-        case E:
-            f[E]   = ftemp[E] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[E];
-            f[NE]  = ftemp[NE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[NE];
-            f[SE]  = ftemp[SE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[SE];
-            f[TE]  = ftemp[TE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TE];
-            f[BE]  = ftemp[BE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BE];
-            f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TNE];
-            f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TSE];
-            f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BNE];
-            f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BSE];
+        case DIR_P00:
+            f[DIR_P00]   = ftemp[DIR_P00] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P00];
+            f[DIR_PP0]  = ftemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PP0];
+            f[DIR_PM0]  = ftemp[DIR_PM0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PM0];
+            f[DIR_P0P]  = ftemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P0P];
+            f[DIR_P0M]  = ftemp[DIR_P0M] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P0M];
+            f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PPP];
+            f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PMP];
+            f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PPM];
+            f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PMM];
 
-            distributions->setDistributionInvForDirection(f[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W);
-            distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
-            distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
-            distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
-            distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
-            distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
-            distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
-            distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
-            distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
+            distributions->setDistributionInvForDirection(f[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
+            distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
+            distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
+            distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
+            distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
+            distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+            distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+            distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+            distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
             break;
-        case W:
-            f[W]   = ftemp[W] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[W];
-            f[NW]  = ftemp[NW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[NW];
-            f[SW]  = ftemp[SW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[SW];
-            f[TW]  = ftemp[TW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TW];
-            f[BW]  = ftemp[BW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BW];
-            f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TNW];
-            f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TSW];
-            f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BNW];
-            f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BSW];
+        case DIR_M00:
+            f[DIR_M00]   = ftemp[DIR_M00] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M00];
+            f[DIR_MP0]  = ftemp[DIR_MP0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MP0];
+            f[DIR_MM0]  = ftemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MM0];
+            f[DIR_M0P]  = ftemp[DIR_M0P] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M0P];
+            f[DIR_M0M]  = ftemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M0M];
+            f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MPP];
+            f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MMP];
+            f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MPM];
+            f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MMM];
 
-            distributions->setDistributionInvForDirection(f[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E);
-            distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
-            distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
-            distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
-            distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
-            distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
-            distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
-            distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
-            distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+            distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
+            distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+            distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+            distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+            distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+            distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+            distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+            distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+            distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
             break;
-        case N:
-            f[N]   = ftemp[N] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[N];
-            f[NE]  = ftemp[NE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[NE];
-            f[NW]  = ftemp[NW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[NW];
-            f[TN]  = ftemp[TN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TN];
-            f[BN]  = ftemp[BN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BN];
-            f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TNE];
-            f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TNW];
-            f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BNE];
-            f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BNW];
+        case DIR_0P0:
+            f[DIR_0P0]   = ftemp[DIR_0P0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0P0];
+            f[DIR_PP0]  = ftemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PP0];
+            f[DIR_MP0]  = ftemp[DIR_MP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MP0];
+            f[DIR_0PP]  = ftemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0PP];
+            f[DIR_0PM]  = ftemp[DIR_0PM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0PM];
+            f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PPP];
+            f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MPP];
+            f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PPM];
+            f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MPM];
 
-            distributions->setDistributionInvForDirection(f[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S);
-            distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
-            distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
-            distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
-            distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
-            distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
-            distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
-            distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
-            distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
+            distributions->setDistributionInvForDirection(f[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
+            distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
+            distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+            distributions->setDistributionInvForDirection(f[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM);
+            distributions->setDistributionInvForDirection(f[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP);
+            distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+            distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+            distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+            distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
             break;
-        case S:
-            f[S]   = ftemp[S] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[S];
-            f[SE]  = ftemp[SE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[SE];
-            f[SW]  = ftemp[SW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[SW];
-            f[TS]  = ftemp[TS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TS];
-            f[BS]  = ftemp[BS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BS];
-            f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TSE];
-            f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TSW];
-            f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BSE];
-            f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BSW];
+        case DIR_0M0:
+            f[DIR_0M0]   = ftemp[DIR_0M0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0M0];
+            f[DIR_PM0]  = ftemp[DIR_PM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PM0];
+            f[DIR_MM0]  = ftemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MM0];
+            f[DIR_0MP]  = ftemp[DIR_0MP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0MP];
+            f[DIR_0MM]  = ftemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0MM];
+            f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PMP];
+            f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MMP];
+            f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PMM];
+            f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MMM];
 
-            distributions->setDistributionInvForDirection(f[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N);
-            distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
-            distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
-            distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
-            distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
-            distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
-            distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
-            distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
-            distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+            distributions->setDistributionInvForDirection(f[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
+            distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
+            distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+            distributions->setDistributionInvForDirection(f[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM);
+            distributions->setDistributionInvForDirection(f[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP);
+            distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+            distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+            distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
+            distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
             break;
-        case T:
-            f[T]   = ftemp[T] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[T];
-            f[TE]  = ftemp[TE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TE];
-            f[TW]  = ftemp[TW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TW];
-            f[TN]  = ftemp[TN] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TN];
-            f[TS]  = ftemp[TS] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TS];
-            f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TNE];
-            f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TNW];
-            f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TSE];
-            f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TSW];
+        case DIR_00P:
+            f[DIR_00P]   = ftemp[DIR_00P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_00P];
+            f[DIR_P0P]  = ftemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_P0P];
+            f[DIR_M0P]  = ftemp[DIR_M0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_M0P];
+            f[DIR_0PP]  = ftemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_0PP];
+            f[DIR_0MP]  = ftemp[DIR_0MP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_0MP];
+            f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_PPP];
+            f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_MPP];
+            f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_PMP];
+            f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_MMP];
 
-            distributions->setDistributionInvForDirection(f[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B);
-            distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
-            distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
-            distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
-            distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
-            distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
-            distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
-            distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
-            distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
+            distributions->setDistributionInvForDirection(f[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
+            distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
+            distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+            distributions->setDistributionInvForDirection(f[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM);
+            distributions->setDistributionInvForDirection(f[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM);
+            distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+            distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+            distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+            distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
             break;
-        case B:
-            f[B]   = ftemp[B] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[B];
-            f[BE]  = ftemp[BE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BE];
-            f[BW]  = ftemp[BW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BW];
-            f[BN]  = ftemp[BN] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BN];
-            f[BS]  = ftemp[BS] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BS];
-            f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BNE];
-            f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BNW];
-            f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BSE];
-            f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BSW];
+        case DIR_00M:
+            f[DIR_00M]   = ftemp[DIR_00M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_00M];
+            f[DIR_P0M]  = ftemp[DIR_P0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_P0M];
+            f[DIR_M0M]  = ftemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_M0M];
+            f[DIR_0PM]  = ftemp[DIR_0PM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_0PM];
+            f[DIR_0MM]  = ftemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_0MM];
+            f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_PPM];
+            f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_MPM];
+            f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_PMM];
+            f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_MMM];
 
-            distributions->setDistributionInvForDirection(f[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T);
-            distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
-            distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
-            distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
-            distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
-            distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
-            distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
-            distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
-            distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+            distributions->setDistributionInvForDirection(f[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
+            distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
+            distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+            distributions->setDistributionInvForDirection(f[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP);
+            distributions->setDistributionInvForDirection(f[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP);
+            distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+            distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+            distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
+            distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
             break;
         default:
             UB_THROW(
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp
index 8d9317f9dee979ff9b81616c9f7554e129af4b47..151e10be4987e27622ce25b86c91c320c0d24406 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp
@@ -61,10 +61,12 @@ void SimpleSlipBCAlgorithm::applyBC()
    LBMReal f[D3Q27System::ENDF+1];
    LBMReal feq[D3Q27System::ENDF+1];
    distributions->getDistributionInv(f, x1, x2, x3);
-   LBMReal vx1, vx2, vx3, drho;
+   LBMReal vx1, vx2, vx3, drho, rho;
    calcMacrosFct(f, drho, vx1, vx2, vx3);
    calcFeqFct(feq, drho, vx1, vx2, vx3);
 
+   rho = 1.0 + drho * compressibleFactor;
+
    UbTupleFloat3 normale = bcPtr->getNormalVector();
    LBMReal amp = vx1*val<1>(normale)+vx2*val<2>(normale)+vx3*val<3>(normale);
 
@@ -81,35 +83,35 @@ void SimpleSlipBCAlgorithm::applyBC()
          LBMReal velocity = 0.0;
          switch (invDir)
          {
-         case D3Q27System::E: velocity = (UbMath::c4o9*(+vx1)); break;      //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3)
-         case D3Q27System::W: velocity = (UbMath::c4o9*(-vx1)); break;      //z.B. aus paper manfred MRT LB models in three dimensions (2002)   
-         case D3Q27System::N: velocity = (UbMath::c4o9*(+vx2)); break;
-         case D3Q27System::S: velocity = (UbMath::c4o9*(-vx2)); break;
-         case D3Q27System::T: velocity = (UbMath::c4o9*(+vx3)); break;
-         case D3Q27System::B: velocity = (UbMath::c4o9*(-vx3)); break;
-         case D3Q27System::NE: velocity = (UbMath::c1o9*(+vx1+vx2)); break;
-         case D3Q27System::SW: velocity = (UbMath::c1o9*(-vx1-vx2)); break;
-         case D3Q27System::SE: velocity = (UbMath::c1o9*(+vx1-vx2)); break;
-         case D3Q27System::NW: velocity = (UbMath::c1o9*(-vx1+vx2)); break;
-         case D3Q27System::TE: velocity = (UbMath::c1o9*(+vx1+vx3)); break;
-         case D3Q27System::BW: velocity = (UbMath::c1o9*(-vx1-vx3)); break;
-         case D3Q27System::BE: velocity = (UbMath::c1o9*(+vx1-vx3)); break;
-         case D3Q27System::TW: velocity = (UbMath::c1o9*(-vx1+vx3)); break;
-         case D3Q27System::TN: velocity = (UbMath::c1o9*(+vx2+vx3)); break;
-         case D3Q27System::BS: velocity = (UbMath::c1o9*(-vx2-vx3)); break;
-         case D3Q27System::BN: velocity = (UbMath::c1o9*(+vx2-vx3)); break;
-         case D3Q27System::TS: velocity = (UbMath::c1o9*(-vx2+vx3)); break;
-         case D3Q27System::TNE: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break;
-         case D3Q27System::BSW: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break;
-         case D3Q27System::BNE: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break;
-         case D3Q27System::TSW: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break;
-         case D3Q27System::TSE: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break;
-         case D3Q27System::BNW: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break;
-         case D3Q27System::BSE: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break;
-         case D3Q27System::TNW: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break;
+         case D3Q27System::DIR_P00: velocity = (UbMath::c4o9*(+vx1)); break;      //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3)
+         case D3Q27System::DIR_M00: velocity = (UbMath::c4o9*(-vx1)); break;      //z.B. aus paper manfred MRT LB models in three dimensions (2002)   
+         case D3Q27System::DIR_0P0: velocity = (UbMath::c4o9*(+vx2)); break;
+         case D3Q27System::DIR_0M0: velocity = (UbMath::c4o9*(-vx2)); break;
+         case D3Q27System::DIR_00P: velocity = (UbMath::c4o9*(+vx3)); break;
+         case D3Q27System::DIR_00M: velocity = (UbMath::c4o9*(-vx3)); break;
+         case D3Q27System::DIR_PP0: velocity = (UbMath::c1o9*(+vx1+vx2)); break;
+         case D3Q27System::DIR_MM0: velocity = (UbMath::c1o9*(-vx1-vx2)); break;
+         case D3Q27System::DIR_PM0: velocity = (UbMath::c1o9*(+vx1-vx2)); break;
+         case D3Q27System::DIR_MP0: velocity = (UbMath::c1o9*(-vx1+vx2)); break;
+         case D3Q27System::DIR_P0P: velocity = (UbMath::c1o9*(+vx1+vx3)); break;
+         case D3Q27System::DIR_M0M: velocity = (UbMath::c1o9*(-vx1-vx3)); break;
+         case D3Q27System::DIR_P0M: velocity = (UbMath::c1o9*(+vx1-vx3)); break;
+         case D3Q27System::DIR_M0P: velocity = (UbMath::c1o9*(-vx1+vx3)); break;
+         case D3Q27System::DIR_0PP: velocity = (UbMath::c1o9*(+vx2+vx3)); break;
+         case D3Q27System::DIR_0MM: velocity = (UbMath::c1o9*(-vx2-vx3)); break;
+         case D3Q27System::DIR_0PM: velocity = (UbMath::c1o9*(+vx2-vx3)); break;
+         case D3Q27System::DIR_0MP: velocity = (UbMath::c1o9*(-vx2+vx3)); break;
+         case D3Q27System::DIR_PPP: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break;
+         case D3Q27System::DIR_MMM: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break;
+         case D3Q27System::DIR_PPM: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break;
+         case D3Q27System::DIR_MMP: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break;
+         case D3Q27System::DIR_PMP: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break;
+         case D3Q27System::DIR_MPM: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break;
+         case D3Q27System::DIR_PMM: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break;
+         case D3Q27System::DIR_MPP: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break;
          default: throw UbException(UB_EXARGS, "unknown error");
          }
-         LBMReal fReturn = f[invDir] - velocity;;
+         LBMReal fReturn = f[invDir] - velocity * rho;
          distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
       }
    }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp
index 8bdc284d606fa621233fe1449801f4751cfef22a..0dc2d5d66e639b3b46bc9fe12cec96eba6e6adac 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp
@@ -56,17 +56,17 @@ void SlipBCAdapter::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryCond
     if (!geo)
         throw UbException(UB_EXARGS, "derzeit nur fuer Cubes valide");
 
-    if (bc->hasSlipBoundaryFlag(D3Q27System::E))
+    if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_P00))
         bc->setNormalVector(1.0, 0.0, 0.0);
-    else if (bc->hasSlipBoundaryFlag(D3Q27System::W))
+    else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_M00))
         bc->setNormalVector(-1.0, 0.0, 0.0);
-    else if (bc->hasSlipBoundaryFlag(D3Q27System::N))
+    else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_0P0))
         bc->setNormalVector(0.0, 1.0, 0.0);
-    else if (bc->hasSlipBoundaryFlag(D3Q27System::S))
+    else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_0M0))
         bc->setNormalVector(0.0, -1.0, 0.0);
-    else if (bc->hasSlipBoundaryFlag(D3Q27System::T))
+    else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_00P))
         bc->setNormalVector(0.0, 0.0, 1.0);
-    else if (bc->hasSlipBoundaryFlag(D3Q27System::B))
+    else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_00M))
         bc->setNormalVector(0.0, 0.0, -1.0);
 
     bc->setBcAlgorithmType(algorithmType);
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp
index 825d2bc0175acb5b2c10df3a89e87512dcc2e6e3..5d9993c459b756dc1d8663907ee90bc0eabef51c 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp
@@ -47,32 +47,32 @@ void SlipBCAlgorithm::applyBC()
          LBMReal velocity = 0.0;
          switch (invDir)
          {
-         case D3Q27System::E: velocity = (UbMath::c4o9*(+vx1)); break;      //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3)
-         case D3Q27System::W: velocity = (UbMath::c4o9*(-vx1)); break;      //z.B. aus paper manfred MRT LB models in three dimensions (2002)   
-         case D3Q27System::N: velocity = (UbMath::c4o9*(+vx2)); break;
-         case D3Q27System::S: velocity = (UbMath::c4o9*(-vx2)); break;
-         case D3Q27System::T: velocity = (UbMath::c4o9*(+vx3)); break;
-         case D3Q27System::B: velocity = (UbMath::c4o9*(-vx3)); break;
-         case D3Q27System::NE: velocity = (UbMath::c1o9*(+vx1+vx2)); break;
-         case D3Q27System::SW: velocity = (UbMath::c1o9*(-vx1-vx2)); break;
-         case D3Q27System::SE: velocity = (UbMath::c1o9*(+vx1-vx2)); break;
-         case D3Q27System::NW: velocity = (UbMath::c1o9*(-vx1+vx2)); break;
-         case D3Q27System::TE: velocity = (UbMath::c1o9*(+vx1+vx3)); break;
-         case D3Q27System::BW: velocity = (UbMath::c1o9*(-vx1-vx3)); break;
-         case D3Q27System::BE: velocity = (UbMath::c1o9*(+vx1-vx3)); break;
-         case D3Q27System::TW: velocity = (UbMath::c1o9*(-vx1+vx3)); break;
-         case D3Q27System::TN: velocity = (UbMath::c1o9*(+vx2+vx3)); break;
-         case D3Q27System::BS: velocity = (UbMath::c1o9*(-vx2-vx3)); break;
-         case D3Q27System::BN: velocity = (UbMath::c1o9*(+vx2-vx3)); break;
-         case D3Q27System::TS: velocity = (UbMath::c1o9*(-vx2+vx3)); break;
-         case D3Q27System::TNE: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break;
-         case D3Q27System::BSW: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break;
-         case D3Q27System::BNE: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break;
-         case D3Q27System::TSW: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break;
-         case D3Q27System::TSE: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break;
-         case D3Q27System::BNW: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break;
-         case D3Q27System::BSE: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break;
-         case D3Q27System::TNW: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break;
+         case D3Q27System::DIR_P00: velocity = (UbMath::c4o9*(+vx1)); break;      //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3)
+         case D3Q27System::DIR_M00: velocity = (UbMath::c4o9*(-vx1)); break;      //z.B. aus paper manfred MRT LB models in three dimensions (2002)   
+         case D3Q27System::DIR_0P0: velocity = (UbMath::c4o9*(+vx2)); break;
+         case D3Q27System::DIR_0M0: velocity = (UbMath::c4o9*(-vx2)); break;
+         case D3Q27System::DIR_00P: velocity = (UbMath::c4o9*(+vx3)); break;
+         case D3Q27System::DIR_00M: velocity = (UbMath::c4o9*(-vx3)); break;
+         case D3Q27System::DIR_PP0: velocity = (UbMath::c1o9*(+vx1+vx2)); break;
+         case D3Q27System::DIR_MM0: velocity = (UbMath::c1o9*(-vx1-vx2)); break;
+         case D3Q27System::DIR_PM0: velocity = (UbMath::c1o9*(+vx1-vx2)); break;
+         case D3Q27System::DIR_MP0: velocity = (UbMath::c1o9*(-vx1+vx2)); break;
+         case D3Q27System::DIR_P0P: velocity = (UbMath::c1o9*(+vx1+vx3)); break;
+         case D3Q27System::DIR_M0M: velocity = (UbMath::c1o9*(-vx1-vx3)); break;
+         case D3Q27System::DIR_P0M: velocity = (UbMath::c1o9*(+vx1-vx3)); break;
+         case D3Q27System::DIR_M0P: velocity = (UbMath::c1o9*(-vx1+vx3)); break;
+         case D3Q27System::DIR_0PP: velocity = (UbMath::c1o9*(+vx2+vx3)); break;
+         case D3Q27System::DIR_0MM: velocity = (UbMath::c1o9*(-vx2-vx3)); break;
+         case D3Q27System::DIR_0PM: velocity = (UbMath::c1o9*(+vx2-vx3)); break;
+         case D3Q27System::DIR_0MP: velocity = (UbMath::c1o9*(-vx2+vx3)); break;
+         case D3Q27System::DIR_PPP: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break;
+         case D3Q27System::DIR_MMM: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break;
+         case D3Q27System::DIR_PPM: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break;
+         case D3Q27System::DIR_MMP: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break;
+         case D3Q27System::DIR_PMP: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break;
+         case D3Q27System::DIR_MPM: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break;
+         case D3Q27System::DIR_PMM: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break;
+         case D3Q27System::DIR_MPP: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break;
          default: throw UbException(UB_EXARGS, "unknown error");
          }
          LBMReal fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(1.0+q));
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp
index ecfb98e67aa4c20603fd4b07e969ccb396c5e757..bec8e139e333f5fa18847ddbb5fbb11c5c5c1eac 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp
@@ -95,12 +95,12 @@ void ThixotropyDensityBCAlgorithm::applyBC()
 	int nx3 = x3;
 
 	//flag points in direction of fluid
-	if (bcPtr->hasDensityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; }
-	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::W)) { nx1 += 1; }
-	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; }
-	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::S)) { nx2 += 1; }
-	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; }
-	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::B)) { nx3 += 1; }
+	if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; }
 	else	 UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary..."));
 
 	LBMReal rhoBC = bcPtr->getBoundaryDensity();
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp
index 2750e606acff2fb7a9f906f67c0b48975a11261c..ed90cc7596e186ab9984f25e2ba0ecdb625c9135 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp
@@ -79,12 +79,12 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
    int direction = -1;
 
    //flag points in direction of fluid
-   if (bcPtr->hasDensityBoundaryFlag(E)) { nx1 += 1; direction = E; }
-   else if (bcPtr->hasDensityBoundaryFlag(W)) { nx1 -= 1; direction = W; }
-   else if (bcPtr->hasDensityBoundaryFlag(N)) { nx2 += 1; direction = N; }
-   else if (bcPtr->hasDensityBoundaryFlag(S)) { nx2 -= 1; direction = S; }
-   else if (bcPtr->hasDensityBoundaryFlag(T)) { nx3 += 1; direction = T; }
-   else if (bcPtr->hasDensityBoundaryFlag(B)) { nx3 -= 1; direction = B; }
+   if (bcPtr->hasDensityBoundaryFlag(DIR_P00)) { nx1 += 1; direction = DIR_P00; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_M00)) { nx1 -= 1; direction = DIR_M00; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_0P0)) { nx2 += 1; direction = DIR_0P0; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_0M0)) { nx2 -= 1; direction = DIR_0M0; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_00P)) { nx3 += 1; direction = DIR_00P; }
+   else if (bcPtr->hasDensityBoundaryFlag(DIR_00M)) { nx3 -= 1; direction = DIR_00M; }
    else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary..."));
 
    distributions->getDistribution(f, x1, x2, x3);
@@ -95,131 +95,131 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
 
    switch (direction)
    {
-   case E:
-      f[E] = ftemp[E] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[E];
-      f[NE] = ftemp[NE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[NE];
-      f[SE] = ftemp[SE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[SE];
-      f[TE] = ftemp[TE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TE];
-      f[BE] = ftemp[BE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BE];
-      f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TNE];
-      f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TSE];
-      f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BNE];
-      f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BSE];
+   case DIR_P00:
+      f[DIR_P00] = ftemp[DIR_P00] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P00];
+      f[DIR_PP0] = ftemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PP0];
+      f[DIR_PM0] = ftemp[DIR_PM0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PM0];
+      f[DIR_P0P] = ftemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P0P];
+      f[DIR_P0M] = ftemp[DIR_P0M] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P0M];
+      f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PPP];
+      f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PMP];
+      f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PPM];
+      f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PMM];
 
-      distributions->setDistributionInvForDirection(f[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W);
-      distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
-      distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
-      distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
-      distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
-      distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
-      distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
-      distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
-      distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
+      distributions->setDistributionInvForDirection(f[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
+      distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
+      distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
+      distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
+      distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
+      distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+      distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+      distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+      distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
       break;
-   case W:
-      f[W] = ftemp[W] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[W];
-      f[NW] = ftemp[NW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[NW];
-      f[SW] = ftemp[SW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[SW];
-      f[TW] = ftemp[TW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TW];
-      f[BW] = ftemp[BW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BW];
-      f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TNW];
-      f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TSW];
-      f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BNW];
-      f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BSW];
+   case DIR_M00:
+      f[DIR_M00] = ftemp[DIR_M00] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M00];
+      f[DIR_MP0] = ftemp[DIR_MP0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MP0];
+      f[DIR_MM0] = ftemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MM0];
+      f[DIR_M0P] = ftemp[DIR_M0P] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M0P];
+      f[DIR_M0M] = ftemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M0M];
+      f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MPP];
+      f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MMP];
+      f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MPM];
+      f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MMM];
 
-      distributions->setDistributionInvForDirection(f[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E);
-      distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
-      distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
-      distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
-      distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
-      distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
-      distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
-      distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
-      distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
+      distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+      distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+      distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+      distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+      distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+      distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+      distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+      distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
-   case N:
-      f[N] = ftemp[N] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[N];
-      f[NE] = ftemp[NE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[NE];
-      f[NW] = ftemp[NW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[NW];
-      f[TN] = ftemp[TN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TN];
-      f[BN] = ftemp[BN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BN];
-      f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TNE];
-      f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TNW];
-      f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BNE];
-      f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BNW];
+   case DIR_0P0:
+      f[DIR_0P0] = ftemp[DIR_0P0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0P0];
+      f[DIR_PP0] = ftemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PP0];
+      f[DIR_MP0] = ftemp[DIR_MP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MP0];
+      f[DIR_0PP] = ftemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0PP];
+      f[DIR_0PM] = ftemp[DIR_0PM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0PM];
+      f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PPP];
+      f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MPP];
+      f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PPM];
+      f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MPM];
 
-      distributions->setDistributionInvForDirection(f[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S);
-      distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
-      distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
-      distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
-      distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
-      distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
-      distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
-      distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
-      distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
+      distributions->setDistributionInvForDirection(f[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
+      distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
+      distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+      distributions->setDistributionInvForDirection(f[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM);
+      distributions->setDistributionInvForDirection(f[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP);
+      distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+      distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+      distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+      distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
       break;
-   case S:
-      f[S] = ftemp[S] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[S];
-      f[SE] = ftemp[SE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[SE];
-      f[SW] = ftemp[SW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[SW];
-      f[TS] = ftemp[TS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TS];
-      f[BS] = ftemp[BS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BS];
-      f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TSE];
-      f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TSW];
-      f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BSE];
-      f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BSW];
+   case DIR_0M0:
+      f[DIR_0M0] = ftemp[DIR_0M0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0M0];
+      f[DIR_PM0] = ftemp[DIR_PM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PM0];
+      f[DIR_MM0] = ftemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MM0];
+      f[DIR_0MP] = ftemp[DIR_0MP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0MP];
+      f[DIR_0MM] = ftemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0MM];
+      f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PMP];
+      f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MMP];
+      f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PMM];
+      f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MMM];
 
-      distributions->setDistributionInvForDirection(f[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N);
-      distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
-      distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
-      distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
-      distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
-      distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
-      distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
-      distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
-      distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      distributions->setDistributionInvForDirection(f[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
+      distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
+      distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+      distributions->setDistributionInvForDirection(f[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM);
+      distributions->setDistributionInvForDirection(f[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP);
+      distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+      distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+      distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
+      distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
-   case T:
-      f[T] = ftemp[T] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[T];
-      f[TE] = ftemp[TE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TE];
-      f[TW] = ftemp[TW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TW];
-      f[TN] = ftemp[TN] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TN];
-      f[TS] = ftemp[TS] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TS];
-      f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TNE];
-      f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TNW];
-      f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TSE];
-      f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TSW];
+   case DIR_00P:
+      f[DIR_00P] = ftemp[DIR_00P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_00P];
+      f[DIR_P0P] = ftemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_P0P];
+      f[DIR_M0P] = ftemp[DIR_M0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_M0P];
+      f[DIR_0PP] = ftemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_0PP];
+      f[DIR_0MP] = ftemp[DIR_0MP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_0MP];
+      f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_PPP];
+      f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_MPP];
+      f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_PMP];
+      f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_MMP];
 
-      distributions->setDistributionInvForDirection(f[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B);
-      distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
-      distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
-      distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
-      distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
-      distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
-      distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
-      distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
-      distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
+      distributions->setDistributionInvForDirection(f[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
+      distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
+      distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+      distributions->setDistributionInvForDirection(f[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM);
+      distributions->setDistributionInvForDirection(f[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM);
+      distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+      distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+      distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+      distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
       break;
-   case B:
-      f[B] = ftemp[B] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[B];
-      f[BE] = ftemp[BE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BE];
-      f[BW] = ftemp[BW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BW];
-      f[BN] = ftemp[BN] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BN];
-      f[BS] = ftemp[BS] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BS];
-      f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BNE];
-      f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BNW];
-      f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BSE];
-      f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BSW];
+   case DIR_00M:
+      f[DIR_00M] = ftemp[DIR_00M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_00M];
+      f[DIR_P0M] = ftemp[DIR_P0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_P0M];
+      f[DIR_M0M] = ftemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_M0M];
+      f[DIR_0PM] = ftemp[DIR_0PM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_0PM];
+      f[DIR_0MM] = ftemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_0MM];
+      f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_PPM];
+      f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_MPM];
+      f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_PMM];
+      f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_MMM];
 
-      distributions->setDistributionInvForDirection(f[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T);
-      distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
-      distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
-      distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
-      distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
-      distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
-      distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
-      distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
-      distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      distributions->setDistributionInvForDirection(f[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
+      distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
+      distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+      distributions->setDistributionInvForDirection(f[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP);
+      distributions->setDistributionInvForDirection(f[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP);
+      distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+      distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+      distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
+      distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
    default:
       UB_THROW(UbException(UB_EXARGS, "It isn't implemented non reflecting density boundary for this direction!"));
@@ -239,131 +239,131 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC()
 
    switch (direction)
    {
-   case E:
-      h[E]  = htemp[E] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[E];
-      h[NE] = htemp[NE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[NE];
-      h[SE] = htemp[SE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[SE];
-      h[TE] = htemp[TE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[TE];
-      h[BE] = htemp[BE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[BE];
-      h[TNE] = htemp[TNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[TNE];
-      h[TSE] = htemp[TSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[TSE];
-      h[BNE] = htemp[BNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[BNE];
-      h[BSE] = htemp[BSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[BSE];
+   case DIR_P00:
+      h[DIR_P00]  = htemp[DIR_P00] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_P00];
+      h[DIR_PP0] = htemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PP0];
+      h[DIR_PM0] = htemp[DIR_PM0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PM0];
+      h[DIR_P0P] = htemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_P0P];
+      h[DIR_P0M] = htemp[DIR_P0M] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_P0M];
+      h[DIR_PPP] = htemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PPP];
+      h[DIR_PMP] = htemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PMP];
+      h[DIR_PPM] = htemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PPM];
+      h[DIR_PMM] = htemp[DIR_PMM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PMM];
 
-      distributionsH->setDistributionInvForDirection(h[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W);
-      distributionsH->setDistributionInvForDirection(h[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
-      distributionsH->setDistributionInvForDirection(h[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
-      distributionsH->setDistributionInvForDirection(h[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
-      distributionsH->setDistributionInvForDirection(h[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
-      distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
-      distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
-      distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
-      distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
+      distributionsH->setDistributionInvForDirection(h[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00);
+      distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
+      distributionsH->setDistributionInvForDirection(h[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
+      distributionsH->setDistributionInvForDirection(h[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
+      distributionsH->setDistributionInvForDirection(h[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
+      distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+      distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+      distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+      distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
       break;
-   case W:
-      h[W] = htemp[W] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[W];
-      h[NW] = htemp[NW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[NW];
-      h[SW] = htemp[SW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[SW];
-      h[TW] = htemp[TW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[TW];
-      h[BW] = htemp[BW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[BW];
-      h[TNW] = htemp[TNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[TNW];
-      h[TSW] = htemp[TSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[TSW];
-      h[BNW] = htemp[BNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[BNW];
-      h[BSW] = htemp[BSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[BSW];
+   case DIR_M00:
+      h[DIR_M00] = htemp[DIR_M00] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_M00];
+      h[DIR_MP0] = htemp[DIR_MP0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MP0];
+      h[DIR_MM0] = htemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MM0];
+      h[DIR_M0P] = htemp[DIR_M0P] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_M0P];
+      h[DIR_M0M] = htemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_M0M];
+      h[DIR_MPP] = htemp[DIR_MPP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MPP];
+      h[DIR_MMP] = htemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MMP];
+      h[DIR_MPM] = htemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MPM];
+      h[DIR_MMM] = htemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MMM];
 
-      distributionsH->setDistributionInvForDirection(h[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E);
-      distributionsH->setDistributionInvForDirection(h[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
-      distributionsH->setDistributionInvForDirection(h[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
-      distributionsH->setDistributionInvForDirection(h[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
-      distributionsH->setDistributionInvForDirection(h[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
-      distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
-      distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
-      distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
-      distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      distributionsH->setDistributionInvForDirection(h[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00);
+      distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+      distributionsH->setDistributionInvForDirection(h[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+      distributionsH->setDistributionInvForDirection(h[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+      distributionsH->setDistributionInvForDirection(h[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+      distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+      distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+      distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+      distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
-   case N:
-      h[N] = htemp[N] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[N];
-      h[NE] = htemp[NE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[NE];
-      h[NW] = htemp[NW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[NW];
-      h[TN] = htemp[TN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[TN];
-      h[BN] = htemp[BN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[BN];
-      h[TNE] = htemp[TNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[TNE];
-      h[TNW] = htemp[TNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[TNW];
-      h[BNE] = htemp[BNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[BNE];
-      h[BNW] = htemp[BNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[BNW];
+   case DIR_0P0:
+      h[DIR_0P0] = htemp[DIR_0P0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_0P0];
+      h[DIR_PP0] = htemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_PP0];
+      h[DIR_MP0] = htemp[DIR_MP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_MP0];
+      h[DIR_0PP] = htemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_0PP];
+      h[DIR_0PM] = htemp[DIR_0PM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_0PM];
+      h[DIR_PPP] = htemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_PPP];
+      h[DIR_MPP] = htemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_MPP];
+      h[DIR_PPM] = htemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_PPM];
+      h[DIR_MPM] = htemp[DIR_MPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_MPM];
 
-      distributionsH->setDistributionInvForDirection(h[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S);
-      distributionsH->setDistributionInvForDirection(h[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
-      distributionsH->setDistributionInvForDirection(h[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
-      distributionsH->setDistributionInvForDirection(h[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
-      distributionsH->setDistributionInvForDirection(h[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
-      distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
-      distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
-      distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
-      distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
+      distributionsH->setDistributionInvForDirection(h[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0);
+      distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0);
+      distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0);
+      distributionsH->setDistributionInvForDirection(h[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM);
+      distributionsH->setDistributionInvForDirection(h[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP);
+      distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+      distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+      distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+      distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
       break;
-   case S:
-      h[S] = htemp[S] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[S];
-      h[SE] = htemp[SE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[SE];
-      h[SW] = htemp[SW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[SW];
-      h[TS] = htemp[TS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[TS];
-      h[BS] = htemp[BS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[BS];
-      h[TSE] = htemp[TSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[TSE];
-      h[TSW] = htemp[TSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[TSW];
-      h[BSE] = htemp[BSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[BSE];
-      h[BSW] = htemp[BSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[BSW];
+   case DIR_0M0:
+      h[DIR_0M0] = htemp[DIR_0M0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_0M0];
+      h[DIR_PM0] = htemp[DIR_PM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_PM0];
+      h[DIR_MM0] = htemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_MM0];
+      h[DIR_0MP] = htemp[DIR_0MP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_0MP];
+      h[DIR_0MM] = htemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_0MM];
+      h[DIR_PMP] = htemp[DIR_PMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_PMP];
+      h[DIR_MMP] = htemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_MMP];
+      h[DIR_PMM] = htemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_PMM];
+      h[DIR_MMM] = htemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_MMM];
 
-      distributionsH->setDistributionInvForDirection(h[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N);
-      distributionsH->setDistributionInvForDirection(h[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
-      distributionsH->setDistributionInvForDirection(h[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
-      distributionsH->setDistributionInvForDirection(h[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
-      distributionsH->setDistributionInvForDirection(h[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
-      distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
-      distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
-      distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
-      distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      distributionsH->setDistributionInvForDirection(h[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0);
+      distributionsH->setDistributionInvForDirection(h[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0);
+      distributionsH->setDistributionInvForDirection(h[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0);
+      distributionsH->setDistributionInvForDirection(h[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM);
+      distributionsH->setDistributionInvForDirection(h[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP);
+      distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+      distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
+      distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
+      distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
-   case T:
-      h[T] = htemp[T] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[T];
-      h[TE] = htemp[TE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TE];
-      h[TW] = htemp[TW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TW];
-      h[TN] = htemp[TN] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TN];
-      h[TS] = htemp[TS] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TS];
-      h[TNE] = htemp[TNE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TNE];
-      h[TNW] = htemp[TNW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TNW];
-      h[TSE] = htemp[TSE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TSE];
-      h[TSW] = htemp[TSW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TSW];
+   case DIR_00P:
+      h[DIR_00P] = htemp[DIR_00P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_00P];
+      h[DIR_P0P] = htemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_P0P];
+      h[DIR_M0P] = htemp[DIR_M0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_M0P];
+      h[DIR_0PP] = htemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_0PP];
+      h[DIR_0MP] = htemp[DIR_0MP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_0MP];
+      h[DIR_PPP] = htemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_PPP];
+      h[DIR_MPP] = htemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_MPP];
+      h[DIR_PMP] = htemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_PMP];
+      h[DIR_MMP] = htemp[DIR_MMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_MMP];
 
-      distributionsH->setDistributionInvForDirection(h[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B);
-      distributionsH->setDistributionInvForDirection(h[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
-      distributionsH->setDistributionInvForDirection(h[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
-      distributionsH->setDistributionInvForDirection(h[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
-      distributionsH->setDistributionInvForDirection(h[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
-      distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
-      distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
-      distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
-      distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
+      distributionsH->setDistributionInvForDirection(h[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M);
+      distributionsH->setDistributionInvForDirection(h[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M);
+      distributionsH->setDistributionInvForDirection(h[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M);
+      distributionsH->setDistributionInvForDirection(h[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM);
+      distributionsH->setDistributionInvForDirection(h[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM);
+      distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM);
+      distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM);
+      distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM);
+      distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM);
       break;
-   case B:
-      h[B] = htemp[B] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[B];
-      h[BE] = htemp[BE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BE];
-      h[BW] = htemp[BW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BW];
-      h[BN] = htemp[BN] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BN];
-      h[BS] = htemp[BS] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BS];
-      h[BNE] = htemp[BNE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BNE];
-      h[BNW] = htemp[BNW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BNW];
-      h[BSE] = htemp[BSE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BSE];
-      h[BSW] = htemp[BSW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BSW];
+   case DIR_00M:
+      h[DIR_00M] = htemp[DIR_00M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_00M];
+      h[DIR_P0M] = htemp[DIR_P0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_P0M];
+      h[DIR_M0M] = htemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_M0M];
+      h[DIR_0PM] = htemp[DIR_0PM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_0PM];
+      h[DIR_0MM] = htemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_0MM];
+      h[DIR_PPM] = htemp[DIR_PPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_PPM];
+      h[DIR_MPM] = htemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_MPM];
+      h[DIR_PMM] = htemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_PMM];
+      h[DIR_MMM] = htemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_MMM];
 
-      distributionsH->setDistributionInvForDirection(h[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T);
-      distributionsH->setDistributionInvForDirection(h[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
-      distributionsH->setDistributionInvForDirection(h[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
-      distributionsH->setDistributionInvForDirection(h[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
-      distributionsH->setDistributionInvForDirection(h[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
-      distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
-      distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
-      distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
-      distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      distributionsH->setDistributionInvForDirection(h[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P);
+      distributionsH->setDistributionInvForDirection(h[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P);
+      distributionsH->setDistributionInvForDirection(h[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P);
+      distributionsH->setDistributionInvForDirection(h[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP);
+      distributionsH->setDistributionInvForDirection(h[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP);
+      distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP);
+      distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP);
+      distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP);
+      distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP);
       break;
    default:
       UB_THROW(UbException(UB_EXARGS, "It isn't implemented non reflecting density boundary for this direction!"));
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp
index 6db2e6230560e313abcccbb08299f1928d5c0672..4748212417600b18615a938a6c7a2696ee00eb00 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp
@@ -92,12 +92,12 @@ void ThixotropyVelocityBCAlgorithm::applyBC()
 	int nx3 = x3;
 
 	//flag points in direction of fluid
-	if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; }
-	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; }
-	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; }
-	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; }
-	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; }
-	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; }
+	if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; }
 	else	 UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary..."));
 
 	//lambdaBC = bcPtr->getBoundaryThixotropy();
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp
index 532570386462c4dd0d6d7db118a19429bc7beff0..454b29bc459045b1f61746eeb7f5f5987f1762a7 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp
@@ -85,12 +85,12 @@ void ThixotropyVelocityWithDensityBCAlgorithm::applyBC()
    int nx3 = x3;
 
    //flag points in direction of fluid
-   if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; }
-   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; }
+   if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; }
    else	 UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary..."));
 
    for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++)
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp
index c63b1559492a1258d7322e4b3b1b17f9ba9b4d13..1fe6632b9de8cb64d98c072bfccaa72ce4bb9ee8 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp
@@ -82,11 +82,12 @@ void VelocityWithDensityBCAlgorithm::applyBC()
         if (minX1 <= nX1 && maxX1 > nX1 && minX2 <= nX2 && maxX2 > nX2 && minX3 <= nX3 && maxX3 > nX3) {
             if (bcArray->isSolid(nX1, nX2, nX3)) {
                 const int invDir = D3Q27System::INVDIR[fdir];
-                //            LBMReal q =1.0;// bcPtr->getQ(invDir);// m+m q=0 stabiler
+                //LBMReal q =1.0;// bcPtr->getQ(invDir);// m+m q=0 stabiler
                 LBMReal velocity = bcPtr->getBoundaryVelocity(fdir);
-                //            LBMReal fReturn = ((1.0 - q) / (1.0 + q))*((f[fdir] - feq[fdir]*collFactor) / (1.0 -
-                //            collFactor)) + ((q*(f[fdir] + f[invDir]) - velocity*rho) / (1.0 +
-                //            q))-drho*D3Q27System::WEIGTH[invDir];
+                
+                //LBMReal fReturn = ((1.0 - q) / (1.0 + q))*((f[fdir] - feq[fdir]*collFactor) / (1.0 -
+                //collFactor)) + ((q*(f[fdir] + f[invDir]) - velocity*rho) / (1.0 +
+                //q))-drho*D3Q27System::WEIGTH[invDir];
 
                 // if q=1
                 // LBMReal fReturn = ((q*(f[fdir] + f[invDir]) - velocity*rho) / (1.0 +
diff --git a/src/cpu/VirtualFluidsCore/CMakeLists.txt b/src/cpu/VirtualFluidsCore/CMakeLists.txt
index a9ee657434ae6ace1fd85974d825469a9e038d68..b691fd34be1cff4f2bfed0fa4e0cf8860014ed90 100644
--- a/src/cpu/VirtualFluidsCore/CMakeLists.txt
+++ b/src/cpu/VirtualFluidsCore/CMakeLists.txt
@@ -16,7 +16,6 @@ IF(${USE_CATALYST})
    list(APPEND VF_LIBRARIES optimized vtkParallelMPI debug vtkParallelMPI )
 ENDIF()
 
-
 IF(${USE_DEM_COUPLING})
    INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/../DemCoupling/DemCoupling.cmake)
 ENDIF()
@@ -25,6 +24,10 @@ if(BUILD_USE_OPENMP)
     list(APPEND VF_LIBRARIES OpenMP::OpenMP_CXX)
 endif()
 
+IF(${USE_LIGGGHTS})
+   list(APPEND VF_LIBRARIES optimized ${LIGGGHTS_RELEASE_LIBRARY} debug ${LIGGGHTS_DEBUG_LIBRARY})
+ENDIF()
+
 vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser ${VF_LIBRARIES} PRIVATE_LINK lbm mpi logger)
 
 vf_get_library_name(library_name)
@@ -46,6 +49,12 @@ IF(${USE_METIS} AND METIS_INCLUDEDIR)
 ENDIF()
 
 target_include_directories(${library_name} PRIVATE ${ZOLTAN_INCLUDEDIR})
+
 IF(${USE_VTK})
    target_include_directories(${library_name} PRIVATE ${VTK_INCLUDE_DIRS})
 ENDIF()
+
+IF(${USE_LIGGGHTS})
+   target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../LiggghtsCoupling)
+   target_include_directories(${library_name} PUBLIC ${LIGGGHTS_SOURCE_DIR})
+ENDIF()
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
index 770e837a0f27b1cb42db385a44382c6bee402aaf..b2c7466f7cd6e7d5dd0aeb0baa152bfb6ced93ae 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
@@ -13,7 +13,7 @@
 #include "EsoTwist3D.h"
 #include "DistributionArray3D.h"
 
-CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : CoProcessor(grid, s), path(path_), comm(comm), forceX1global(0), forceX2global(0), forceX3global(0)
+CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : CoProcessor(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0)
 {
    if (comm->getProcessID() == comm->getRoot())
    {
@@ -68,9 +68,9 @@ void CalculateTorqueCoProcessor::collectData( double step )
       }
 
       ostr << istep << ";";
-      ostr << forceX1global << ";";
-      ostr << forceX2global << ";";
-      ostr << forceX3global;
+      ostr << torqueX1global << ";";
+      ostr << torqueX2global << ";";
+      ostr << torqueX3global;
       ostr << std::endl;
       ostr.close();
    }
@@ -78,9 +78,9 @@ void CalculateTorqueCoProcessor::collectData( double step )
 //////////////////////////////////////////////////////////////////////////
 void CalculateTorqueCoProcessor::calculateForces()
 {
-   forceX1global = 0.0;
-   forceX2global = 0.0;
-   forceX3global = 0.0;
+   torqueX1global = 0.0;
+   torqueX2global = 0.0;
+   torqueX3global = 0.0;
 
    for(SPtr<D3Q27Interactor> interactor : interactors)
    {
@@ -97,18 +97,9 @@ void CalculateTorqueCoProcessor::calculateForces()
          SPtr<Block3D> block = t.first;
          std::set< std::vector<int> >& transNodeIndicesSet = t.second;
 
-         SPtr<ILBMKernel> kernel = block->getKernel();
+         double deltaX = grid->getDeltaX(block);
 
-         if (kernel->getCompressible())
-         {
-            calcMacrosFct = &D3Q27System::calcCompMacroscopicValues;
-            compressibleFactor = 1.0;
-         }
-         else
-         {
-            calcMacrosFct = &D3Q27System::calcIncompMacroscopicValues;
-            compressibleFactor = 0.0;
-         }
+         SPtr<ILBMKernel> kernel = block->getKernel();
 
          SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();          
          SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); 
@@ -128,11 +119,6 @@ void CalculateTorqueCoProcessor::calculateForces()
             int x2 = node[1];
             int x3 = node[2];
 
-            Vector3D worldCoordinates = grid->getNodeCoordinates(block, x1, x2, x3);
-            double rx                 = worldCoordinates[0] - x1Centre;
-            double ry                 = worldCoordinates[1] - x2Centre;
-            double rz                 = worldCoordinates[2] - x3Centre;
-
             //without ghost nodes
             if (x1 < minX1 || x1 > maxX1 || x2 < minX2 || x2 > maxX2 ||x3 < minX3 || x3 > maxX3 ) continue;
 
@@ -144,48 +130,42 @@ void CalculateTorqueCoProcessor::calculateForces()
                double Fy                   = val<2>(forceVec);
                double Fz                   = val<3>(forceVec);
 
+               Vector3D worldCoordinates = grid->getNodeCoordinates(block, x1, x2, x3);
+               double rx                 = (worldCoordinates[0] - x1Centre) / deltaX;
+               double ry                 = (worldCoordinates[1] - x2Centre) / deltaX;
+               double rz                 = (worldCoordinates[2] - x3Centre) / deltaX;
+
                torqueX1 += ry * Fz - rz * Fy;
                torqueX2 += rz * Fx - rx * Fz;
                torqueX3 += rx * Fy - ry * Fx;
-               //counter++;
-               //UBLOG(logINFO, "x1="<<(worldCoordinates[1] - x2Centre)<<",x2=" << (worldCoordinates[2] - x3Centre)<< ",x3=" << (worldCoordinates[0] - x1Centre) <<" forceX3 = " << forceX3);
             }
          }
-         //if we have got discretization with more level
-         // deltaX is LBM deltaX and equal LBM deltaT 
-         double deltaX = LBMSystem::getDeltaT(block->getLevel()); //grid->getDeltaT(block);
-         double deltaXquadrat = deltaX*deltaX;
-         torqueX1 *= deltaXquadrat;
-         torqueX2 *= deltaXquadrat;
-         torqueX3 *= deltaXquadrat;
 
          distributions->swap();
 
-         forceX1global += torqueX1;
-         forceX2global += torqueX2;
-         forceX3global += torqueX3;
-
-         //UBLOG(logINFO, "forceX3global = " << forceX3global);
+         torqueX1global += torqueX1;
+         torqueX2global += torqueX2;
+         torqueX3global += torqueX3;
       }
    }
    std::vector<double> values;
    std::vector<double> rvalues;
-   values.push_back(forceX1global);
-   values.push_back(forceX2global);
-   values.push_back(forceX3global);
+   values.push_back(torqueX1global);
+   values.push_back(torqueX2global);
+   values.push_back(torqueX3global);
 
    rvalues = comm->gather(values);
    if (comm->getProcessID() == comm->getRoot())
    {
-      forceX1global = 0.0;
-      forceX2global = 0.0;
-      forceX3global = 0.0;
+      torqueX1global = 0.0;
+      torqueX2global = 0.0;
+      torqueX3global = 0.0;
       
       for (int i = 0; i < (int)rvalues.size(); i+=3)
       {
-         forceX1global += rvalues[i];
-         forceX2global += rvalues[i+1];
-         forceX3global += rvalues[i+2];
+         torqueX1global += rvalues[i];
+         torqueX2global += rvalues[i+1];
+         torqueX3global += rvalues[i+2];
       }
    }
 }
@@ -196,9 +176,6 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3,  SP
 
    LBMReal fs[D3Q27System::ENDF + 1];
    distributions->getDistributionInv(fs, x1, x2, x3);
-   LBMReal rho = 0.0, vx1 = 0.0, vx2 = 0.0, vx3 = 0.0, drho = 0.0;
-   calcMacrosFct(fs, drho, vx1, vx2, vx3);
-   rho = 1.0 + drho * compressibleFactor;
    
    if(bc)
    {
@@ -216,22 +193,9 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3,  SP
             f = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1, x2, x3, invDir);
             fnbr = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
 
-            Vector3D boundaryVelocity;
-            boundaryVelocity[0] = bc->getBoundaryVelocityX1();
-            boundaryVelocity[1] = bc->getBoundaryVelocityX2();
-            boundaryVelocity[2] = bc->getBoundaryVelocityX3();
-            double correction[3] = { 0.0, 0.0, 0.0 };
-            if (bc->hasVelocityBoundaryFlag(fdir))
-            {
-               const double forceTerm = f - fnbr;
-               correction[0] = forceTerm * boundaryVelocity[0];
-               correction[1] = forceTerm * boundaryVelocity[1];
-               correction[2] = forceTerm * boundaryVelocity[2];
-            }
-
-            forceX1 += (f + fnbr) * D3Q27System::DX1[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[0];
-            forceX2 += (f + fnbr) * D3Q27System::DX2[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[1];
-            forceX3 += (f + fnbr) * D3Q27System::DX3[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[2];
+            forceX1 += (f + fnbr) * D3Q27System::DX1[invDir];
+            forceX2 += (f + fnbr) * D3Q27System::DX2[invDir];
+            forceX3 += (f + fnbr) * D3Q27System::DX3[invDir];
          }
       }
    }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
index b1a7f771f5dffb5146f66d2bc16399b92aaceba6..e488b442b60b2f726747a521e51cad9d4bacdbe9 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
@@ -40,13 +40,9 @@ private:
    std::string path;
    std::shared_ptr<vf::mpi::Communicator> comm;
    std::vector<SPtr<D3Q27Interactor> > interactors;
-   double forceX1global;
-   double forceX2global;
-   double forceX3global;
-
-   typedef void(*CalcMacrosFct)(const LBMReal* const& /*f[27]*/, LBMReal& /*rho*/, LBMReal& /*vx1*/, LBMReal& /*vx2*/, LBMReal& /*vx3*/);
-   CalcMacrosFct    calcMacrosFct;
-   LBMReal compressibleFactor;
+   double torqueX1global;
+   double torqueX2global;
+   double torqueX3global;
 };
 
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp
index 5a514606ad8486073e7c1e3679ee7a31916553df..cb2fd908ff78803e4262ae64e906b8dad3c14dff 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp
@@ -42,7 +42,7 @@ Vector3D ForceCalculator::getForces(int x1, int x2, int x3, SPtr<DistributionArr
                 // UBLOG(logINFO, "c, c * bv(x,y,z): " << correction << ", " << correction * val<1>(boundaryVelocity) <<
                 // ", " << correction * val<2>(boundaryVelocity) << ", " << correction * val<3>(boundaryVelocity));
 
-                // force consists of the MEM part and the galilean invariance correction including the boundary velocity
+                // force consists of the MEM part and the Galilean invariance correction including the boundary velocity
                 forceX1 += (f + fnbr) * D3Q27System::DX1[invDir] - correction[0];
                 forceX2 += (f + fnbr) * D3Q27System::DX2[invDir] - correction[1];
                 forceX3 += (f + fnbr) * D3Q27System::DX3[invDir] - correction[2];
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp
index 73c0a2325953994c337934347e872223ba18452a..ed258864a4a87b473ca276064abf60ad5910828d 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp
@@ -226,11 +226,11 @@ void InSituVTKCoProcessor::addData(SPtr<Block3D> block)
                                            UbSystem::toString(ix2) + "," + UbSystem::toString(ix3)));
                     // vx3=999.0;
 
-                    arrays[0]->InsertNextValue(rho * conv->getFactorDensityLbToW2());
-                    arrays[1]->InsertNextValue(vx1 * conv->getFactorVelocityLbToW2());
-                    arrays[2]->InsertNextValue(vx2 * conv->getFactorVelocityLbToW2());
-                    arrays[3]->InsertNextValue(vx3 * conv->getFactorVelocityLbToW2());
-                    arrays[4]->InsertNextValue(press * conv->getFactorPressureLbToW2());
+                    arrays[0]->InsertNextValue(rho * conv->getFactorDensityLbToW());
+                    arrays[1]->InsertNextValue(vx1 * conv->getFactorVelocityLbToW());
+                    arrays[2]->InsertNextValue(vx2 * conv->getFactorVelocityLbToW());
+                    arrays[3]->InsertNextValue(vx3 * conv->getFactorVelocityLbToW());
+                    arrays[4]->InsertNextValue(press * conv->getFactorPressureLbToW());
                 }
             }
         }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp
index 4f8f3a4b503f9490545ed760aaacf2778dece474..a16f32c7d9e0d83dff90a55bb139d4115285a196 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp
@@ -55,7 +55,7 @@ MPIIOCoProcessor::MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const
     //-----------------------------------------------------------------------
 
     MPI_Datatype typesBC[3] = { MPI_LONG_LONG_INT, MPI_FLOAT, MPI_CHAR };
-    int blocksBC[3]         = { 5, 38, 1 };
+    int blocksBC[3]         = { 5, 34, 1 };
     MPI_Aint offsetsBC[3], lbBC, extentBC;
 
     offsetsBC[0] = 0;
@@ -70,7 +70,7 @@ MPIIOCoProcessor::MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const
 
     //---------------------------------------
 
-    MPI_Type_contiguous(8, MPI_CHAR, &arrayPresenceType);
+    MPI_Type_contiguous(9, MPI_CHAR, &arrayPresenceType);
     MPI_Type_commit(&arrayPresenceType);
 }
 
@@ -425,8 +425,7 @@ void MPIIOCoProcessor::clearAllFiles(int step)
     MPI_File_set_size(file_handler, new_size);
     MPI_File_close(&file_handler);
 
-    std::string filename6 =
-        path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageFluktuationsArray.bin";
+    std::string filename6 = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageFluktuationsArray.bin";
     // MPI_File_delete(filename6.c_str(), info);
     int rc6 = MPI_File_open(MPI_COMM_WORLD, filename6.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
     if (rc6 != MPI_SUCCESS)
@@ -472,6 +471,13 @@ void MPIIOCoProcessor::clearAllFiles(int step)
     MPI_File_set_size(file_handler, new_size);
     MPI_File_close(&file_handler);
 
+    std::string filename12 = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPressureField.bin";
+    int rc12 = MPI_File_open(MPI_COMM_WORLD, filename12.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
+    if (rc12 != MPI_SUCCESS)
+        throw UbException(UB_EXARGS, "couldn't open file " + filename12);
+    MPI_File_set_size(file_handler, new_size);
+    MPI_File_close(&file_handler);
+
 }
 
 void MPIIOCoProcessor::writeCpTimeStep(int step)
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
index b58376cebd7854a1aba1a2b69881ac445ad51082..34c247345d2d3cf1a9c527ab7a7b15e23f7ab5da 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
@@ -10,7 +10,7 @@
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "LBMKernel.h"
-#include "MetisPartitioningGridVisitor.h"
+#include "Grid3DVisitor.h"
 #include "PointerDefinitions.h"
 #include "RenumberGridVisitor.h"
 #include "UbFileInputASCII.h"
@@ -25,10 +25,11 @@ using namespace MPIIODataStructures;
 #define MESSAGE_TAG 80
 #define SEND_BLOCK_SIZE 100000
 
-MPIIOMigrationBECoProcessor::MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+MPIIOMigrationBECoProcessor::MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
     : MPIIOCoProcessor(grid, s, path, comm), nue(-999.999), nuL(-999.999), nuG(-999.999), densityRatio(-999.999)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
+    metisVisitor = mV;
 
     //-------------------------   define MPI types  ---------------------------------
 
@@ -116,7 +117,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
     int firstGlobalID {0};
     std::vector<double> doubleValuesArrayF; // double-values (arrays of f's) in all blocks  Fdistribution
     std::vector<double> doubleValuesArrayH1; // double-values (arrays of f's) in all blocks  H1distribution
-    // std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks  H2distribution
+    std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks  H2distribution
 
     if (comm->isRoot()) 
     {
@@ -124,7 +125,8 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
-    bool multiPhase = false;
+    bool multiPhase1 = false;
+    bool multiPhase2 = false;
     DSArraysPresence arrPresence;
     bool firstBlock        = true;
     int doubleCountInBlock = 0;
@@ -146,19 +148,20 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
             D3Q27EsoTwist3DSplittedVectorPtrH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getHdistributions());
             if (D3Q27EsoTwist3DSplittedVectorPtrH1 != 0)
             {
-                multiPhase = true;
+                multiPhase1 = true;
                 localDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getLocalDistributions();
                 nonLocalDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getNonLocalDistributions();
                 zeroDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getZeroDistributions();
             }
 
-            /*D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions());
+            D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions());
             if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0)
             {
+                multiPhase2 = true;
                 localDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getLocalDistributions();
                 nonLocalDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getNonLocalDistributions();
                 zeroDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getZeroDistributions();
-            }*/
+            }
 
 
             if (firstBlock) // && block->getKernel()) // when first (any) valid block...
@@ -242,6 +245,11 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
                 else
                     arrPresence.isPhaseField2Present = false;
 
+                SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> pressureFieldPtr = block->getKernel()->getDataSet()->getPressureField();
+                if (pressureFieldPtr)
+                    arrPresence.isPressureFieldPresent = true;
+                else
+                    arrPresence.isPressureFieldPresent = false;
 
                 firstBlock = false;
             }
@@ -253,7 +261,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
             if (zeroDistributionsF && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0))
                 doubleValuesArrayF.insert(doubleValuesArrayF.end(), zeroDistributionsF->getDataVector().begin(), zeroDistributionsF->getDataVector().end());
 
-            if (multiPhase)
+            if (multiPhase1)
             {
                 if (localDistributionsH1 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0))
                     doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), localDistributionsH1->getDataVector().begin(), localDistributionsH1->getDataVector().end());
@@ -263,7 +271,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
                     doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), zeroDistributionsH1->getDataVector().begin(), zeroDistributionsH1->getDataVector().end());
             }
 
-            /*if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0)
+            if (multiPhase2)
             {
                 if (localDistributionsH2 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0))
                 doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), localDistributionsH2->getDataVector().begin(), localDistributionsH2->getDataVector().end());
@@ -271,7 +279,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
                 doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), nonLocalDistributionsH2->getDataVector().begin(), nonLocalDistributionsH2->getDataVector().end());
                 if (zeroDistributionsH2 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0))
                 doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), zeroDistributionsH2->getDataVector().begin(), zeroDistributionsH2->getDataVector().end());
-            }*/
+            }
 
             ic++;
         }
@@ -318,7 +326,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
     MPI_File_close(&file_handler);
 
     //-------------------------------- H1 ------------------------------------------------
-    if (multiPhase)
+    if (multiPhase1)
     {
         filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH1.bin";
         rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
@@ -333,7 +341,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
     }
 
     //-------------------------------- H2 --------------------------------------------------
-    /*if (D3Q27EsoTwist3DSplittedVectorPtr2 != 0)
+    if (multiPhase2)
     {
         filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin";
         rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
@@ -345,7 +353,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
 
         MPI_File_sync(file_handler);
         MPI_File_close(&file_handler);
-    }    */
+    }
 
     //--------------------------------
 
@@ -395,6 +403,10 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step)
 
     if (arrPresence.isPhaseField2Present)
         write3DArray(step, PhaseField2, std::string("/cpPhaseField2.bin"));
+
+    if (arrPresence.isPressureFieldPresent)
+        write3DArray(step, PressureField, std::string("/cpPressureField.bin"));
+
     }
 
 void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::string fname)
@@ -562,6 +574,9 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std::
                 case PhaseField2:
                     ___Array = block->getKernel()->getDataSet()->getPhaseField2();
                     break;
+                case PressureField:
+                    ___Array = block->getKernel()->getDataSet()->getPressureField();
+                    break;
                 default:
                     UB_THROW(UbException(UB_EXARGS,
                     "MPIIOMigrationBECoProcessor::write3DArray : 3D array type does not exist!"));
@@ -695,11 +710,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step)
                     bouCond->bcVelocityX2           = (float)bcArr->bcvector[bc]->getBoundaryVelocityX2();
                     bouCond->bcVelocityX3           = (float)bcArr->bcvector[bc]->getBoundaryVelocityX3();
                     bouCond->bcDensity              = (float)bcArr->bcvector[bc]->getBoundaryDensity();
-                    bouCond->bcLodiDensity          = (float)bcArr->bcvector[bc]->getDensityLodiDensity();
-                    bouCond->bcLodiVelocityX1       = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX1();
-                    bouCond->bcLodiVelocityX2       = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX2();
-                    bouCond->bcLodiVelocityX3       = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX3();
-                    bouCond->bcLodiLentgh           = (float)bcArr->bcvector[bc]->getDensityLodiLength();
+                    bouCond->bcPhaseField           = (float)bcArr->bcvector[bc]->getBoundaryPhaseField();
                     bouCond->nx1                    = (float)bcArr->bcvector[bc]->nx1;
                     bouCond->nx2                    = (float)bcArr->bcvector[bc]->nx2;
                     bouCond->nx3                    = (float)bcArr->bcvector[bc]->nx3;
@@ -842,8 +853,7 @@ void MPIIOMigrationBECoProcessor::restart(int step)
         UBLOG(logINFO, "Load check point - start");
 
     readBlocks(step);
-    SPtr<Grid3DVisitor> newMetisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY));
-    grid->accept(newMetisVisitor);
+    grid->accept(metisVisitor);
 
     readDataSet(step);
     readBoundaryConds(step);
@@ -980,6 +990,8 @@ void MPIIOMigrationBECoProcessor::blocksExchange(int tagN, int ind1, int ind2, i
 
     MPI_Waitall(requestCount, &requests[0], MPI_STATUSES_IGNORE);
 
+    MPI_Type_free(&sendBlockDoubleType);
+
     delete[] blocksCounterSend;
     delete[] blocksCounterRec;
     delete[] rawDataSend;
@@ -1011,7 +1023,8 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
-    bool multiPhase = false;
+    bool multiPhase1 = false;
+    bool multiPhase2 = false;
     dataSetParam dataSetParamStr1, dataSetParamStr2, dataSetParamStr3;
 
     int blocksCountAll   = grid->getNumberOfBlocks(); // quantity of all blocks in the grid
@@ -1047,7 +1060,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
         dataSetParamStr3.nx[0] * dataSetParamStr3.nx[1] * dataSetParamStr3.nx[2] * dataSetParamStr3.nx[3];
     std::vector<double> doubleValuesArrayF(size_t(myBlocksCount * doubleCountInBlock)); // double-values in all blocks  Fdistributions
     std::vector<double> doubleValuesArrayH1; // double-values in all blocks  H1distributions
-    //std::vector<double> doubleValuesArrayH2; // double-values in all blocks  H2distributions
+    std::vector<double> doubleValuesArrayH2; // double-values in all blocks  H2distributions
 
     MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType);
     MPI_Type_commit(&dataSetDoubleType);
@@ -1067,7 +1080,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     MPI_File_get_size(file_handler, &fsize);
     if (fsize > 0)
     {
-        multiPhase = true;
+        multiPhase1 = true;
         doubleValuesArrayH1.resize(myBlocksCount * doubleCountInBlock);
 
         read_offset = (MPI_Offset)(indexB * doubleCountInBlock * sizeof(double)) ;
@@ -1075,6 +1088,22 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     }
     MPI_File_close(&file_handler);
 
+    //--------------------------------- H2 ---------------------------------------------------------
+    filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin";
+    rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
+    if (rc != MPI_SUCCESS)
+        throw UbException(UB_EXARGS, "couldn't open file " + filename);
+    MPI_File_get_size(file_handler, &fsize);
+    if (fsize > 0)
+    {
+        multiPhase2 = true;
+        doubleValuesArrayH2.resize(myBlocksCount * doubleCountInBlock);
+
+        read_offset = (MPI_Offset)(indexB * doubleCountInBlock * sizeof(double));
+        MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[0], int(myBlocksCount), dataSetDoubleType, MPI_STATUS_IGNORE);
+    }
+    MPI_File_close(&file_handler);
+
     MPI_Type_free(&dataSetDoubleType);
 
     if (comm->isRoot()) 
@@ -1089,16 +1118,23 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     for (int r = 0; r < size; r++)
         rawDataReceiveF[r].resize(0);
     blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayF, rawDataReceiveF);
+    
 
     std::vector<double>* rawDataReceiveH1 = new std::vector<double>[size];
-    for (int r = 0; r < size; r++)
-        rawDataReceiveH1[r].resize(0);
-    blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayH1, rawDataReceiveH1);
+    if (multiPhase1)
+    {
+        for (int r = 0; r < size; r++)
+            rawDataReceiveH1[r].resize(0);
+        blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayH1, rawDataReceiveH1);
+    }
 
-    /*    std::vector<double>* rawDataReceiveH2 = new std::vector<double>[size];
+    std::vector<double>* rawDataReceiveH2 = new std::vector<double>[size];
+    if (multiPhase2)
+    {
         for (int r = 0; r < size; r++)
             rawDataReceiveH2[r].resize(0);
-        blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayH2, rawDataReceiveH2);*/
+        blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayH2, rawDataReceiveH2);
+    }
 
     if (comm->isRoot())
     {
@@ -1110,9 +1146,9 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     
     //-------------------------------------- restore blocks ---------------------------------
     int blockID;
-    std::vector<LBMReal> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3;
-    std::vector<LBMReal> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13;
-    //std::vector<LBMReal> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23;
+    std::vector<double> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3;
+    std::vector<double> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13;
+    std::vector<double> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23;
 
     size_t vectorSize1 = dataSetParamStr1.nx[0] * dataSetParamStr1.nx[1] * dataSetParamStr1.nx[2] * dataSetParamStr1.nx[3];
     size_t vectorSize2 = dataSetParamStr2.nx[0] * dataSetParamStr2.nx[1] * dataSetParamStr2.nx[2] * dataSetParamStr2.nx[3];
@@ -1128,21 +1164,24 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
             index += 1;
 
             vectorsOfValuesF1.assign(rawDataReceiveF[r].data() + index, rawDataReceiveF[r].data() + index + vectorSize1);
-            if(multiPhase)
+            if(multiPhase1)
                 vectorsOfValuesH11.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize1);
-            //vectorsOfValuesH21.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize1);
+            if (multiPhase2)
+                vectorsOfValuesH21.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize1);
             index += vectorSize1;
 
             vectorsOfValuesF2.assign(rawDataReceiveF[r].data() + index, rawDataReceiveF[r].data() + index + vectorSize2);
-            if (multiPhase)
-                vectorsOfValuesH12.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize1);
-            //vectorsOfValuesH22.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize1);
+            if (multiPhase1)
+                vectorsOfValuesH12.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize2);
+            if (multiPhase2)
+                vectorsOfValuesH22.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize2);
             index += vectorSize2;
 
             vectorsOfValuesF3.assign(rawDataReceiveF[r].data() + index, rawDataReceiveF[r].data() + index + vectorSize3);
-            if (multiPhase)
-                vectorsOfValuesH13.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize1);
-                //vectorsOfValuesH23.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize1);
+            if (multiPhase1)
+                vectorsOfValuesH13.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize3);
+            if (multiPhase2)
+                vectorsOfValuesH23.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize3);
             index += vectorSize3;
 
             SPtr<DistributionArray3D> mFdistributions(new D3Q27EsoTwist3DSplittedVector());
@@ -1158,7 +1197,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
             dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX3(dataSetParamStr1.nx3);
 
             SPtr<DistributionArray3D> mH1distributions(new D3Q27EsoTwist3DSplittedVector());
-            if (multiPhase)
+            if (multiPhase1)
             {
                 dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
                     new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH11, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3])));
@@ -1172,22 +1211,25 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
                 dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setNX3(dataSetParamStr1.nx3);
             }
 
-            /*SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector());
-            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
+            SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector());
+            if (multiPhase2)
+            {
+                dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
                     new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH21, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3])));
-            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
-                    new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3])));
-            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
-                    vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2])));
-
-            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1);
-            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2);
-            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3);*/
-
+                dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
+                        new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3])));
+                dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+                        vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2])));
+
+                dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1);
+                dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2);
+                dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3);
+            }
 
             // find the nesessary block and fill it
             SPtr<Block3D> block = grid->getBlock(blockID);
             this->lbmKernel->setBlock(block);
+            this->lbmKernel->setNX(std::array<int, 3>{ {dataSetParamStr1.nx1, dataSetParamStr1.nx2, dataSetParamStr1.nx3}});
             SPtr<LBMKernel> kernel = this->lbmKernel->clone();
             LBMReal collFactor = LBMSystem::calcCollisionFactor(this->nue, block->getLevel());
             LBMReal collFactorL = LBMSystem::calcCollisionFactor(this->nuL, block->getLevel());
@@ -1199,14 +1241,16 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
             kernel->setDensityRatio(this->densityRatio);
             SPtr<DataSet3D> dataSetPtr = SPtr<DataSet3D>(new DataSet3D());
             dataSetPtr->setFdistributions(mFdistributions);
-            if (multiPhase)
+            if (multiPhase1)
                 dataSetPtr->setHdistributions(mH1distributions);
-//            dataSetPtr->setHdistributions(mH2distributions);
+            if (multiPhase2)
+                dataSetPtr->setH2distributions(mH2distributions);
             kernel->setDataSet(dataSetPtr);
             block->setKernel(kernel);
         }
     }
-    //if (comm->isRoot()) 
+
+    if (comm->isRoot()) 
     {
         UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet end of restore of data, rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
@@ -1254,9 +1298,12 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step)
     if (arrPresence.isPhaseField2Present)
         readArray(step, PhaseField2, std::string("/cpPhaseField2.bin"));
 
+    if (arrPresence.isPressureFieldPresent)
+        readArray(step, PressureField, std::string("/cpPressureField.bin"));
+
     delete[] rawDataReceiveF;
-//    delete[] rawDataReceiveH1;
-//    delete[] rawDataReceiveH2;
+    delete[] rawDataReceiveH1;
+    delete[] rawDataReceiveH2;
 }
 
 void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::string fname)
@@ -1337,7 +1384,7 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
 
     //----------------------------- restore data ---------------------------------
     int blockID;
-    std::vector<LBMReal> vectorsOfValues;
+    std::vector<double> vectorsOfValues;
     size_t index;
     size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
 
@@ -1399,6 +1446,11 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
                         vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
                     block->getKernel()->getDataSet()->setPhaseField2(___3DArray);
                     break;
+                case PressureField:
+                    ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+                        vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
+                    block->getKernel()->getDataSet()->setPressureField(___3DArray);
+                    break;
                 default:
                     UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBECoProcessor::readArray : array type does not exist!"));
                     break;
@@ -1622,11 +1674,7 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step)
                     bc->bcVelocityX2           = bcArray[ibc].bcVelocityX2;
                     bc->bcVelocityX3           = bcArray[ibc].bcVelocityX3;
                     bc->bcDensity              = bcArray[ibc].bcDensity;
-                    bc->bcLodiDensity          = bcArray[ibc].bcLodiDensity;
-                    bc->bcLodiVelocityX1       = bcArray[ibc].bcLodiVelocityX1;
-                    bc->bcLodiVelocityX2       = bcArray[ibc].bcLodiVelocityX2;
-                    bc->bcLodiVelocityX3       = bcArray[ibc].bcLodiVelocityX3;
-                    bc->bcLodiLentgh           = bcArray[ibc].bcLodiLentgh;
+                    bc->bcPhaseField           = bcArray[ibc].bcPhaseField;
 
                     bc->nx1 = bcArray[ibc].nx1;
                     bc->nx2 = bcArray[ibc].nx2;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h
index 7c9471246af0207d3baef1bb7e8e1726627d77b6..c60800ccd18e5ac523c5c85ea47219a96f8a69c5 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h
@@ -13,6 +13,7 @@ class UbScheduler;
 namespace vf::mpi {class Communicator;}
 class BCProcessor;
 class LBMKernel;
+class Grid3DVisitor;
 
 //! \class MPIWriteBlocksBECoProcessor
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
@@ -26,11 +27,12 @@ class MPIIOMigrationBECoProcessor : public MPIIOCoProcessor
         ShearStressVal      = 5,
         RelaxationFactor    = 6,
         PhaseField1         = 7,
-        PhaseField2 = 8
+        PhaseField2         = 8,
+        PressureField = 9
     };
 
 public:
-    MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+    MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path,
                                 std::shared_ptr<vf::mpi::Communicator> comm);
     ~MPIIOMigrationBECoProcessor() override;
     //! Each timestep writes the grid into the files
@@ -78,10 +80,6 @@ public:
     void blocksExchange(int tagN, int ind1, int ind2, int doubleCountInBlock, std::vector<double> &pV,
                         std::vector<double> *rawDataReceive);
 
-protected:
-    // std::string path;
-    // std::shared_ptr<vf::mpi::Communicator> comm;
-
 private:
     // MPI_Datatype gridParamType, block3dType;
     //   MPI_Datatype dataSetType, dataSetSmallType;
@@ -93,6 +91,7 @@ private:
     MPIIODataStructures::boundCondParam boundCondParamStr;
     SPtr<LBMKernel> lbmKernel;
     SPtr<BCProcessor> bcProcessor;
+    SPtr<Grid3DVisitor> metisVisitor;
     double nue;
     double nuL;
     double nuG;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
index daf31d6fd663574381d5d5d63263283f9681de7a..285d6c28ae92b3bad7fb6b1171f3a09a637e0729 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
@@ -10,7 +10,7 @@
 #include "DataSet3D.h"
 #include "Grid3D.h"
 #include "LBMKernel.h"
-#include "MetisPartitioningGridVisitor.h"
+#include "Grid3DVisitor.h"
 #include "PointerDefinitions.h"
 #include "RenumberBlockVisitor.h"
 #include "UbFileInputASCII.h"
@@ -22,10 +22,11 @@
 
 using namespace MPIIODataStructures;
 
-MPIIOMigrationCoProcessor::MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
+MPIIOMigrationCoProcessor::MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm)
     : MPIIOCoProcessor(grid, s, path, comm)
 {
     memset(&boundCondParamStr, 0, sizeof(boundCondParamStr));
+    metisVisitor = mV;
 
     //-------------------------   define MPI types  ---------------------------------
 
@@ -134,7 +135,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
     DataSetMigration *dataSetArray = new DataSetMigration[blocksCount];
     std::vector<double> doubleValuesArrayF; // double-values (arrays of f's) in all blocks  Fdistribution
     std::vector<double> doubleValuesArrayH1; // double-values (arrays of f's) in all blocks  H1distribution
-    // std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks  H2distribution
+    std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks  H2distribution
 
     if (comm->isRoot()) 
     {
@@ -142,8 +143,10 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
-    bool multiPhase = false;
+    bool multiPhase1 = false;
+    bool multiPhase2 = false;
     DSArraysPresence arrPresence;
+    memset(&arrPresence, 0, sizeof(arrPresence));
     bool firstBlock           = true;
     size_t doubleCountInBlock = 0;
     int ic                    = 0;
@@ -178,19 +181,20 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
             D3Q27EsoTwist3DSplittedVectorPtrH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getHdistributions());
             if (D3Q27EsoTwist3DSplittedVectorPtrH1 != 0)
             {
-                multiPhase = true;
+                multiPhase1 = true;
                 localDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getLocalDistributions();
                 nonLocalDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getNonLocalDistributions();
                 zeroDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getZeroDistributions();
             }
 
-            /*D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions());
+            D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions());
             if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0)
             {
+                multiPhase2 = true;
                 localDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getLocalDistributions();
                 nonLocalDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getNonLocalDistributions();
                 zeroDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getZeroDistributions();
-            }*/
+            }
 
             if (firstBlock) // && block->getKernel()) // when first (any) valid block...
             {
@@ -274,6 +278,12 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
                 else
                     arrPresence.isPhaseField2Present = false;
 
+                SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> pressureFieldPtr = block->getKernel()->getDataSet()->getPressureField();
+                if (pressureFieldPtr)
+                    arrPresence.isPressureFieldPresent = true;
+                else
+                    arrPresence.isPressureFieldPresent = false;
+
                 firstBlock = false;
             }
 
@@ -284,7 +294,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
             if (zeroDistributionsF && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0))
                 doubleValuesArrayF.insert(doubleValuesArrayF.end(), zeroDistributionsF->getDataVector().begin(), zeroDistributionsF->getDataVector().end());
 
-            if (multiPhase)
+            if (multiPhase1)
             {
                 if (localDistributionsH1 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0))
                     doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), localDistributionsH1->getDataVector().begin(), localDistributionsH1->getDataVector().end());
@@ -294,7 +304,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
                     doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), zeroDistributionsH1->getDataVector().begin(), zeroDistributionsH1->getDataVector().end());
             }
 
-            /*if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0)
+            if (multiPhase2)
             {
                 if (localDistributionsH2 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0))
                     doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), localDistributionsH2->getDataVector().begin(), localDistributionsH2->getDataVector().end());
@@ -302,8 +312,8 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
                     doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), nonLocalDistributionsH2->getDataVector().begin(), nonLocalDistributionsH2->getDataVector().end());
                 if (zeroDistributionsH2 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0))
                     doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), zeroDistributionsH2->getDataVector().begin(), zeroDistributionsH2->getDataVector().end());
-            }*/
-
+            }
+            
             ic++;
         }
     }
@@ -318,7 +328,6 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
-    
     double start {0.};
     double finish {0.};
     if (comm->isRoot())
@@ -356,7 +365,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
     MPI_File_close(&file_handler);
 
     //-------------------------------- H1 ----------------------------------------------------
-    if (multiPhase)
+    if (multiPhase1)
     {
         filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH1.bin";
         rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
@@ -376,7 +385,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
     }
 
     //-------------------------------- H2 ----------------------------------------------------
-    /*if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0)
+    if (multiPhase2)
     {
         filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin";
         rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
@@ -393,7 +402,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
 
         MPI_File_sync(file_handler);
         MPI_File_close(&file_handler);
-    }*/
+    }
     //--------------------------------
 
     MPI_Type_free(&dataSetDoubleType);
@@ -417,23 +426,18 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
 
     if (arrPresence.isAverageDensityArrayPresent)
         write4DArray(step, AverageDensity, std::string("/cpAverageDensityArray.bin"));
-    // writeAverageDensityArray(step);
 
     if (arrPresence.isAverageVelocityArrayPresent)
         write4DArray(step, AverageVelocity, std::string("/cpAverageVelocityArray.bin"));
-    // writeAverageVelocityArray(step);
 
     if (arrPresence.isAverageFluktuationsArrayPresent)
         write4DArray(step, AverageFluktuations, std::string("/cpAverageFluktuationsArray.bin"));
-    // writeAverageFluktuationsArray(step);
 
     if (arrPresence.isAverageTripleArrayPresent)
         write4DArray(step, AverageTriple, std::string("/cpAverageTripleArray.bin"));
-    // writeAverageTripleArray(step);
 
     if (arrPresence.isShearStressValArrayPresent)
         write4DArray(step, ShearStressVal, std::string("/cpShearStressValArray.bin"));
-    // writeShearStressValArray(step);
 
     if (arrPresence.isRelaxationFactorPresent)
         write3DArray(step, RelaxationFactor, std::string("/cpRelaxationFactor.bin"));
@@ -444,6 +448,9 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step)
     if (arrPresence.isPhaseField2Present)
         write3DArray(step, PhaseField2, std::string("/cpPhaseField2.bin"));
 
+    if (arrPresence.isPressureFieldPresent)
+        write3DArray(step, PressureField, std::string("/cpPressureField.bin"));
+
 }
 
 void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::string fname)
@@ -469,7 +476,7 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageDensityArray start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write4DArray start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -599,7 +606,7 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray start collect data to file = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
@@ -625,6 +632,9 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
                 case PhaseField2:
                     ___Array = block->getKernel()->getDataSet()->getPhaseField2();
                     break;
+                case PressureField:
+                    ___Array = block->getKernel()->getDataSet()->getPressureField();
+                    break;
                 default:
                     UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::write3DArray : 3D array type does not exist!"));
                     break;
@@ -706,732 +716,6 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st
     delete[] dataSetSmallArray;
 }
 
-/*
-void MPIIOMigrationCoProcessor::writeAverageDensityArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks!
-
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   std::vector<double> doubleValuesArray; // double-values of the AverageDensityArray in all blocks
-   dataSetParam dataSetParamStr;
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageDensityArray start collect data rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   bool firstBlock = true;
-   size_t doubleCountInBlock = 0;
-   int ic = 0;
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         dataSetSmallArray[ic].globalID = block->getGlobalID();     // id of the block needed to find it while
-regenerating the grid
-
-         SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > averageDensityArray =
-block->getKernel()->getDataSet()->getAverageDensity();
-
-         if (firstBlock) // when first (any) valid block...
-         {
-            //if (averageDensityArray)
-            //{
-            dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
-            dataSetParamStr.nx[0] = static_cast<int>(averageDensityArray->getNX1());
-            dataSetParamStr.nx[1] = static_cast<int>(averageDensityArray->getNX2());
-            dataSetParamStr.nx[2] = static_cast<int>(averageDensityArray->getNX3());
-            dataSetParamStr.nx[3] = static_cast<int>(averageDensityArray->getNX4());
-            doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3];
-            //}
-            //else
-            //   break;
-
-            firstBlock = false;
-         }
-
-         if (averageDensityArray && (dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2]
-> 0) && (dataSetParamStr.nx[3] > 0)) doubleValuesArray.insert(doubleValuesArray.end(),
-averageDensityArray->getDataVector().begin(), averageDensityArray->getDataVector().end());
-
-         ic++;
-      }
-   }
-
-   // register new MPI-types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageDensityArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_Info info = MPI_INFO_NULL;
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageDensityArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // each process writes common parameters of a dataSet
-   MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   MPI_Offset write_offset;
-   size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double);
-
-   for (size_t nb = 0; nb < blocksCount; nb++)
-   {
-      write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet);
-      MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-      MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE);
-   }
-
-   MPI_File_sync(file_handler);
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageDensityArray time: " << finish - start << " s");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::writeAverageVelocityArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks!
-
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks
-   dataSetParam dataSetParamStr;
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageVelocityArray start collect data rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   bool firstBlock = true;
-   size_t doubleCountInBlock = 0;
-   int ic = 0;
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         dataSetSmallArray[ic].globalID = block->getGlobalID();     // id of the block needed to find it while
-regenerating the grid
-
-         SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > AverageVelocityArray3DPtr =
-block->getKernel()->getDataSet()->getAverageVelocity();
-
-         if (firstBlock) // when first (any) valid block...
-         {
-            //if (AverageVelocityArray3DPtr)
-            //{
-            dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
-            dataSetParamStr.nx[0] = static_cast<int>(AverageVelocityArray3DPtr->getNX1());
-            dataSetParamStr.nx[1] = static_cast<int>(AverageVelocityArray3DPtr->getNX2());
-            dataSetParamStr.nx[2] = static_cast<int>(AverageVelocityArray3DPtr->getNX3());
-            dataSetParamStr.nx[3] = static_cast<int>(AverageVelocityArray3DPtr->getNX4());
-            doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3];
-            //}
-            //else
-            //   break;
-
-            firstBlock = false;
-         }
-
-         if (AverageVelocityArray3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) &&
-(dataSetParamStr.nx[2]>0) && (dataSetParamStr.nx[3]>0)) doubleValuesArray.insert(doubleValuesArray.end(),
-AverageVelocityArray3DPtr->getDataVector().begin(), AverageVelocityArray3DPtr->getDataVector().end());
-
-         ic++;
-      }
-   }
-
-   // register new MPI-types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageVelocityArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_Info info = MPI_INFO_NULL;
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageVelocityArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // each process writes common parameters of a dataSet
-   MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   MPI_Offset write_offset;
-   size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double);
-
-   for (size_t nb = 0; nb < blocksCount; nb++)
-   {
-      write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet);
-      MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-      MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE);
-   }
-
-   MPI_File_sync(file_handler);
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageVelocityArray time: " << finish - start << " s");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::writeAverageFluktuationsArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks!
-
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks
-   dataSetParam dataSetParamStr;
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageFluktuationsArray start collect data rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   bool firstBlock = true;
-   size_t doubleCountInBlock = 0;
-   int ic = 0;
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         dataSetSmallArray[ic].globalID = block->getGlobalID();     // id of the block needed to find it while
-regenerating the grid
-
-         SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > AverageFluctArray3DPtr =
-block->getKernel()->getDataSet()->getAverageFluctuations();
-
-         if (firstBlock) // when first (any) valid block...
-         {
-            //if (AverageFluctArray3DPtr)
-            //{
-            dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
-            dataSetParamStr.nx[0] = static_cast<int>(AverageFluctArray3DPtr->getNX1());
-            dataSetParamStr.nx[1] = static_cast<int>(AverageFluctArray3DPtr->getNX2());
-            dataSetParamStr.nx[2] = static_cast<int>(AverageFluctArray3DPtr->getNX3());
-            dataSetParamStr.nx[3] = static_cast<int>(AverageFluctArray3DPtr->getNX4());
-            doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3];
-            //}
-            //else
-            //   break;
-
-            firstBlock = false;
-         }
-
-         if (AverageFluctArray3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) &&
-(dataSetParamStr.nx[2]>0) && (dataSetParamStr.nx[3]>0)) doubleValuesArray.insert(doubleValuesArray.end(),
-AverageFluctArray3DPtr->getDataVector().begin(), AverageFluctArray3DPtr->getDataVector().end());
-
-         ic++;
-      }
-   }
-
-   // register new MPI-types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageFluktuationsArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_Info info = MPI_INFO_NULL;
-#ifdef HLRN_LUSTRE
-   MPI_Info_create(&info);
-   MPI_Info_set(info, "striping_factor", "40");
-   MPI_Info_set(info, "striping_unit", "4M");
-#endif
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageFluktuationsArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // each process writes common parameters of a dataSet
-   MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   MPI_Offset write_offset;
-   size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double);
-
-   for (size_t nb = 0; nb < blocksCount; nb++)
-   {
-      write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet);
-      MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-      MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE);
-   }
-
-   MPI_File_sync(file_handler);
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageFluktuationsArray time: " << finish - start << " s");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::writeAverageTripleArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks!
-
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks
-   dataSetParam dataSetParamStr;
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageTripleArray start collect data rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   bool firstBlock = true;
-   size_t doubleCountInBlock = 0;
-   int ic = 0;
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         dataSetSmallArray[ic].globalID = block->getGlobalID();     // id of the block needed to find it while
-regenerating the grid
-
-         SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > AverageTripleArray3DPtr =
-block->getKernel()->getDataSet()->getAverageTriplecorrelations();
-
-         if (firstBlock) // when first (any) valid block...
-         {
-            //if (AverageTripleArray3DPtr)
-            //{
-            dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
-            dataSetParamStr.nx[0] = static_cast<int>(AverageTripleArray3DPtr->getNX1());
-            dataSetParamStr.nx[1] = static_cast<int>(AverageTripleArray3DPtr->getNX2());
-            dataSetParamStr.nx[2] = static_cast<int>(AverageTripleArray3DPtr->getNX3());
-            dataSetParamStr.nx[3] = static_cast<int>(AverageTripleArray3DPtr->getNX4());
-            doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3];
-            //}
-            //else
-            //   break;
-
-            firstBlock = false;
-         }
-
-         if (AverageTripleArray3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) &&
-(dataSetParamStr.nx[2]>0) && (dataSetParamStr.nx[3]>0)) doubleValuesArray.insert(doubleValuesArray.end(),
-AverageTripleArray3DPtr->getDataVector().begin(), AverageTripleArray3DPtr->getDataVector().end());
-
-         ic++;
-      }
-   }
-
-   // register new MPI-types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageTripleArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_Info info = MPI_INFO_NULL;
-
-#ifdef HLRN_LUSTRE
-   MPI_Info_create(&info);
-   MPI_Info_set(info, "striping_factor", "40");
-   MPI_Info_set(info, "striping_unit", "4M");
-#endif
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageTripleArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // each process writes common parameters of a dataSet
-   MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   MPI_Offset write_offset;
-   size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double);
-
-   for (size_t nb = 0; nb < blocksCount; nb++)
-   {
-      write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet);
-      MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-      MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE);
-   }
-
-   MPI_File_sync(file_handler);
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageTripleArray time: " << finish - start << " s");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::writeShearStressValArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks!
-
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks
-   dataSetParam dataSetParamStr;
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeShearStressValArray start collect data rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   bool firstBlock = true;
-   size_t doubleCountInBlock = 0;
-   int ic = 0;
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         dataSetSmallArray[ic].globalID = block->getGlobalID();     // id of the block needed to find it while
-regenerating the grid
-
-         SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > ShearStressValArray3DPtr =
-block->getKernel()->getDataSet()->getShearStressValues();
-
-         if (firstBlock) // when first (any) valid block...
-         {
-            //if (ShearStressValArray3DPtr)
-            //{
-            dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
-            dataSetParamStr.nx[0] = static_cast<int>(ShearStressValArray3DPtr->getNX1());
-            dataSetParamStr.nx[1] = static_cast<int>(ShearStressValArray3DPtr->getNX2());
-            dataSetParamStr.nx[2] = static_cast<int>(ShearStressValArray3DPtr->getNX3());
-            dataSetParamStr.nx[3] = static_cast<int>(ShearStressValArray3DPtr->getNX4());
-            doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3];
-            //}
-            //else
-            //   break;
-
-            firstBlock = false;
-         }
-
-         if (ShearStressValArray3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) &&
-(dataSetParamStr.nx[2]>0) && (dataSetParamStr.nx[3]>0)) doubleValuesArray.insert(doubleValuesArray.end(),
-ShearStressValArray3DPtr->getDataVector().begin(), ShearStressValArray3DPtr->getDataVector().end());
-
-         ic++;
-      }
-   }
-
-   // register new MPI-types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeShearStressValArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_Info info = MPI_INFO_NULL;
-
-#ifdef HLRN_LUSTRE
-   MPI_Info_create(&info);
-   MPI_Info_set(info, "striping_factor", "40");
-   MPI_Info_set(info, "striping_unit", "4M");
-#endif
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpShearStressValArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // each process writes common parameters of a dataSet
-   MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   MPI_Offset write_offset;
-   size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double);
-
-   for (size_t nb = 0; nb < blocksCount; nb++)
-   {
-      write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet);
-      MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-      MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE);
-   }
-
-   MPI_File_sync(file_handler);
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeShearStressValArray time: " << finish - start << " s");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::writeRelaxationFactor(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks!
-
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks
-   dataSetParam dataSetParamStr;
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeRelaxationFactor start collect data rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   bool firstBlock = true;
-   size_t doubleCountInBlock = 0;
-   int ic = 0;
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         dataSetSmallArray[ic].globalID = block->getGlobalID();     // id of the block needed to find it while
-regenerating the grid
-
-         SPtr< CbArray3D<LBMReal, IndexerX3X2X1> > relaxationFactor3DPtr =
-block->getKernel()->getDataSet()->getRelaxationFactor();
-
-         if (firstBlock) // when first (any) valid block...
-         {
-            //if (relaxationFactor3DPtr)
-            //{
-            dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
-            dataSetParamStr.nx[0] = static_cast<int>(relaxationFactor3DPtr->getNX1());
-            dataSetParamStr.nx[1] = static_cast<int>(relaxationFactor3DPtr->getNX2());
-            dataSetParamStr.nx[2] = static_cast<int>(relaxationFactor3DPtr->getNX3());
-            dataSetParamStr.nx[3] = 1;
-            doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3];
-            //}
-            //else
-            //   break;
-
-            firstBlock = false;
-         }
-
-         if (relaxationFactor3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) &&
-(dataSetParamStr.nx[2]>0)) doubleValuesArray.insert(doubleValuesArray.end(),
-relaxationFactor3DPtr->getDataVector().begin(), relaxationFactor3DPtr->getDataVector().end());
-
-         ic++;
-      }
-   }
-
-   // register new MPI-types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeRelaxationFactor start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_Info info = MPI_INFO_NULL;
-
-#ifdef HLRN_LUSTRE
-   MPI_Info_create(&info);
-   MPI_Info_set(info, "striping_factor", "40");
-   MPI_Info_set(info, "striping_unit", "4M");
-#endif
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpRelaxationFactor.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // each process writes common parameters of a dataSet
-   MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   MPI_Offset write_offset;
-   size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double);
-
-   for (size_t nb = 0; nb < blocksCount; nb++)
-   {
-      write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet);
-      MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-      MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE);
-   }
-
-   MPI_File_sync(file_handler);
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeRelaxationFactor time: " << finish - start << " s");
-   }
-
-   delete[] dataSetSmallArray;
-}
-*/
 void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
 {
     int rank, size;
@@ -1498,11 +782,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step)
                     bouCond->bcVelocityX2           = (float)bcArr->bcvector[bc]->getBoundaryVelocityX2();
                     bouCond->bcVelocityX3           = (float)bcArr->bcvector[bc]->getBoundaryVelocityX3();
                     bouCond->bcDensity              = (float)bcArr->bcvector[bc]->getBoundaryDensity();
-                    bouCond->bcLodiDensity          = (float)bcArr->bcvector[bc]->getDensityLodiDensity();
-                    bouCond->bcLodiVelocityX1       = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX1();
-                    bouCond->bcLodiVelocityX2       = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX2();
-                    bouCond->bcLodiVelocityX3       = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX3();
-                    bouCond->bcLodiLentgh           = (float)bcArr->bcvector[bc]->getDensityLodiLength();
+                    bouCond->bcPhaseField           = (float)bcArr->bcvector[bc]->getBoundaryPhaseField();
                     bouCond->nx1                    = (float)bcArr->bcvector[bc]->nx1;
                     bouCond->nx2                    = (float)bcArr->bcvector[bc]->nx2;
                     bouCond->nx3                    = (float)bcArr->bcvector[bc]->nx3;
@@ -1637,7 +917,6 @@ void MPIIOMigrationCoProcessor::restart(int step)
 
     readBlocks(step);
 
-    SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY));
     grid->accept(metisVisitor);
 
     readDataSet(step);
@@ -1668,7 +947,8 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
     if (comm->isRoot())
         start = MPI_Wtime();
 
-    bool multiPhase = false;
+    bool multiPhase1 = false;
+    bool multiPhase2 = false;
     size_t blocksCount = 0; // quantity of the blocks, that belong to this process
     dataSetParam dataSetParamStr1, dataSetParamStr2, dataSetParamStr3;
 
@@ -1699,7 +979,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
         dataSetParamStr3.nx[0] * dataSetParamStr3.nx[1] * dataSetParamStr3.nx[2] * dataSetParamStr3.nx[3];
     std::vector<double> doubleValuesArrayF(size_t(blocksCount * doubleCountInBlock)); // double-values in all blocks  Fdistributions
     std::vector<double> doubleValuesArrayH1; // double-values in all blocks  H1distributions
-    //std::vector<double> doubleValuesArrayH2; // double-values in all blocks  H2distributions
+    std::vector<double> doubleValuesArrayH2; // double-values in all blocks  H2distributions
 
     // define MPI_types depending on the block-specific information
     MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType);
@@ -1724,6 +1004,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
     MPI_File_close(&file_handler);
 
     //----------------------------------------- H1 ----------------------------------------------------
+    ic = 0;
     MPI_Offset fsize;
     filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH1.bin";
     rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
@@ -1732,7 +1013,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
     MPI_File_get_size(file_handler, &fsize);
     if (fsize > 0)
     {
-        multiPhase = true;
+        multiPhase1 = true;
         doubleValuesArrayH1.resize(blocksCount * doubleCountInBlock);
 
         sizeofOneDataSet = size_t(doubleCountInBlock * sizeof(double));
@@ -1749,27 +1030,33 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
 
     }
     MPI_File_close(&file_handler);
-
     //----------------------------------------- H2 ----------------------------------------------------
-  /*filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin";
+    ic = 0;
+    filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin";
     rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
     if (rc != MPI_SUCCESS)
         throw UbException(UB_EXARGS, "couldn't open file " + filename);
 
-    sizeofOneDataSet = size_t(doubleCountInBlock * sizeof(double));
-    doubleValuesArrayH2.resize(blocksCount * doubleCountInBlock);
-
-    for (int level = minInitLevel; level <= maxInitLevel; level++) 
+    MPI_File_get_size(file_handler, &fsize);
+    if (fsize > 0)
     {
-        for (SPtr<Block3D> block : blocksVector[level]) //	blocks of the current level
+        multiPhase2 = true;
+        doubleValuesArrayH2.resize(blocksCount * doubleCountInBlock);
+
+        sizeofOneDataSet = size_t(doubleCountInBlock * sizeof(double));
+
+        for (int level = minInitLevel; level <= maxInitLevel; level++)
         {
-            read_offset = (MPI_Offset)(block->getGlobalID() * sizeofOneDataSet);
-            MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[ic * doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE);
-            ic++;
+            for (SPtr<Block3D> block : blocksVector[level]) //	blocks of the current level
+            {
+                read_offset = (MPI_Offset)(block->getGlobalID() * sizeofOneDataSet);
+                MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[ic * doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE);
+                ic++;
+            }
         }
-    }
 
-    MPI_File_close(&file_handler);*/
+    }
+    MPI_File_close(&file_handler);
 
     MPI_Type_free(&dataSetDoubleType);
 
@@ -1782,9 +1069,9 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
     }
 
     size_t index = 0;
-    std::vector<LBMReal> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3;
-    std::vector<LBMReal> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13;
-    //std::vector<LBMReal> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23;
+    std::vector<double> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3;
+    std::vector<double> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13;
+    std::vector<double> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23;
 
     size_t vectorSize1 = dataSetParamStr1.nx[0] * dataSetParamStr1.nx[1] * dataSetParamStr1.nx[2] * dataSetParamStr1.nx[3];
     size_t vectorSize2 = dataSetParamStr2.nx[0] * dataSetParamStr2.nx[1] * dataSetParamStr2.nx[2] * dataSetParamStr2.nx[3];
@@ -1793,37 +1080,37 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
     for (std::size_t n = 0; n < blocksCount; n++) 
     {
         vectorsOfValuesF1.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize1);
-        if(multiPhase)
+        if(multiPhase1)
             vectorsOfValuesH11.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize1);
-        //vectorsOfValuesH21.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize1);
+        if (multiPhase2)
+            vectorsOfValuesH21.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize1);
         index += vectorSize1;
 
         vectorsOfValuesF2.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize2);
-        if (multiPhase)
+        if (multiPhase1)
             vectorsOfValuesH12.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize2);
-        //vectorsOfValuesH22.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize2);
+        if (multiPhase2)
+            vectorsOfValuesH22.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize2);
         index += vectorSize2;
 
         vectorsOfValuesF3.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize3);
-        if (multiPhase)
+        if (multiPhase1)
             vectorsOfValuesH13.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize3);
-        //vectorsOfValuesH23.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize3);
+        if (multiPhase2)
+            vectorsOfValuesH23.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize3);
         index += vectorSize3;
-
+ 
         SPtr<DistributionArray3D> mFdistributions(new D3Q27EsoTwist3DSplittedVector());
         dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
-                new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesF1, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3])));
+            new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesF1, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3])));
         dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
-                new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesF2, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3])));
+            new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesF2, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3])));
         dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
-                    vectorsOfValuesF3, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2])));
-
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX1(dataSetParamStr1.nx1);
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX2(dataSetParamStr1.nx2);
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX3(dataSetParamStr1.nx3);
-
+            vectorsOfValuesF3, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2])));
+        
+        //----------------------------------------- H1 ----------------------------------------------------
        SPtr<DistributionArray3D> mH1distributions(new D3Q27EsoTwist3DSplittedVector());
-       if (multiPhase)
+       if (multiPhase1)
         {
             dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
                 new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH11, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3])));
@@ -1837,21 +1124,31 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
             dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setNX3(dataSetParamStr1.nx3);
          }
 
-        /*SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector());
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
+        SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector());
+        if (multiPhase2)
+        {
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
                 new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH21, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3])));
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
-                new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3])));
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
-                vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2])));
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
+                    new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3])));
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+                    vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2])));
+
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1);
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2);
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3);
+        }
 
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1);
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2);
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3);*/
+        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX1(dataSetParamStr1.nx1);
+        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX2(dataSetParamStr1.nx2);
+        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX3(dataSetParamStr1.nx3);
 
         // find the nesessary block and fill it
         SPtr<Block3D> block = grid->getBlock(dataSetArray[n].globalID);
         this->lbmKernel->setBlock(block);
+        this->lbmKernel->setNX(std::array<int, 3>{ {dataSetParamStr1.nx1, dataSetParamStr1.nx2, dataSetParamStr1.nx3}});
+        UbTupleInt3 blockNX = grid->getBlockNX();
+        this->lbmKernel->setNX(std::array<int, 3>{ { val<1>(blockNX), val<2>(blockNX), val<3>(blockNX) } });
         SPtr<LBMKernel> kernel = this->lbmKernel->clone();
         kernel->setGhostLayerWidth(dataSetArray[n].ghostLayerWidth);
         kernel->setCollisionFactor(dataSetArray[n].collFactor);
@@ -1863,9 +1160,10 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
 
         SPtr<DataSet3D> dataSetPtr = SPtr<DataSet3D>(new DataSet3D());
         dataSetPtr->setFdistributions(mFdistributions);
-        if (multiPhase)
+        if (multiPhase1)
             dataSetPtr->setHdistributions(mH1distributions);
-        //dataSetPtr->setH2distributions(mH2distributions);
+        if (multiPhase2)
+            dataSetPtr->setH2distributions(mH2distributions);
         kernel->setDataSet(dataSetPtr);
         block->setKernel(kernel);
     }
@@ -1891,27 +1189,21 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
 
     if (arrPresence.isAverageDensityArrayPresent)
         readArray(step, AverageDensity, std::string("/cpAverageDensityArray.bin"));
-    // readAverageDensityArray(step);
 
     if (arrPresence.isAverageVelocityArrayPresent)
         readArray(step, AverageVelocity, std::string("/cpAverageVelocityArray.bin"));
-    //   readAverageVelocityArray(step);
 
     if (arrPresence.isAverageFluktuationsArrayPresent)
         readArray(step, AverageFluktuations, std::string("/cpAverageFluktuationsArray.bin"));
-    //   readAverageFluktuationsArray(step);
 
     if (arrPresence.isAverageTripleArrayPresent)
         readArray(step, AverageTriple, std::string("/cpAverageTripleArray.bin"));
-    //  readAverageTripleArray(step);
 
     if (arrPresence.isShearStressValArrayPresent)
         readArray(step, ShearStressVal, std::string("/cpShearStressValArray.bin"));
-    //   readShearStressValArray(step);
 
     if (arrPresence.isRelaxationFactorPresent)
         readArray(step, RelaxationFactor, std::string("/cpRelaxationFactor.bin"));
-    //   readRelaxationFactor(step);
  
     if (arrPresence.isPhaseField1Present)
         readArray(step, PhaseField1, std::string("/cpPhaseField1.bin"));
@@ -1919,6 +1211,9 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
     if (arrPresence.isPhaseField2Present)
         readArray(step, PhaseField2, std::string("/cpPhaseField2.bin"));
 
+    if (arrPresence.isPressureFieldPresent)
+        readArray(step, PressureField, std::string("/cpPressureField.bin"));
+
 }
 
 void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string fname)
@@ -1929,7 +1224,7 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
 
     if (comm->isRoot()) 
     {
-        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray start fname = " << fname);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
     
@@ -1997,19 +1292,19 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
 
     //----------------------------- restore data ---------------------------------
     size_t index = 0;
-    size_t nextVectorSize =
-        dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
-    std::vector<LBMReal> vectorsOfValues;
-    for (std::size_t n = 0; n < blocksCount; n++) {
+    size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> vectorsOfValues;
+    SPtr<CbArray4D<LBMReal, IndexerX4X3X2X1>> ___4DArray;
+    SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> ___3DArray;
+
+    for (std::size_t n = 0; n < blocksCount; n++)
+    {
         SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID);
 
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
         // fill arrays
-        SPtr<CbArray4D<LBMReal, IndexerX4X3X2X1>> ___4DArray;
-        SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> ___3DArray;
-
         switch (arrType) 
         {
             case AverageDensity:
@@ -2052,6 +1347,11 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
                     vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
                 block->getKernel()->getDataSet()->setPhaseField2(___3DArray);
                 break;
+            case PressureField:
+                ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+                    vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
+                block->getKernel()->getDataSet()->setPressureField(___3DArray);
+                break;
             default:
                 UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::readArray : array type does not exist!"));
                 break;
@@ -2067,648 +1367,6 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string
     delete[] dataSetSmallArray;
 }
 
-/*void MPIIOMigrationCoProcessor::readAverageDensityArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageDensityArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageDensityArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // read count of blocks
-   size_t blocksCount = 0;
-   dataSetParam dataSetParamStr;
-   memset(&dataSetParamStr, 0, sizeof(dataSetParam));
-
-   // read from the grid the blocks, that belong to this process
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all
-blocks
-
-   // define MPI_types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   size_t ic = 0;
-   MPI_Offset read_offset;
-   size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double));
-
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet);
-         MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-         MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++;
-      }
-   }
-
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageDensityArray time: " << finish - start << " s");
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageDensityArray start of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   size_t index = 0;
-   size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++)
-   {
-      vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
-      index += nextVectorSize;
-
-      // fill mAverageDensity arrays
-      SPtr<AverageValuesArray3D> mAverageDensity;
-      //if
-((dataSetParamStr.nx[0]==0)&&(dataSetParamStr.nx[1]==0)&&(dataSetParamStr.nx[2]==0)&&(dataSetParamStr.nx[3]==0))
-      //   mAverageDensity = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr();
-      //else
-      mAverageDensity = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal,
-IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2],
-dataSetParamStr.nx[3]));
-
-      //std::cout << "rank=" << rank << ", dataSetArray[n].globalID=" << dataSetSmallArray[n].globalID << std::endl;
-      // find the nesessary block and fill it
-      SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID);
-      block->getKernel()->getDataSet()->setAverageDensity(mAverageDensity);
-   }
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageDensityArray end of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::readAverageVelocityArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageVelocityArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageVelocityArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // read count of blocks
-   size_t blocksCount = 0;
-   dataSetParam dataSetParamStr;
-   memset(&dataSetParamStr, 0, sizeof(dataSetParam));
-
-   // read from the grid the blocks, that belong to this process
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all
-blocks
-
-   // define MPI_types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   size_t ic = 0;
-   MPI_Offset read_offset;
-   size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double));
-
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet);
-         MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-         MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++;
-      }
-   }
-
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageVelocityArray time: " << finish - start << " s");
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageVelocityArray start of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   size_t index = 0;
-   size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++)
-   {
-      vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
-      index += nextVectorSize;
-
-      // fill mAverageVelocity array
-      SPtr<AverageValuesArray3D> mAverageVelocity;
-      //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0) &&
-(dataSetParamStr.nx[3] == 0))
-      //   mAverageVelocity = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr();
-      //else
-      mAverageVelocity = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal,
-IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2],
-dataSetParamStr.nx[3]));
-
-      // find the nesessary block and fill it
-      SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID);
-      block->getKernel()->getDataSet()->setAverageVelocity(mAverageVelocity);
-   }
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageVelocityArray end of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::readAverageFluktuationsArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageFluktuationsArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageFluktuationsArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // read count of blocks
-   size_t blocksCount = 0;
-   dataSetParam dataSetParamStr;
-   memset(&dataSetParamStr, 0, sizeof(dataSetParam));
-
-   // read from the grid the blocks, that belong to this process
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   int doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all
-blocks
-
-   // define MPI_types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   size_t ic = 0;
-   MPI_Offset read_offset;
-   size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double));
-
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet);
-         MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-         MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++;
-      }
-   }
-
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageFluktuationsArray time: " << finish - start << " s");
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageFluktuationsArray start of restore of data, rank = " <<
-rank); UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   size_t index = 0;
-   size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++)
-   {
-      vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
-      index += nextVectorSize;
-
-      // fill AverageFluktuations array
-      SPtr<AverageValuesArray3D> mAverageFluktuations;
-      //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0) &&
-(dataSetParamStr.nx[3] == 0))
-      //   mAverageFluktuations = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr();
-      //else
-      mAverageFluktuations = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal,
-IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2],
-dataSetParamStr.nx[3]));
-
-      // find the nesessary block and fill it
-      SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID);
-      block->getKernel()->getDataSet()->setAverageFluctuations(mAverageFluktuations);
-   }
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageFluktuationsArray end of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::readAverageTripleArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageTripleArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageTripleArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // read count of blocks
-   size_t blocksCount = 0;
-   dataSetParam dataSetParamStr;
-   memset(&dataSetParamStr, 0, sizeof(dataSetParam));
-
-   // read from the grid the blocks, that belong to this process
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all
-blocks
-
-   // define MPI_types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   size_t ic = 0;
-   MPI_Offset read_offset;
-   size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double));
-
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet);
-         MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-         MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++;
-      }
-   }
-
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageTripleArray time: " << finish - start << " s");
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageTripleArray start of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   size_t index = 0;
-   size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++)
-   {
-      vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
-      index += nextVectorSize;
-
-      // fill AverageTriplecorrelations array
-      SPtr<AverageValuesArray3D> mAverageTriplecorrelations;
-      //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0) &&
-(dataSetParamStr.nx[3] == 0))
-      //   mAverageTriplecorrelations = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr();
-      //else
-      mAverageTriplecorrelations = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal,
-IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2],
-dataSetParamStr.nx[3]));
-
-      // find the nesessary block and fill it
-      SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID);
-      block->getKernel()->getDataSet()->setAverageTriplecorrelations(mAverageTriplecorrelations);
-   }
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageTripleArray end of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::readShearStressValArray(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readShearStressValArray start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpShearStressValArray.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // read count of blocks
-   size_t blocksCount = 0;
-   dataSetParam dataSetParamStr;
-   memset(&dataSetParamStr, 0, sizeof(dataSetParam));
-
-   // read from the grid the blocks, that belong to this process
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all
-blocks
-
-   // define MPI_types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   size_t ic = 0;
-   MPI_Offset read_offset;
-   size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double));
-
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet);
-         MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-         MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++;
-      }
-   }
-
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readShearStressValArray time: " << finish - start << " s");
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readShearStressValArray start of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   size_t index = 0;
-   size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++)
-   {
-      vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
-      index += nextVectorSize;
-
-      // fill ShearStressValuesArray array
-      SPtr<ShearStressValuesArray3D> mShearStressValues;
-      //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0) &&
-(dataSetParamStr.nx[3] == 0))
-      //   mShearStressValues = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr();
-      //else
-      mShearStressValues = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal,
-IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2],
-dataSetParamStr.nx[3]));
-
-      // find the nesessary block and fill it
-      SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID);
-      block->getKernel()->getDataSet()->setShearStressValues(mShearStressValues);
-   }
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readShearStressValArray end of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   delete[] dataSetSmallArray;
-}
-
-void MPIIOMigrationCoProcessor::readRelaxationFactor(int step)
-{
-   int rank, size;
-   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readRelaxationFactor start MPI IO rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-   
-    double start {0.};
-    double finish {0.};
-   if (comm->isRoot()) start = MPI_Wtime();
-
-   MPI_File file_handler;
-   std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpRelaxationFactor.bin";
-   int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
-   if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename);
-
-   // read count of blocks
-   size_t blocksCount = 0;
-   dataSetParam dataSetParamStr;
-   memset(&dataSetParamStr, 0, sizeof(dataSetParam));
-
-   // read from the grid the blocks, that belong to this process
-   std::vector<SPtr<Block3D>> blocksVector[25];
-   int minInitLevel = this->grid->getCoarsestInitializedLevel();
-   int maxInitLevel = this->grid->getFinestInitializedLevel();
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      grid->getBlocks(level, rank, blocksVector[level]);
-      blocksCount += static_cast<int>(blocksVector[level].size());
-   }
-
-   MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
-
-   DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount];
-   size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all
-blocks
-
-   // define MPI_types depending on the block-specific information
-   MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
-   MPI_Type_commit(&dataSetDoubleType);
-
-   size_t ic = 0;
-   MPI_Offset read_offset;
-   size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double));
-
-   for (int level = minInitLevel; level <= maxInitLevel; level++)
-   {
-      for (SPtr<Block3D> block : blocksVector[level])  //	blocks of the current level
-      {
-         read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet);
-         MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE);
-         MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic
-* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++;
-      }
-   }
-
-   MPI_File_close(&file_handler);
-   MPI_Type_free(&dataSetDoubleType);
-
-   if (comm->isRoot())
-   {
-      finish = MPI_Wtime();
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readRelaxationFactor time: " << finish - start << " s");
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readRelaxationFactor start of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   size_t index = 0;
-   size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] *
-dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++)
-   {
-      vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
-      index += nextVectorSize;
-
-      // fill RelaxationFactor array
-      SPtr<RelaxationFactorArray3D> mRelaxationFactor;
-      //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0))
-      //   mRelaxationFactor = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr();
-      //else
-      mRelaxationFactor = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal,
-IndexerX3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
-
-      // find the nesessary block and fill it
-      SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID);
-      block->getKernel()->getDataSet()->setRelaxationFactor(mRelaxationFactor);
-   }
-
-   if (comm->isRoot())
-   {
-      UBLOG(logINFO, "MPIIOMigrationCoProcessor::readRelaxationFactor end of restore of data, rank = " << rank);
-      UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() /
-1073741824.0 << " GB");
-   }
-
-   delete[] dataSetSmallArray;
-}
-*/
-
 void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
 {
     int rank, size;
@@ -2816,11 +1474,7 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step)
                     bc->bcVelocityX2           = bcArray[ibc].bcVelocityX2;
                     bc->bcVelocityX3           = bcArray[ibc].bcVelocityX3;
                     bc->bcDensity              = bcArray[ibc].bcDensity;
-                    bc->bcLodiDensity          = bcArray[ibc].bcLodiDensity;
-                    bc->bcLodiVelocityX1       = bcArray[ibc].bcLodiVelocityX1;
-                    bc->bcLodiVelocityX2       = bcArray[ibc].bcLodiVelocityX2;
-                    bc->bcLodiVelocityX3       = bcArray[ibc].bcLodiVelocityX3;
-                    bc->bcLodiLentgh           = bcArray[ibc].bcLodiLentgh;
+                    bc->bcPhaseField           = bcArray[ibc].bcPhaseField;
 
                     bc->nx1 = bcArray[ibc].nx1;
                     bc->nx2 = bcArray[ibc].nx2;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h
index 1293d38d4a9f9a7ff7174db3473288cc1af70c4e..b822b783edd3628f947aadf20d6dc6109e9e3c31 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h
@@ -12,6 +12,7 @@ class UbScheduler;
 namespace vf::mpi {class Communicator;}
 class BCProcessor;
 class LBMKernel;
+class Grid3DVisitor;
 
 //! \class MPIWriteBlocksCoProcessor
 //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating
@@ -26,10 +27,11 @@ public:
         ShearStressVal      = 5,
         RelaxationFactor = 6,
         PhaseField1 = 7,
-        PhaseField2 = 8
+        PhaseField2 = 8,
+        PressureField = 9
     };
 
-    MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
+    MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
     ~MPIIOMigrationCoProcessor() override;
     //! Each timestep writes the grid into the files
     void process(double step) override;
@@ -71,10 +73,6 @@ public:
     void clearAllFiles(int step);
     // void setNu(double nu);
 
-protected:
-    // std::string path;
-    // std::shared_ptr<vf::mpi::Communicator> comm;
-
 private:
     // MPI_Datatype gridParamType, block3dType;
     MPI_Datatype dataSetType, dataSetSmallType, dataSetDoubleType;
@@ -83,7 +81,7 @@ private:
     MPIIODataStructures::boundCondParam boundCondParamStr;
     SPtr<LBMKernel> lbmKernel;
     SPtr<BCProcessor> bcProcessor;
-    // double nue;
+    SPtr<Grid3DVisitor> metisVisitor;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
index 2a35d2d203a242a1ddc89ab431f6772e49ceb98b..ea45bb14110a071724f816b3c7840ce0dfbd7327 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
@@ -9,7 +9,7 @@
 #include "D3Q27System.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMKernel.h"
 #include "UbFileInputASCII.h"
 #include "UbFileOutputASCII.h"
@@ -140,7 +140,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
     DataSetRestart *dataSetArray = new DataSetRestart[blocksCount];
     std::vector<double> doubleValuesArrayF; // double-values (arrays of f's) in all blocks  Fdistribution
     std::vector<double> doubleValuesArrayH1; // double-values (arrays of f's) in all blocks  H1distribution
-    // std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks  H2distribution
+    std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks  H2distribution
 
     if (comm->isRoot()) 
     {
@@ -148,7 +148,8 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
-    bool multiPhase = false;
+    bool multiPhase1 = false;
+    bool multiPhase2 = false;
     DSArraysPresence arrPresence;
     bool firstBlock        = true;
     int doubleCountInBlock = 0;
@@ -188,36 +189,40 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
             D3Q27EsoTwist3DSplittedVectorPtrH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getHdistributions());
             if (D3Q27EsoTwist3DSplittedVectorPtrH1 != 0)
             {
-                multiPhase = true;
+                multiPhase1 = true;
                 localDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getLocalDistributions();
                 nonLocalDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getNonLocalDistributions();
                 zeroDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getZeroDistributions();
             }
 
-            /*D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions());
+            D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions());
             if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0)
             {
+                multiPhase2 = true;
                 localDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getLocalDistributions();
                 nonLocalDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getNonLocalDistributions();
                 zeroDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getZeroDistributions();
-            }*/
+            }
 
             if (firstBlock) // when first (any) valid block...
             {
-                if (localDistributionsF) {
+                if (localDistributionsF) 
+                {
                     dataSetParamStr1.nx[0] = static_cast<int>(localDistributionsF->getNX1());
                     dataSetParamStr1.nx[1] = static_cast<int>(localDistributionsF->getNX2());
                     dataSetParamStr1.nx[2] = static_cast<int>(localDistributionsF->getNX3());
                     dataSetParamStr1.nx[3] = static_cast<int>(localDistributionsF->getNX4());
                 }
 
-                if (nonLocalDistributionsF) {
+                if (nonLocalDistributionsF) 
+                {
                     dataSetParamStr2.nx[0] = static_cast<int>(nonLocalDistributionsF->getNX1());
                     dataSetParamStr2.nx[1] = static_cast<int>(nonLocalDistributionsF->getNX2());
                     dataSetParamStr2.nx[2] = static_cast<int>(nonLocalDistributionsF->getNX3());
                     dataSetParamStr2.nx[3] = static_cast<int>(nonLocalDistributionsF->getNX4());
                 }
-                if (zeroDistributionsF) {
+                if (zeroDistributionsF) 
+                {
                     dataSetParamStr3.nx[0] = static_cast<int>(zeroDistributionsF->getNX1());
                     dataSetParamStr3.nx[1] = static_cast<int>(zeroDistributionsF->getNX2());
                     dataSetParamStr3.nx[2] = static_cast<int>(zeroDistributionsF->getNX3());
@@ -281,6 +286,12 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
                 else
                     arrPresence.isPhaseField2Present = false;
 
+                SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> pressureFieldPtr = block->getKernel()->getDataSet()->getPressureField();
+                if (pressureFieldPtr)
+                    arrPresence.isPressureFieldPresent = true;
+                else
+                    arrPresence.isPressureFieldPresent = false;
+
                 firstBlock = false;
             }
 
@@ -291,7 +302,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
             if (zeroDistributionsF && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0))
                 doubleValuesArrayF.insert(doubleValuesArrayF.end(), zeroDistributionsF->getDataVector().begin(), zeroDistributionsF->getDataVector().end());
 
-            if (multiPhase)
+            if (multiPhase1)
             {
                 if (localDistributionsH1 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0))
                     doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), localDistributionsH1->getDataVector().begin(), localDistributionsH1->getDataVector().end());
@@ -300,15 +311,17 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
                 if (zeroDistributionsH1 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0))
                     doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), zeroDistributionsH1->getDataVector().begin(), zeroDistributionsH1->getDataVector().end());
             }
-
-            /*if (localDistributionsH2 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0))
-                doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), localDistributionsH2->getDataVector().begin(), localDistributionsH2->getDataVector().end());
-            if (nonLocalDistributionsH2 && (dataSetParamStr2.nx[0] > 0) && (dataSetParamStr2.nx[1] > 0) && (dataSetParamStr2.nx[2] > 0) && (dataSetParamStr2.nx[3] > 0))
-                doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), nonLocalDistributionsH2->getDataVector().begin(), nonLocalDistributionsH2->getDataVector().end());
-            if (zeroDistributionsH2 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0))
-                doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), zeroDistributionsH2->getDataVector().begin(), zeroDistributionsH2->getDataVector().end());*/
-
-            ic++;
+            if (multiPhase2)
+            {
+                if (localDistributionsH2 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0))
+                    doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), localDistributionsH2->getDataVector().begin(), localDistributionsH2->getDataVector().end());
+                if (nonLocalDistributionsH2 && (dataSetParamStr2.nx[0] > 0) && (dataSetParamStr2.nx[1] > 0) && (dataSetParamStr2.nx[2] > 0) && (dataSetParamStr2.nx[3] > 0))
+                    doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), nonLocalDistributionsH2->getDataVector().begin(), nonLocalDistributionsH2->getDataVector().end());
+                if (zeroDistributionsH2 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0))
+                    doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), zeroDistributionsH2->getDataVector().begin(), zeroDistributionsH2->getDataVector().end());
+             }
+
+           ic++;
         }
     }
 
@@ -381,7 +394,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
     MPI_File_close(&file_handler);
 
     //------------------------------------------------------------------------------------------------------------------
-    if (multiPhase)
+    if (multiPhase1)
     {
         filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH1.bin";
         rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
@@ -396,20 +409,23 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
         MPI_File_close(&file_handler);
     }
 
-    //--------------------------------------------------------------------------------------------------------------------
-    /*filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin";
-    rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
-    if (rc != MPI_SUCCESS)
-        throw UbException(UB_EXARGS, "couldn't open file " + filename);
+        //--------------------------------------------------------------------------------------------------------------------
+    if (multiPhase2)
+    {
+        filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin";
+        rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
+        if (rc != MPI_SUCCESS)
+            throw UbException(UB_EXARGS, "couldn't open file " + filename);
 
-    // each process writes the dataSet arrays
-    if (doubleValuesArrayH1.size() > 0)
-        MPI_File_write_at(file_handler, write_offset, &doubleValuesArrayH2[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
+        // each process writes the dataSet arrays
+        if (doubleValuesArrayH2.size() > 0)
+            MPI_File_write_at(file_handler, write_offset, &doubleValuesArrayH2[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
 
-    MPI_File_sync(file_handler);
-    MPI_File_close(&file_handler);*/
+        MPI_File_sync(file_handler);
+        MPI_File_close(&file_handler);
+    }
+    //------------------------------------------------------------------------------------------------------------------------
 
-    //--------------------------------
     MPI_Type_free(&dataSetDoubleType);
 
     delete[] dataSetArray;
@@ -430,6 +446,33 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
     MPI_File_close(&file_handler1);
 
     if (arrPresence.isAverageDensityArrayPresent)
+        write4DArray(step, AverageDensity, std::string("/cpAverageDensityArray.bin"));
+
+    if (arrPresence.isAverageVelocityArrayPresent)
+        write4DArray(step, AverageVelocity, std::string("/cpAverageVelocityArray.bin"));
+
+    if (arrPresence.isAverageFluktuationsArrayPresent)
+        write4DArray(step, AverageFluktuations, std::string("/cpAverageFluktuationsArray.bin"));
+
+    if (arrPresence.isAverageTripleArrayPresent)
+        write4DArray(step, AverageTriple, std::string("/cpAverageTripleArray.bin"));
+
+    if (arrPresence.isShearStressValArrayPresent)
+        write4DArray(step, ShearStressVal, std::string("/cpShearStressValArray.bin"));
+
+    if (arrPresence.isRelaxationFactorPresent)
+        write3DArray(step, RelaxationFactor, std::string("/cpRelaxationFactor.bin"));
+
+    if (arrPresence.isPhaseField1Present)
+        write3DArray(step, PhaseField1, std::string("/cpPhaseField1.bin"));
+
+    if (arrPresence.isPhaseField2Present)
+        write3DArray(step, PhaseField2, std::string("/cpPhaseField2.bin"));
+
+    if (arrPresence.isPressureFieldPresent)
+        write3DArray(step, PressureField, std::string("/cpPressureField.bin"));
+
+    /*if (arrPresence.isAverageDensityArrayPresent)
         writeAverageDensityArray(step);
 
     if (arrPresence.isAverageVelocityArrayPresent)
@@ -452,9 +495,327 @@ void MPIIORestartCoProcessor::writeDataSet(int step)
 
     if (arrPresence.isPhaseField2Present)
         writePhaseField(step, 2);
+
+    if (arrPresence.isPressureFieldPresent)
+        writePressureField(step);*/
+
+}
+
+void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::string fname)
+{
+    int rank, size;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks!
+
+    std::vector<SPtr<Block3D>> blocksVector[25];
+    int minInitLevel = this->grid->getCoarsestInitializedLevel();
+    int maxInitLevel = this->grid->getFinestInitializedLevel();
+    for (int level = minInitLevel; level <= maxInitLevel; level++)
+    {
+        grid->getBlocks(level, rank, blocksVector[level]);
+        blocksCount += static_cast<int>(blocksVector[level].size());
+    }
+
+    DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount];
+    std::vector<double> doubleValuesArray; // double-values of the AverageDensityArray in all blocks
+    dataSetParam dataSetParamStr;
+
+    if (comm->isRoot())
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::writeAverageDensityArray start collect data to file = " << fname);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    bool firstBlock = true;
+    int doubleCountInBlock = 0;
+    int ic = 0;
+    SPtr<CbArray4D<LBMReal, IndexerX4X3X2X1>> ___Array;
+
+    for (int level = minInitLevel; level <= maxInitLevel; level++)
+    {
+        for (SPtr<Block3D> block : blocksVector[level]) //	blocks of the current level
+        {
+            dataSetSmallArray[ic].x1 = block->getX1(); // coordinates of the block needed to find it while regenerating the grid
+            dataSetSmallArray[ic].x2 = block->getX2();
+            dataSetSmallArray[ic].x3 = block->getX3();
+            dataSetSmallArray[ic].level = block->getLevel();
+
+            switch (arrayType)
+            {
+            case AverageDensity:
+                ___Array = block->getKernel()->getDataSet()->getAverageDensity();
+                break;
+            case AverageVelocity:
+                ___Array = block->getKernel()->getDataSet()->getAverageVelocity();
+                break;
+            case AverageFluktuations:
+                ___Array = block->getKernel()->getDataSet()->getAverageFluctuations();
+                break;
+            case AverageTriple:
+                ___Array = block->getKernel()->getDataSet()->getAverageTriplecorrelations();
+                break;
+            case ShearStressVal:
+                ___Array = block->getKernel()->getDataSet()->getShearStressValues();
+                break;
+            default:
+                UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::write4DArray : 4D array type does not exist!"));
+                break;
+            }
+
+            if (firstBlock) // when first (any) valid block...
+            {
+                dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
+                dataSetParamStr.nx[0] = static_cast<int>(___Array->getNX1());
+                dataSetParamStr.nx[1] = static_cast<int>(___Array->getNX2());
+                dataSetParamStr.nx[2] = static_cast<int>(___Array->getNX3());
+                dataSetParamStr.nx[3] = static_cast<int>(___Array->getNX4());
+                doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+
+                firstBlock = false;
+            }
+
+            if (___Array && (dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0) && (dataSetParamStr.nx[3] > 0))
+                doubleValuesArray.insert(doubleValuesArray.end(), ___Array->getDataVector().begin(), ___Array->getDataVector().end());
+
+            ic++;
+        }
+    }
+ 
+     // register new MPI-types depending on the block-specific information
+    MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType);
+    MPI_Type_commit(&dataSetDoubleType);
+
+    if (comm->isRoot())
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::write4DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    // write to the file
+    // all processes calculate their offsets (quantity of bytes that the process is going to write)
+    // and notify the next process (with the rank = rank + 1)
+    MPI_Offset write_offset = (MPI_Offset)(size * sizeof(int));
+    size_t next_write_offset = 0;
+
+    if (size > 1)
+    {
+        if (rank == 0)
+        {
+            next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD);
+        }
+        else
+        {
+            MPI_Recv(&write_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+            next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            if (rank < size - 1)
+                MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD);
+        }
+    }
+
+    double start{ 0. };
+    double finish{ 0. };
+    if (comm->isRoot())
+        start = MPI_Wtime();
+
+    MPI_Info info = MPI_INFO_NULL;
+
+#ifdef HLRN_LUSTRE
+    MPI_Info_create(&info);
+    MPI_Info_set(info, "striping_factor", "40");
+    MPI_Info_set(info, "striping_unit", "4M");
+#endif
+
+    MPI_File file_handler;
+    std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + fname;
+    int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
+    if (rc != MPI_SUCCESS)
+        throw UbException(UB_EXARGS, "couldn't open file " + filename);
+
+    // each process writes the quantity of it's blocks
+    MPI_File_write_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE);
+    // each process writes common parameters of a dataSet
+    MPI_File_write_at(file_handler, write_offset, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
+    // each process writes data identifying blocks
+    MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount, dataSetSmallType, MPI_STATUS_IGNORE);
+    // each process writes the dataSet arrays
+    if (doubleValuesArray.size() > 0)
+        MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)),
+            &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
+
+    MPI_File_sync(file_handler);
+    MPI_File_close(&file_handler);
+    MPI_Type_free(&dataSetDoubleType);
+
+    if (comm->isRoot())
+    {
+        finish = MPI_Wtime();
+        UBLOG(logINFO, "MPIIORestartCoProcessor::write4DArray time: " << finish - start << " s");
+    }
+
+    delete[] dataSetSmallArray;
+}
+
+void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::string fname)
+{
+   int rank, size;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks!
+
+    std::vector<SPtr<Block3D>> blocksVector[25];
+    int minInitLevel = this->grid->getCoarsestInitializedLevel();
+    int maxInitLevel = this->grid->getFinestInitializedLevel();
+    for (int level = minInitLevel; level <= maxInitLevel; level++)
+    {
+        grid->getBlocks(level, rank, blocksVector[level]);
+        blocksCount += static_cast<int>(blocksVector[level].size());
+    }
+
+    DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount];
+    std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks
+    dataSetParam dataSetParamStr;
+
+    if (comm->isRoot())
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::write3DArray start collect data to file = " << fname);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    bool firstBlock = true;
+    size_t doubleCountInBlock = 0;
+    int ic = 0;
+    SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> ___Array;
+
+    for (int level = minInitLevel; level <= maxInitLevel; level++)
+    {
+        for (SPtr<Block3D> block : blocksVector[level]) //	blocks of the current level
+        {
+            dataSetSmallArray[ic].x1 = block->getX1(); // coordinates of the block needed to find it while regenerating the grid
+            dataSetSmallArray[ic].x2 = block->getX2();
+            dataSetSmallArray[ic].x3 = block->getX3();
+            dataSetSmallArray[ic].level = block->getLevel();
+
+            switch (arrayType)
+            {
+            case RelaxationFactor:
+                ___Array = block->getKernel()->getDataSet()->getRelaxationFactor();
+                break;
+            case PhaseField1:
+                ___Array = block->getKernel()->getDataSet()->getPhaseField();
+                break;
+            case PhaseField2:
+                ___Array = block->getKernel()->getDataSet()->getPhaseField2();
+                break;
+            case PressureField:
+                ___Array = block->getKernel()->getDataSet()->getPressureField();
+                break;
+            default:
+                UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::write3DArray : 3D array type does not exist!"));
+                break;
+            }
+
+            if (firstBlock) // when first (any) valid block...
+            {
+                dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
+                dataSetParamStr.nx[0] = static_cast<int>(___Array->getNX1());
+                dataSetParamStr.nx[1] = static_cast<int>(___Array->getNX2());
+                dataSetParamStr.nx[2] = static_cast<int>(___Array->getNX3());
+                dataSetParamStr.nx[3] = 1;
+                doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+
+                firstBlock = false;
+            }
+
+            if (___Array && (dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0))
+                doubleValuesArray.insert(doubleValuesArray.end(), ___Array->getDataVector().begin(), ___Array->getDataVector().end());
+
+            ic++;
+        }
+    }
+
+     // register new MPI-types depending on the block-specific information
+    MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType);
+    MPI_Type_commit(&dataSetDoubleType);
+
+    if (comm->isRoot())
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::write3DArray start MPI IO rank = " << rank);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    // write to the file
+    // all processes calculate their offsets (quantity of bytes that the process is going to write)
+    // and notify the next process (with the rank = rank + 1)
+    MPI_Offset write_offset = (MPI_Offset)(size * sizeof(int));
+    size_t next_write_offset = 0;
+
+    if (size > 1)
+    {
+        if (rank == 0)
+        {
+            next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD);
+    }
+        else
+        {
+            MPI_Recv(&write_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+            next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            if (rank < size - 1)
+                MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD);
+        }
+}
+
+
+    double start{ 0. };
+    double finish{ 0. };
+    if (comm->isRoot())
+        start = MPI_Wtime();
+
+    MPI_Info info = MPI_INFO_NULL;
+
+#ifdef HLRN_LUSTRE
+    MPI_Info_create(&info);
+    MPI_Info_set(info, "striping_factor", "40");
+    MPI_Info_set(info, "striping_unit", "4M");
+#endif
+
+    MPI_File file_handler;
+    std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + fname;
+    int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
+    if (rc != MPI_SUCCESS)
+        throw UbException(UB_EXARGS, "couldn't open file " + filename);
+
+    // each process writes the quantity of it's blocks
+    MPI_File_write_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE);
+    // each process writes common parameters of a dataSet
+    MPI_File_write_at(file_handler, write_offset, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
+    // each process writes data identifying blocks
+    MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount,
+        dataSetSmallType, MPI_STATUS_IGNORE);
+    // each process writes the dataSet arrays
+    if (doubleValuesArray.size() > 0)
+        MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)),
+            &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
+
+
+    MPI_File_sync(file_handler);
+    MPI_File_close(&file_handler);
+    MPI_Type_free(&dataSetDoubleType);
+
+    if (comm->isRoot())
+    {
+        finish = MPI_Wtime();
+        UBLOG(logINFO, "MPIIORestartCoProcessor ::write3DArray time: " << finish - start << " s");
+    }
+
+    delete[] dataSetSmallArray;
 }
 
-void MPIIORestartCoProcessor::writeAverageDensityArray(int step)
+/*void MPIIORestartCoProcessor::writeAverageDensityArray(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1287,7 +1648,150 @@ void MPIIORestartCoProcessor::writeRelaxationFactor(int step)
     delete[] dataSetSmallArray;
 }
 
-void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN)
+void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN)
+{
+    int rank, size;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks!
+
+    std::vector<SPtr<Block3D>> blocksVector[25];
+    int minInitLevel = this->grid->getCoarsestInitializedLevel();
+    int maxInitLevel = this->grid->getFinestInitializedLevel();
+    for (int level = minInitLevel; level <= maxInitLevel; level++) 
+    {
+        grid->getBlocks(level, rank, blocksVector[level]);
+        blocksCount += static_cast<int>(blocksVector[level].size());
+    }
+
+    DataSetSmallRestart *dataSetSmallArray = new DataSetSmallRestart[blocksCount];
+    std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks
+    dataSetParam dataSetParamStr;
+
+    if (comm->isRoot()) 
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField start collect data rank = " << rank);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    bool firstBlock        = true;
+    int doubleCountInBlock = 0;
+    int ic                 = 0;
+    SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> PhaseField3DPtr;
+
+    for (int level = minInitLevel; level <= maxInitLevel; level++) 
+    {
+        for (SPtr<Block3D> block : blocksVector[level]) //	blocks of the current level
+        {
+            dataSetSmallArray[ic].x1 = block->getX1(); // coordinates of the block needed to find it while regenerating the grid
+            dataSetSmallArray[ic].x2 = block->getX2();
+            dataSetSmallArray[ic].x3 = block->getX3();
+            dataSetSmallArray[ic].level = block->getLevel();
+
+            if(fieldN == 1)
+                PhaseField3DPtr = block->getKernel()->getDataSet()->getPhaseField();
+            else
+                PhaseField3DPtr = block->getKernel()->getDataSet()->getPhaseField2();
+
+            if (firstBlock) // when first (any) valid block...
+            {
+                dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
+                dataSetParamStr.nx[0] = static_cast<int>(PhaseField3DPtr->getNX1());
+                dataSetParamStr.nx[1] = static_cast<int>(PhaseField3DPtr->getNX2());
+                dataSetParamStr.nx[2] = static_cast<int>(PhaseField3DPtr->getNX3());
+                dataSetParamStr.nx[3] = 1;
+                doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+                std::cout << "writePhaseField"<<fieldN<< " = " << dataSetParamStr.nx[0] << " " << dataSetParamStr.nx[1] << " " << dataSetParamStr.nx[2] << std::endl;
+                firstBlock = false;
+            }
+            if ((dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0))
+                doubleValuesArray.insert(doubleValuesArray.end(), PhaseField3DPtr->getDataVector().begin(), PhaseField3DPtr->getDataVector().end());
+
+            ic++;
+        }
+    }
+        
+    // register new MPI-types depending on the block-specific information
+    MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
+    MPI_Type_commit(&dataSetDoubleType);
+
+    if (comm->isRoot()) 
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField start MPI IO rank = " << rank);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    // write to the file
+    // all processes calculate their offsets (quantity of bytes that the process is going to write)
+    // and notify the next process (with the rank = rank + 1)
+    MPI_Offset write_offset  = (MPI_Offset)(size * sizeof(int));
+    size_t next_write_offset = 0;
+
+    if (size > 1) 
+    {
+        if (rank == 0) 
+        {
+            next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD);
+        } 
+        else 
+        {
+            MPI_Recv(&write_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+            next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            if (rank < size - 1)
+                MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD);
+        }
+    }
+
+    
+    double start {0.};
+    double finish {0.};
+    if (comm->isRoot())
+        start = MPI_Wtime();
+
+    MPI_Info info = MPI_INFO_NULL;
+
+#ifdef HLRN_LUSTRE
+    MPI_Info_create(&info);
+    MPI_Info_set(info, "striping_factor", "40");
+    MPI_Info_set(info, "striping_unit", "4M");
+#endif
+
+    MPI_File file_handler;
+    std::string filename;
+    if(fieldN == 1) filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPhaseField1.bin";
+    else filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPhaseField2.bin";
+    int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
+    if (rc != MPI_SUCCESS)
+        throw UbException(UB_EXARGS, "couldn't open file " + filename);
+
+    // each process writes the quantity of it's blocks
+    MPI_File_write_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE);
+    // each process writes common parameters of a dataSet
+    MPI_File_write_at(file_handler, write_offset, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
+    // each process writes data identifying blocks
+    MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount,
+                      dataSetSmallType, MPI_STATUS_IGNORE);
+    // each process writes the dataSet arrays
+    if (doubleValuesArray.size() > 0)
+        MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)),
+                          &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
+
+    MPI_File_sync(file_handler);
+    MPI_File_close(&file_handler);
+    MPI_Type_free(&dataSetDoubleType);
+
+    if (comm->isRoot()) 
+    {
+        finish = MPI_Wtime();
+        UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField time: " << finish - start << " s");
+    }
+
+    delete[] dataSetSmallArray;
+}
+
+void MPIIORestartCoProcessor::writePressureField(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1298,28 +1802,28 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN)
     std::vector<SPtr<Block3D>> blocksVector[25];
     int minInitLevel = this->grid->getCoarsestInitializedLevel();
     int maxInitLevel = this->grid->getFinestInitializedLevel();
-    for (int level = minInitLevel; level <= maxInitLevel; level++) 
+    for (int level = minInitLevel; level <= maxInitLevel; level++)
     {
         grid->getBlocks(level, rank, blocksVector[level]);
         blocksCount += static_cast<int>(blocksVector[level].size());
     }
 
-    DataSetSmallRestart *dataSetSmallArray = new DataSetSmallRestart[blocksCount];
+    DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount];
     std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks
     dataSetParam dataSetParamStr;
 
-    if (comm->isRoot()) 
+    if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField start collect data rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartCoProcessor::writePressureField start collect data rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
-    bool firstBlock        = true;
+    bool firstBlock = true;
     int doubleCountInBlock = 0;
-    int ic                 = 0;
-    SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> PhaseField3DPtr;
+    int ic = 0;
+    SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> PressureField3DPtr;
 
-    for (int level = minInitLevel; level <= maxInitLevel; level++) 
+    for (int level = minInitLevel; level <= maxInitLevel; level++)
     {
         for (SPtr<Block3D> block : blocksVector[level]) //	blocks of the current level
         {
@@ -1328,53 +1832,53 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN)
             dataSetSmallArray[ic].x3 = block->getX3();
             dataSetSmallArray[ic].level = block->getLevel();
 
-            if(fieldN == 1)
-                PhaseField3DPtr = block->getKernel()->getDataSet()->getPhaseField();
-            else
-                PhaseField3DPtr = block->getKernel()->getDataSet()->getPhaseField2();
+            PressureField3DPtr = block->getKernel()->getDataSet()->getPressureField();
 
             if (firstBlock) // when first (any) valid block...
             {
                 dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0;
-                dataSetParamStr.nx[0] = static_cast<int>(PhaseField3DPtr->getNX1());
-                dataSetParamStr.nx[1] = static_cast<int>(PhaseField3DPtr->getNX2());
-                dataSetParamStr.nx[2] = static_cast<int>(PhaseField3DPtr->getNX3());
+                dataSetParamStr.nx[0] = static_cast<int>(PressureField3DPtr->getNX1());
+                dataSetParamStr.nx[1] = static_cast<int>(PressureField3DPtr->getNX2());
+                dataSetParamStr.nx[2] = static_cast<int>(PressureField3DPtr->getNX3());
                 dataSetParamStr.nx[3] = 1;
                 doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
 
                 firstBlock = false;
             }
-            if ((dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0))
-                doubleValuesArray.insert(doubleValuesArray.end(), PhaseField3DPtr->getDataVector().begin(), PhaseField3DPtr->getDataVector().end());
 
+            if ((dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0))
+                doubleValuesArray.insert(doubleValuesArray.end(), PressureField3DPtr->getDataVector().begin(),
+                    PressureField3DPtr->getDataVector().end());
+ 
             ic++;
         }
     }
-        
-    // register new MPI-types depending on the block-specific information
+    //doubleValuesArrayRW.assign(doubleValuesArray.begin(), doubleValuesArray.end());
+    //std::cout << "doubleValuesArrayRW = " << doubleValuesArrayRW.size() << std::endl;
+   // register new MPI-types depending on the block-specific information
     MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
     MPI_Type_commit(&dataSetDoubleType);
 
-    if (comm->isRoot()) 
+    if (comm->isRoot())
     {
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField start MPI IO rank = " << rank);
+        UBLOG(logINFO, "MPIIORestartCoProcessor::writePressureField start MPI IO rank = " << rank);
         UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
     }
 
     // write to the file
     // all processes calculate their offsets (quantity of bytes that the process is going to write)
     // and notify the next process (with the rank = rank + 1)
-    MPI_Offset write_offset  = (MPI_Offset)(size * sizeof(int));
+    MPI_Offset write_offset = (MPI_Offset)(size * sizeof(int));
     size_t next_write_offset = 0;
 
-    if (size > 1) 
+    if (size > 1)
     {
-        if (rank == 0) 
+        if (rank == 0)
         {
             next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
             MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD);
-        } 
-        else 
+        }
+        else
         {
             MPI_Recv(&write_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
             next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
@@ -1383,9 +1887,9 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN)
         }
     }
 
-    
-    double start {0.};
-    double finish {0.};
+
+    double start{ 0. };
+    double finish{ 0. };
     if (comm->isRoot())
         start = MPI_Wtime();
 
@@ -1398,9 +1902,7 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN)
 #endif
 
     MPI_File file_handler;
-    std::string filename;
-    if(fieldN == 1) filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPhaseField1.bin";
-    else filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPhaseField2.bin";
+    std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPressureField.bin";
     int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler);
     if (rc != MPI_SUCCESS)
         throw UbException(UB_EXARGS, "couldn't open file " + filename);
@@ -1411,24 +1913,24 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN)
     MPI_File_write_at(file_handler, write_offset, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
     // each process writes data identifying blocks
     MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount,
-                      dataSetSmallType, MPI_STATUS_IGNORE);
+        dataSetSmallType, MPI_STATUS_IGNORE);
     // each process writes the dataSet arrays
     if (doubleValuesArray.size() > 0)
         MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)),
-                          &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
+            &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
 
     MPI_File_sync(file_handler);
     MPI_File_close(&file_handler);
     MPI_Type_free(&dataSetDoubleType);
 
-    if (comm->isRoot()) 
+    if (comm->isRoot())
     {
         finish = MPI_Wtime();
-        UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartCoProcessor::writePressureField time: " << finish - start << " s");
     }
 
     delete[] dataSetSmallArray;
-}
+}*/
 
 void MPIIORestartCoProcessor::writeBoundaryConds(int step)
 {
@@ -1495,11 +1997,7 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step)
                     bouCond->bcVelocityX2           = (float)bcArr->bcvector[bc]->getBoundaryVelocityX2();
                     bouCond->bcVelocityX3           = (float)bcArr->bcvector[bc]->getBoundaryVelocityX3();
                     bouCond->bcDensity              = (float)bcArr->bcvector[bc]->getBoundaryDensity();
-                    bouCond->bcLodiDensity          = (float)bcArr->bcvector[bc]->getDensityLodiDensity();
-                    bouCond->bcLodiVelocityX1       = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX1();
-                    bouCond->bcLodiVelocityX2       = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX2();
-                    bouCond->bcLodiVelocityX3       = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX3();
-                    bouCond->bcLodiLentgh           = (float)bcArr->bcvector[bc]->getDensityLodiLength();
+                    bouCond->bcPhaseField           = (float)bcArr->bcvector[bc]->getBoundaryPhaseField();
                     bouCond->nx1                    = (float)bcArr->bcvector[bc]->nx1;
                     bouCond->nx2                    = (float)bcArr->bcvector[bc]->nx2;
                     bouCond->nx3                    = (float)bcArr->bcvector[bc]->nx3;
@@ -1685,7 +2183,8 @@ void MPIIORestartCoProcessor::readDataSet(int step)
     // calculate the read offset
     MPI_Offset read_offset  = (MPI_Offset)(size * sizeof(int));
     size_t next_read_offset = 0;
-    bool multiPhase = false;
+    bool multiPhase1 = false;
+    bool multiPhase2 = false;
 
     // read count of blocks
     int blocksCount = 0;
@@ -1702,7 +2201,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
         dataSetParamStr3.nx[0] * dataSetParamStr3.nx[1] * dataSetParamStr3.nx[2] * dataSetParamStr3.nx[3];
     std::vector<double> doubleValuesArrayF(size_t(blocksCount * doubleCountInBlock)); // double-values in all blocks  Fdistributions
     std::vector<double> doubleValuesArrayH1; // double-values in all blocks  H1distributions
-    //std::vector<double> doubleValuesArrayH2; // double-values in all blocks  H2distributions
+    std::vector<double> doubleValuesArrayH2; // double-values in all blocks  H2distributions
 
     //   define MPI_types depending on the block-specific information
     MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType);
@@ -1738,21 +2237,27 @@ void MPIIORestartCoProcessor::readDataSet(int step)
     MPI_File_get_size(file_handler, &fsize);
     if (fsize > 0)
     {
-        multiPhase = true;
+        multiPhase1 = true;
         doubleValuesArrayH1.resize(blocksCount * doubleCountInBlock);
         MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH1[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
     }
     MPI_File_close(&file_handler);
 
     //-------------------------------------- H2 -----------------------------
-       /*filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin";
+    filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin";
     rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
     if (rc != MPI_SUCCESS)
         throw UbException(UB_EXARGS, "couldn't open file " + filename);
 
-    doubleValuesArrayH2.resize(blocksCount * doubleCountInBlock);
-    MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
-    MPI_File_close(&file_handler);*/
+    MPI_File_get_size(file_handler, &fsize);
+    if (fsize > 0)
+    {
+        multiPhase2 = true;
+        doubleValuesArrayH2.resize(blocksCount * doubleCountInBlock);
+        MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
+    }
+    MPI_File_close(&file_handler);
+    //-------------------------------------------------------------------
 
     MPI_Type_free(&dataSetDoubleType);
 
@@ -1765,9 +2270,9 @@ void MPIIORestartCoProcessor::readDataSet(int step)
     }
     
     size_t index = 0;
-    std::vector<LBMReal> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3;
-    std::vector<LBMReal> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13;
-    //std::vector<LBMReal> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23;
+    std::vector<double> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3;
+    std::vector<double> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13;
+    std::vector<double> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23;
     size_t vectorSize1 = dataSetParamStr1.nx[0] * dataSetParamStr1.nx[1] * dataSetParamStr1.nx[2] * dataSetParamStr1.nx[3];
     size_t vectorSize2 = dataSetParamStr2.nx[0] * dataSetParamStr2.nx[1] * dataSetParamStr2.nx[2] * dataSetParamStr2.nx[3];
     size_t vectorSize3 = dataSetParamStr3.nx[0] * dataSetParamStr3.nx[1] * dataSetParamStr3.nx[2] * dataSetParamStr3.nx[3];
@@ -1775,21 +2280,24 @@ void MPIIORestartCoProcessor::readDataSet(int step)
     for (int n = 0; n < blocksCount; n++) 
     {
         vectorsOfValuesF1.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize1);
-        if (multiPhase)
+        if (multiPhase1)
             vectorsOfValuesH11.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize1);
-        //vectorsOfValuesH21.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize1);
+        if (multiPhase2)
+            vectorsOfValuesH21.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize1);
         index += vectorSize1;
 
         vectorsOfValuesF2.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize2);
-        if (multiPhase)
+        if (multiPhase1)
             vectorsOfValuesH12.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize2);
-        //vectorsOfValuesH22.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize2);
+        if (multiPhase2)
+            vectorsOfValuesH22.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize2);
         index += vectorSize2;
 
         vectorsOfValuesF3.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize3);
-        if (multiPhase)
+        if (multiPhase1)
             vectorsOfValuesH13.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize3);
-        //vectorsOfValuesH23.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize3);
+        if (multiPhase2)
+            vectorsOfValuesH23.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize3);
         index += vectorSize3;
 
         SPtr<DistributionArray3D> mFdistributions(new D3Q27EsoTwist3DSplittedVector());
@@ -1805,7 +2313,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
         dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX3(dataSetParamStr1.nx3);
 
         SPtr<DistributionArray3D> mH1distributions(new D3Q27EsoTwist3DSplittedVector());
-        if (multiPhase)
+        if (multiPhase1)
         {
             dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
                 new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH11, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3])));
@@ -1818,22 +2326,27 @@ void MPIIORestartCoProcessor::readDataSet(int step)
             dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setNX2(dataSetParamStr1.nx2);
             dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setNX3(dataSetParamStr1.nx3);
         }
-        /*SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector());
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
-                new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH21, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3])));
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
-                new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3])));
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
-                vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2])));
-
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1);
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2);
-        dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3);*/
-         
+
+        SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector());
+        if (multiPhase2)
+        {
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
+                    new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH21, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3])));
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(
+                    new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3])));
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+                    vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2])));
+
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1);
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2);
+            dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3);
+        }
+
         // find the nesessary block and fill it
         SPtr<Block3D> block = grid->getBlock(dataSetArray[n].x1, dataSetArray[n].x2, dataSetArray[n].x3, dataSetArray[n].level);
    
         this->lbmKernel->setBlock(block);
+        this->lbmKernel->setNX(std::array<int, 3>{{dataSetParamStr1.nx1, dataSetParamStr1.nx2, dataSetParamStr1.nx3}});
         SPtr<LBMKernel> kernel = this->lbmKernel->clone();
         kernel->setGhostLayerWidth(dataSetArray[n].ghostLayerWidth);
         kernel->setCollisionFactor(dataSetArray[n].collFactor);
@@ -1845,9 +2358,10 @@ void MPIIORestartCoProcessor::readDataSet(int step)
 
         SPtr<DataSet3D> dataSetPtr = SPtr<DataSet3D>(new DataSet3D());
         dataSetPtr->setFdistributions(mFdistributions);
-        if (multiPhase)
+        if (multiPhase1)
             dataSetPtr->setHdistributions(mH1distributions);
-        //dataSetPtr->setH2distributions(mH2distributions);
+        if (multiPhase2)
+            dataSetPtr->setH2distributions(mH2distributions);
         kernel->setDataSet(dataSetPtr);
         block->setKernel(kernel);
     }
@@ -1871,7 +2385,7 @@ void MPIIORestartCoProcessor::readDataSet(int step)
     MPI_File_read_at(file_handler1, (MPI_Offset)0, &arrPresence, 1, arrayPresenceType, MPI_STATUS_IGNORE);
     MPI_File_close(&file_handler1);
 
-    if (arrPresence.isAverageDensityArrayPresent)
+    /*if (arrPresence.isAverageDensityArrayPresent)
         readAverageDensityArray(step);
 
     if (arrPresence.isAverageVelocityArrayPresent)
@@ -1894,9 +2408,194 @@ void MPIIORestartCoProcessor::readDataSet(int step)
 
     if (arrPresence.isPhaseField2Present)
         readPhaseField(step, 2);
+
+    if (arrPresence.isPressureFieldPresent)
+        readPressureField(step);*/
+
+    if (arrPresence.isAverageDensityArrayPresent)
+        readArray(step, AverageDensity, std::string("/cpAverageDensityArray.bin"));
+
+    if (arrPresence.isAverageVelocityArrayPresent)
+        readArray(step, AverageVelocity, std::string("/cpAverageVelocityArray.bin"));
+
+    if (arrPresence.isAverageFluktuationsArrayPresent)
+        readArray(step, AverageFluktuations, std::string("/cpAverageFluktuationsArray.bin"));
+
+    if (arrPresence.isAverageTripleArrayPresent)
+        readArray(step, AverageTriple, std::string("/cpAverageTripleArray.bin"));
+
+    if (arrPresence.isShearStressValArrayPresent)
+        readArray(step, ShearStressVal, std::string("/cpShearStressValArray.bin"));
+
+    if (arrPresence.isRelaxationFactorPresent)
+        readArray(step, RelaxationFactor, std::string("/cpRelaxationFactor.bin"));
+
+    if (arrPresence.isPhaseField1Present)
+        readArray(step, PhaseField1, std::string("/cpPhaseField1.bin"));
+
+    if (arrPresence.isPhaseField2Present)
+        readArray(step, PhaseField2, std::string("/cpPhaseField2.bin"));
+
+    if (arrPresence.isPressureFieldPresent)
+        readArray(step, PressureField, std::string("/cpPressureField.bin"));
+
+}
+
+void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fname)
+{
+    int rank, size;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    if (comm->isRoot())
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray start fname = " << fname);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    double start{ 0. };
+    double finish{ 0. };
+    if (comm->isRoot())
+        start = MPI_Wtime();
+
+    MPI_File file_handler;
+    std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + fname;
+    int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
+    if (rc != MPI_SUCCESS)
+        throw UbException(UB_EXARGS, "couldn't open file " + filename);
+
+    // read count of blocks
+    size_t blocksCount = 0;
+    dataSetParam dataSetParamStr;
+    memset(&dataSetParamStr, 0, sizeof(dataSetParam));
+
+    MPI_File_read_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE);
+    MPI_File_read_at(file_handler, (MPI_Offset)(size * sizeof(int)), &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
+
+    DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount];
+    int doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all blocks
+
+    // define MPI_types depending on the block-specific information
+    MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
+    MPI_Type_commit(&dataSetDoubleType);
+
+    // calculate the read offset
+    MPI_Offset read_offset = (MPI_Offset)(size * sizeof(int));
+    size_t next_read_offset = 0;
+
+    if (size > 1)
+    {
+        if (rank == 0)
+        {
+            next_read_offset = read_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            MPI_Send(&next_read_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD);
+        }
+        else
+        {
+            MPI_Recv(&read_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+            next_read_offset = read_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            if (rank < size - 1)
+                MPI_Send(&next_read_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD);
+        }
+    }
+
+    MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(dataSetParam)), dataSetSmallArray, (int)blocksCount, dataSetSmallType, MPI_STATUS_IGNORE);
+    if (doubleCountInBlock > 0)
+        MPI_File_read_at(
+            file_handler,
+            (MPI_Offset)(read_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)),
+            &doubleValuesArray[0], (int)blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
+    MPI_File_close(&file_handler);
+    MPI_Type_free(&dataSetDoubleType);
+
+    if (comm->isRoot())
+    {
+        finish = MPI_Wtime();
+        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    //----------------------------- restore data ---------------------------------
+    SPtr<CbArray4D<LBMReal, IndexerX4X3X2X1>> ___4DArray;
+    SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> ___3DArray;
+
+    size_t index = 0;
+    size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> vectorsOfValues;
+    for (std::size_t n = 0; n < blocksCount; n++)
+    {
+        vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
+        index += nextVectorSize;
+
+        // find the nesessary block and fill it
+        SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].x1, dataSetSmallArray[n].x2, dataSetSmallArray[n].x3, dataSetSmallArray[n].level);
+
+       // fill arrays
+       switch (arrType)
+        {
+        case AverageDensity:
+            ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>(
+                vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3]));
+            block->getKernel()->getDataSet()->setAverageDensity(___4DArray);
+            break;
+        case AverageVelocity:
+            ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>(
+                vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3]));
+            block->getKernel()->getDataSet()->setAverageVelocity(___4DArray);
+            break;
+        case AverageFluktuations:
+            ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>(
+                vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3]));
+            block->getKernel()->getDataSet()->setAverageFluctuations(___4DArray);
+            break;
+        case AverageTriple:
+            ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>(
+                vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3]));
+            block->getKernel()->getDataSet()->setAverageTriplecorrelations(___4DArray);
+            break;
+        case ShearStressVal:
+            ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>(
+                vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3]));
+            block->getKernel()->getDataSet()->setShearStressValues(___4DArray);
+            break;
+        case RelaxationFactor:
+            ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+                vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
+            block->getKernel()->getDataSet()->setRelaxationFactor(___3DArray);
+            break;
+        case PhaseField1:
+            ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+                vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
+            block->getKernel()->getDataSet()->setPhaseField(___3DArray);
+            break;
+        case PhaseField2:
+            ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+                vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
+            block->getKernel()->getDataSet()->setPhaseField2(___3DArray);
+            break;
+        case PressureField:
+            ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+                vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
+            block->getKernel()->getDataSet()->setPressureField(___3DArray);
+            break;
+        default:
+            UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::readArray : array type does not exist!"));
+            break;
+        }
+    }
+
+    if (comm->isRoot())
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::readArray end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    delete[] dataSetSmallArray;
 }
 
-void MPIIORestartCoProcessor::readAverageDensityArray(int step)
+/*void MPIIORestartCoProcessor::readAverageDensityArray(int step)
 {
     int rank, size;
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
@@ -1971,10 +2670,10 @@ void MPIIORestartCoProcessor::readAverageDensityArray(int step)
     }
 
     size_t index = 0;
-    size_t nextVectorSize =
-        dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
-    std::vector<LBMReal> vectorsOfValues;
-    for (int n = 0; n < blocksCount; n++) {
+    size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) 
+    {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2070,10 +2769,10 @@ void MPIIORestartCoProcessor::readAverageVelocityArray(int step)
     }
 
     size_t index = 0;
-    size_t nextVectorSize =
-        dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
-    std::vector<LBMReal> vectorsOfValues;
-    for (int n = 0; n < blocksCount; n++) {
+    size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) 
+    {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2170,10 +2869,10 @@ void MPIIORestartCoProcessor::readAverageFluktuationsArray(int step)
     }
 
     size_t index = 0;
-    size_t nextVectorSize =
-        dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
-    std::vector<LBMReal> vectorsOfValues;
-    for (int n = 0; n < blocksCount; n++) {
+    size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) 
+    {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2269,10 +2968,10 @@ void MPIIORestartCoProcessor::readAverageTripleArray(int step)
     }
 
     size_t index = 0;
-    size_t nextVectorSize =
-        dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
-    std::vector<LBMReal> vectorsOfValues;
-    for (int n = 0; n < blocksCount; n++) {
+    size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) 
+    {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2368,10 +3067,10 @@ void MPIIORestartCoProcessor::readShearStressValArray(int step)
     }
 
     size_t index = 0;
-    size_t nextVectorSize =
-        dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
-    std::vector<LBMReal> vectorsOfValues;
-    for (int n = 0; n < blocksCount; n++) {
+    size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) 
+    {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2467,10 +3166,10 @@ void MPIIORestartCoProcessor::readRelaxationFactor(int step)
     }
 
     size_t index = 0;
-    size_t nextVectorSize =
-        dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
-    std::vector<LBMReal> vectorsOfValues;
-    for (int n = 0; n < blocksCount; n++) {
+    size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) 
+    {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2570,7 +3269,8 @@ void MPIIORestartCoProcessor::readPhaseField(int step, int fieldN)
 
     size_t index = 0;
     size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
-    std::vector<LBMReal> vectorsOfValues;
+    std::vector<double> vectorsOfValues;
+    std::cout << "readPhaseField"<< fieldN<<" = " << dataSetParamStr.nx[0] << " " << dataSetParamStr.nx[1] << " " << dataSetParamStr.nx[2] << std::endl;
 
     for (int n = 0; n < blocksCount; n++)
     {
@@ -2588,6 +3288,12 @@ void MPIIORestartCoProcessor::readPhaseField(int step, int fieldN)
             block->getKernel()->getDataSet()->setPhaseField(mPhaseField);
         else
             block->getKernel()->getDataSet()->setPhaseField2(mPhaseField);
+       int nx1 = static_cast<int>(block->getKernel()->getDataSet()->getPhaseField()->getNX1());
+       int nx2 = static_cast<int>(block->getKernel()->getDataSet()->getPhaseField()->getNX2());
+       int nx3 = static_cast<int>(block->getKernel()->getDataSet()->getPhaseField()->getNX3());
+        dataSetParamStr.nx[3] = 1;
+        doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+        std::cout << "writePhaseField" << fieldN << " = " << nx1 << " " << nx2 << " " << nx3 << std::endl;
 
     }
 
@@ -2600,6 +3306,106 @@ void MPIIORestartCoProcessor::readPhaseField(int step, int fieldN)
     delete[] dataSetSmallArray;
 }
 
+void MPIIORestartCoProcessor::readPressureField(int step)
+{
+    int rank, size;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    if (comm->isRoot())
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::readPressureField start MPI IO rank = " << rank);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    double start{ 0. };
+    double finish{ 0. };
+    if (comm->isRoot())
+        start = MPI_Wtime();
+
+    MPI_File file_handler;
+    std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPressureField.bin";
+    int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler);
+    if (rc != MPI_SUCCESS)
+        throw UbException(UB_EXARGS, "couldn't open file " + filename);
+
+    // read count of blocks
+    int blocksCount = 0;
+    dataSetParam dataSetParamStr;
+    MPI_File_read_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE);
+    MPI_File_read_at(file_handler, (MPI_Offset)(size * sizeof(int)), &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE);
+
+    DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount];
+    int doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all blocks
+
+    // define MPI_types depending on the block-specific information
+    MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType);
+    MPI_Type_commit(&dataSetDoubleType);
+
+    // calculate the read offset
+    MPI_Offset read_offset = (MPI_Offset)(size * sizeof(int));
+    size_t next_read_offset = 0;
+
+    if (size > 1)
+    {
+        if (rank == 0)
+        {
+            next_read_offset = read_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            MPI_Send(&next_read_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD);
+        }
+        else
+        {
+            MPI_Recv(&read_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+            next_read_offset = read_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double));
+            if (rank < size - 1)
+                MPI_Send(&next_read_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD);
+        }
+    }
+
+    MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount, dataSetSmallType, MPI_STATUS_IGNORE);
+    if (doubleCountInBlock > 0)
+        MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)),
+            &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE);
+    MPI_File_close(&file_handler);
+    MPI_Type_free(&dataSetDoubleType);
+
+    if (comm->isRoot())
+    {
+        finish = MPI_Wtime();
+        UBLOG(logINFO, "MPIIORestartCoProcessor::readPressureField time: " << finish - start << " s");
+        UBLOG(logINFO, "MPIIORestartCoProcessor::readPressureField start of restore of data, rank = " << rank);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    size_t index = 0;
+    size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
+    std::vector<double> vectorsOfValues;
+
+    for (int n = 0; n < blocksCount; n++)
+    {
+        vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
+        index += nextVectorSize;
+    
+        // fill Pressure array
+        SPtr<PressureFieldArray3D> mPressureField;
+        mPressureField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(
+            vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2]));
+
+        // find the nesessary block and fill it
+        SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].x1, dataSetSmallArray[n].x2, dataSetSmallArray[n].x3, dataSetSmallArray[n].level);
+        block->getKernel()->getDataSet()->setPressureField(mPressureField);
+    }
+
+    if (comm->isRoot())
+    {
+        UBLOG(logINFO, "MPIIORestartCoProcessor::readPressureField end of restore of data, rank = " << rank);
+        UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB");
+    }
+
+    delete[] dataSetSmallArray;
+}*/
+
 void MPIIORestartCoProcessor::readBoundaryConds(int step)
 {
     int rank, size;
@@ -2715,11 +3521,7 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step)
                 bc->bcVelocityX2           = bcArray[index].bcVelocityX2;
                 bc->bcVelocityX3           = bcArray[index].bcVelocityX3;
                 bc->bcDensity              = bcArray[index].bcDensity;
-                bc->bcLodiDensity          = bcArray[index].bcLodiDensity;
-                bc->bcLodiVelocityX1       = bcArray[index].bcLodiVelocityX1;
-                bc->bcLodiVelocityX2       = bcArray[index].bcLodiVelocityX2;
-                bc->bcLodiVelocityX3       = bcArray[index].bcLodiVelocityX3;
-                bc->bcLodiLentgh           = bcArray[index].bcLodiLentgh;
+                bc->bcPhaseField           = bcArray[ibc].bcPhaseField;
 
                 bc->nx1 = bcArray[index].nx1;
                 bc->nx2 = bcArray[index].nx2;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h
index b50eafb799f601a48aa0d80f5a4a0a17bab95d0f..1a1e1fb4d45066a93826fe7a819b056e10544036 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h
@@ -20,6 +20,18 @@ class LBMKernel;
 class MPIIORestartCoProcessor : public MPIIOCoProcessor
 {
 public:
+    enum Arrays {
+        AverageDensity = 1,
+        AverageVelocity = 2,
+        AverageFluktuations = 3,
+        AverageTriple = 4,
+        ShearStressVal = 5,
+        RelaxationFactor = 6,
+        PhaseField1 = 7,
+        PhaseField2 = 8,
+        PressureField = 9
+    };
+
     MPIIORestartCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm);
     ~MPIIORestartCoProcessor() override;
     //! Each timestep writes the grid into the files
@@ -30,13 +42,16 @@ public:
     void writeBlocks(int step);
     //! Writes the datasets of the blocks into the file cpDataSet.bin
     void writeDataSet(int step);
-    void writeAverageDensityArray(int step);
-    void writeAverageVelocityArray(int step);
-    void writeAverageFluktuationsArray(int step);
-    void writeAverageTripleArray(int step);
-    void writeShearStressValArray(int step);
-    void writeRelaxationFactor(int step);
-    void writePhaseField(int step, int num);
+    void write4DArray(int step, Arrays arrType, std::string fname);
+    void write3DArray(int step, Arrays arrType, std::string fname);
+    //void writeAverageDensityArray(int step);
+    //void writeAverageVelocityArray(int step);
+    //void writeAverageFluktuationsArray(int step);
+    //void writeAverageTripleArray(int step);
+    //void writeShearStressValArray(int step);
+    //void writeRelaxationFactor(int step);
+    //void writePhaseField(int step, int num);
+    //void writePressureField(int step);
     //! Writes the boundary conditions of the blocks into the file cpBC.bin
     void writeBoundaryConds(int step);
 
@@ -44,14 +59,18 @@ public:
     void readBlocks(int step);
     //! Reads the datasets of the blocks from the file cpDataSet.bin
     void readDataSet(int step);
-    void readAverageDensityArray(int step);
-    void readAverageVelocityArray(int step);
-    void readAverageFluktuationsArray(int step);
-    void readAverageTripleArray(int step);
-    void readShearStressValArray(int step);
-    void readRelaxationFactor(int step);
-    void readPhaseField(int step, int num);
-    //! Reads the boundary conditions of the blocks from the file cpBC.bin
+    void readArray(int step, Arrays arrType, std::string fname);
+
+    //void readAverageDensityArray(int step);
+    //void readAverageVelocityArray(int step);
+    //void readAverageFluktuationsArray(int step);
+    //void readAverageTripleArray(int step);
+    //void readShearStressValArray(int step);
+    //void readRelaxationFactor(int step);
+    //void readPhaseField(int step, int num);
+    //void readPressureField(int step);
+    // 
+   //! Reads the boundary conditions of the blocks from the file cpBC.bin
     void readBoundaryConds(int step);
     //! The function sets LBMKernel
     void setLBMKernel(SPtr<LBMKernel> kernel);
@@ -60,10 +79,6 @@ public:
     //! The function truncates the data files
     void clearAllFiles(int step);
 
-protected:
-    // std::string path;
-    // std::shared_ptr<vf::mpi::Communicator> comm;
-
 private:
     // MPI_Datatype gridParamType, block3dType;
     MPI_Datatype dataSetType, dataSetSmallType, dataSetDoubleType;
@@ -72,6 +87,8 @@ private:
     MPIIODataStructures::boundCondParam boundCondParamStr;
     SPtr<LBMKernel> lbmKernel;
     SPtr<BCProcessor> bcProcessor;
+
+    //std::vector<double> doubleValuesArrayRW;
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp
index 3765d2a999f73c476a4f1b250daeaefde971c277..64ecc177ff38403f346a519e8d0a5515a12713e4 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp
@@ -172,34 +172,34 @@ void ShearStressCoProcessor::calculateShearStress(double timeStep)
                     //////////////////////////////////////////////////////////////////////////
                     // compute velocity
                     //////////////////////////////////////////////////////////////////////////
-                    vx = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
-                          (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W]));
+                    vx = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+                          (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00]));
 
-                    vy = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
-                          (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S]));
+                    vy = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+                          (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0]));
 
-                    vz = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
-                          (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B]));
+                    vz = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) +
+                          (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M]));
 
                     sxy = 3.0 * collFactor / (collFactor - 1.0) *
-                          (((f[TNE] + f[BSW]) - (f[TSE] + f[BNW])) + (-(f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) +
-                           (((f[NE] + f[SW]) - (f[SE] + f[NW]))) - vx * vy);
+                          (((f[DIR_PPP] + f[DIR_MMM]) - (f[DIR_PMP] + f[DIR_MPM])) + (-(f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) +
+                           (((f[DIR_PP0] + f[DIR_MM0]) - (f[DIR_PM0] + f[DIR_MP0]))) - vx * vy);
 
                     sxz = 3.0 * collFactor / (collFactor - 1.0) *
-                          (((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + (-(f[BSE] + f[TNW]) - (f[TSW] + f[BNE])) +
-                           ((f[TE] + f[BW]) - (f[BE] + f[TW])) - vx * vz);
+                          (((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + (-(f[DIR_PMM] + f[DIR_MPP]) - (f[DIR_MMP] + f[DIR_PPM])) +
+                           ((f[DIR_P0P] + f[DIR_M0M]) - (f[DIR_P0M] + f[DIR_M0P])) - vx * vz);
 
                     syz = 3.0 * collFactor / (collFactor - 1.0) *
-                          (((f[TNE] + f[BSW]) - (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) - (f[TSW] + f[BNE])) +
-                           (-(f[BN] + f[TS]) + (f[TN] + f[BS])) - vy * vz);
+                          (((f[DIR_PPP] + f[DIR_MMM]) - (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) - (f[DIR_MMP] + f[DIR_PPM])) +
+                           (-(f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM])) - vy * vz);
 
                     LBMReal dxxMyy = 3.0 / 2.0 * collFactor / (collFactor - 1.0) *
-                                     (((f[TE] + f[BW]) + (f[BE] + f[TW])) - ((f[BN] + f[TS]) + (f[TN] + f[BS])) +
-                                      ((f[E] + f[W]) - (f[N] + f[S])) - vx * vx + vy * vy);
+                                     (((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) - ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM])) +
+                                      ((f[DIR_P00] + f[DIR_M00]) - (f[DIR_0P0] + f[DIR_0M0])) - vx * vx + vy * vy);
 
                     LBMReal dxxMzz = 3.0 / 2.0 * collFactor / (collFactor - 1.0) *
-                                     ((((f[NE] + f[SW]) + (f[SE] + f[NW])) - ((f[BN] + f[TS]) + (f[TN] + f[BS]))) +
-                                      ((f[E] + f[W]) - (f[T] + f[B])) - vx * vx + vz * vz);
+                                     ((((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) - ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) +
+                                      ((f[DIR_P00] + f[DIR_M00]) - (f[DIR_00P] + f[DIR_00M])) - vx * vx + vz * vz);
 
                     // LBMReal dyyMzz =3.0/2.0 *collFactor/(collFactor-1.0)*((((f[NE] + f[SW]) + (f[SE] +
                     // f[NW]))-((f[TE] + f[BW])+(f[BE]+ f[TW])))
@@ -562,32 +562,32 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
                                                 "ix2=" + UbSystem::toString(ix2) + "ix3=" + UbSystem::toString(ix3) +
                                                 "GlobalID=" + UbSystem::toString(block->getGlobalID()) +
                                                 "dx=" + UbSystem::toString(dx) +
-                                                "T=" + UbSystem::toString(bcPtr->getQ(D3Q27System::T)) +
-                                                "B=" + UbSystem::toString(bcPtr->getQ(D3Q27System::B)) +
-                                                "E=" + UbSystem::toString(bcPtr->getQ(D3Q27System::E)) +
-                                                "W=" + UbSystem::toString(bcPtr->getQ(D3Q27System::W)) +
-                                                "N=" + UbSystem::toString(bcPtr->getQ(D3Q27System::N)) +
-                                                "S=" + UbSystem::toString(bcPtr->getQ(D3Q27System::S)) +
-                                                "NE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::NE)) +
-                                                "SW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::SW)) +
-                                                "SE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::SE)) +
-                                                "NW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::NW)) +
-                                                "TE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TE)) +
-                                                "BW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BW)) +
-                                                "BE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BE)) +
-                                                "TW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TW)) +
-                                                "TN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TN)) +
-                                                "BS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BS)) +
-                                                "BN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BN)) +
-                                                "TS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TS)) +
-                                                "TNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TNE)) +
-                                                "TNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TNW)) +
-                                                "TSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TSE)) +
-                                                "TSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TSW)) +
-                                                "BNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BNE)) +
-                                                "BNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BNW)) +
-                                                "BSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BSE)) +
-                                                "BSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BSW) * dx)));
+                                                "T=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_00P)) +
+                                                "B=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_00M)) +
+                                                "E=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P00)) +
+                                                "W=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M00)) +
+                                                "N=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0P0)) +
+                                                "S=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0M0)) +
+                                                "NE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PP0)) +
+                                                "SW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MM0)) +
+                                                "SE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PM0)) +
+                                                "NW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MP0)) +
+                                                "TE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P0P)) +
+                                                "BW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M0M)) +
+                                                "BE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P0M)) +
+                                                "TW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M0P)) +
+                                                "TN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0PP)) +
+                                                "BS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0MM)) +
+                                                "BN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0PM)) +
+                                                "TS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0MP)) +
+                                                "TNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PPP)) +
+                                                "TNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MPP)) +
+                                                "TSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PMP)) +
+                                                "TSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MMP)) +
+                                                "BNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PPM)) +
+                                                "BNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MPM)) +
+                                                "BSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PMM)) +
+                                                "BSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MMM) * dx)));
         }
     }
 
@@ -608,7 +608,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
                                 if (ii <= 2) {
                                     LBMReal q = bcPtrIn->getQ(fdir);
                                     if (q != 999.00000) {
-                                        if (fdir == D3Q27System::E) {
+                                        if (fdir == D3Q27System::DIR_P00) {
                                             // if(!bcArray->isSolid(i, j, k))continue;
                                             if (i + q <= x + 1) {
                                                 if (ii == 0) {
@@ -634,7 +634,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
                                                 }
                                             }
                                         }
-                                        if (fdir == D3Q27System::W) {
+                                        if (fdir == D3Q27System::DIR_M00) {
                                             // if(!bcArray->isSolid(i, j, k))continue;
                                             if (i - q >= x) {
                                                 if (ii == 0) {
@@ -660,7 +660,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
                                                 }
                                             }
                                         }
-                                        if (fdir == D3Q27System::N) {
+                                        if (fdir == D3Q27System::DIR_0P0) {
                                             // if(!bcArray->isSolid(i, j, k))continue;
                                             if (j + q <= y + 1) {
                                                 if (ii == 0) {
@@ -686,7 +686,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
                                                 }
                                             }
                                         }
-                                        if (fdir == D3Q27System::S) {
+                                        if (fdir == D3Q27System::DIR_0M0) {
                                             // if(!bcArray->isSolid(i, j, k))continue;
                                             if (j - q >= y) {
                                                 if (ii == 0) {
@@ -713,7 +713,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
                                             }
                                         }
 
-                                        if (fdir == D3Q27System::T) {
+                                        if (fdir == D3Q27System::DIR_00P) {
                                             // if(!bcArray->isSolid(i, j, k))continue;
                                             if (k + q <= z + 1) {
                                                 if (ii == 0) {
@@ -739,7 +739,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
                                                 }
                                             }
                                         }
-                                        if (fdir == D3Q27System::B) {
+                                        if (fdir == D3Q27System::DIR_00M) {
                                             // if(!bcArray->isSolid(i, j, k))continue;
                                             if (k - q >= z) {
                                                 if (ii == 0) {
@@ -788,32 +788,32 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g
                     UB_EXARGS, "ii is=" + UbSystem::toString(ii) + "  ix1=" + UbSystem::toString(ix1) +
                                    " ix2=" + UbSystem::toString(ix2) + " ix3=" + UbSystem::toString(ix3) +
                                    " Block3D::GlobalID=" + UbSystem::toString(block->getGlobalID()) + " dx=" +
-                                   UbSystem::toString(dx) + " T=" + UbSystem::toString(bcPtr->getQ(D3Q27System::T)) +
-                                   " B=" + UbSystem::toString(bcPtr->getQ(D3Q27System::B)) +
-                                   " E=" + UbSystem::toString(bcPtr->getQ(D3Q27System::E)) +
-                                   " W=" + UbSystem::toString(bcPtr->getQ(D3Q27System::W)) +
-                                   " N=" + UbSystem::toString(bcPtr->getQ(D3Q27System::N)) +
-                                   " S=" + UbSystem::toString(bcPtr->getQ(D3Q27System::S)) +
-                                   " NE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::NE)) +
-                                   " SW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::SW)) +
-                                   " SE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::SE)) +
-                                   " NW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::NW)) +
-                                   " TE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TE)) +
-                                   " BW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BW)) +
-                                   " BE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BE)) +
-                                   " TW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TW)) +
-                                   " TN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TN)) +
-                                   " BS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BS)) +
-                                   " BN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BN)) +
-                                   " TS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TS)) +
-                                   " TNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TNE)) +
-                                   " TNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TNW)) +
-                                   " TSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TSE)) +
-                                   " TSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TSW)) +
-                                   " BNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BNE)) +
-                                   " BNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BNW)) +
-                                   " BSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BSE)) +
-                                   " BSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BSW))));
+                                   UbSystem::toString(dx) + " T=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_00P)) +
+                                   " B=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_00M)) +
+                                   " E=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P00)) +
+                                   " W=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M00)) +
+                                   " N=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0P0)) +
+                                   " S=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0M0)) +
+                                   " NE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PP0)) +
+                                   " SW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MM0)) +
+                                   " SE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PM0)) +
+                                   " NW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MP0)) +
+                                   " TE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P0P)) +
+                                   " BW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M0M)) +
+                                   " BE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P0M)) +
+                                   " TW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M0P)) +
+                                   " TN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0PP)) +
+                                   " BS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0MM)) +
+                                   " BN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0PM)) +
+                                   " TS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0MP)) +
+                                   " TNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PPP)) +
+                                   " TNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MPP)) +
+                                   " TSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PMP)) +
+                                   " TSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MMP)) +
+                                   " BNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PPM)) +
+                                   " BNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MPM)) +
+                                   " BSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PMM)) +
+                                   " BSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MMM))));
             }
         }
     }
@@ -876,22 +876,22 @@ void ShearStressCoProcessor::initDistance()
                         continue;
                     int numberOfCorner = 0;
 
-                    if (bc->getQ(D3Q27System::T) != 999.000) {
+                    if (bc->getQ(D3Q27System::DIR_00P) != 999.000) {
                         numberOfCorner++;
                     }
-                    if (bc->getQ(D3Q27System::B) != 999.000) {
+                    if (bc->getQ(D3Q27System::DIR_00M) != 999.000) {
                         numberOfCorner++;
                     }
-                    if (bc->getQ(D3Q27System::E) != 999.000) {
+                    if (bc->getQ(D3Q27System::DIR_P00) != 999.000) {
                         numberOfCorner++;
                     }
-                    if (bc->getQ(D3Q27System::W) != 999.000) {
+                    if (bc->getQ(D3Q27System::DIR_M00) != 999.000) {
                         numberOfCorner++;
                     }
-                    if (bc->getQ(D3Q27System::N) != 999.000) {
+                    if (bc->getQ(D3Q27System::DIR_0P0) != 999.000) {
                         numberOfCorner++;
                     }
-                    if (bc->getQ(D3Q27System::S) != 999.000) {
+                    if (bc->getQ(D3Q27System::DIR_0M0) != 999.000) {
                         numberOfCorner++;
                     }
                     // if(bc->hasVelocityBoundary()||bc->hasDensityBoundary())continue;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp
index 7391754ee92fe216b78245c38032dbfc0594ad62..d2874876ee9b36b9a17a6c4dcf88c4c7d0e948cb 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp
@@ -413,7 +413,7 @@ void TimeAveragedValuesCoProcessor::calculateAverageValues(double timeSteps)
                                     (*av)(Vz, ix1, ix2, ix3) = uz;
                                 }
 
-                                // fluctuations
+                                // mean fluctuations
                                 if ((options & Fluctuations) == Fluctuations) {
                                     uxx = (*af)(Vxx, ix1, ix2, ix3) / timeSteps;
                                     uyy = (*af)(Vyy, ix1, ix2, ix3) / timeSteps;
@@ -431,7 +431,7 @@ void TimeAveragedValuesCoProcessor::calculateAverageValues(double timeSteps)
                                 }
 
                                 if ((options & Triplecorrelations) == Triplecorrelations) {
-                                    // triple-correlations
+                                    // mean triple-correlations
                                     (*at)(Vxxx, ix1, ix2, ix3) =
                                         (*at)(Vxxx, ix1, ix2, ix3) / timeSteps - 3.0 * uxx * ux + 2.0 * ux * ux * ux;
                                     (*at)(Vxxy, ix1, ix2, ix3) = (*at)(Vxxy, ix1, ix2, ix3) / timeSteps -
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp
index 51be3b53a9a3bc123b15e03d0925bd619fb01fa3..6a06a20d41fc8b57c43dd219623bb2d544d7a4a9 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp
@@ -215,14 +215,14 @@ void TurbulenceIntensityCoProcessor::calculateAverageValues(double timeStep)
                                 //////////////////////////////////////////////////////////////////////////
                                 // compute velocity
                                 //////////////////////////////////////////////////////////////////////////
-                                vx = f[E] - f[W] + f[NE] - f[SW] + f[SE] - f[NW] + f[TE] - f[BW] + f[BE] - f[TW] +
-                                     f[TNE] - f[TSW] + f[TSE] - f[TNW] + f[BNE] - f[BSW] + f[BSE] - f[BNW];
+                                vx = f[DIR_P00] - f[DIR_M00] + f[DIR_PP0] - f[DIR_MM0] + f[DIR_PM0] - f[DIR_MP0] + f[DIR_P0P] - f[DIR_M0M] + f[DIR_P0M] - f[DIR_M0P] +
+                                     f[DIR_PPP] - f[DIR_MMP] + f[DIR_PMP] - f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] + f[DIR_PMM] - f[DIR_MPM];
 
-                                vy = f[N] - f[S] + f[NE] - f[SW] - f[SE] + f[NW] + f[TN] - f[BS] + f[BN] - f[TS] +
-                                     f[TNE] - f[TSW] - f[TSE] + f[TNW] + f[BNE] - f[BSW] - f[BSE] + f[BNW];
+                                vy = f[DIR_0P0] - f[DIR_0M0] + f[DIR_PP0] - f[DIR_MM0] - f[DIR_PM0] + f[DIR_MP0] + f[DIR_0PP] - f[DIR_0MM] + f[DIR_0PM] - f[DIR_0MP] +
+                                     f[DIR_PPP] - f[DIR_MMP] - f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] + f[DIR_MPM];
 
-                                vz = f[T] - f[B] + f[TE] - f[BW] - f[BE] + f[TW] + f[TN] - f[BS] - f[BN] + f[TS] +
-                                     f[TNE] + f[TSW] + f[TSE] + f[TNW] - f[BNE] - f[BSW] - f[BSE] - f[BNW];
+                                vz = f[DIR_00P] - f[DIR_00M] + f[DIR_P0P] - f[DIR_M0M] - f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] - f[DIR_0MM] - f[DIR_0PM] + f[DIR_0MP] +
+                                     f[DIR_PPP] + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] - f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] - f[DIR_MPM];
                                 //////////////////////////////////////////////////////////////////////////
                                 // compute average values
                                 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp
index 536d2ee133517279aa2458d06aea8edcee1dd20f..523ae4ffb0ac78143e071054d8804f67bd2e12d6 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp
@@ -123,7 +123,7 @@ void WriteBlocksCoProcessor::collectData(double step)
                 // for (std::size_t i = 0; i<connectors.size(); i++)
                 //   if (connectors[i])
                 //   {
-                //      if (connectors[i]->getSendDir() == D3Q27System::BS)
+                //      if (connectors[i]->getSendDir() == D3Q27System::DIR_0MM)
                 //      {
 
                 //         flag = true;
@@ -146,7 +146,7 @@ void WriteBlocksCoProcessor::collectData(double step)
                 // for (std::size_t i = 0; i<connectors.size(); i++)
                 //   if (connectors[i])
                 //   {
-                //      if (connectors[i]->getSendDir() == D3Q27System::BS)
+                //      if (connectors[i]->getSendDir() == D3Q27System::DIR_0MM)
                 //      {
 
                 //         flag = true;
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
index 4bf2b30375145fb961cb7f932afc4aa15780820b..b886271b7f3842b0453a0fa16f53ca75442da9e9 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
@@ -182,13 +182,13 @@ void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     int maxX2 = (int)(distributions->getNX2());
     int maxX3 = (int)(distributions->getNX3());
 
-    // int minX1 = 1;
-    // int minX2 = 1;
-    // int minX3 = 1;
+     //int minX1 = 1;
+     //int minX2 = 1;
+     //int minX3 = 1;
 
-    // int maxX1 = (int)(distributions->getNX1());
-    // int maxX2 = (int)(distributions->getNX2());
-    // int maxX3 = (int)(distributions->getNX3());
+     //int maxX1 = (int)(distributions->getNX1());
+     //int maxX2 = (int)(distributions->getNX2());
+     //int maxX3 = (int)(distributions->getNX3());
 
     // nummern vergeben und node vector erstellen + daten sammeln
     CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3, -1);
@@ -202,7 +202,7 @@ void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     for (int ix3 = minX3; ix3 <= maxX3; ix3++) {
         for (int ix2 = minX2; ix2 <= maxX2; ix2++) {
             for (int ix1 = minX1; ix1 <= maxX1; ix1++) {
-                if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3)) {
+                if (/* !bcArray->isUndefined(ix1, ix2, ix3) &&*/ !bcArray->isSolid(ix1, ix2, ix3)) {
                     int index                  = 0;
                     nodeNumbers(ix1, ix2, ix3) = nr++;
                     Vector3D worldCoordinates  = grid->getNodeCoordinates(block, ix1, ix2, ix3);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c71a12ee6d7bc17297cca377712b9a6b479bb336
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp
@@ -0,0 +1,278 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp
+//! \ingroup CoProcessors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#include "WriteMacroscopicQuantitiesPlusMassCoProcessor.h"
+#include "BCProcessor.h"
+#include "LBMKernel.h"
+#include <string>
+#include <vector>
+
+#include "BCArray3D.h"
+#include "Block3D.h"
+#include "Communicator.h"
+#include "DataSet3D.h"
+#include "Grid3D.h"
+#include "LBMUnitConverter.h"
+#include "UbScheduler.h"
+#include "basics/writer/WbWriterVtkXmlASCII.h"
+
+WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMassCoProcessor() = default;
+//////////////////////////////////////////////////////////////////////////
+WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMassCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s,
+                                                                             const std::string &path,
+                                                                             WbWriter *const writer,
+                                                                             SPtr<LBMUnitConverter> conv,
+                                                                             std::shared_ptr<vf::mpi::Communicator> comm)
+        : CoProcessor(grid, s), path(path), writer(writer), conv(conv), comm(comm)
+{
+    gridRank = comm->getProcessID();
+    minInitLevel = this->grid->getCoarsestInitializedLevel();
+    maxInitLevel = this->grid->getFinestInitializedLevel();
+
+    blockVector.resize(maxInitLevel + 1);
+
+    for (int level = minInitLevel; level <= maxInitLevel; level++)
+    {
+        grid->getBlocks(level, gridRank, true, blockVector[level]);
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+void WriteMacroscopicQuantitiesPlusMassCoProcessor::init()
+{}
+
+//////////////////////////////////////////////////////////////////////////
+void WriteMacroscopicQuantitiesPlusMassCoProcessor::process(double step)
+{
+    if (scheduler->isDue(step))
+        collectData(step);
+
+    UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesPlusMassCoProcessor::update:" << step);
+}
+
+//////////////////////////////////////////////////////////////////////////
+void WriteMacroscopicQuantitiesPlusMassCoProcessor::collectData(double step)
+{
+    int istep = static_cast<int>(step);
+
+    for (int level = minInitLevel; level <= maxInitLevel; level++)
+    {
+        for (SPtr<Block3D> block : blockVector[level])
+        {
+            if (block)
+            {
+                addDataMQ(block);
+            }
+        }
+    }
+
+    std::string pfilePath, partPath, subfolder, cfilePath;
+
+    subfolder = "mq" + UbSystem::toString(istep);
+    pfilePath = path + "/mq/" + subfolder;
+    cfilePath = path + "/mq/mq_collection";
+    partPath = pfilePath + "/mq" + UbSystem::toString(gridRank) + "_" + UbSystem::toString(istep);
+
+    std::string partName = writer->writeOctsWithNodeData(partPath, nodes, cells, datanames, data);
+    size_t found = partName.find_last_of("/");
+    std::string piece = partName.substr(found + 1);
+    piece = subfolder + "/" + piece;
+
+    std::vector<std::string> cellDataNames;
+    std::vector<std::string> pieces = comm->gather(piece);
+    if (comm->getProcessID() == comm->getRoot()) {
+        std::string pname =
+                WbWriterVtkXmlASCII::getInstance()->writeParallelFile(pfilePath, pieces, datanames, cellDataNames);
+        found = pname.find_last_of("/");
+        piece = pname.substr(found + 1);
+
+        std::vector<std::string> filenames;
+        filenames.push_back(piece);
+        if (step == CoProcessor::scheduler->getMinBegin())
+        {
+            WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
+        } else
+        {
+            WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
+        }
+        UBLOG(logINFO, "WriteMacroscopicQuantitiesPlusMassCoProcessor step: " << istep);
+    }
+
+    clearData();
+}
+
+//////////////////////////////////////////////////////////////////////////
+void WriteMacroscopicQuantitiesPlusMassCoProcessor::clearData()
+{
+    nodes.clear();
+    cells.clear();
+    datanames.clear();
+    data.clear();
+}
+
+//////////////////////////////////////////////////////////////////////////
+void WriteMacroscopicQuantitiesPlusMassCoProcessor::addDataMQ(SPtr<Block3D> block)
+{
+    double level   = (double)block->getLevel();
+
+    // Diese Daten werden geschrieben:
+    datanames.resize(0);
+    datanames.push_back("Rho");
+    datanames.push_back("Vx");
+    datanames.push_back("Vy");
+    datanames.push_back("Vz");
+    // datanames.push_back("Press");
+    datanames.push_back("Level");
+    // datanames.push_back("BlockID");
+    // datanames.push_back("gamma");
+    // datanames.push_back("collFactor");
+
+    data.resize(datanames.size());
+
+    SPtr<ILBMKernel> kernel                 = block->getKernel();
+    SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
+    SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
+    LBMReal f[D3Q27System::ENDF + 1];
+    LBMReal vx1, vx2, vx3, rho;
+
+    // knotennummerierung faengt immer bei 0 an!
+    int SWB, SEB, NEB, NWB, SWT, SET, NET, NWT;
+
+    if (block->getKernel()->getCompressible()) {
+        calcMacros = &D3Q27System::calcCompMacroscopicValues;
+    } else {
+        calcMacros = &D3Q27System::calcIncompMacroscopicValues;
+    }
+
+    int minX1 = 0;
+    int minX2 = 0;
+    int minX3 = 0;
+
+    int maxX1 = (int)(distributions->getNX1());
+    int maxX2 = (int)(distributions->getNX2());
+    int maxX3 = (int)(distributions->getNX3());
+
+    // int minX1 = 1;
+    // int minX2 = 1;
+    // int minX3 = 1;
+
+    // int maxX1 = (int)(distributions->getNX1());
+    // int maxX2 = (int)(distributions->getNX2());
+    // int maxX3 = (int)(distributions->getNX3());
+
+    // nummern vergeben und node vector erstellen + daten sammeln
+    CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3, -1);
+    maxX1 -= 2;
+    maxX2 -= 2;
+    maxX3 -= 2;
+
+    // D3Q27BoundaryConditionPtr bcPtr;
+    int nr = (int)nodes.size();
+
+    for (int ix3 = minX3; ix3 <= maxX3; ix3++) {
+        for (int ix2 = minX2; ix2 <= maxX2; ix2++) {
+            for (int ix1 = minX1; ix1 <= maxX1; ix1++) {
+                if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3)) {
+                    int index                  = 0;
+                    nodeNumbers(ix1, ix2, ix3) = nr++;
+                    Vector3D worldCoordinates  = grid->getNodeCoordinates(block, ix1, ix2, ix3);
+                    nodes.push_back(UbTupleFloat3(float(worldCoordinates[0]), float(worldCoordinates[1]),
+                                                  float(worldCoordinates[2])));
+
+                    distributions->getDistribution(f, ix1, ix2, ix3);
+                    calcMacros(f, rho, vx1, vx2, vx3);
+                    //double press = D3Q27System::getPressure(f); // D3Q27System::calcPress(f,rho,vx1,vx2,vx3);
+
+                    if (UbMath::isNaN(rho) || UbMath::isInfinity(rho))
+                         UB_THROW( UbException(UB_EXARGS,"rho is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+",node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                        //rho = 999.0;
+                    //if (UbMath::isNaN(press) || UbMath::isInfinity(press))
+                        // UB_THROW( UbException(UB_EXARGS,"press is not a number (nan or -1.#IND) or infinity number
+                        // -1.#INF in block="+block->toString()+",
+                        // node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                        //press = 999.0;
+                    if (UbMath::isNaN(vx1) || UbMath::isInfinity(vx1))
+                         UB_THROW( UbException(UB_EXARGS,"vx1 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                        //vx1 = 999.0;
+                    if (UbMath::isNaN(vx2) || UbMath::isInfinity(vx2))
+                         UB_THROW( UbException(UB_EXARGS,"vx2 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                        //vx2 = 999.0;
+                    if (UbMath::isNaN(vx3) || UbMath::isInfinity(vx3))
+                         UB_THROW( UbException(UB_EXARGS,"vx3 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                        //vx3 = 999.0;
+
+                    data[index++].push_back(rho);
+                    data[index++].push_back(vx1);
+                    data[index++].push_back(vx2);
+                    data[index++].push_back(vx3);
+
+                    // shearRate = D3Q27System::getShearRate(f, collFactor);
+
+                    // LBMReal collFactorF = RheologyBinghamModelLBMKernel::getBinghamCollFactor(collFactor, yieldStress,
+                    // shearRate, rho);
+
+                    // data[index++].push_back(shearRate);
+                    // data[index++].push_back(collFactorF);
+
+                    // data[index++].push_back((rho+1.0) * conv->getFactorDensityLbToW() );
+                    // data[index++].push_back(vx1 * conv->getFactorVelocityLbToW());
+                    // data[index++].push_back(vx2 * conv->getFactorVelocityLbToW());
+                    // data[index++].push_back(vx3 * conv->getFactorVelocityLbToW());
+                    // data[index++].push_back((press * conv->getFactorPressureLbToW()) / ((rho+1.0) *
+                    // conv->getFactorDensityLbToW()));
+                    data[index++].push_back(level);
+                    // data[index++].push_back(blockID);
+                }
+            }
+        }
+    }
+    maxX1 -= 1;
+    maxX2 -= 1;
+    maxX3 -= 1;
+    // cell vector erstellen
+    for (int ix3 = minX3; ix3 <= maxX3; ix3++) {
+        for (int ix2 = minX2; ix2 <= maxX2; ix2++) {
+            for (int ix1 = minX1; ix1 <= maxX1; ix1++) {
+                if ((SWB = nodeNumbers(ix1, ix2, ix3)) >= 0 && (SEB = nodeNumbers(ix1 + 1, ix2, ix3)) >= 0 &&
+                    (NEB = nodeNumbers(ix1 + 1, ix2 + 1, ix3)) >= 0 && (NWB = nodeNumbers(ix1, ix2 + 1, ix3)) >= 0 &&
+                    (SWT = nodeNumbers(ix1, ix2, ix3 + 1)) >= 0 && (SET = nodeNumbers(ix1 + 1, ix2, ix3 + 1)) >= 0 &&
+                    (NET = nodeNumbers(ix1 + 1, ix2 + 1, ix3 + 1)) >= 0 &&
+                    (NWT = nodeNumbers(ix1, ix2 + 1, ix3 + 1)) >= 0) {
+                    cells.push_back(makeUbTuple((unsigned int)SWB, (unsigned int)SEB, (unsigned int)NEB,
+                                                (unsigned int)NWB, (unsigned int)SWT, (unsigned int)SET,
+                                                (unsigned int)NET, (unsigned int)NWT));
+                }
+            }
+        }
+    }
+}
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..07f1a12676902e5964fcb0127203c1b527c89778
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h
@@ -0,0 +1,99 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file WriteMacroscopicQuantitiesPlusMassCoProcessor.h
+//! \ingroup CoProcessors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef WriteMacroscopicQuantitiesPlusMassCoProcessor_H
+#define WriteMacroscopicQuantitiesPlusMassCoProcessor_H
+
+#include <PointerDefinitions.h>
+#include <string>
+#include <vector>
+
+#include "CoProcessor.h"
+#include "LBMSystem.h"
+#include "UbTuple.h"
+
+namespace vf::mpi {class Communicator;}
+class Grid3D;
+class UbScheduler;
+class LBMUnitConverter;
+class WbWriter;
+class Block3D;
+
+//! \brief A class writes macroscopic quantities information to a VTK-file
+class WriteMacroscopicQuantitiesPlusMassCoProcessor : public CoProcessor
+{
+public:
+    WriteMacroscopicQuantitiesPlusMassCoProcessor();
+    //! \brief Construct WriteMacroscopicQuantitiesPlusMassCoProcessor object
+    //! \pre The Grid3D and UbScheduler objects must exist
+    //! \param grid is observable Grid3D object
+    //! \param s is UbScheduler object for scheduling of observer
+    //! \param path is path of folder for output
+    //! \param writer is WbWriter object
+    //! \param conv is LBMUnitConverter object
+    //! \param comm is Communicator object
+    WriteMacroscopicQuantitiesPlusMassCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path,
+                                          WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm);
+    ~WriteMacroscopicQuantitiesPlusMassCoProcessor() override = default;
+
+    void process(double step) override;
+
+protected:
+    //! Collect data for VTK-file
+    //! \param step is a time step
+    void collectData(double step);
+    //! Collect data for VTK-file
+    //! \param block is a time step
+    void addDataMQ(SPtr<Block3D> block);
+    void clearData();
+
+private:
+    void init();
+    std::vector<UbTupleFloat3> nodes;
+    std::vector<UbTupleUInt8> cells;
+    std::vector<std::string> datanames;
+    std::vector<std::vector<double>> data;
+    std::string path;
+    WbWriter *writer;
+    SPtr<LBMUnitConverter> conv;
+    std::vector<std::vector<SPtr<Block3D>>> blockVector;
+    int minInitLevel;
+    int maxInitLevel;
+    int gridRank;
+    std::shared_ptr<vf::mpi::Communicator> comm;
+
+    using CalcMacrosFct = void (*)(const LBMReal *const &, LBMReal &, LBMReal &, LBMReal &, LBMReal &);
+    CalcMacrosFct calcMacros;
+};
+
+#endif
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
index c5442930623344fb528a7764fb1f1e314c35437c..0298c1dbeb1d4b4a9ed6afb0c202206d9d21c488 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
@@ -145,7 +145,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
 {
     using namespace D3Q27System;
     using namespace UbMath;
-
+    SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel());
     //double level   = (double)block->getLevel();
 
     // Diese Daten werden geschrieben:
@@ -155,17 +155,24 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     datanames.push_back("Vy");
     datanames.push_back("Vz");
     datanames.push_back("P1");
+    datanames.push_back("Phi2");
+    if (kernel->getDataSet()->getPressureField()) datanames.push_back("Pressure");
 
     data.resize(datanames.size());
 
-    SPtr<LBMKernel> kernel                   = dynamicPointerCast<LBMKernel>(block->getKernel());
+
     SPtr<BCArray3D> bcArray                  = kernel->getBCProcessor()->getBCArray();
     SPtr<DistributionArray3D> distributionsF = kernel->getDataSet()->getFdistributions();
     SPtr<DistributionArray3D> distributionsH = kernel->getDataSet()->getHdistributions();
+    SPtr<DistributionArray3D> distributionsH2 = kernel->getDataSet()->getH2distributions();
     SPtr<PhaseFieldArray3D> divU             = kernel->getDataSet()->getPhaseField();
 
+    SPtr<PressureFieldArray3D> pressure;
+    if (kernel->getDataSet()->getPressureField()) pressure = kernel->getDataSet()->getPressureField();
+
     LBMReal f[D3Q27System::ENDF + 1];
     LBMReal phi[D3Q27System::ENDF + 1];
+    LBMReal phi2[D3Q27System::ENDF + 1];
     LBMReal vx1, vx2, vx3, rho, p1, beta, kappa;
     LBMReal densityRatio = kernel->getDensityRatio();
 
@@ -193,6 +200,13 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     int minX1 = 0;
     int minX2 = 0;
     int minX3 = 0;
+    
+    if (kernel->getGhostLayerWidth() == 2)
+    {
+        minX1 = 1;
+        minX2 = 1;
+        minX3 = 1;
+    }
 
     // int maxX1 = (int)(distributions->getNX1());
     // int maxX2 = (int)(distributions->getNX2());
@@ -202,6 +216,8 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3, -1);
     CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField(
         new CbArray3D<LBMReal, IndexerX3X2X1>(maxX1, maxX2, maxX3, -999.0));
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField2(
+        new CbArray3D<LBMReal, IndexerX3X2X1>(maxX1, maxX2, maxX3, -999.0));
 
     for (int ix3 = minX3; ix3 < maxX3; ix3++) {
         for (int ix2 = minX2; ix2 < maxX2; ix2++) {
@@ -209,24 +225,38 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
                 if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3)) {
                     distributionsH->getDistribution(f, ix1, ix2, ix3);
                     (*phaseField)(ix1, ix2, ix3) =
-                        ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) +
-                        (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) +
-                         ((f[BN] + f[TS]) + (f[TN] + f[BS]))) +
-                        ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[REST];
+                        ((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) +
+                        (((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) + ((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) +
+                        ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) +
+                            ((f[DIR_P00] + f[DIR_M00]) + (f[DIR_0P0] + f[DIR_0M0]) + (f[DIR_00P] + f[DIR_00M])) + f[DIR_000];
+                    if (distributionsH2) {
+                    distributionsH2->getDistribution(f, ix1, ix2, ix3);
+                    (*phaseField2)(ix1, ix2, ix3) =
+                        ((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) +
+                        (((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) + ((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) +
+                        ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) +
+                            ((f[DIR_P00] + f[DIR_M00]) + (f[DIR_0P0] + f[DIR_0M0]) + (f[DIR_00P] + f[DIR_00M])) + f[DIR_000];
+                }
+                    else { (*phaseField2)(ix1, ix2, ix3) = 999.0; }
+                    
                 }
             }
         }
     }
 
-    maxX1 -= 2;
-    maxX2 -= 2;
-    maxX3 -= 2;
-
-    // maxX1 -= 1;
-    // maxX2 -= 1;
-    // maxX3 -= 1;
+    if (kernel->getGhostLayerWidth() == 1)
+    {
+        maxX1 -= 2;
+        maxX2 -= 2;
+        maxX3 -= 2;
+    }
+    else if (kernel->getGhostLayerWidth() == 2)
+    {
+        maxX1 -= 3;
+        maxX2 -= 3;
+        maxX3 -= 3;
+    }
 
-    // D3Q27BoundaryConditionPtr bcPtr;
     int nr = (int)nodes.size();
     LBMReal dX1_phi;
     LBMReal dX2_phi;
@@ -243,7 +273,8 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
                     nodes.push_back(UbTupleFloat3(float(worldCoordinates[0]), float(worldCoordinates[1]),
                                                   float(worldCoordinates[2])));
 
-                    phi[REST] = (*phaseField)(ix1, ix2, ix3);
+                    phi[DIR_000] = (*phaseField)(ix1, ix2, ix3);
+                    phi2[DIR_000] = (*phaseField2)(ix1, ix2, ix3);
 
                     if ((ix1 == 0) || (ix2 == 0) || (ix3 == 0)) {
                         dX1_phi = 0.0;
@@ -254,36 +285,68 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
                         // vx2 = 0.0;
                         // vx3 = 0.0;
                     } else {
-                        phi[E]   = (*phaseField)(ix1 + DX1[E], ix2 + DX2[E], ix3 + DX3[E]);
-                        phi[N]   = (*phaseField)(ix1 + DX1[N], ix2 + DX2[N], ix3 + DX3[N]);
-                        phi[T]   = (*phaseField)(ix1 + DX1[T], ix2 + DX2[T], ix3 + DX3[T]);
-                        phi[W]   = (*phaseField)(ix1 + DX1[W], ix2 + DX2[W], ix3 + DX3[W]);
-                        phi[S]   = (*phaseField)(ix1 + DX1[S], ix2 + DX2[S], ix3 + DX3[S]);
-                        phi[B]   = (*phaseField)(ix1 + DX1[B], ix2 + DX2[B], ix3 + DX3[B]);
-                        phi[NE]  = (*phaseField)(ix1 + DX1[NE], ix2 + DX2[NE], ix3 + DX3[NE]);
-                        phi[NW]  = (*phaseField)(ix1 + DX1[NW], ix2 + DX2[NW], ix3 + DX3[NW]);
-                        phi[TE]  = (*phaseField)(ix1 + DX1[TE], ix2 + DX2[TE], ix3 + DX3[TE]);
-                        phi[TW]  = (*phaseField)(ix1 + DX1[TW], ix2 + DX2[TW], ix3 + DX3[TW]);
-                        phi[TN]  = (*phaseField)(ix1 + DX1[TN], ix2 + DX2[TN], ix3 + DX3[TN]);
-                        phi[TS]  = (*phaseField)(ix1 + DX1[TS], ix2 + DX2[TS], ix3 + DX3[TS]);
-                        phi[SW]  = (*phaseField)(ix1 + DX1[SW], ix2 + DX2[SW], ix3 + DX3[SW]);
-                        phi[SE]  = (*phaseField)(ix1 + DX1[SE], ix2 + DX2[SE], ix3 + DX3[SE]);
-                        phi[BW]  = (*phaseField)(ix1 + DX1[BW], ix2 + DX2[BW], ix3 + DX3[BW]);
-                        phi[BE]  = (*phaseField)(ix1 + DX1[BE], ix2 + DX2[BE], ix3 + DX3[BE]);
-                        phi[BS]  = (*phaseField)(ix1 + DX1[BS], ix2 + DX2[BS], ix3 + DX3[BS]);
-                        phi[BN]  = (*phaseField)(ix1 + DX1[BN], ix2 + DX2[BN], ix3 + DX3[BN]);
-                        phi[BSW] = (*phaseField)(ix1 + DX1[BSW], ix2 + DX2[BSW], ix3 + DX3[BSW]);
-                        phi[BSE] = (*phaseField)(ix1 + DX1[BSE], ix2 + DX2[BSE], ix3 + DX3[BSE]);
-                        phi[BNW] = (*phaseField)(ix1 + DX1[BNW], ix2 + DX2[BNW], ix3 + DX3[BNW]);
-                        phi[BNE] = (*phaseField)(ix1 + DX1[BNE], ix2 + DX2[BNE], ix3 + DX3[BNE]);
-                        phi[TNE] = (*phaseField)(ix1 + DX1[TNE], ix2 + DX2[TNE], ix3 + DX3[TNE]);
-                        phi[TNW] = (*phaseField)(ix1 + DX1[TNW], ix2 + DX2[TNW], ix3 + DX3[TNW]);
-                        phi[TSE] = (*phaseField)(ix1 + DX1[TSE], ix2 + DX2[TSE], ix3 + DX3[TSE]);
-                        phi[TSW] = (*phaseField)(ix1 + DX1[TSW], ix2 + DX2[TSW], ix3 + DX3[TSW]);
+                        phi[DIR_P00] = (*phaseField)(ix1 + DX1[DIR_P00], ix2 + DX2[DIR_P00], ix3 + DX3[DIR_P00]);
+                        phi[DIR_0P0] = (*phaseField)(ix1 + DX1[DIR_0P0], ix2 + DX2[DIR_0P0], ix3 + DX3[DIR_0P0]);
+                        phi[DIR_00P] = (*phaseField)(ix1 + DX1[DIR_00P], ix2 + DX2[DIR_00P], ix3 + DX3[DIR_00P]);
+                        phi[DIR_M00] = (*phaseField)(ix1 + DX1[DIR_M00], ix2 + DX2[DIR_M00], ix3 + DX3[DIR_M00]);
+                        phi[DIR_0M0] = (*phaseField)(ix1 + DX1[DIR_0M0], ix2 + DX2[DIR_0M0], ix3 + DX3[DIR_0M0]);
+                        phi[DIR_00M] = (*phaseField)(ix1 + DX1[DIR_00M], ix2 + DX2[DIR_00M], ix3 + DX3[DIR_00M]);
+                        phi[DIR_PP0] = (*phaseField)(ix1 + DX1[DIR_PP0], ix2 + DX2[DIR_PP0], ix3 + DX3[DIR_PP0]);
+                        phi[DIR_MP0] = (*phaseField)(ix1 + DX1[DIR_MP0], ix2 + DX2[DIR_MP0], ix3 + DX3[DIR_MP0]);
+                        phi[DIR_P0P] = (*phaseField)(ix1 + DX1[DIR_P0P], ix2 + DX2[DIR_P0P], ix3 + DX3[DIR_P0P]);
+                        phi[DIR_M0P] = (*phaseField)(ix1 + DX1[DIR_M0P], ix2 + DX2[DIR_M0P], ix3 + DX3[DIR_M0P]);
+                        phi[DIR_0PP] = (*phaseField)(ix1 + DX1[DIR_0PP], ix2 + DX2[DIR_0PP], ix3 + DX3[DIR_0PP]);
+                        phi[DIR_0MP] = (*phaseField)(ix1 + DX1[DIR_0MP], ix2 + DX2[DIR_0MP], ix3 + DX3[DIR_0MP]);
+                        phi[DIR_MM0] = (*phaseField)(ix1 + DX1[DIR_MM0], ix2 + DX2[DIR_MM0], ix3 + DX3[DIR_MM0]);
+                        phi[DIR_PM0] = (*phaseField)(ix1 + DX1[DIR_PM0], ix2 + DX2[DIR_PM0], ix3 + DX3[DIR_PM0]);
+                        phi[DIR_M0M] = (*phaseField)(ix1 + DX1[DIR_M0M], ix2 + DX2[DIR_M0M], ix3 + DX3[DIR_M0M]);
+                        phi[DIR_P0M] = (*phaseField)(ix1 + DX1[DIR_P0M], ix2 + DX2[DIR_P0M], ix3 + DX3[DIR_P0M]);
+                        phi[DIR_0MM] = (*phaseField)(ix1 + DX1[DIR_0MM], ix2 + DX2[DIR_0MM], ix3 + DX3[DIR_0MM]);
+                        phi[DIR_0PM] = (*phaseField)(ix1 + DX1[DIR_0PM], ix2 + DX2[DIR_0PM], ix3 + DX3[DIR_0PM]);
+                        phi[DIR_MMM] = (*phaseField)(ix1 + DX1[DIR_MMM], ix2 + DX2[DIR_MMM], ix3 + DX3[DIR_MMM]);
+                        phi[DIR_PMM] = (*phaseField)(ix1 + DX1[DIR_PMM], ix2 + DX2[DIR_PMM], ix3 + DX3[DIR_PMM]);
+                        phi[DIR_MPM] = (*phaseField)(ix1 + DX1[DIR_MPM], ix2 + DX2[DIR_MPM], ix3 + DX3[DIR_MPM]);
+                        phi[DIR_PPM] = (*phaseField)(ix1 + DX1[DIR_PPM], ix2 + DX2[DIR_PPM], ix3 + DX3[DIR_PPM]);
+                        phi[DIR_PPP] = (*phaseField)(ix1 + DX1[DIR_PPP], ix2 + DX2[DIR_PPP], ix3 + DX3[DIR_PPP]);
+                        phi[DIR_MPP] = (*phaseField)(ix1 + DX1[DIR_MPP], ix2 + DX2[DIR_MPP], ix3 + DX3[DIR_MPP]);
+                        phi[DIR_PMP] = (*phaseField)(ix1 + DX1[DIR_PMP], ix2 + DX2[DIR_PMP], ix3 + DX3[DIR_PMP]);
+                        phi[DIR_MMP] = (*phaseField)(ix1 + DX1[DIR_MMP], ix2 + DX2[DIR_MMP], ix3 + DX3[DIR_MMP]);
                         dX1_phi  = 0.0 * gradX1_phi(phi);
                         dX2_phi  = 0.0 * gradX2_phi(phi);
                         dX3_phi  = 0.0 * gradX3_phi(phi);
-                        mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi(phi);
+                        mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(phi);
+
+                        //phi2[DIR_P00] = (*phaseField2)(ix1 + DX1[DIR_P00], ix2 + DX2[DIR_P00], ix3 + DX3[DIR_P00]);
+                        //phi2[N] = (*phaseField2)(ix1 + DX1[N], ix2 + DX2[N], ix3 + DX3[N]);
+                        //phi2[T] = (*phaseField2)(ix1 + DX1[T], ix2 + DX2[T], ix3 + DX3[T]);
+                        //phi2[W] = (*phaseField2)(ix1 + DX1[W], ix2 + DX2[W], ix3 + DX3[W]);
+                        //phi2[S] = (*phaseField2)(ix1 + DX1[S], ix2 + DX2[S], ix3 + DX3[S]);
+                        //phi2[B] = (*phaseField2)(ix1 + DX1[B], ix2 + DX2[B], ix3 + DX3[B]);
+                        //phi2[NE] = (*phaseField2)(ix1 + DX1[NE], ix2 + DX2[NE], ix3 + DX3[NE]);
+                        //phi2[NW] = (*phaseField2)(ix1 + DX1[NW], ix2 + DX2[NW], ix3 + DX3[NW]);
+                        //phi2[TE] = (*phaseField2)(ix1 + DX1[TE], ix2 + DX2[TE], ix3 + DX3[TE]);
+                        //phi2[TW] = (*phaseField2)(ix1 + DX1[TW], ix2 + DX2[TW], ix3 + DX3[TW]);
+                        //phi2[TN] = (*phaseField2)(ix1 + DX1[TN], ix2 + DX2[TN], ix3 + DX3[TN]);
+                        //phi2[TS] = (*phaseField2)(ix1 + DX1[TS], ix2 + DX2[TS], ix3 + DX3[TS]);
+                        //phi2[SW] = (*phaseField2)(ix1 + DX1[SW], ix2 + DX2[SW], ix3 + DX3[SW]);
+                        //phi2[SE] = (*phaseField2)(ix1 + DX1[SE], ix2 + DX2[SE], ix3 + DX3[SE]);
+                        //phi2[BW] = (*phaseField2)(ix1 + DX1[BW], ix2 + DX2[BW], ix3 + DX3[BW]);
+                        //phi2[BE] = (*phaseField2)(ix1 + DX1[BE], ix2 + DX2[BE], ix3 + DX3[BE]);
+                        //phi2[BS] = (*phaseField2)(ix1 + DX1[BS], ix2 + DX2[BS], ix3 + DX3[BS]);
+                        //phi2[BN] = (*phaseField2)(ix1 + DX1[BN], ix2 + DX2[BN], ix3 + DX3[BN]);
+                        //phi2[BSW] = (*phaseField2)(ix1 + DX1[BSW], ix2 + DX2[BSW], ix3 + DX3[BSW]);
+                        //phi2[BSE] = (*phaseField2)(ix1 + DX1[BSE], ix2 + DX2[BSE], ix3 + DX3[BSE]);
+                        //phi2[BNW] = (*phaseField2)(ix1 + DX1[BNW], ix2 + DX2[BNW], ix3 + DX3[BNW]);
+                        //phi2[BNE] = (*phaseField2)(ix1 + DX1[BNE], ix2 + DX2[BNE], ix3 + DX3[BNE]);
+                        //phi2[TNE] = (*phaseField2)(ix1 + DX1[TNE], ix2 + DX2[TNE], ix3 + DX3[TNE]);
+                        //phi2[TNW] = (*phaseField2)(ix1 + DX1[TNW], ix2 + DX2[TNW], ix3 + DX3[TNW]);
+                        //phi2[TSE] = (*phaseField2)(ix1 + DX1[TSE], ix2 + DX2[TSE], ix3 + DX3[TSE]);
+                        //phi2[TSW] = (*phaseField2)(ix1 + DX1[TSW], ix2 + DX2[TSW], ix3 + DX3[TSW]);
+
+                       // mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi(phi);
+
+
+
                     }
 
                     distributionsF->getDistribution(f, ix1, ix2, ix3);
@@ -295,30 +358,47 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
                     LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
 
                     // rho = phi[ZERO] + (1.0 - phi[ZERO])*1.0/densityRatio;
-                    rho = rhoH + rhoToPhi * (phi[REST] - phiH);
-
-                   vx1 =
-                        ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
-                         (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) /
-                            (rho * c1o3) +
-                        mu * dX1_phi / (2 * rho);
-
-                    vx2 =
-                        ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
-                         (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) /
-                            (rho * c1o3) +
-                        mu * dX2_phi / (2 * rho);
-
-                    vx3 =
-                        ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
-                         (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) /
-                            (rho * c1o3) +
-                        mu * dX3_phi / (2 * rho);
-
-                    p1 = (((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) +
-                          (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) +
-                           ((f[BN] + f[TS]) + (f[TN] + f[BS]))) +
-                          ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[REST]) +
+                    rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH);
+
+                    if (pressure) {
+                        vx1 =
+                            ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+                            (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])) ;
+
+                        vx2 =
+                            ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+                            (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])) ;
+
+                        vx3 =
+                            ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) +
+                            (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M]));
+
+                    }
+                    else {
+                        vx1 =
+                            ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+                            (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])) /
+                                (rho * c1o3) +
+                            mu * dX1_phi / (2 * rho);
+
+                        vx2 =
+                            ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+                            (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])) /
+                                (rho * c1o3) +
+                            mu * dX2_phi / (2 * rho);
+
+                        vx3 =
+                            ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) +
+                            (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M])) /
+                                (rho * c1o3) +
+                            mu * dX3_phi / (2 * rho);
+
+                    }
+
+                    p1 = (((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) +
+                          (((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) + ((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) +
+                           ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) +
+                          ((f[DIR_P00] + f[DIR_M00]) + (f[DIR_0P0] + f[DIR_0M0]) + (f[DIR_00P] + f[DIR_00M])) + f[DIR_000]) +
                          (vx1 * rhoToPhi * dX1_phi * c1o3 + vx2 * rhoToPhi * dX2_phi * c1o3 +
                           vx3 * rhoToPhi * dX3_phi * c1o3) /
                              2.0;
@@ -346,7 +426,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
                                            block->toString() + ", node=" + UbSystem::toString(ix1) + "," +
                                            UbSystem::toString(ix2) + "," + UbSystem::toString(ix3)));
 
-                    if (UbMath::isNaN(phi[REST]) || UbMath::isInfinity(phi[REST]))
+                    if (UbMath::isNaN(phi[DIR_000]) || UbMath::isInfinity(phi[DIR_000]))
                         UB_THROW(UbException(
                             UB_EXARGS, "phi is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" +
                                            block->toString() + ", node=" + UbSystem::toString(ix1) + "," +
@@ -356,11 +436,13 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
                         UB_THROW( UbException(UB_EXARGS,"p1 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+
                         ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
 
-                    data[index++].push_back(phi[REST]);
+                    data[index++].push_back(phi[DIR_000]);
                     data[index++].push_back(vx1);
                     data[index++].push_back(vx2);
                     data[index++].push_back(vx3);
                     data[index++].push_back(p1);
+                    data[index++].push_back(phi2[DIR_000]);
+                    if (pressure) data[index++].push_back((*pressure)(ix1, ix2, ix3));
                 }
             }
         }
@@ -420,7 +502,7 @@ LBMReal WriteMultiphaseQuantitiesCoProcessor::nabla2_phi(const LBMReal *const &h
     using namespace D3Q27System;
     LBMReal sum = 0.0;
     for (int k = FSTARTDIR; k <= FENDDIR; k++) {
-        sum += WEIGTH[k] * (h[k] - h[REST]);
+        sum += WEIGTH[k] * (h[k] - h[DIR_000]);
     }
     return 6.0 * sum;
 }
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h
index 7c5c4f136fc814bec2c9d782e7502668c785ab42..00ba4c4e915530a4678b7271b8f78648f267cd96 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h
@@ -156,15 +156,15 @@ CoarseToFineVectorConnector<VectorTransmitter>::CoarseToFineVectorConnector(
       receiverEvenOddNW(receiverEvenOddNW), receiverOddEvenSE(receiverOddEvenSE), receiverOddOddNE(receiverOddOddNE),
       iprocessor(iprocessor)
 {
-    if (!(sendDir == D3Q27System::E || sendDir == D3Q27System::W || sendDir == D3Q27System::N ||
-          sendDir == D3Q27System::S || sendDir == D3Q27System::T || sendDir == D3Q27System::B ||
-          sendDir == D3Q27System::NE || sendDir == D3Q27System::SW || sendDir == D3Q27System::SE ||
-          sendDir == D3Q27System::NW || sendDir == D3Q27System::TE || sendDir == D3Q27System::BW ||
-          sendDir == D3Q27System::BE || sendDir == D3Q27System::TW || sendDir == D3Q27System::TN ||
-          sendDir == D3Q27System::BS || sendDir == D3Q27System::BN || sendDir == D3Q27System::TS ||
-          sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSE ||
-          sendDir == D3Q27System::TSW || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW ||
-          sendDir == D3Q27System::BSE || sendDir == D3Q27System::BSW)) {
+    if (!(sendDir == D3Q27System::DIR_P00 || sendDir == D3Q27System::DIR_M00 || sendDir == D3Q27System::DIR_0P0 ||
+          sendDir == D3Q27System::DIR_0M0 || sendDir == D3Q27System::DIR_00P || sendDir == D3Q27System::DIR_00M ||
+          sendDir == D3Q27System::DIR_PP0 || sendDir == D3Q27System::DIR_MM0 || sendDir == D3Q27System::DIR_PM0 ||
+          sendDir == D3Q27System::DIR_MP0 || sendDir == D3Q27System::DIR_P0P || sendDir == D3Q27System::DIR_M0M ||
+          sendDir == D3Q27System::DIR_P0M || sendDir == D3Q27System::DIR_M0P || sendDir == D3Q27System::DIR_0PP ||
+          sendDir == D3Q27System::DIR_0MM || sendDir == D3Q27System::DIR_0PM || sendDir == D3Q27System::DIR_0MP ||
+          sendDir == D3Q27System::DIR_PPP || sendDir == D3Q27System::DIR_MPP || sendDir == D3Q27System::DIR_PMP ||
+          sendDir == D3Q27System::DIR_MMP || sendDir == D3Q27System::DIR_PPM || sendDir == D3Q27System::DIR_MPM ||
+          sendDir == D3Q27System::DIR_PMM || sendDir == D3Q27System::DIR_MMM)) {
         throw UbException(UB_EXARGS, "invalid constructor for this direction");
     }
 }
@@ -310,44 +310,44 @@ void CoarseToFineVectorConnector<VectorTransmitter>::init()
     int iCellSize       = 8; // size of interpolation cell
 
     switch (this->sendDir) {
-        case E:
-        case W:
+        case DIR_P00:
+        case DIR_M00:
             sendSize = bMaxX2 * bMaxX3 * sendDataPerNode * iCellSize;
             break;
-        case N:
-        case S:
+        case DIR_0P0:
+        case DIR_0M0:
             sendSize = bMaxX1 * bMaxX3 * sendDataPerNode * iCellSize;
             break;
-        case T:
-        case B:
+        case DIR_00P:
+        case DIR_00M:
             sendSize = bMaxX1 * bMaxX2 * sendDataPerNode * iCellSize;
             break;
-        case NE:
-        case SW:
-        case SE:
-        case NW:
+        case DIR_PP0:
+        case DIR_MM0:
+        case DIR_PM0:
+        case DIR_MP0:
             sendSize = 2 * bMaxX3 * sendDataPerNode * iCellSize;
             break;
-        case TE:
-        case BW:
-        case BE:
-        case TW:
+        case DIR_P0P:
+        case DIR_M0M:
+        case DIR_P0M:
+        case DIR_M0P:
             sendSize = 2 * bMaxX2 * sendDataPerNode * iCellSize;
             break;
-        case TN:
-        case BS:
-        case BN:
-        case TS:
+        case DIR_0PP:
+        case DIR_0MM:
+        case DIR_0PM:
+        case DIR_0MP:
             sendSize = 2 * bMaxX1 * sendDataPerNode * iCellSize;
             break;
-        case TNE:
-        case TNW:
-        case TSE:
-        case TSW:
-        case BNE:
-        case BNW:
-        case BSE:
-        case BSW:
+        case DIR_PPP:
+        case DIR_MPP:
+        case DIR_PMP:
+        case DIR_MMP:
+        case DIR_PPM:
+        case DIR_MPM:
+        case DIR_PMM:
+        case DIR_MMM:
             sendSize = 6 * bMaxX1 * sendDataPerNode * iCellSize;
             break;
         default:
@@ -408,7 +408,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
     int lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3;
 
     switch (sendDir) {
-        case E:
+        case DIR_P00:
             lMinX1 = maxX1 - 3;
             lMaxX1 = lMinX1 + 1;
 
@@ -428,7 +428,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false);
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case W:
+        case DIR_M00:
             lMinX1 = 1;
             lMaxX1 = lMinX1 + 1;
 
@@ -448,7 +448,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false);
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case N:
+        case DIR_0P0:
             lMinX2 = maxX2 - 3;
             lMaxX2 = lMinX2 + 1;
 
@@ -468,7 +468,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false);
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case S:
+        case DIR_0M0:
             lMinX2 = 1;
             lMaxX2 = lMinX2 + 1;
 
@@ -488,7 +488,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false);
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case T:
+        case DIR_00P:
             lMinX3 = maxX3 - 3;
             lMaxX3 = lMinX3 + 1;
 
@@ -508,7 +508,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             getLocalMinMax(minX2, maxX2, false, lMinX2, lMaxX2, false);
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case B:
+        case DIR_00M:
             lMinX3 = 1;
             lMaxX3 = lMinX3 + 1;
 
@@ -529,7 +529,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
             /// N-S-E-W
-        case NE:
+        case DIR_PP0:
             lMinX1 = maxX1 - 3;
             lMaxX1 = lMinX1 + 2;
             lMinX2 = maxX2 - 3;
@@ -543,7 +543,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case SW:
+        case DIR_MM0:
             lMinX1 = 0;
             lMaxX1 = lMinX1 + 2;
             lMinX2 = 0;
@@ -557,7 +557,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case SE:
+        case DIR_PM0:
             lMinX1 = maxX1 - 3;
             lMaxX1 = lMinX1 + 2;
             lMinX2 = 0;
@@ -571,7 +571,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case NW:
+        case DIR_MP0:
             lMinX1 = 0;
             lMaxX1 = lMinX1 + 2;
             lMinX2 = maxX2 - 3;
@@ -585,7 +585,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
             /////T-B-E-W
-        case TE:
+        case DIR_P0P:
             lMinX1 = maxX1 - 3;
             lMaxX1 = lMinX1 + 2;
             lMinX3 = maxX3 - 3;
@@ -599,7 +599,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case BW:
+        case DIR_M0M:
             lMinX1 = 0;
             lMaxX1 = lMinX1 + 2;
             lMinX3 = 0;
@@ -613,7 +613,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case BE:
+        case DIR_P0M:
             lMinX1 = maxX1 - 3;
             lMaxX1 = lMinX1 + 2;
             lMinX3 = 0;
@@ -627,7 +627,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case TW:
+        case DIR_M0P:
             lMinX1 = 0;
             lMaxX1 = lMinX1 + 2;
             lMinX3 = maxX3 - 3;
@@ -642,7 +642,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             break;
             ////
             /////T-B-N-S
-        case TN:
+        case DIR_0PP:
             lMinX2 = maxX2 - 3;
             lMaxX2 = lMinX2 + 2;
             lMinX3 = maxX3 - 3;
@@ -656,7 +656,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case BS:
+        case DIR_0MM:
             lMinX2 = 0;
             lMaxX2 = lMinX2 + 2;
             lMinX3 = 0;
@@ -670,7 +670,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case BN:
+        case DIR_0PM:
             lMinX2 = maxX2 - 3;
             lMaxX2 = lMinX2 + 2;
             lMinX3 = 0;
@@ -684,7 +684,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case TS:
+        case DIR_0MP:
             lMinX2 = 0;
             lMaxX2 = lMinX2 + 2;
             lMinX3 = maxX3 - 3;
@@ -699,7 +699,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             break;
 
             // TNE
-        case TNE:
+        case DIR_PPP:
             lMinX1 = maxX1 - 3;
             lMaxX1 = maxX1 - 1;
             lMinX2 = maxX2 - 3;
@@ -710,7 +710,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   TNW
-        case TNW:
+        case DIR_MPP:
             lMinX1 = 0;
             lMaxX1 = 2;
             lMinX2 = maxX2 - 3;
@@ -721,7 +721,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   TSE
-        case TSE:
+        case DIR_PMP:
             lMinX1 = maxX1 - 3;
             lMaxX1 = maxX1 - 1;
             lMinX2 = 0;
@@ -732,7 +732,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   TSW
-        case TSW:
+        case DIR_MMP:
             lMinX1 = 0;
             lMaxX1 = 2;
             lMinX2 = 0;
@@ -743,7 +743,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   BNE
-        case BNE:
+        case DIR_PPM:
             lMinX1 = maxX1 - 3;
             lMaxX1 = maxX1 - 1;
             lMinX2 = maxX2 - 3;
@@ -754,7 +754,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   BNW
-        case BNW:
+        case DIR_MPM:
             lMinX1 = 0;
             lMaxX1 = 2;
             lMinX2 = maxX2 - 3;
@@ -765,7 +765,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   BSE
-        case BSE:
+        case DIR_PMM:
             lMinX1 = maxX1 - 3;
             lMaxX1 = maxX1 - 1;
             lMinX2 = 0;
@@ -776,7 +776,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   BSW
-        case BSW:
+        case DIR_MMM:
             lMinX1 = 0;
             lMaxX1 = 2;
             lMinX2 = 0;
@@ -912,7 +912,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
     int dummy;
 
     switch (sendDir) {
-        case E:
+        case DIR_P00:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 1;
             getLocalMinMax(minX2, maxX2, true, lMinX2, lMaxX2, true);
@@ -935,7 +935,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             getLocalMinMax(dummy, dummy, dummy, dummy, lMaxX2, lMaxX3);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case W:
+        case DIR_M00:
             lMinX1 = 3;
             lMaxX1 = lMinX1 + 1;
             getLocalMinMax(minX2, maxX2, true, lMinX2, lMaxX2, true);
@@ -958,7 +958,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             getLocalMinMax(dummy, dummy, dummy, dummy, lMaxX2, lMaxX3);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case N:
+        case DIR_0P0:
             lMinX2 = maxX2 - 4;
             lMaxX2 = lMinX2 + 1;
             getLocalMinMax(minX1, maxX1, true, lMinX1, lMaxX1, true);
@@ -981,7 +981,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             getLocalMinMax(dummy, dummy, dummy, lMaxX1, dummy, lMaxX3);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case S:
+        case DIR_0M0:
             lMinX2 = 3;
             lMaxX2 = lMinX2 + 1;
             getLocalMinMax(minX1, maxX1, true, lMinX1, lMaxX1, true);
@@ -1004,7 +1004,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             getLocalMinMax(dummy, dummy, dummy, lMaxX1, dummy, lMaxX3);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case T:
+        case DIR_00P:
             lMinX3 = maxX3 - 4;
             lMaxX3 = lMinX3 + 1;
             getLocalMinMax(minX1, maxX1, true, lMinX1, lMaxX1, true);
@@ -1027,7 +1027,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             getLocalMinMax(dummy, dummy, dummy, lMaxX1, lMaxX2, dummy);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
             break;
-        case B:
+        case DIR_00M:
             lMinX3 = 3;
             lMaxX3 = lMinX3 + 1;
             getLocalMinMax(minX1, maxX1, true, lMinX1, lMaxX1, true);
@@ -1052,7 +1052,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             break;
 
             //	/////E-W-N-S
-        case NE:
+        case DIR_PP0:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 3;
             lMinX2 = maxX2 - 4;
@@ -1079,7 +1079,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
 
-        case SW:
+        case DIR_MM0:
             lMinX1 = 1;
             lMaxX1 = lMinX1 + 3;
             lMinX2 = 3;
@@ -1106,7 +1106,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
 
-        case SE:
+        case DIR_PM0:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 3;
             lMinX2 = 3;
@@ -1133,7 +1133,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
 
-        case NW:
+        case DIR_MP0:
             lMinX1 = 1;
             lMaxX1 = lMinX1 + 3;
             lMinX2 = maxX2 - 4;
@@ -1160,7 +1160,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
             //		/////T-B-E-W
-        case TE:
+        case DIR_P0P:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 3;
             lMinX3 = maxX3 - 4;
@@ -1187,7 +1187,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
 
-        case BW:
+        case DIR_M0M:
             lMinX1 = 1;
             lMaxX1 = lMinX1 + 3;
             lMinX3 = 3;
@@ -1214,7 +1214,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
 
-        case BE:
+        case DIR_P0M:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 3;
             lMinX3 = 3;
@@ -1241,7 +1241,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
 
-        case TW:
+        case DIR_M0P:
             lMinX1 = 1;
             lMaxX1 = lMinX1 + 3;
             lMinX3 = maxX3 - 4;
@@ -1269,7 +1269,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             break;
 
             /////////////////////////T-N-B-S
-        case TN:
+        case DIR_0PP:
             lMinX2 = maxX2 - 4;
             lMaxX2 = lMinX2 + 3;
             lMinX3 = maxX3 - 4;
@@ -1296,7 +1296,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
 
-        case BS:
+        case DIR_0MM:
             lMinX2 = 1;
             lMaxX2 = lMinX2 + 3;
             lMinX3 = 3;
@@ -1323,7 +1323,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
 
-        case BN:
+        case DIR_0PM:
             lMinX2 = maxX2 - 4;
             lMaxX2 = lMinX2 + 3;
             lMinX3 = 3;
@@ -1350,7 +1350,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
 
-        case TS:
+        case DIR_0MP:
             lMinX2 = 1;
             lMaxX2 = lMinX2 + 3;
             lMinX3 = maxX3 - 4;
@@ -1378,7 +1378,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             break;
 
             // TNE
-        case TNE:
+        case DIR_PPP:
             lMinX1 = maxX1 - 4;
             lMaxX1 = maxX1 - 3;
             lMinX2 = maxX2 - 4;
@@ -1405,7 +1405,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
             //   TNW
-        case TNW:
+        case DIR_MPP:
             lMinX1 = 3;
             lMaxX1 = 4;
             lMinX2 = maxX2 - 4;
@@ -1432,7 +1432,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
             //   TSE
-        case TSE:
+        case DIR_PMP:
             lMinX1 = maxX1 - 4;
             lMaxX1 = maxX1 - 3;
             lMinX2 = 1;
@@ -1458,7 +1458,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   TSW
-        case TSW:
+        case DIR_MMP:
             lMinX1 = 3;
             lMaxX1 = 4;
             lMinX2 = 1;
@@ -1484,7 +1484,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   BNE
-        case BNE:
+        case DIR_PPM:
             lMinX1 = maxX1 - 4;
             lMaxX1 = maxX1 - 3;
             lMinX2 = maxX2 - 4;
@@ -1511,7 +1511,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
             break;
             //   BNW
-        case BNW:
+        case DIR_MPM:
             lMinX1 = 3;
             lMaxX1 = 4;
             lMinX2 = maxX2 - 4;
@@ -1537,7 +1537,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   BSE
-        case BSE:
+        case DIR_PMM:
             lMinX1 = maxX1 - 4;
             lMaxX1 = maxX1 - 3;
             lMinX2 = 1;
@@ -1563,7 +1563,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv);
             break;
             //   BSW
-        case BSW:
+        case DIR_MMM:
             lMinX1 = 3;
             lMaxX1 = 4;
             lMinX2 = 1;
@@ -1634,55 +1634,55 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     int TmaxX2 = maxX2;
     int TmaxX3 = maxX3;
 
-    if (block.lock()->hasInterpolationFlagCF(E)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_P00)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(W)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_M00)) {
         if (minX1 == TminX1)
             minX1 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(N)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0P0)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(S)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0M0)) {
         if (minX2 == TminX2)
             minX2 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (maxX3 == TmaxX3)
             maxX3 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (minX3 == TminX3)
             minX3 += 2;
     }
 
     // E-W-N-S
-    if (block.lock()->hasInterpolationFlagCF(NE) && !block.lock()->hasInterpolationFlagCF(N) &&
-        !block.lock()->hasInterpolationFlagCF(E)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_PP0) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_P00)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
         if (maxX2 == TmaxX2)
             maxX2 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(SW) && !block.lock()->hasInterpolationFlagCF(W) &&
-        !block.lock()->hasInterpolationFlagCF(S)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_MM0) && !block.lock()->hasInterpolationFlagCF(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_0M0)) {
         if (minX1 == TminX1)
             minX1 += 2;
         if (minX2 == TminX2)
             minX2 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(SE) && !block.lock()->hasInterpolationFlagCF(E) &&
-        !block.lock()->hasInterpolationFlagCF(S)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_PM0) && !block.lock()->hasInterpolationFlagCF(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_0M0)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
         if (minX2 == TminX2)
             minX2 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(NW) && !block.lock()->hasInterpolationFlagCF(N) &&
-        !block.lock()->hasInterpolationFlagCF(W)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_MP0) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_M00)) {
         if (minX1 == TminX1)
             minX1 += 2;
         if (maxX2 == TmaxX2)
@@ -1690,29 +1690,29 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     //	////T-B-E-W
-    if (block.lock()->hasInterpolationFlagCF(TE) && !block.lock()->hasInterpolationFlagCF(E) &&
-        !block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_P0P) && !block.lock()->hasInterpolationFlagCF(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
         if (maxX3 == TmaxX3)
             maxX3 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(BW) && !block.lock()->hasInterpolationFlagCF(W) &&
-        !block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_M0M) && !block.lock()->hasInterpolationFlagCF(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (minX1 == TminX1)
             minX1 += 2;
         if (minX3 == TminX3)
             minX3 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(BE) && !block.lock()->hasInterpolationFlagCF(E) &&
-        !block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_P0M) && !block.lock()->hasInterpolationFlagCF(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
         if (minX3 == TminX3)
             minX3 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(TW) && !block.lock()->hasInterpolationFlagCF(W) &&
-        !block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_M0P) && !block.lock()->hasInterpolationFlagCF(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (minX1 == TminX1)
             minX1 += 2;
         if (maxX3 == TmaxX3)
@@ -1720,29 +1720,29 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     ////T-B-N-S
-    if (block.lock()->hasInterpolationFlagCF(TN) && !block.lock()->hasInterpolationFlagCF(N) &&
-        !block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0PP) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 2;
         if (maxX3 == TmaxX3)
             maxX3 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(BS) && !block.lock()->hasInterpolationFlagCF(S) &&
-        !block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0MM) && !block.lock()->hasInterpolationFlagCF(DIR_0M0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (minX2 == TminX2)
             minX2 += 2;
         if (minX3 == TminX3)
             minX3 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(BN) && !block.lock()->hasInterpolationFlagCF(N) &&
-        !block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0PM) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 2;
         if (minX3 == TminX3)
             minX3 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(TS) && !block.lock()->hasInterpolationFlagCF(S) &&
-        !block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0MP) && !block.lock()->hasInterpolationFlagCF(DIR_0M0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (minX2 == TminX2)
             minX2 += 2;
         if (maxX3 == TmaxX3)
@@ -1750,10 +1750,10 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     // if
-    // (block.lock()->hasInterpolationFlagCF(D3Q27System::TNE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::TN)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::NE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::T)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::N)
-    // && !block.lock()->hasInterpolationFlagCF(D3Q27System::E)) if
-    // (!block.lock()->hasInterpolationFlagCF(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::T)&&
-    // !block.lock()->hasInterpolationFlagCF(D3Q27System::E))
+    // (block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_PPP)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_00P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_0P0)
+    // && !block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P00)) if
+    // (!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_00P)&&
+    // !block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P00))
     //{
     //   if (maxX1==TmaxX1) maxX1 -= 2;
     //   if (maxX2==TmaxX2) maxX2 -= 2;
@@ -1774,55 +1774,55 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     int TmaxX2 = maxX2;
     int TmaxX3 = maxX3;
 
-    if (block.lock()->hasInterpolationFlagCF(E)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_P00)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(W)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_M00)) {
         if (minX1 == TminX1)
             minX1 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(N)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0P0)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(S)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0M0)) {
         if (minX2 == TminX2)
             minX2 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (maxX3 == TmaxX3)
             maxX3 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (minX3 == TminX3)
             minX3 += 2;
     }
 
     // E-W-N-S
-    if (block.lock()->hasInterpolationFlagCF(NE) && !block.lock()->hasInterpolationFlagCF(N) &&
-        !block.lock()->hasInterpolationFlagCF(E)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_PP0) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_P00)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
         if (maxX2 == TmaxX2)
             maxX2 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(SW) && !block.lock()->hasInterpolationFlagCF(W) &&
-        !block.lock()->hasInterpolationFlagCF(S)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_MM0) && !block.lock()->hasInterpolationFlagCF(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_0M0)) {
         if (minX1 == TminX1)
             minX1 += 2;
         if (minX2 == TminX2)
             minX2 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(SE) && !block.lock()->hasInterpolationFlagCF(E) &&
-        !block.lock()->hasInterpolationFlagCF(S)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_PM0) && !block.lock()->hasInterpolationFlagCF(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_0M0)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
         if (minX2 == TminX2)
             minX2 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(NW) && !block.lock()->hasInterpolationFlagCF(N) &&
-        !block.lock()->hasInterpolationFlagCF(W)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_MP0) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_M00)) {
         if (minX1 == TminX1)
             minX1 += 2;
         if (maxX2 == TmaxX2)
@@ -1830,29 +1830,29 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     //	////T-B-E-W
-    if (block.lock()->hasInterpolationFlagCF(TE) && !block.lock()->hasInterpolationFlagCF(E) &&
-        !block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_P0P) && !block.lock()->hasInterpolationFlagCF(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
         if (maxX3 == TmaxX3)
             maxX3 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(BW) && !block.lock()->hasInterpolationFlagCF(W) &&
-        !block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_M0M) && !block.lock()->hasInterpolationFlagCF(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (minX1 == TminX1)
             minX1 += 2;
         if (minX3 == TminX3)
             minX3 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(BE) && !block.lock()->hasInterpolationFlagCF(E) &&
-        !block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_P0M) && !block.lock()->hasInterpolationFlagCF(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 2;
         if (minX3 == TminX3)
             minX3 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(TW) && !block.lock()->hasInterpolationFlagCF(W) &&
-        !block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_M0P) && !block.lock()->hasInterpolationFlagCF(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (minX1 == TminX1)
             minX1 += 2;
         if (maxX3 == TmaxX3)
@@ -1860,29 +1860,29 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     ////T-B-N-S
-    if (block.lock()->hasInterpolationFlagCF(TN) && !block.lock()->hasInterpolationFlagCF(N) &&
-        !block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0PP) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 2;
         if (maxX3 == TmaxX3)
             maxX3 -= 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(BS) && !block.lock()->hasInterpolationFlagCF(S) &&
-        !block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0MM) && !block.lock()->hasInterpolationFlagCF(DIR_0M0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (minX2 == TminX2)
             minX2 += 2;
         if (minX3 == TminX3)
             minX3 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(BN) && !block.lock()->hasInterpolationFlagCF(N) &&
-        !block.lock()->hasInterpolationFlagCF(B)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0PM) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00M)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 2;
         if (minX3 == TminX3)
             minX3 += 2;
     }
-    if (block.lock()->hasInterpolationFlagCF(TS) && !block.lock()->hasInterpolationFlagCF(S) &&
-        !block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0MP) && !block.lock()->hasInterpolationFlagCF(DIR_0M0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         if (minX2 == TminX2)
             minX2 += 2;
         if (maxX3 == TmaxX3)
@@ -1890,8 +1890,8 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     // if
-    // (block.lock()->hasInterpolationFlagCF(D3Q27System::TNE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::TN)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::NE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::T)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::N)
-    // && !block.lock()->hasInterpolationFlagCF(D3Q27System::E))
+    // (block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_PPP)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_00P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_0P0)
+    // && !block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P00))
     //{
     //   if (maxX1==TmaxX1) maxX1 -= 2;
     //   if (maxX2==TmaxX2) maxX2 -= 2;
@@ -1923,7 +1923,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::findCFnodes()
     int lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3;
 
     using namespace D3Q27System;
-    if (block.lock()->hasInterpolationFlagCF(W)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_M00)) {
         lMinX1 = 1;
         lMaxX1 = lMinX1 + 1;
 
@@ -1943,8 +1943,8 @@ void CoarseToFineVectorConnector<VectorTransmitter>::findCFnodes()
         getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false);
         findCFnodes(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd);
     }
-    if (block.lock()->hasInterpolationFlagCF(TN) && !block.lock()->hasInterpolationFlagCF(N) &&
-        !block.lock()->hasInterpolationFlagCF(T)) {
+    if (block.lock()->hasInterpolationFlagCF(DIR_0PP) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagCF(DIR_00P)) {
         lMinX2 = maxX2 - 3;
         lMaxX2 = lMinX2 + 1;
         lMinX3 = maxX3 - 3;
diff --git a/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h
index e430a0ad30dd7e3d0cd647271d79dd0c61f6b1f8..f8809f17b6676148faf3a94a1b9fcabede72fe58 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h
@@ -143,16 +143,16 @@ FineToCoarseVectorConnector<VectorTransmitter>::FineToCoarseVectorConnector(SPtr
     : Block3DConnector(sendDir), block(block), sender(sender), receiver(receiver), iprocessor(iprocessor),
       connType(connType)
 {
-    if (!(sendDir == D3Q27System::E || sendDir == D3Q27System::W || sendDir == D3Q27System::N ||
-          sendDir == D3Q27System::S || sendDir == D3Q27System::T || sendDir == D3Q27System::B ||
-          sendDir == D3Q27System::NE || sendDir == D3Q27System::SW || sendDir == D3Q27System::SE ||
-          sendDir == D3Q27System::NW || sendDir == D3Q27System::TE || sendDir == D3Q27System::BW ||
-          sendDir == D3Q27System::BE || sendDir == D3Q27System::TW || sendDir == D3Q27System::TN ||
-          sendDir == D3Q27System::BS || sendDir == D3Q27System::BN || sendDir == D3Q27System::TS
+    if (!(sendDir == D3Q27System::DIR_P00 || sendDir == D3Q27System::DIR_M00 || sendDir == D3Q27System::DIR_0P0 ||
+          sendDir == D3Q27System::DIR_0M0 || sendDir == D3Q27System::DIR_00P || sendDir == D3Q27System::DIR_00M ||
+          sendDir == D3Q27System::DIR_PP0 || sendDir == D3Q27System::DIR_MM0 || sendDir == D3Q27System::DIR_PM0 ||
+          sendDir == D3Q27System::DIR_MP0 || sendDir == D3Q27System::DIR_P0P || sendDir == D3Q27System::DIR_M0M ||
+          sendDir == D3Q27System::DIR_P0M || sendDir == D3Q27System::DIR_M0P || sendDir == D3Q27System::DIR_0PP ||
+          sendDir == D3Q27System::DIR_0MM || sendDir == D3Q27System::DIR_0PM || sendDir == D3Q27System::DIR_0MP
 
-          || sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSE ||
-          sendDir == D3Q27System::TSW || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW ||
-          sendDir == D3Q27System::BSE || sendDir == D3Q27System::BSW
+          || sendDir == D3Q27System::DIR_PPP || sendDir == D3Q27System::DIR_MPP || sendDir == D3Q27System::DIR_PMP ||
+          sendDir == D3Q27System::DIR_MMP || sendDir == D3Q27System::DIR_PPM || sendDir == D3Q27System::DIR_MPM ||
+          sendDir == D3Q27System::DIR_PMM || sendDir == D3Q27System::DIR_MMM
 
           )) {
         throw UbException(UB_EXARGS, "invalid constructor for this direction");
@@ -235,44 +235,44 @@ void FineToCoarseVectorConnector<VectorTransmitter>::init()
     int iCellSize       = 1; // size of interpolation cell
 
     switch (this->sendDir) {
-        case E:
-        case W:
+        case DIR_P00:
+        case DIR_M00:
             sendSize = (bMaxX2 - 1) / 2 * (bMaxX3 - 1) / 2 * sendDataPerNode * iCellSize;
             break;
-        case N:
-        case S:
+        case DIR_0P0:
+        case DIR_0M0:
             sendSize = (bMaxX1 - 1) / 2 * (bMaxX3 - 1) / 2 * sendDataPerNode * iCellSize;
             break;
-        case T:
-        case B:
+        case DIR_00P:
+        case DIR_00M:
             sendSize = (bMaxX1 - 1) / 2 * (bMaxX2 - 1) / 2 * sendDataPerNode * iCellSize;
             break;
-        case NE:
-        case SW:
-        case SE:
-        case NW:
+        case DIR_PP0:
+        case DIR_MM0:
+        case DIR_PM0:
+        case DIR_MP0:
             sendSize = (3 * bMaxX3 - 3) * sendDataPerNode * iCellSize;
             break; // buffer overhead, should be (3*bMaxX3-6) for even bMax3
-        case TE:
-        case BW:
-        case BE:
-        case TW:
+        case DIR_P0P:
+        case DIR_M0M:
+        case DIR_P0M:
+        case DIR_M0P:
             sendSize = (3 * bMaxX2 - 3) * sendDataPerNode * iCellSize;
             break;
-        case TN:
-        case BS:
-        case BN:
-        case TS:
+        case DIR_0PP:
+        case DIR_0MM:
+        case DIR_0PM:
+        case DIR_0MP:
             sendSize = (3 * bMaxX1 - 3) * sendDataPerNode * iCellSize;
             break;
-        case TNE:
-        case TNW:
-        case TSE:
-        case TSW:
-        case BNE:
-        case BNW:
-        case BSE:
-        case BSW:
+        case DIR_PPP:
+        case DIR_MPP:
+        case DIR_PMP:
+        case DIR_MMP:
+        case DIR_PPM:
+        case DIR_MPM:
+        case DIR_PMM:
+        case DIR_MMM:
             sendSize = 3 * (3 * bMaxX1 - 3) * sendDataPerNode * iCellSize;
             break;
         default:
@@ -321,42 +321,42 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
     //////////////
 
     switch (sendDir) {
-        case E:
+        case DIR_P00:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX1 = maxX1 - 7;
             lMaxX1 = lMinX1 + 1;
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case W:
+        case DIR_M00:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX1 = 5;
             lMaxX1 = lMinX1 + 1;
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case N:
+        case DIR_0P0:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX2 = maxX2 - 7;
             lMaxX2 = lMinX2 + 1;
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case S:
+        case DIR_0M0:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX2 = 5;
             lMaxX2 = lMinX2 + 1;
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case T:
+        case DIR_00P:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX3 = maxX3 - 7;
             lMaxX3 = lMinX3 + 1;
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case B:
+        case DIR_00M:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX3 = 5;
@@ -365,7 +365,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             break;
 
         //	////N-S-E-W
-        case NE:
+        case DIR_PP0:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX1 = maxX1 - 7;
@@ -380,7 +380,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             lMaxX2 = lMinX2 + 5;
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case SW:
+        case DIR_MM0:
 
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
@@ -397,7 +397,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case SE:
+        case DIR_PM0:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX1 = maxX1 - 7;
@@ -414,7 +414,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
 
-        case NW:
+        case DIR_MP0:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX1 = 1;
@@ -430,7 +430,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
             //////T-B-E-W
-        case TE:
+        case DIR_P0P:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX1 = maxX1 - 7;
@@ -446,7 +446,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case BW:
+        case DIR_M0M:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX1 = 1;
@@ -462,7 +462,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case BE:
+        case DIR_P0M:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX1 = maxX1 - 7;
@@ -478,7 +478,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case TW:
+        case DIR_M0P:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX1 = 1;
@@ -495,7 +495,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             break;
             ///////////////T-B-N-S
             //
-        case TN:
+        case DIR_0PP:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX2 = maxX2 - 7;
@@ -511,7 +511,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case BS:
+        case DIR_0MM:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX2 = 1;
@@ -527,7 +527,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case BN:
+        case DIR_0PM:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX2 = maxX2 - 7;
@@ -543,7 +543,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case TS:
+        case DIR_0MP:
             getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3);
             getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3);
             lMinX2 = 1;
@@ -560,7 +560,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             break;
 
         // TNE
-        case TNE:
+        case DIR_PPP:
             lMinX1 = maxX1 - 7;
             lMaxX1 = maxX1 - 6;
             lMinX2 = maxX2 - 7;
@@ -587,7 +587,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             break;
 
         // TNW
-        case TNW:
+        case DIR_MPP:
             lMinX1 = 5;
             lMaxX1 = 6;
             lMinX2 = maxX2 - 7;
@@ -616,7 +616,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             break;
 
         //      TSE
-        case TSE:
+        case DIR_PMP:
             lMinX1 = maxX1 - 7;
             lMaxX1 = maxX1 - 6;
             lMinX2 = 1;
@@ -643,7 +643,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
         //      TSW
-        case TSW:
+        case DIR_MMP:
             lMinX1 = 5;
             lMaxX1 = 6;
             lMinX2 = 1;
@@ -670,7 +670,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
         //      BNE
-        case BNE:
+        case DIR_PPM:
             lMinX1 = maxX1 - 7;
             lMaxX1 = maxX1 - 6;
             lMinX2 = maxX2 - 7;
@@ -697,7 +697,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
 
             break;
         //      BNW
-        case BNW:
+        case DIR_MPM:
             lMinX1 = 5;
             lMaxX1 = 6;
             lMinX2 = maxX2 - 7;
@@ -725,7 +725,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             break;
 
         //      BSE
-        case BSE:
+        case DIR_PMM:
             lMinX1 = maxX1 - 7;
             lMaxX1 = maxX1 - 6;
             lMinX2 = 1;
@@ -753,7 +753,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors()
             break;
 
         // BSW
-        case BSW:
+        case DIR_MMM:
             lMinX1 = 5;
             lMaxX1 = 6;
             lMinX2 = 1;
@@ -869,42 +869,42 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
     lMaxX3 = maxX3 - 1;
 
     switch (sendDir) {
-        case E:
+        case DIR_P00:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 1;
             getLocalMinMaxCF(maxX2, lMinX2, lMaxX2);
             getLocalMinMaxCF(maxX3, lMinX3, lMaxX3);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case W:
+        case DIR_M00:
             lMinX1 = 2;
             lMaxX1 = lMinX1 + 1;
             getLocalMinMaxCF(maxX2, lMinX2, lMaxX2);
             getLocalMinMaxCF(maxX3, lMinX3, lMaxX3);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case N:
+        case DIR_0P0:
             lMinX2 = maxX2 - 4;
             lMaxX2 = lMinX2 + 1;
             getLocalMinMaxCF(maxX1, lMinX1, lMaxX1);
             getLocalMinMaxCF(maxX3, lMinX3, lMaxX3);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case S:
+        case DIR_0M0:
             lMinX2 = 2;
             lMaxX2 = lMinX2 + 1;
             getLocalMinMaxCF(maxX1, lMinX1, lMaxX1);
             getLocalMinMaxCF(maxX3, lMinX3, lMaxX3);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case T:
+        case DIR_00P:
             lMinX3 = maxX3 - 4;
             lMaxX3 = lMinX3 + 1;
             getLocalMinMaxCF(maxX1, lMinX1, lMaxX1);
             getLocalMinMaxCF(maxX2, lMinX2, lMaxX2);
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
-        case B:
+        case DIR_00M:
             lMinX3 = 2;
             lMaxX3 = lMinX3 + 1;
             getLocalMinMaxCF(maxX1, lMinX1, lMaxX1);
@@ -913,7 +913,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             break;
 
             /////E-W-N-S
-        case NE:
+        case DIR_PP0:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 3;
             lMinX2 = maxX2 - 4;
@@ -922,7 +922,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case SW:
+        case DIR_MM0:
             lMinX1 = 0;
             lMaxX1 = lMinX1 + 3;
             lMinX2 = 0;
@@ -931,7 +931,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case SE:
+        case DIR_PM0:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 3;
             lMinX2 = 0;
@@ -940,7 +940,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case NW:
+        case DIR_MP0:
             lMinX1 = 0;
             lMaxX1 = lMinX1 + 3;
             lMinX2 = maxX2 - 4;
@@ -950,7 +950,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             break;
         //
         //	/////T-B-E-W
-        case TE:
+        case DIR_P0P:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 3;
             lMinX3 = maxX3 - 4;
@@ -959,7 +959,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case BW:
+        case DIR_M0M:
             lMinX1 = 0;
             lMaxX1 = lMinX1 + 3;
             lMinX3 = 0;
@@ -968,7 +968,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case BE:
+        case DIR_P0M:
             lMinX1 = maxX1 - 4;
             lMaxX1 = lMinX1 + 3;
             lMinX3 = 0;
@@ -977,7 +977,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case TW:
+        case DIR_M0P:
             lMinX1 = 0;
             lMaxX1 = lMinX1 + 3;
             lMinX3 = maxX3 - 4;
@@ -988,7 +988,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
 
         //	////////////////T-B-N-S
         //
-        case TN:
+        case DIR_0PP:
             lMinX2 = maxX2 - 4;
             lMaxX2 = lMinX2 + 3;
             lMinX3 = maxX3 - 4;
@@ -997,7 +997,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case BS:
+        case DIR_0MM:
             lMinX2 = 0;
             lMaxX2 = lMinX2 + 3;
             lMinX3 = 0;
@@ -1006,7 +1006,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case BN:
+        case DIR_0PM:
             lMinX2 = maxX2 - 4;
             lMaxX2 = lMinX2 + 3;
             lMinX3 = 0;
@@ -1015,7 +1015,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
 
-        case TS:
+        case DIR_0MP:
             lMinX2 = 0;
             lMaxX2 = lMinX2 + 3;
             lMinX3 = maxX3 - 4;
@@ -1025,7 +1025,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             break;
 
         //   //TNE
-        case TNE:
+        case DIR_PPP:
             lMinX1 = maxX1 - 4;
             lMaxX1 = maxX1 - 1;
             lMinX2 = maxX2 - 4;
@@ -1035,7 +1035,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
             //   TNW
-        case TNW:
+        case DIR_MPP:
             lMinX1 = 0;
             lMaxX1 = 3;
             lMinX2 = maxX2 - 4;
@@ -1045,7 +1045,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
             //   TSE
-        case TSE:
+        case DIR_PMP:
             lMinX1 = maxX1 - 4;
             lMaxX1 = maxX1 - 1;
             lMinX2 = 0;
@@ -1055,7 +1055,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
             //   TSW
-        case TSW:
+        case DIR_MMP:
             lMinX1 = 0;
             lMaxX1 = 3;
             lMinX2 = 0;
@@ -1065,7 +1065,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
             //   BNE
-        case BNE:
+        case DIR_PPM:
             lMinX1 = maxX1 - 4;
             lMaxX1 = maxX1 - 1;
             lMinX2 = maxX2 - 4;
@@ -1075,7 +1075,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
             //   BNW
-        case BNW:
+        case DIR_MPM:
             lMinX1 = 0;
             lMaxX1 = 3;
             lMinX2 = maxX2 - 4;
@@ -1085,7 +1085,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
             //   BSE
-        case BSE:
+        case DIR_PMM:
             lMinX1 = maxX1 - 4;
             lMaxX1 = maxX1 - 1;
             lMinX2 = 0;
@@ -1095,7 +1095,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors()
             distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index);
             break;
             // BSW
-        case BSW:
+        case DIR_MMM:
             lMinX1 = 0;
             lMaxX1 = 3;
             lMinX2 = 0;
@@ -1163,56 +1163,56 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     int TmaxX2 = maxX2;
     int TmaxX3 = maxX3;
 
-    if (block.lock()->hasInterpolationFlagFC(E)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_P00)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(W)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_M00)) {
         if (minX1 == TminX1)
             minX1 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(N)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0P0)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(S)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0M0)) {
         if (minX2 == TminX2)
             minX2 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (maxX3 == TmaxX3)
             maxX3 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (minX3 == TminX3)
             minX3 += 4;
     }
 
     ////////////
     /////E-W-N-S
-    if (block.lock()->hasInterpolationFlagFC(NE) && !block.lock()->hasInterpolationFlagFC(N) &&
-        !block.lock()->hasInterpolationFlagFC(E)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_PP0) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_P00)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
         if (maxX2 == TmaxX2)
             maxX2 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(SW) && !block.lock()->hasInterpolationFlagFC(W) &&
-        !block.lock()->hasInterpolationFlagFC(S)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_MM0) && !block.lock()->hasInterpolationFlagFC(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_0M0)) {
         if (minX1 == TminX1)
             minX1 += 4;
         if (minX2 == TminX2)
             minX2 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(SE) && !block.lock()->hasInterpolationFlagFC(E) &&
-        !block.lock()->hasInterpolationFlagFC(S)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_PM0) && !block.lock()->hasInterpolationFlagFC(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_0M0)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
         if (minX2 == TminX2)
             minX2 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(NW) && !block.lock()->hasInterpolationFlagFC(N) &&
-        !block.lock()->hasInterpolationFlagFC(W)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_MP0) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_M00)) {
         if (minX1 == TminX1)
             minX1 += 4;
         if (maxX2 == TmaxX2)
@@ -1220,29 +1220,29 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     //////T-B-E-W
-    if (block.lock()->hasInterpolationFlagFC(TE) && !block.lock()->hasInterpolationFlagFC(E) &&
-        !block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_P0P) && !block.lock()->hasInterpolationFlagFC(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
         if (maxX3 == TmaxX3)
             maxX3 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(BW) && !block.lock()->hasInterpolationFlagFC(W) &&
-        !block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_M0M) && !block.lock()->hasInterpolationFlagFC(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (minX1 == TminX1)
             minX1 += 4;
         if (minX3 == TminX3)
             minX3 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(BE) && !block.lock()->hasInterpolationFlagFC(E) &&
-        !block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_P0M) && !block.lock()->hasInterpolationFlagFC(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
         if (minX3 == TminX3)
             minX3 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(TW) && !block.lock()->hasInterpolationFlagFC(W) &&
-        !block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_M0P) && !block.lock()->hasInterpolationFlagFC(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (minX1 == TminX1)
             minX1 += 4;
         if (maxX3 == TmaxX3)
@@ -1250,29 +1250,29 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     ////T-B-N-S
-    if (block.lock()->hasInterpolationFlagFC(TN) && !block.lock()->hasInterpolationFlagFC(N) &&
-        !block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0PP) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 3;
         if (maxX3 == TmaxX3)
             maxX3 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(BS) && !block.lock()->hasInterpolationFlagFC(S) &&
-        !block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0MM) && !block.lock()->hasInterpolationFlagFC(DIR_0M0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (minX2 == TminX2)
             minX2 += 4;
         if (minX3 == TminX3)
             minX3 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(BN) && !block.lock()->hasInterpolationFlagFC(N) &&
-        !block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0PM) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 3;
         if (minX3 == TminX3)
             minX3 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(TS) && !block.lock()->hasInterpolationFlagFC(S) &&
-        !block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0MP) && !block.lock()->hasInterpolationFlagFC(DIR_0M0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (minX2 == TminX2)
             minX2 += 4;
         if (maxX3 == TmaxX3)
@@ -1280,10 +1280,10 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     // if
-    // (block.lock()->hasInterpolationFlagFC(D3Q27System::TNE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::TN)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::NE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::T)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::N)
-    // && !block.lock()->hasInterpolationFlagFC(D3Q27System::E)) if
-    // (!block.lock()->hasInterpolationFlagFC(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::T) &&
-    // !block.lock()->hasInterpolationFlagFC(D3Q27System::E))
+    // (block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_PPP)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_0PP)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_PP0)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_00P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_0P0)
+    // && !block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P00)) if
+    // (!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_00P) &&
+    // !block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P00))
     //{
     //   if (maxX1==TmaxX1) maxX1 -= 3;
     //   if (maxX2==TmaxX2) maxX2 -= 3;
@@ -1304,56 +1304,56 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     int TmaxX2 = maxX2;
     int TmaxX3 = maxX3;
 
-    if (block.lock()->hasInterpolationFlagFC(E)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_P00)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(W)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_M00)) {
         if (minX1 == TminX1)
             minX1 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(N)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0P0)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(S)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0M0)) {
         if (minX2 == TminX2)
             minX2 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (maxX3 == TmaxX3)
             maxX3 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (minX3 == TminX3)
             minX3 += 4;
     }
 
     ////////////
     /////E-W-N-S
-    if (block.lock()->hasInterpolationFlagFC(NE) && !block.lock()->hasInterpolationFlagFC(N) &&
-        !block.lock()->hasInterpolationFlagFC(E)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_PP0) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_P00)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
         if (maxX2 == TmaxX2)
             maxX2 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(SW) && !block.lock()->hasInterpolationFlagFC(W) &&
-        !block.lock()->hasInterpolationFlagFC(S)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_MM0) && !block.lock()->hasInterpolationFlagFC(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_0M0)) {
         if (minX1 == TminX1)
             minX1 += 4;
         if (minX2 == TminX2)
             minX2 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(SE) && !block.lock()->hasInterpolationFlagFC(E) &&
-        !block.lock()->hasInterpolationFlagFC(S)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_PM0) && !block.lock()->hasInterpolationFlagFC(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_0M0)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
         if (minX2 == TminX2)
             minX2 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(NW) && !block.lock()->hasInterpolationFlagFC(N) &&
-        !block.lock()->hasInterpolationFlagFC(W)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_MP0) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_M00)) {
         if (minX1 == TminX1)
             minX1 += 4;
         if (maxX2 == TmaxX2)
@@ -1361,29 +1361,29 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     //////T-B-E-W
-    if (block.lock()->hasInterpolationFlagFC(TE) && !block.lock()->hasInterpolationFlagFC(E) &&
-        !block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_P0P) && !block.lock()->hasInterpolationFlagFC(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
         if (maxX3 == TmaxX3)
             maxX3 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(BW) && !block.lock()->hasInterpolationFlagFC(W) &&
-        !block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_M0M) && !block.lock()->hasInterpolationFlagFC(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (minX1 == TminX1)
             minX1 += 4;
         if (minX3 == TminX3)
             minX3 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(BE) && !block.lock()->hasInterpolationFlagFC(E) &&
-        !block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_P0M) && !block.lock()->hasInterpolationFlagFC(DIR_P00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (maxX1 == TmaxX1)
             maxX1 -= 3;
         if (minX3 == TminX3)
             minX3 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(TW) && !block.lock()->hasInterpolationFlagFC(W) &&
-        !block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_M0P) && !block.lock()->hasInterpolationFlagFC(DIR_M00) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (minX1 == TminX1)
             minX1 += 4;
         if (maxX3 == TmaxX3)
@@ -1391,29 +1391,29 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     ////T-B-N-S
-    if (block.lock()->hasInterpolationFlagFC(TN) && !block.lock()->hasInterpolationFlagFC(N) &&
-        !block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0PP) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 3;
         if (maxX3 == TmaxX3)
             maxX3 -= 3;
     }
-    if (block.lock()->hasInterpolationFlagFC(BS) && !block.lock()->hasInterpolationFlagFC(S) &&
-        !block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0MM) && !block.lock()->hasInterpolationFlagFC(DIR_0M0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (minX2 == TminX2)
             minX2 += 4;
         if (minX3 == TminX3)
             minX3 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(BN) && !block.lock()->hasInterpolationFlagFC(N) &&
-        !block.lock()->hasInterpolationFlagFC(B)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0PM) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00M)) {
         if (maxX2 == TmaxX2)
             maxX2 -= 3;
         if (minX3 == TminX3)
             minX3 += 4;
     }
-    if (block.lock()->hasInterpolationFlagFC(TS) && !block.lock()->hasInterpolationFlagFC(S) &&
-        !block.lock()->hasInterpolationFlagFC(T)) {
+    if (block.lock()->hasInterpolationFlagFC(DIR_0MP) && !block.lock()->hasInterpolationFlagFC(DIR_0M0) &&
+        !block.lock()->hasInterpolationFlagFC(DIR_00P)) {
         if (minX2 == TminX2)
             minX2 += 4;
         if (maxX3 == TmaxX3)
@@ -1421,8 +1421,8 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1,
     }
 
     // if
-    // (block.lock()->hasInterpolationFlagFC(D3Q27System::TNE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::TN)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::NE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::T)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::N)
-    // && !block.lock()->hasInterpolationFlagFC(D3Q27System::E))
+    // (block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_PPP)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_0PP)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_PP0)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_00P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_0P0)
+    // && !block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P00))
     //{
     //   if (maxX1==TmaxX1) maxX1 -= 3;
     //   if (maxX2==TmaxX2) maxX2 -= 3;
@@ -1448,8 +1448,8 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in
     using namespace D3Q27System;
 
     switch (sendDir) {
-        case E:
-        case W:
+        case DIR_P00:
+        case DIR_M00:
             if (connType == OddEvenSE)
                 minX2 += oMinX2;
             if (connType == OddOddNE) {
@@ -1459,8 +1459,8 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in
             if (connType == EvenOddNW)
                 minX3 += oMinX3;
             break;
-        case N:
-        case S:
+        case DIR_0P0:
+        case DIR_0M0:
             if (connType == OddEvenSE)
                 minX1 += oMinX1;
             if (connType == OddOddNE) {
@@ -1470,8 +1470,8 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in
             if (connType == EvenOddNW)
                 minX3 += oMinX3;
             break;
-        case T:
-        case B:
+        case DIR_00P:
+        case DIR_00M:
             if (connType == OddEvenSE)
                 minX1 += oMinX1;
             if (connType == OddOddNE) {
@@ -1483,10 +1483,10 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in
             break;
 
             /////
-        case NE:
-        case SW:
-        case SE:
-        case NW:
+        case DIR_PP0:
+        case DIR_MM0:
+        case DIR_PM0:
+        case DIR_MP0:
             // case SW:
             if (connType == OddEvenSE)
                 // minX2 += oMinX2;
@@ -1499,10 +1499,10 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in
             break;
 
             //////
-        case TE:
-        case BW:
-        case BE:
-        case TW:
+        case DIR_P0P:
+        case DIR_M0M:
+        case DIR_P0M:
+        case DIR_M0P:
             if (connType == OddEvenSE)
                 //		minX1 += oMinX1;
                 if (connType == OddOddNE) {
@@ -1514,10 +1514,10 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in
             break;
 
         //	//////
-        case TN:
-        case BS:
-        case BN:
-        case TS:
+        case DIR_0PP:
+        case DIR_0MM:
+        case DIR_0PM:
+        case DIR_0MP:
             if (connType == OddEvenSE)
                 minX1 += oMinX1;
             if (connType == OddOddNE) {
diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.cpp
index 858921de452937158c620011889707f9560f09b9..18a8319589cde954b7c2202e10f3eda61b435671 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.cpp
+++ b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.cpp
@@ -60,7 +60,7 @@ void FullDirectConnector::sendVectors()
 void FullDirectConnector::exchangeData()
 {
     // EAST
-    if (sendDir == D3Q27System::E) {
+    if (sendDir == D3Q27System::DIR_P00) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x2 = 1; x2 < maxX2; x2++) {
                 exchangeData(maxX1 - 1, x2, x3, 0, x2, x3);
@@ -68,7 +68,7 @@ void FullDirectConnector::exchangeData()
         }
     }
     // WEST
-    else if (sendDir == D3Q27System::W) {
+    else if (sendDir == D3Q27System::DIR_M00) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x2 = 1; x2 < maxX2; x2++) {
                 exchangeData(1, x2, x3, maxX1, x2, x3);
@@ -76,7 +76,7 @@ void FullDirectConnector::exchangeData()
         }
     }
     // NORTH
-    else if (sendDir == D3Q27System::N) {
+    else if (sendDir == D3Q27System::DIR_0P0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 exchangeData(x1, maxX2 - 1, x3, x1, 0, x3);
@@ -84,7 +84,7 @@ void FullDirectConnector::exchangeData()
         }
     }
     // SOUTH
-    else if (sendDir == D3Q27System::S) {
+    else if (sendDir == D3Q27System::DIR_0M0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 exchangeData(x1, 1, x3, x1, maxX2, x3);
@@ -93,7 +93,7 @@ void FullDirectConnector::exchangeData()
     }
 
     // TOP
-    else if (sendDir == D3Q27System::T) {
+    else if (sendDir == D3Q27System::DIR_00P) {
         for (int x2 = 1; x2 < maxX2; x2++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 exchangeData(x1, x2, maxX3 - 1, x1, x2, 0);
@@ -101,7 +101,7 @@ void FullDirectConnector::exchangeData()
         }
     }
     // BOTTOM
-    else if (sendDir == D3Q27System::B) {
+    else if (sendDir == D3Q27System::DIR_00M) {
         for (int x2 = 1; x2 < maxX2; x2++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 exchangeData(x1, x2, 1, x1, x2, maxX3);
@@ -109,77 +109,77 @@ void FullDirectConnector::exchangeData()
         }
     }
     // NORTHEAST
-    else if (sendDir == D3Q27System::NE) {
+    else if (sendDir == D3Q27System::DIR_PP0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             exchangeData(maxX1 - 1, maxX2 - 1, x3, 0, 0, x3);
         }
     }
     // NORTHWEST
-    else if (sendDir == D3Q27System::NW) {
+    else if (sendDir == D3Q27System::DIR_MP0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             exchangeData(1, maxX2 - 1, x3, maxX1, 0, x3);
         }
     }
     // SOUTHWEST
-    else if (sendDir == D3Q27System::SW) {
+    else if (sendDir == D3Q27System::DIR_MM0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             exchangeData(1, 1, x3, maxX1, maxX2, x3);
         }
     }
     // SOUTHEAST
-    else if (sendDir == D3Q27System::SE) {
+    else if (sendDir == D3Q27System::DIR_PM0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             exchangeData(maxX1 - 1, 1, x3, 0, maxX2, x3);
         }
-    } else if (sendDir == D3Q27System::TE)
+    } else if (sendDir == D3Q27System::DIR_P0P)
         for (int x2 = 1; x2 < maxX2; x2++) {
             exchangeData(maxX1 - 1, x2, maxX3 - 1, 0, x2, 0);
         }
-    else if (sendDir == D3Q27System::BW)
+    else if (sendDir == D3Q27System::DIR_M0M)
         for (int x2 = 1; x2 < maxX2; x2++) {
             exchangeData(1, x2, 1, maxX1, x2, maxX3);
         }
-    else if (sendDir == D3Q27System::BE)
+    else if (sendDir == D3Q27System::DIR_P0M)
         for (int x2 = 1; x2 < maxX2; x2++) {
             exchangeData(maxX1 - 1, x2, 1, 0, x2, maxX3);
         }
-    else if (sendDir == D3Q27System::TW)
+    else if (sendDir == D3Q27System::DIR_M0P)
         for (int x2 = 1; x2 < maxX2; x2++) {
             exchangeData(1, x2, maxX3 - 1, maxX1, x2, 0);
         }
-    else if (sendDir == D3Q27System::TN)
+    else if (sendDir == D3Q27System::DIR_0PP)
         for (int x1 = 1; x1 < maxX1; x1++) {
             exchangeData(x1, maxX2 - 1, maxX3 - 1, x1, 0, 0);
         }
-    else if (sendDir == D3Q27System::BS)
+    else if (sendDir == D3Q27System::DIR_0MM)
         for (int x1 = 1; x1 < maxX1; x1++) {
             exchangeData(x1, 1, 1, x1, maxX2, maxX3);
         }
-    else if (sendDir == D3Q27System::BN)
+    else if (sendDir == D3Q27System::DIR_0PM)
         for (int x1 = 1; x1 < maxX1; x1++) {
             exchangeData(x1, maxX2 - 1, 1, x1, 0, maxX3);
         }
 
-    else if (sendDir == D3Q27System::TS)
+    else if (sendDir == D3Q27System::DIR_0MP)
         for (int x1 = 1; x1 < maxX1; x1++) {
             exchangeData(x1, 1, maxX3 - 1, x1, maxX2, 0);
         }
 
-    else if (sendDir == D3Q27System::TSW) {
+    else if (sendDir == D3Q27System::DIR_MMP) {
         exchangeData(1, 1, maxX3 - 1, maxX1, maxX2, 0);
-    } else if (sendDir == D3Q27System::TSE) {
+    } else if (sendDir == D3Q27System::DIR_PMP) {
         exchangeData(maxX1 - 1, 1, maxX3 - 1, 0, maxX2, 0);
-    } else if (sendDir == D3Q27System::TNW) {
+    } else if (sendDir == D3Q27System::DIR_MPP) {
         exchangeData(1, maxX2 - 1, maxX3 - 1, maxX1, 0, 0);
-    } else if (sendDir == D3Q27System::TNE) {
+    } else if (sendDir == D3Q27System::DIR_PPP) {
         exchangeData(maxX1 - 1, maxX2 - 1, maxX3 - 1, 0, 0, 0);
-    } else if (sendDir == D3Q27System::BSW) {
+    } else if (sendDir == D3Q27System::DIR_MMM) {
         exchangeData(1, 1, 1, maxX1, maxX2, maxX3);
-    } else if (sendDir == D3Q27System::BSE) {
+    } else if (sendDir == D3Q27System::DIR_PMM) {
         exchangeData(maxX1 - 1, 1, 1, 0, maxX2, maxX3);
-    } else if (sendDir == D3Q27System::BNW) {
+    } else if (sendDir == D3Q27System::DIR_MPM) {
         exchangeData(1, maxX2 - 1, 1, maxX1, 0, maxX3);
-    } else if (sendDir == D3Q27System::BNE) {
+    } else if (sendDir == D3Q27System::DIR_PPM) {
         exchangeData(maxX1 - 1, maxX2 - 1, 1, 0, 0, maxX3);
     } else
         UB_THROW(UbException(UB_EXARGS, "unknown dir"));
diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h
index fb04de68aaa4ab360e38ae83c9d47d077c05e59f..81984eee943bf2548a4c8f49527f9a41178d5f71 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h
@@ -49,7 +49,7 @@ public:
 
 protected:
     virtual void updatePointers() = 0;
-    void exchangeData();
+    virtual void exchangeData();
     virtual void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) = 0;
 
     int maxX1;
diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.cpp
index ccbd62c2ff247bb2b02f478974c40592b693ce20..d5b810015abc1172699b7489df4ea0aee8b02fe2 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.cpp
+++ b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.cpp
@@ -63,7 +63,7 @@ void FullVectorConnector::fillData()
 
     int index = 0;
     // EAST
-    if (sendDir == D3Q27System::E) {
+    if (sendDir == D3Q27System::DIR_P00) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x2 = 1; x2 < maxX2; x2++) {
                 fillData(sdata, index, maxX1 - 1, x2, x3);
@@ -71,7 +71,7 @@ void FullVectorConnector::fillData()
         }
     }
     // WEST
-    else if (sendDir == D3Q27System::W) {
+    else if (sendDir == D3Q27System::DIR_M00) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x2 = 1; x2 < maxX2; x2++) {
                 fillData(sdata, index, 1, x2, x3);
@@ -79,7 +79,7 @@ void FullVectorConnector::fillData()
         }
     }
     // NORTH
-    else if (sendDir == D3Q27System::N) {
+    else if (sendDir == D3Q27System::DIR_0P0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 fillData(sdata, index, x1, maxX2 - 1, x3);
@@ -87,7 +87,7 @@ void FullVectorConnector::fillData()
         }
     }
     // SOUTH
-    else if (sendDir == D3Q27System::S) {
+    else if (sendDir == D3Q27System::DIR_0M0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 fillData(sdata, index, x1, 1, x3);
@@ -95,7 +95,7 @@ void FullVectorConnector::fillData()
         }
     }
     // TOP
-    else if (sendDir == D3Q27System::T) {
+    else if (sendDir == D3Q27System::DIR_00P) {
         for (int x2 = 1; x2 < maxX2; x2++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 fillData(sdata, index, x1, x2, maxX3 - 1);
@@ -103,7 +103,7 @@ void FullVectorConnector::fillData()
         }
     }
     // BOTTOM
-    else if (sendDir == D3Q27System::B) {
+    else if (sendDir == D3Q27System::DIR_00M) {
         for (int x2 = 1; x2 < maxX2; x2++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 fillData(sdata, index, x1, x2, 1);
@@ -111,24 +111,24 @@ void FullVectorConnector::fillData()
         }
     }
     // NE NW SW SE
-    else if (sendDir == D3Q27System::NE || sendDir == D3Q27System::NW || sendDir == D3Q27System::SW ||
-             sendDir == D3Q27System::SE) {
+    else if (sendDir == D3Q27System::DIR_PP0 || sendDir == D3Q27System::DIR_MP0 || sendDir == D3Q27System::DIR_MM0 ||
+             sendDir == D3Q27System::DIR_PM0) {
         int x1 = 0;
         int x2 = 0;
         switch (sendDir) {
-            case D3Q27System::NE:
+            case D3Q27System::DIR_PP0:
                 x1 = maxX1 - 1;
                 x2 = maxX2 - 1;
                 break;
-            case D3Q27System::NW:
+            case D3Q27System::DIR_MP0:
                 x1 = 1;
                 x2 = maxX2 - 1;
                 break;
-            case D3Q27System::SW:
+            case D3Q27System::DIR_MM0:
                 x1 = 1;
                 x2 = 1;
                 break;
-            case D3Q27System::SE:
+            case D3Q27System::DIR_PM0:
                 x1 = maxX1 - 1;
                 x2 = 1;
                 break;
@@ -138,24 +138,24 @@ void FullVectorConnector::fillData()
         }
     }
     // TE TW BW BE
-    else if (sendDir == D3Q27System::TE || sendDir == D3Q27System::TW || sendDir == D3Q27System::BW ||
-             sendDir == D3Q27System::BE) {
+    else if (sendDir == D3Q27System::DIR_P0P || sendDir == D3Q27System::DIR_M0P || sendDir == D3Q27System::DIR_M0M ||
+             sendDir == D3Q27System::DIR_P0M) {
         int x1 = 0;
         int x3 = 0;
         switch (sendDir) {
-            case D3Q27System::TE:
+            case D3Q27System::DIR_P0P:
                 x1 = maxX1 - 1;
                 x3 = maxX3 - 1;
                 break;
-            case D3Q27System::TW:
+            case D3Q27System::DIR_M0P:
                 x1 = 1;
                 x3 = maxX3 - 1;
                 break;
-            case D3Q27System::BW:
+            case D3Q27System::DIR_M0M:
                 x1 = 1;
                 x3 = 1;
                 break;
-            case D3Q27System::BE:
+            case D3Q27System::DIR_P0M:
                 x1 = maxX1 - 1;
                 x3 = 1;
                 break;
@@ -165,24 +165,24 @@ void FullVectorConnector::fillData()
         }
     }
     // TN BN BS TS
-    else if (sendDir == D3Q27System::TN || sendDir == D3Q27System::BN || sendDir == D3Q27System::BS ||
-             sendDir == D3Q27System::TS) {
+    else if (sendDir == D3Q27System::DIR_0PP || sendDir == D3Q27System::DIR_0PM || sendDir == D3Q27System::DIR_0MM ||
+             sendDir == D3Q27System::DIR_0MP) {
         int x2 = 0;
         int x3 = 0;
         switch (sendDir) {
-            case D3Q27System::TN:
+            case D3Q27System::DIR_0PP:
                 x3 = maxX3 - 1;
                 x2 = maxX2 - 1;
                 break;
-            case D3Q27System::BN:
+            case D3Q27System::DIR_0PM:
                 x3 = 1;
                 x2 = maxX2 - 1;
                 break;
-            case D3Q27System::BS:
+            case D3Q27System::DIR_0MM:
                 x3 = 1;
                 x2 = 1;
                 break;
-            case D3Q27System::TS:
+            case D3Q27System::DIR_0MP:
                 x3 = maxX3 - 1;
                 x2 = 1;
                 break;
@@ -192,49 +192,49 @@ void FullVectorConnector::fillData()
         }
     }
     // TNE TNW TSW TSE BNE BNW BSW BSE
-    else if (sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSW ||
-             sendDir == D3Q27System::TSE || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW ||
-             sendDir == D3Q27System::BSW || sendDir == D3Q27System::BSE) {
+    else if (sendDir == D3Q27System::DIR_PPP || sendDir == D3Q27System::DIR_MPP || sendDir == D3Q27System::DIR_MMP ||
+             sendDir == D3Q27System::DIR_PMP || sendDir == D3Q27System::DIR_PPM || sendDir == D3Q27System::DIR_MPM ||
+             sendDir == D3Q27System::DIR_MMM || sendDir == D3Q27System::DIR_PMM) {
         int x1 = 0;
         int x2 = 0;
         int x3 = 0;
         switch (sendDir) {
-            case D3Q27System::TNE:
+            case D3Q27System::DIR_PPP:
                 x1 = maxX1 - 1;
                 x2 = maxX2 - 1;
                 x3 = maxX3 - 1;
                 break;
-            case D3Q27System::TNW:
+            case D3Q27System::DIR_MPP:
                 x1 = 1;
                 x2 = maxX2 - 1;
                 x3 = maxX3 - 1;
                 break;
-            case D3Q27System::TSW:
+            case D3Q27System::DIR_MMP:
                 x1 = 1;
                 x2 = 1;
                 x3 = maxX3 - 1;
                 break;
-            case D3Q27System::TSE:
+            case D3Q27System::DIR_PMP:
                 x1 = maxX1 - 1;
                 x2 = 1;
                 x3 = maxX3 - 1;
                 break;
-            case D3Q27System::BNE:
+            case D3Q27System::DIR_PPM:
                 x1 = maxX1 - 1;
                 x2 = maxX2 - 1;
                 x3 = 1;
                 break;
-            case D3Q27System::BNW:
+            case D3Q27System::DIR_MPM:
                 x1 = 1;
                 x2 = maxX2 - 1;
                 x3 = 1;
                 break;
-            case D3Q27System::BSW:
+            case D3Q27System::DIR_MMM:
                 x1 = 1;
                 x2 = 1;
                 x3 = 1;
                 break;
-            case D3Q27System::BSE:
+            case D3Q27System::DIR_PMM:
                 x1 = maxX1 - 1;
                 x2 = 1;
                 x3 = 1;
@@ -257,37 +257,37 @@ void FullVectorConnector::distributeData()
 
     int index = 0;
 
-    if (sendDir == D3Q27System::W) {
+    if (sendDir == D3Q27System::DIR_M00) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x2 = 1; x2 < maxX2; x2++) {
                 distributeData(rdata, index, 0, x2, x3);
             }
         }
-    } else if (sendDir == D3Q27System::E) {
+    } else if (sendDir == D3Q27System::DIR_P00) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x2 = 1; x2 < maxX2; x2++) {
                 distributeData(rdata, index, maxX1, x2, x3);
             }
         }
-    } else if (sendDir == D3Q27System::S) {
+    } else if (sendDir == D3Q27System::DIR_0M0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 distributeData(rdata, index, x1, 0, x3);
             }
         }
-    } else if (sendDir == D3Q27System::N) {
+    } else if (sendDir == D3Q27System::DIR_0P0) {
         for (int x3 = 1; x3 < maxX3; x3++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 distributeData(rdata, index, x1, maxX2, x3);
             }
         }
-    } else if (sendDir == D3Q27System::B) {
+    } else if (sendDir == D3Q27System::DIR_00M) {
         for (int x2 = 1; x2 < maxX2; x2++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 distributeData(rdata, index, x1, x2, 0);
             }
         }
-    } else if (sendDir == D3Q27System::T) {
+    } else if (sendDir == D3Q27System::DIR_00P) {
         for (int x2 = 1; x2 < maxX2; x2++) {
             for (int x1 = 1; x1 < maxX1; x1++) {
                 distributeData(rdata, index, x1, x2, maxX3);
@@ -295,25 +295,25 @@ void FullVectorConnector::distributeData()
         }
     }
     // NE NW SW SE
-    else if (sendDir == D3Q27System::NE || sendDir == D3Q27System::NW || sendDir == D3Q27System::SW ||
-             sendDir == D3Q27System::SE) {
+    else if (sendDir == D3Q27System::DIR_PP0 || sendDir == D3Q27System::DIR_MP0 || sendDir == D3Q27System::DIR_MM0 ||
+             sendDir == D3Q27System::DIR_PM0) {
         int x1 = 0;
         int x2 = 0;
         switch (sendDir) // wenn sendir NE dann kommen werte von SW
         {
-            case D3Q27System::NE:
+            case D3Q27System::DIR_PP0:
                 x1 = maxX1;
                 x2 = maxX2;
                 break;
-            case D3Q27System::NW:
+            case D3Q27System::DIR_MP0:
                 x1 = 0;
                 x2 = maxX2;
                 break;
-            case D3Q27System::SW:
+            case D3Q27System::DIR_MM0:
                 x1 = 0;
                 x2 = 0;
                 break;
-            case D3Q27System::SE:
+            case D3Q27System::DIR_PM0:
                 x1 = maxX1;
                 x2 = 0;
                 break;
@@ -324,27 +324,27 @@ void FullVectorConnector::distributeData()
 
     }
     // TE TW BW BE
-    else if (sendDir == D3Q27System::TE || sendDir == D3Q27System::TW || sendDir == D3Q27System::BW ||
-             sendDir == D3Q27System::BE)
+    else if (sendDir == D3Q27System::DIR_P0P || sendDir == D3Q27System::DIR_M0P || sendDir == D3Q27System::DIR_M0M ||
+             sendDir == D3Q27System::DIR_P0M)
 
     {
         int x1 = 0;
         int x3 = 0;
         switch (sendDir) // wenn sendir NE dann kommen werte von SW
         {
-            case D3Q27System::TE:
+            case D3Q27System::DIR_P0P:
                 x1 = maxX1;
                 x3 = maxX3;
                 break;
-            case D3Q27System::TW:
+            case D3Q27System::DIR_M0P:
                 x1 = 0;
                 x3 = maxX3;
                 break;
-            case D3Q27System::BW:
+            case D3Q27System::DIR_M0M:
                 x1 = 0;
                 x3 = 0;
                 break;
-            case D3Q27System::BE:
+            case D3Q27System::DIR_P0M:
                 x1 = maxX1;
                 x3 = 0;
                 break;
@@ -354,24 +354,24 @@ void FullVectorConnector::distributeData()
         }
     }
     // TN BN BS TS
-    else if (sendDir == D3Q27System::TN || sendDir == D3Q27System::BN || sendDir == D3Q27System::BS ||
-             sendDir == D3Q27System::TS) {
+    else if (sendDir == D3Q27System::DIR_0PP || sendDir == D3Q27System::DIR_0PM || sendDir == D3Q27System::DIR_0MM ||
+             sendDir == D3Q27System::DIR_0MP) {
         int x2 = 0;
         int x3 = 0;
         switch (sendDir) {
-            case D3Q27System::TN:
+            case D3Q27System::DIR_0PP:
                 x3 = maxX3;
                 x2 = maxX2;
                 break;
-            case D3Q27System::BN:
+            case D3Q27System::DIR_0PM:
                 x3 = 0;
                 x2 = maxX2;
                 break;
-            case D3Q27System::BS:
+            case D3Q27System::DIR_0MM:
                 x3 = 0;
                 x2 = 0;
                 break;
-            case D3Q27System::TS:
+            case D3Q27System::DIR_0MP:
                 x3 = maxX3;
                 x2 = 0;
                 break;
@@ -381,50 +381,50 @@ void FullVectorConnector::distributeData()
         }
     }
     // TNE TNW TSW TSE BNE BNW BSW BSE
-    else if (sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSW ||
-             sendDir == D3Q27System::TSE || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW ||
-             sendDir == D3Q27System::BSW || sendDir == D3Q27System::BSE) {
+    else if (sendDir == D3Q27System::DIR_PPP || sendDir == D3Q27System::DIR_MPP || sendDir == D3Q27System::DIR_MMP ||
+             sendDir == D3Q27System::DIR_PMP || sendDir == D3Q27System::DIR_PPM || sendDir == D3Q27System::DIR_MPM ||
+             sendDir == D3Q27System::DIR_MMM || sendDir == D3Q27System::DIR_PMM) {
         int x1 = 0;
         int x2 = 0;
         int x3 = 0;
 
         switch (sendDir) {
-            case D3Q27System::TNE:
+            case D3Q27System::DIR_PPP:
                 x1 = maxX1;
                 x2 = maxX2;
                 x3 = maxX3;
                 break;
-            case D3Q27System::TNW:
+            case D3Q27System::DIR_MPP:
                 x1 = 0;
                 x2 = maxX2;
                 x3 = maxX3;
                 break;
-            case D3Q27System::TSW:
+            case D3Q27System::DIR_MMP:
                 x1 = 0;
                 x2 = 0;
                 x3 = maxX3;
                 break;
-            case D3Q27System::TSE:
+            case D3Q27System::DIR_PMP:
                 x1 = maxX1;
                 x2 = 0;
                 x3 = maxX3;
                 break;
-            case D3Q27System::BNE:
+            case D3Q27System::DIR_PPM:
                 x1 = maxX1;
                 x2 = maxX2;
                 x3 = 0;
                 break;
-            case D3Q27System::BNW:
+            case D3Q27System::DIR_MPM:
                 x1 = 0;
                 x2 = maxX2;
                 x3 = 0;
                 break;
-            case D3Q27System::BSW:
+            case D3Q27System::DIR_MMM:
                 x1 = 0;
                 x2 = 0;
                 x3 = 0;
                 break;
-            case D3Q27System::BSE:
+            case D3Q27System::DIR_PMM:
                 x1 = maxX1;
                 x2 = 0;
                 x3 = 0;
diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h
index 39fc3d1afa3fb958b09d128bd67a5aca42acbc03..802a91290cfc0994e1ef2ae33fce78c6a6a4964e 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h
@@ -56,8 +56,8 @@ public:
 
 protected:
     virtual void updatePointers() = 0;
-    void fillData();
-    void distributeData();
+    virtual void fillData();
+    virtual void distributeData();
     virtual void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) = 0;
     virtual void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) = 0;
     
diff --git a/src/cpu/VirtualFluidsCore/Connectors/OneDistributionFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/OneDistributionFullVectorConnector.cpp
index 739efcddb9ceea5c0951df83833d64ad90bb02c5..72f43858ae7e64538b4b9bdb7028a8c895e2e84d 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/OneDistributionFullVectorConnector.cpp
+++ b/src/cpu/VirtualFluidsCore/Connectors/OneDistributionFullVectorConnector.cpp
@@ -18,51 +18,51 @@ void OneDistributionFullVectorConnector::init()
 
     int anz = 27;
     switch (sendDir) {
-        case D3Q27System::REST:
+        case D3Q27System::DIR_000:
             UB_THROW(UbException(UB_EXARGS, "ZERO not allowed"));
             break;
-        case D3Q27System::E:
-        case D3Q27System::W:
+        case D3Q27System::DIR_P00:
+        case D3Q27System::DIR_M00:
             sender->getData().resize(maxX2 * maxX3 * anz, 0.0);
             break;
-        case D3Q27System::N:
-        case D3Q27System::S:
+        case D3Q27System::DIR_0P0:
+        case D3Q27System::DIR_0M0:
             sender->getData().resize(maxX1 * maxX3 * anz, 0.0);
             break;
-        case D3Q27System::T:
-        case D3Q27System::B:
+        case D3Q27System::DIR_00P:
+        case D3Q27System::DIR_00M:
             sender->getData().resize(maxX1 * maxX2 * anz, 0.0);
             break;
 
-        case D3Q27System::NE:
-        case D3Q27System::SW:
-        case D3Q27System::SE:
-        case D3Q27System::NW:
+        case D3Q27System::DIR_PP0:
+        case D3Q27System::DIR_MM0:
+        case D3Q27System::DIR_PM0:
+        case D3Q27System::DIR_MP0:
             sender->getData().resize(maxX3 * anz, 0.0);
             break;
 
-        case D3Q27System::TE:
-        case D3Q27System::BW:
-        case D3Q27System::BE:
-        case D3Q27System::TW:
+        case D3Q27System::DIR_P0P:
+        case D3Q27System::DIR_M0M:
+        case D3Q27System::DIR_P0M:
+        case D3Q27System::DIR_M0P:
             sender->getData().resize(maxX2 * anz, 0.0);
             break;
 
-        case D3Q27System::TN:
-        case D3Q27System::BS:
-        case D3Q27System::BN:
-        case D3Q27System::TS:
+        case D3Q27System::DIR_0PP:
+        case D3Q27System::DIR_0MM:
+        case D3Q27System::DIR_0PM:
+        case D3Q27System::DIR_0MP:
             sender->getData().resize(maxX1 * anz, 0.0);
             break;
 
-        case D3Q27System::TNE:
-        case D3Q27System::BSW:
-        case D3Q27System::BNE:
-        case D3Q27System::TSW:
-        case D3Q27System::TSE:
-        case D3Q27System::BNW:
-        case D3Q27System::BSE:
-        case D3Q27System::TNW:
+        case D3Q27System::DIR_PPP:
+        case D3Q27System::DIR_MMM:
+        case D3Q27System::DIR_PPM:
+        case D3Q27System::DIR_MMP:
+        case D3Q27System::DIR_PMP:
+        case D3Q27System::DIR_MPM:
+        case D3Q27System::DIR_PMM:
+        case D3Q27System::DIR_MPP:
             sender->getData().resize(anz, 0.0);
             break;
 
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..782b0f27d4b0cd006a27c89def02dad11ff558c5
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.cpp
@@ -0,0 +1,317 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 ThreeDistributionsDoubleGhostLayerFullDirectConnector.cpp
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#include "ThreeDistributionsDoubleGhostLayerFullDirectConnector.h"
+#include "LBMKernel.h"
+#include "DataSet3D.h"
+
+ThreeDistributionsDoubleGhostLayerFullDirectConnector::ThreeDistributionsDoubleGhostLayerFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir)
+    : FullDirectConnector(from, to, sendDir)
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsDoubleGhostLayerFullDirectConnector::init()
+{
+    FullDirectConnector::init();
+
+	fFrom =dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getFdistributions());
+	fTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getFdistributions());
+	hFrom = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getHdistributions());
+	hTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getHdistributions());
+    hFrom2 = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getH2distributions());
+    hTo2  = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getH2distributions());
+    pressureFrom = from.lock()->getKernel()->getDataSet()->getPressureField();
+    pressureTo   = to.lock()->getKernel()->getDataSet()->getPressureField();
+}
+//////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsDoubleGhostLayerFullDirectConnector::sendVectors()
+{
+    updatePointers();
+    exchangeData();
+}
+//////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsDoubleGhostLayerFullDirectConnector::exchangeData()
+{
+    ////////////////////////////////////////////////////////////
+    // relation between ghost layer and regular nodes
+    // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes
+    // minX1   minX1p1 ... maxX1m1 maxX1   - ghost layer
+    ////////////////////////////////////////////////////////////
+
+    int minX1   = 0;
+    int minX1p1 = minX1 + 1;
+    int minX1p2 = minX1 + 2;
+    int minX1p3 = minX1 + 3;
+    int maxX1m1 = maxX1 - 1;
+    int maxX1m2 = maxX1 - 2;
+    int maxX1m3 = maxX1 - 3;
+
+    int minX2   = 0;
+    int minX2p1 = minX2 + 1;
+    int minX2p2 = minX2 + 2;
+    int minX2p3 = minX2 + 3;
+    int maxX2m1 = maxX2 - 1;
+    int maxX2m2 = maxX2 - 2;
+    int maxX2m3 = maxX2 - 3;
+
+    int minX3   = 0;
+    int minX3p1 = minX3 + 1;
+    int minX3p2 = minX3 + 2;
+    int minX3p3 = minX3 + 3;
+    int maxX3m1 = maxX3 - 1;
+    int maxX3m2 = maxX3 - 2;
+    int maxX3m3 = maxX3 - 3;
+
+    // EAST
+    if (sendDir == D3Q27System::DIR_P00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                exchangeData(maxX1m3, x2, x3, minX1, x2, x3);
+                exchangeData(maxX1m2, x2, x3, minX1p1, x2, x3);
+            }
+        }
+    }
+    // WEST
+    else if (sendDir == D3Q27System::DIR_M00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                exchangeData(minX1p3, x2, x3, maxX1, x2, x3);
+                exchangeData(minX1p2, x2, x3, maxX1m1, x2, x3);
+            }
+        }
+    }
+    // NORTH
+    else if (sendDir == D3Q27System::DIR_0P0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                exchangeData(x1, maxX2m3, x3, x1, minX2, x3);
+                exchangeData(x1, maxX2m2, x3, x1, minX2p1, x3);
+            }
+        }
+    }
+    // SOUTH
+    else if (sendDir == D3Q27System::DIR_0M0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                exchangeData(x1, minX2p3, x3, x1, maxX2, x3);
+                exchangeData(x1, minX2p2, x3, x1, maxX2m1, x3);
+            }
+        }
+    }
+
+    // TOP
+    else if (sendDir == D3Q27System::DIR_00P) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                exchangeData(x1, x2, maxX3m3, x1, x2, minX3);
+                exchangeData(x1, x2, maxX3m2, x1, x2, minX3p1);
+            }
+        }
+    }
+    // BOTTOM
+    else if (sendDir == D3Q27System::DIR_00M) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                exchangeData(x1, x2, minX3p3, x1, x2, maxX3);
+                exchangeData(x1, x2, minX3p2, x1, x2, maxX3m1);
+            }
+        }
+    }
+    // NORTHEAST
+    else if (sendDir == D3Q27System::DIR_PP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            exchangeData(maxX1m3, maxX2m3, x3, minX1, minX2, x3);
+            exchangeData(maxX1m2, maxX2m2, x3, minX1p1, minX2p1, x3);
+            exchangeData(maxX1m3, maxX2m2, x3, minX1, minX2p1, x3);
+            exchangeData(maxX1m2, maxX2m3, x3, minX1p1, minX2, x3);
+        }
+    }
+    // NORTHWEST
+    else if (sendDir == D3Q27System::DIR_MP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            exchangeData(minX1p3, maxX2m3, x3, maxX1, minX2, x3);
+            exchangeData(minX1p2, maxX2m2, x3, maxX1m1, minX2p1, x3);
+            exchangeData(minX1p3, maxX2m2, x3, maxX1, minX2p1, x3);
+            exchangeData(minX1p2, maxX2m3, x3, maxX1m1, minX2, x3);
+        }
+    }
+    // SOUTHWEST
+    else if (sendDir == D3Q27System::DIR_MM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            exchangeData(minX1p3, minX2p3, x3, maxX1, maxX2, x3);
+            exchangeData(minX1p2, minX2p2, x3, maxX1m1, maxX2m1, x3);
+            exchangeData(minX1p3, minX2p2, x3, maxX1, maxX2m1, x3);
+            exchangeData(minX1p2, minX2p3, x3, maxX1m1, maxX2, x3);
+        }
+    }
+    // SOUTHEAST
+    else if (sendDir == D3Q27System::DIR_PM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            exchangeData(maxX1m3, minX2p3, x3, minX1, maxX2, x3);
+            exchangeData(maxX1m2, minX2p2, x3, minX1p1, maxX2m1, x3);
+            exchangeData(maxX1m3, minX2p2, x3, minX1, maxX2m1, x3);
+            exchangeData(maxX1m2, minX2p3, x3, minX1p1, maxX2, x3);
+        }
+    } else if (sendDir == D3Q27System::DIR_P0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            exchangeData(maxX1m3, x2, maxX3m3, minX1, x2, minX3);
+            exchangeData(maxX1m2, x2, maxX3m2, minX1p1, x2, minX3p1);
+            exchangeData(maxX1m3, x2, maxX3m2, minX1, x2, minX3p1);
+            exchangeData(maxX1m2, x2, maxX3m3, minX1p1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            exchangeData(minX1p3, x2, minX3p3, maxX1, x2, maxX3);
+            exchangeData(minX1p2, x2, minX3p2, maxX1m1, x2, maxX3m1);
+            exchangeData(minX1p3, x2, minX3p2, maxX1, x2, maxX3m1);
+            exchangeData(minX1p2, x2, minX3p3, maxX1m1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_P0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            exchangeData(maxX1m3, x2, minX3p3, minX1, x2, maxX3);
+            exchangeData(maxX1m2, x2, minX3p2, minX1p1, x2, maxX3m1);
+            exchangeData(maxX1m3, x2, minX3p2, minX1, x2, maxX3m1);
+            exchangeData(maxX1m2, x2, minX3p3, minX1p1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            exchangeData(minX1p3, x2, maxX3m3, maxX1, x2, minX3);
+            exchangeData(minX1p2, x2, maxX3m2, maxX1m1, x2, minX3p1);
+            exchangeData(minX1p3, x2, maxX3m2, maxX1, x2, minX3p1);
+            exchangeData(minX1p2, x2, maxX3m3, maxX1m1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            exchangeData(x1, maxX2m3, maxX3m3, x1, minX2, minX3);
+            exchangeData(x1, maxX2m2, maxX3m2, x1, minX2p1, minX3p1);
+            exchangeData(x1, maxX2m3, maxX3m2, x1, minX2, minX3p1);
+            exchangeData(x1, maxX2m2, maxX3m3, x1, minX2p1, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            exchangeData(x1, minX2p3, minX3p3, x1, maxX2, maxX3);
+            exchangeData(x1, minX2p2, minX3p2, x1, maxX2m1, maxX3m1);
+            exchangeData(x1, minX2p3, minX3p2, x1, maxX2, maxX3m1);
+            exchangeData(x1, minX2p2, minX3p3, x1, maxX2m1, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            exchangeData(x1, maxX2m3, minX3p3, x1, minX2, maxX3);
+            exchangeData(x1, maxX2m2, minX3p2, x1, minX2p1, maxX3m1);
+            exchangeData(x1, maxX2m3, minX3p2, x1, minX2, maxX3m1);
+            exchangeData(x1, maxX2m2, minX3p3, x1, minX2p1, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            exchangeData(x1, minX2p3, maxX3m3, x1, maxX2, minX3);
+            exchangeData(x1, minX2p2, maxX3m2, x1, maxX2m1, minX3p1);
+            exchangeData(x1, minX2p3, maxX3m2, x1, maxX2, minX3p1);
+            exchangeData(x1, minX2p2, maxX3m3, x1, maxX2m1, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_MMP) {
+        exchangeData(minX1p3, minX2p3, maxX3m3, maxX1, maxX2, minX3);
+        exchangeData(minX1p2, minX2p2, maxX3m2, maxX1m1, maxX2m1, minX3p1);
+        exchangeData(minX1p3, minX2p2, maxX3m2, maxX1, maxX2m1, minX3p1);
+        exchangeData(minX1p2, minX2p3, maxX3m2, maxX1m1, maxX2, minX3p1);
+        exchangeData(minX1p2, minX2p2, maxX3m3, maxX1m1, maxX2m1, minX3);
+        exchangeData(minX1p3, minX2p3, maxX3m2, maxX1, maxX2, minX3p1);
+        exchangeData(minX1p3, minX2p2, maxX3m3, maxX1, maxX2m1, minX3);
+        exchangeData(minX1p2, minX2p3, maxX3m3, maxX1m1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_PMP) {
+        exchangeData(maxX1m3, minX1p3, maxX3m3, minX1, maxX2, minX3);
+        exchangeData(maxX1m2, minX1p2, maxX3m2, minX1p1, maxX2m1, minX3p1);
+        exchangeData(maxX1m3, minX1p2, maxX3m2, minX1, maxX2m1, minX3p1);
+        exchangeData(maxX1m2, minX1p3, maxX3m2, minX1p1, maxX2, minX3p1);
+        exchangeData(maxX1m2, minX1p2, maxX3m3, minX1p1, maxX2m1, minX3);
+        exchangeData(maxX1m3, minX1p3, maxX3m2, minX1, maxX2, minX3p1);
+        exchangeData(maxX1m3, minX1p2, maxX3m3, minX1, maxX2m1, minX3);
+        exchangeData(maxX1m2, minX1p3, maxX3m3, minX1p1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_MPP) {
+        exchangeData(minX1p3, maxX2m3, maxX3m3, maxX1, minX2, minX3);
+        exchangeData(minX1p2, maxX2m2, maxX3m2, maxX1m1, minX2p1, minX3p1);
+        exchangeData(minX1p3, maxX2m2, maxX3m2, maxX1, minX2p1, minX3p1);
+        exchangeData(minX1p2, maxX2m3, maxX3m2, maxX1m1, minX2, minX3p1);
+        exchangeData(minX1p2, maxX2m2, maxX3m3, maxX1m1, minX2p1, minX3);
+        exchangeData(minX1p3, maxX2m3, maxX3m2, maxX1, minX2, minX3p1);
+        exchangeData(minX1p3, maxX2m2, maxX3m3, maxX1, minX2p1, minX3);
+        exchangeData(minX1p2, maxX2m3, maxX3m3, maxX1m1, minX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_PPP) {
+        exchangeData(maxX1m3, maxX2m3, maxX3m3, minX1, minX2, minX3);
+        exchangeData(maxX1m2, maxX2m2, maxX3m2, minX1p1, minX2p1, minX3p1);
+        exchangeData(maxX1m3, maxX2m2, maxX3m2, minX1, minX2p1, minX3p1);
+        exchangeData(maxX1m2, maxX2m3, maxX3m2, minX1p1, minX2, minX3p1);
+        exchangeData(maxX1m2, maxX2m2, maxX3m3, minX1p1, minX2p1, minX3);
+        exchangeData(maxX1m3, maxX2m3, maxX3m2, minX1, minX2, minX3p1);
+        exchangeData(maxX1m3, maxX2m2, maxX3m3, minX1, minX2p1, minX3);
+        exchangeData(maxX1m2, maxX2m3, maxX3m3, minX1p1, minX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_MMM) {
+        exchangeData(minX1p3, minX2p3, minX3p3, maxX1, maxX2, maxX3);
+        exchangeData(minX1p2, minX2p2, minX3p2, maxX1m1, maxX2m1, maxX3m1);
+        exchangeData(minX1p3, minX2p2, minX3p2, maxX1, maxX2m1, maxX3m1);
+        exchangeData(minX1p2, minX2p3, minX3p2, maxX1m1, maxX2, maxX3m1);
+        exchangeData(minX1p2, minX2p2, minX3p3, maxX1m1, maxX2m1, maxX3);
+        exchangeData(minX1p3, minX2p3, minX3p2, maxX1, maxX2, maxX3m1);
+        exchangeData(minX1p3, minX2p2, minX3p3, maxX1, maxX2m1, maxX3);
+        exchangeData(minX1p2, minX2p3, minX3p3, maxX1m1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_PMM) {
+        exchangeData(maxX1m3, minX2p3, minX3p3, minX1, maxX2, maxX3);
+        exchangeData(maxX1m2, minX2p2, minX3p2, minX1p1, maxX2m1, maxX3m1);
+        exchangeData(maxX1m3, minX2p2, minX3p2, minX1, maxX2m1, maxX3m1);
+        exchangeData(maxX1m2, minX2p3, minX3p2, minX1p1, maxX2, maxX3m1);
+        exchangeData(maxX1m2, minX2p2, minX3p3, minX1p1, maxX2m1, maxX3);
+        exchangeData(maxX1m3, minX2p3, minX3p2, minX1, maxX2, maxX3m1);
+        exchangeData(maxX1m3, minX2p2, minX3p3, minX1, maxX2m1, maxX3);
+        exchangeData(maxX1m2, minX2p3, minX3p3, minX1p1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_MPM) {
+        exchangeData(minX1p3, maxX2m3, minX3p3, maxX1, minX2, maxX3);
+        exchangeData(minX1p2, maxX2m2, minX3p2, maxX1m1, minX2p1, maxX3m1);
+        exchangeData(minX1p3, maxX2m2, minX3p2, maxX1, minX2p1, maxX3m1);
+        exchangeData(minX1p2, maxX2m3, minX3p2, maxX1m1, minX2, maxX3m1);
+        exchangeData(minX1p2, maxX2m2, minX3p3, maxX1m1, minX2p1, maxX3);
+        exchangeData(minX1p3, maxX2m3, minX3p2, maxX1, minX2, maxX3m1);
+        exchangeData(minX1p3, maxX2m2, minX3p3, maxX1, minX2p1, maxX3);
+        exchangeData(minX1p2, maxX2m3, minX3p3, maxX1m1, minX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_PPM) {
+        exchangeData(maxX1m3, maxX2m3, minX3p3, minX1, minX2, maxX3);
+        exchangeData(maxX1m2, maxX2m2, minX3p2, minX1p1, minX2p1, maxX3m1);
+        exchangeData(maxX1m3, maxX2m2, minX3p2, minX1, minX2p1, maxX3m1);
+        exchangeData(maxX1m2, maxX2m3, minX3p2, minX1p1, minX2, maxX3m1);
+        exchangeData(maxX1m2, maxX2m2, minX3p3, minX1p1, minX2p1, maxX3);
+        exchangeData(maxX1m3, maxX2m3, minX3p2, minX1, minX2, maxX3m1);
+        exchangeData(maxX1m3, maxX2m2, minX3p3, minX1, minX2p1, maxX3);
+        exchangeData(maxX1m2, maxX2m3, minX3p3, minX1p1, minX2, maxX3);
+    } else
+        UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+
+}
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.h
new file mode 100644
index 0000000000000000000000000000000000000000..1f53ca70aecd3531c986edb8a3933e9d4c5c5ba7
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.h
@@ -0,0 +1,239 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 ThreeDistributionsDoubleGhostLayerFullDirectConnector.h
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef ThreeDistributionsDoubleGhostLayerFullDirectConnector_H
+#define ThreeDistributionsDoubleGhostLayerFullDirectConnector_H
+
+#include "FullDirectConnector.h"
+#include "Block3D.h"
+#include "D3Q27System.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "basics/container/CbArray3D.h"
+#include "basics/container/CbArray4D.h"
+#include "DataSet3D.h"
+
+//! \brief   Exchange data between blocks. 
+//! \details Connector send and receive full distributions between two blocks in shared memory.
+
+class ThreeDistributionsDoubleGhostLayerFullDirectConnector : public FullDirectConnector
+{
+public:
+	ThreeDistributionsDoubleGhostLayerFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir);
+    void init() override;
+    void sendVectors() override;
+
+protected:
+    inline void updatePointers() override;
+    void exchangeData() override;
+    inline void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) override;
+
+private:
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromf;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromf;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsFromf;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsTof;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsTof;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsTof;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromh;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromh;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsFromh;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsToh;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsToh;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsToh;
+
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromh2;
+    CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromh2;
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsFromh2;
+
+    CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsToh2;
+    CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsToh2;
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsToh2;
+
+	SPtr<EsoTwist3D> fFrom, hFrom, hFrom2;
+    SPtr<EsoTwist3D> fTo, hTo, hTo2;
+
+    SPtr<PressureFieldArray3D> pressureFrom, pressureTo;
+};
+//////////////////////////////////////////////////////////////////////////
+inline void ThreeDistributionsDoubleGhostLayerFullDirectConnector::updatePointers()
+{
+    localDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getLocalDistributions();
+    nonLocalDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getNonLocalDistributions();
+    zeroDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getZeroDistributions();
+
+    localDistributionsTof    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getLocalDistributions();
+    nonLocalDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getNonLocalDistributions();
+    zeroDistributionsTof     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getZeroDistributions();
+
+    localDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getLocalDistributions();
+    nonLocalDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getNonLocalDistributions();
+    zeroDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getZeroDistributions();
+
+    localDistributionsToh    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getLocalDistributions();
+    nonLocalDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getNonLocalDistributions();
+    zeroDistributionsToh     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getZeroDistributions();
+
+    localDistributionsFromh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom2)->getLocalDistributions();
+    nonLocalDistributionsFromh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom2)->getNonLocalDistributions();
+    zeroDistributionsFromh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom2)->getZeroDistributions();
+
+    localDistributionsToh2    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo2)->getLocalDistributions();
+    nonLocalDistributionsToh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo2)->getNonLocalDistributions();
+    zeroDistributionsToh2     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo2)->getZeroDistributions();
+}
+//////////////////////////////////////////////////////////////////////////
+inline void ThreeDistributionsDoubleGhostLayerFullDirectConnector::exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To)
+{
+	(*this->localDistributionsTof)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_E, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_N, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_T, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NE, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TE, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TN, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TS, x1From, x2From + 1, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNE, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From);
+
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_W, x1From + 1, x2From, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_S, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_B, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SE, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BE, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BN, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1);
+
+	(*this->zeroDistributionsTof)(x1To, x2To, x3To) = (*this->zeroDistributionsFromf)(x1From, x2From, x3From);
+
+
+	(*this->localDistributionsToh)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_E, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_N, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_T, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NE, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TE, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TN, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TS, x1From, x2From + 1, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNE, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From);
+
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_W, x1From + 1, x2From, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_S, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_B, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SE, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BE, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BN, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1);
+
+	(*this->zeroDistributionsToh)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh)(x1From, x2From, x3From);
+
+	(*this->localDistributionsToh2)(D3Q27System::ET_E, x1To, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_E, x1From, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_N, x1To, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_N, x1From, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_T, x1To, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_T, x1From, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_NE, x1To, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_NE, x1From, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_NW, x1From + 1, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_TE, x1To, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_TE, x1From, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_TW, x1From + 1, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_TN, x1To, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_TN, x1From, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_TS, x1From, x2From + 1, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_TNE, x1To, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_TNE, x1From, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From);
+    (*this->localDistributionsToh2)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) =
+        (*this->localDistributionsFromh2)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From);
+
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_W, x1To + 1, x2To, x3To) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_W, x1From + 1, x2From, x3From);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_S, x1To, x2To + 1, x3To) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_S, x1From, x2From + 1, x3From);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_B, x1To, x2To, x3To + 1) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_B, x1From, x2From, x3From + 1);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_SE, x1From, x2From + 1, x3From);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BE, x1From, x2From, x3From + 1);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BN, x1From, x2From, x3From + 1);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1);
+    (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) =
+        (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1);
+
+    (*this->zeroDistributionsToh2)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh2)(x1From, x2From, x3From);
+
+    (*this->pressureTo)(x1To, x2To, x3To) = (*this->pressureFrom)(x1From, x2From, x3From);
+}
+#endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0b94f7b4a971462517db6dd07050942f4b8595c0
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.cpp
@@ -0,0 +1,616 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 ThreeDistributionsDoubleGhostLayerFullVectorConnector.cpp
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#include "ThreeDistributionsDoubleGhostLayerFullVectorConnector.h"
+#include "Block3D.h"
+#include "LBMKernel.h"
+#include "EsoTwist3D.h"
+#include "DataSet3D.h"
+
+//////////////////////////////////////////////////////////////////////////
+ThreeDistributionsDoubleGhostLayerFullVectorConnector::ThreeDistributionsDoubleGhostLayerFullVectorConnector(SPtr<Block3D> block,
+                                                                         VectorTransmitterPtr sender,
+                                                                         VectorTransmitterPtr receiver, int sendDir)
+    : FullVectorConnector(block, sender, receiver, sendDir)
+{
+   if (!block || !sender || !receiver)
+      UB_THROW(UbException(UB_EXARGS, "sender or receiver == NULL!!"));
+
+}
+//////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsDoubleGhostLayerFullVectorConnector::init()
+{
+   FullVectorConnector::init();
+
+   fDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getFdistributions());
+   hDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getHdistributions());
+   h2Dis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getH2distributions());
+   pressure   = block.lock()->getKernel()->getDataSet()->getPressureField();
+
+   int anz = 3*27+1;
+   switch (sendDir)
+   {
+   case D3Q27System::DIR_000: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break;
+   case D3Q27System::DIR_P00:
+   case D3Q27System::DIR_M00: sender->getData().resize(maxX2*maxX3*anz*2, 0.0);   break;
+   case D3Q27System::DIR_0P0:
+   case D3Q27System::DIR_0M0: sender->getData().resize(maxX1*maxX3*anz*2, 0.0);   break;
+   case D3Q27System::DIR_00P:
+   case D3Q27System::DIR_00M: sender->getData().resize(maxX1*maxX2*anz*2, 0.0);   break;
+
+   case D3Q27System::DIR_PP0:
+   case D3Q27System::DIR_MM0:
+   case D3Q27System::DIR_PM0:
+   case D3Q27System::DIR_MP0:  sender->getData().resize(maxX3*anz*4, 0.0);   break;
+
+   case D3Q27System::DIR_P0P:
+   case D3Q27System::DIR_M0M:
+   case D3Q27System::DIR_P0M:
+   case D3Q27System::DIR_M0P:  sender->getData().resize(maxX2*anz*4, 0.0);   break;
+
+   case D3Q27System::DIR_0PP:
+   case D3Q27System::DIR_0MM:
+   case D3Q27System::DIR_0PM:
+   case D3Q27System::DIR_0MP:  sender->getData().resize(maxX1*anz*4, 0.0);   break;
+
+   case D3Q27System::DIR_PPP:
+   case D3Q27System::DIR_MMM:
+   case D3Q27System::DIR_PPM:
+   case D3Q27System::DIR_MMP:
+   case D3Q27System::DIR_PMP:
+   case D3Q27System::DIR_MPM:
+   case D3Q27System::DIR_PMM:
+   case D3Q27System::DIR_MPP:  sender->getData().resize(anz*8, 0.0);   break;
+
+   default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir"));
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsDoubleGhostLayerFullVectorConnector::fillSendVectors() 
+{ 
+    updatePointers();
+    fillData();
+}
+////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsDoubleGhostLayerFullVectorConnector::fillData()
+{
+    ////////////////////////////////////////////////////////////
+    // relation between ghost layer and regular nodes
+    // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes
+    // minX1   minX1p1 ... maxX1m1 maxX1   - ghost layer
+    ////////////////////////////////////////////////////////////
+
+    int minX1   = 0;
+    //int minX1p1 = minX1 + 1;
+    int minX1p2 = minX1 + 2;
+    int minX1p3 = minX1 + 3;
+    //int maxX1m1 = maxX1 - 1;
+    int maxX1m2 = maxX1 - 2;
+    int maxX1m3 = maxX1 - 3;
+
+    int minX2   = 0;
+    //int minX2p1 = minX2 + 1;
+    int minX2p2 = minX2 + 2;
+    int minX2p3 = minX2 + 3;
+    //int maxX2m1 = maxX2 - 1;
+    int maxX2m2 = maxX2 - 2;
+    int maxX2m3 = maxX2 - 3;
+
+    int minX3   = 0;
+    //int minX3p1 = minX3 + 1;
+    int minX3p2 = minX3 + 2;
+    int minX3p3 = minX3 + 3;
+    //int maxX3m1 = maxX3 - 1;
+    int maxX3m2 = maxX3 - 2;
+    int maxX3m3 = maxX3 - 3;
+
+    vector_type &sdata = sender->getData();
+
+    int index = 0;
+    // EAST
+    if (sendDir == D3Q27System::DIR_P00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                fillData(sdata, index, maxX1m3, x2, x3);
+                fillData(sdata, index, maxX1m2, x2, x3);
+            }
+        }
+    }
+    // WEST
+    else if (sendDir == D3Q27System::DIR_M00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                fillData(sdata, index, minX1p3, x2, x3);
+                fillData(sdata, index, minX1p2, x2, x3);
+            }
+        }
+    }
+    // NORTH
+    else if (sendDir == D3Q27System::DIR_0P0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, maxX2m3, x3);
+                fillData(sdata, index, x1, maxX2m2, x3);
+            }
+        }
+    }
+    // SOUTH
+    else if (sendDir == D3Q27System::DIR_0M0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, minX2p3, x3);
+                fillData(sdata, index, x1, minX2p2, x3);
+            }
+        }
+    }
+
+    // TOP
+    else if (sendDir == D3Q27System::DIR_00P) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, x2, maxX3m3);
+                fillData(sdata, index, x1, x2, maxX3m2);
+            }
+        }
+    }
+    // BOTTOM
+    else if (sendDir == D3Q27System::DIR_00M) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, x2, minX3p3);
+                fillData(sdata, index, x1, x2, minX3p2);
+            }
+        }
+    }
+    // NORTHEAST
+    else if (sendDir == D3Q27System::DIR_PP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, maxX1m3, maxX2m3, x3);
+            fillData(sdata, index, maxX1m2, maxX2m2, x3);
+            fillData(sdata, index, maxX1m3, maxX2m2, x3);
+            fillData(sdata, index, maxX1m2, maxX2m3, x3);
+        }
+    }
+    // NORTHWEST
+    else if (sendDir == D3Q27System::DIR_MP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, minX1p3, maxX2m3, x3);
+            fillData(sdata, index, minX1p2, maxX2m2, x3);
+            fillData(sdata, index, minX1p3, maxX2m2, x3);
+            fillData(sdata, index, minX1p2, maxX2m3, x3);
+        }
+    }
+    // SOUTHWEST
+    else if (sendDir == D3Q27System::DIR_MM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, minX1p3, minX2p3, x3);
+            fillData(sdata, index, minX1p2, minX2p2, x3);
+            fillData(sdata, index, minX1p3, minX2p2, x3);
+            fillData(sdata, index, minX1p2, minX2p3, x3);
+        }
+    }
+    // SOUTHEAST
+    else if (sendDir == D3Q27System::DIR_PM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, maxX1m3, minX2p3, x3);
+            fillData(sdata, index, maxX1m2, minX2p2, x3);
+            fillData(sdata, index, maxX1m3, minX2p2, x3);
+            fillData(sdata, index, maxX1m2, minX2p3, x3);
+        }
+    } else if (sendDir == D3Q27System::DIR_P0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, maxX1m3, x2, maxX3m3);
+            fillData(sdata, index, maxX1m2, x2, maxX3m2);
+            fillData(sdata, index, maxX1m3, x2, maxX3m2);
+            fillData(sdata, index, maxX1m2, x2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, minX1p3, x2, minX3p3);
+            fillData(sdata, index, minX1p2, x2, minX3p2);
+            fillData(sdata, index, minX1p3, x2, minX3p2);
+            fillData(sdata, index, minX1p2, x2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::DIR_P0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, maxX1m3, x2, minX3p3);
+            fillData(sdata, index, maxX1m2, x2, minX3p2);
+            fillData(sdata, index, maxX1m3, x2, minX3p2);
+            fillData(sdata, index, maxX1m2, x2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, minX1p3, x2, maxX3m3);
+            fillData(sdata, index, minX1p2, x2, maxX3m2);
+            fillData(sdata, index, minX1p3, x2, maxX3m2);
+            fillData(sdata, index, minX1p2, x2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, maxX2m3, maxX3m3);
+            fillData(sdata, index, x1, maxX2m2, maxX3m2);
+            fillData(sdata, index, x1, maxX2m3, maxX3m2);
+            fillData(sdata, index, x1, maxX2m2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, minX2p3, minX3p3);
+            fillData(sdata, index, x1, minX2p2, minX3p2);
+            fillData(sdata, index, x1, minX2p3, minX3p2);
+            fillData(sdata, index, x1, minX2p2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, maxX2m3, minX3p3);
+            fillData(sdata, index, x1, maxX2m2, minX3p2);
+            fillData(sdata, index, x1, maxX2m3, minX3p2);
+            fillData(sdata, index, x1, maxX2m2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, minX2p3, maxX3m3);
+            fillData(sdata, index, x1, minX2p2, maxX3m2);
+            fillData(sdata, index, x1, minX2p3, maxX3m2);
+            fillData(sdata, index, x1, minX2p2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::DIR_MMP) {
+        fillData(sdata, index, minX1p3, minX2p3, maxX3m3);
+        fillData(sdata, index, minX1p2, minX2p2, maxX3m2);
+        fillData(sdata, index, minX1p3, minX2p2, maxX3m2);
+        fillData(sdata, index, minX1p2, minX2p3, maxX3m2);
+        fillData(sdata, index, minX1p2, minX2p2, maxX3m3);
+        fillData(sdata, index, minX1p3, minX2p3, maxX3m2);
+        fillData(sdata, index, minX1p3, minX2p2, maxX3m3);
+        fillData(sdata, index, minX1p2, minX2p3, maxX3m3);
+    } else if (sendDir == D3Q27System::DIR_PMP) {
+        fillData(sdata, index, maxX1m3, minX1p3, maxX3m3);
+        fillData(sdata, index, maxX1m2, minX1p2, maxX3m2);
+        fillData(sdata, index, maxX1m3, minX1p2, maxX3m2);
+        fillData(sdata, index, maxX1m2, minX1p3, maxX3m2);
+        fillData(sdata, index, maxX1m2, minX1p2, maxX3m3);
+        fillData(sdata, index, maxX1m3, minX1p3, maxX3m2);
+        fillData(sdata, index, maxX1m3, minX1p2, maxX3m3);
+        fillData(sdata, index, maxX1m2, minX1p3, maxX3m3);
+    } else if (sendDir == D3Q27System::DIR_MPP) {
+        fillData(sdata, index, minX1p3, maxX2m3, maxX3m3);
+        fillData(sdata, index, minX1p2, maxX2m2, maxX3m2);
+        fillData(sdata, index, minX1p3, maxX2m2, maxX3m2);
+        fillData(sdata, index, minX1p2, maxX2m3, maxX3m2);
+        fillData(sdata, index, minX1p2, maxX2m2, maxX3m3);
+        fillData(sdata, index, minX1p3, maxX2m3, maxX3m2);
+        fillData(sdata, index, minX1p3, maxX2m2, maxX3m3);
+        fillData(sdata, index, minX1p2, maxX2m3, maxX3m3);
+    } else if (sendDir == D3Q27System::DIR_PPP) {
+        fillData(sdata, index, maxX1m3, maxX2m3, maxX3m3);
+        fillData(sdata, index, maxX1m2, maxX2m2, maxX3m2);
+        fillData(sdata, index, maxX1m3, maxX2m2, maxX3m2);
+        fillData(sdata, index, maxX1m2, maxX2m3, maxX3m2);
+        fillData(sdata, index, maxX1m2, maxX2m2, maxX3m3);
+        fillData(sdata, index, maxX1m3, maxX2m3, maxX3m2);
+        fillData(sdata, index, maxX1m3, maxX2m2, maxX3m3);
+        fillData(sdata, index, maxX1m2, maxX2m3, maxX3m3);
+    } else if (sendDir == D3Q27System::DIR_MMM) {
+        fillData(sdata, index, minX1p3, minX2p3, minX3p3);
+        fillData(sdata, index, minX1p2, minX2p2, minX3p2);
+        fillData(sdata, index, minX1p3, minX2p2, minX3p2);
+        fillData(sdata, index, minX1p2, minX2p3, minX3p2);
+        fillData(sdata, index, minX1p2, minX2p2, minX3p3);
+        fillData(sdata, index, minX1p3, minX2p3, minX3p2);
+        fillData(sdata, index, minX1p3, minX2p2, minX3p3);
+        fillData(sdata, index, minX1p2, minX2p3, minX3p3);
+    } else if (sendDir == D3Q27System::DIR_PMM) {
+        fillData(sdata, index, maxX1m3, minX2p3, minX3p3);
+        fillData(sdata, index, maxX1m2, minX2p2, minX3p2);
+        fillData(sdata, index, maxX1m3, minX2p2, minX3p2);
+        fillData(sdata, index, maxX1m2, minX2p3, minX3p2);
+        fillData(sdata, index, maxX1m2, minX2p2, minX3p3);
+        fillData(sdata, index, maxX1m3, minX2p3, minX3p2);
+        fillData(sdata, index, maxX1m3, minX2p2, minX3p3);
+        fillData(sdata, index, maxX1m2, minX2p3, minX3p3);
+    } else if (sendDir == D3Q27System::DIR_MPM) {
+        fillData(sdata, index, minX1p3, maxX2m3, minX3p3);
+        fillData(sdata, index, minX1p2, maxX2m2, minX3p2);
+        fillData(sdata, index, minX1p3, maxX2m2, minX3p2);
+        fillData(sdata, index, minX1p2, maxX2m3, minX3p2);
+        fillData(sdata, index, minX1p2, maxX2m2, minX3p3);
+        fillData(sdata, index, minX1p3, maxX2m3, minX3p2);
+        fillData(sdata, index, minX1p3, maxX2m2, minX3p3);
+        fillData(sdata, index, minX1p2, maxX2m3, minX3p3);
+    } else if (sendDir == D3Q27System::DIR_PPM) {
+        fillData(sdata, index, maxX1m3, maxX2m3, minX3p3);
+        fillData(sdata, index, maxX1m2, maxX2m2, minX3p2);
+        fillData(sdata, index, maxX1m3, maxX2m2, minX3p2);
+        fillData(sdata, index, maxX1m2, maxX2m3, minX3p2);
+        fillData(sdata, index, maxX1m2, maxX2m2, minX3p3);
+        fillData(sdata, index, maxX1m3, maxX2m3, minX3p2);
+        fillData(sdata, index, maxX1m3, maxX2m2, minX3p3);
+        fillData(sdata, index, maxX1m2, maxX2m3, minX3p3);
+    } else
+        UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+}
+////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsDoubleGhostLayerFullVectorConnector::distributeReceiveVectors() 
+{
+    updatePointers();
+    distributeData();
+}
+////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsDoubleGhostLayerFullVectorConnector::distributeData()
+{
+    vector_type &rdata = receiver->getData();
+
+    int index = 0;
+    ////////////////////////////////////////////////////////////
+    // relation between ghost layer and regular nodes
+    // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes
+    // minX1   minX1p1 ... maxX1m1 maxX1   - ghost layer
+    ////////////////////////////////////////////////////////////
+
+    int minX1   = 0;
+    int minX1p1 = minX1 + 1;
+    int minX1p2 = minX1 + 2;
+    //int minX1p3 = minX1 + 3;
+    int maxX1m1 = maxX1 - 1;
+    int maxX1m2 = maxX1 - 2;
+    //int maxX1m3 = maxX1 - 3;
+
+    int minX2   = 0;
+    int minX2p1 = minX2 + 1;
+    int minX2p2 = minX2 + 2;
+    //int minX2p3 = minX2 + 3;
+    int maxX2m1 = maxX2 - 1;
+    int maxX2m2 = maxX2 - 2;
+    //int maxX2m3 = maxX2 - 3;
+
+    int minX3   = 0;
+    int minX3p1 = minX3 + 1;
+    int minX3p2 = minX3 + 2;
+    //int minX3p3 = minX3 + 3;
+    int maxX3m1 = maxX3 - 1;
+    int maxX3m2 = maxX3 - 2;
+    //int maxX3m3 = maxX3 - 3;
+
+    if (sendDir == D3Q27System::DIR_M00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                distributeData(rdata, index, minX1, x2, x3);
+                distributeData(rdata, index, minX1p1, x2, x3);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_P00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                distributeData(rdata, index, maxX1, x2, x3);
+                distributeData(rdata, index, maxX1m1, x2, x3);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_0M0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, minX2, x3);
+                distributeData(rdata, index, x1, minX2p1, x3);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_0P0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, maxX2, x3);
+                distributeData(rdata, index, x1, maxX2m1, x3);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_00M) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, x2, minX3);
+                distributeData(rdata, index, x1, x2, minX3p1);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_00P) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, x2, maxX3);
+                distributeData(rdata, index, x1, x2, maxX3m1);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_MM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, minX1, minX2, x3);
+            distributeData(rdata, index, minX1p1, minX2p1, x3);
+            distributeData(rdata, index, minX1, minX2p1, x3);
+            distributeData(rdata, index, minX1p1, minX2, x3);
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_PM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, maxX1, minX2, x3);
+            distributeData(rdata, index, maxX1m1, minX2p1, x3);
+            distributeData(rdata, index, maxX1, minX2p1, x3);
+            distributeData(rdata, index, maxX1m1, minX2, x3);
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_PP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, maxX1, maxX2, x3);
+            distributeData(rdata, index, maxX1m1, maxX2m1, x3);
+            distributeData(rdata, index, maxX1, maxX2m1, x3);
+            distributeData(rdata, index, maxX1m1, maxX2, x3);
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_MP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, minX1, maxX2, x3);
+            distributeData(rdata, index, minX1p1, maxX2m1, x3);
+            distributeData(rdata, index, minX1, maxX2m1, x3);
+            distributeData(rdata, index, minX1p1, maxX2, x3);
+        }
+    } else if (sendDir == D3Q27System::DIR_M0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, minX1, x2, minX3);
+            distributeData(rdata, index, minX1p1, x2, minX3p1);
+            distributeData(rdata, index, minX1, x2, minX3p1);
+            distributeData(rdata, index, minX1p1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_P0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, maxX1, x2, maxX3);
+            distributeData(rdata, index, maxX1m1, x2, maxX3m1);
+            distributeData(rdata, index, maxX1, x2, maxX3m1);
+            distributeData(rdata, index, maxX1m1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, minX1, x2, maxX3);
+            distributeData(rdata, index, minX1p1, x2, maxX3m1);
+            distributeData(rdata, index, minX1, x2, maxX3m1);
+            distributeData(rdata, index, minX1p1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_P0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, maxX1, x2, minX3);
+            distributeData(rdata, index, maxX1m1, x2, minX3p1);
+            distributeData(rdata, index, maxX1, x2, minX3p1);
+            distributeData(rdata, index, maxX1m1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, minX2, minX3);
+            distributeData(rdata, index, x1, minX2p1, minX3p1);
+            distributeData(rdata, index, x1, minX2, minX3p1);
+            distributeData(rdata, index, x1, minX2p1, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, maxX2, maxX3);
+            distributeData(rdata, index, x1, maxX2m1, maxX3m1);
+            distributeData(rdata, index, x1, maxX2, maxX3m1);
+            distributeData(rdata, index, x1, maxX2m1, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, minX2, maxX3);
+            distributeData(rdata, index, x1, minX2p1, maxX3m1);
+            distributeData(rdata, index, x1, minX2, maxX3m1);
+            distributeData(rdata, index, x1, minX2p1, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, maxX2, minX3);
+            distributeData(rdata, index, x1, maxX2m1, minX3p1);
+            distributeData(rdata, index, x1, maxX2, minX3p1);
+            distributeData(rdata, index, x1, maxX2m1, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_PPM) {
+        distributeData(rdata, index, maxX1, maxX2, minX3);
+        distributeData(rdata, index, maxX1m1, maxX2m1, minX3p1);
+        distributeData(rdata, index, maxX1, maxX2m1, minX3p1);
+        distributeData(rdata, index, maxX1m1, maxX2, minX3p1);
+        distributeData(rdata, index, maxX1m1, maxX2m1, minX3);
+        distributeData(rdata, index, maxX1, maxX2, minX3p1);
+        distributeData(rdata, index, maxX1, maxX2m1, minX3);
+        distributeData(rdata, index, maxX1m1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_MPM) {
+        distributeData(rdata, index, minX1, maxX2, minX3);
+        distributeData(rdata, index, minX1p1, maxX2m1, minX3p1);
+        distributeData(rdata, index, minX1, maxX2m1, minX3p1);
+        distributeData(rdata, index, minX1p1, maxX2, minX3p1);
+        distributeData(rdata, index, minX1p1, maxX2m1, minX3);
+        distributeData(rdata, index, minX1, maxX2, minX3p1);
+        distributeData(rdata, index, minX1, maxX2m1, minX3);
+        distributeData(rdata, index, minX1p1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_PMM) {
+        distributeData(rdata, index, maxX1, minX2, minX3);
+        distributeData(rdata, index, maxX1m1, minX2p1, minX3p1);
+        distributeData(rdata, index, maxX1, minX2p1, minX3p1);
+        distributeData(rdata, index, maxX1m1, minX2, minX3p1);
+        distributeData(rdata, index, maxX1m1, minX2p1, minX3);
+        distributeData(rdata, index, maxX1, minX2, minX3p1);
+        distributeData(rdata, index, maxX1, minX2p1, minX3);
+        distributeData(rdata, index, maxX1m1, minX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_MMM) {
+        distributeData(rdata, index, minX1, minX2, minX3);
+        distributeData(rdata, index, minX1p1, minX2p1, minX3p1);
+        distributeData(rdata, index, minX1, minX2p1, minX3p1);
+        distributeData(rdata, index, minX1p1, minX2, minX3p1);
+        distributeData(rdata, index, minX1p1, minX2p1, minX3);
+        distributeData(rdata, index, minX1, minX2, minX3p1);
+        distributeData(rdata, index, minX1, minX2p1, minX3);
+        distributeData(rdata, index, minX1p1, minX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_PPP) {
+        distributeData(rdata, index, maxX1, maxX2, maxX3);
+        distributeData(rdata, index, maxX1m1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, maxX1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, maxX1m1, maxX2, maxX3m1);
+        distributeData(rdata, index, maxX1m1, maxX2m1, maxX3);
+        distributeData(rdata, index, maxX1, maxX2, maxX3m1);
+        distributeData(rdata, index, maxX1, maxX2m1, maxX3);
+        distributeData(rdata, index, maxX1m1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_MPP) {
+        distributeData(rdata, index, minX1, maxX2, maxX3);
+        distributeData(rdata, index, minX1p1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, minX1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, minX1p1, maxX2, maxX3m1);
+        distributeData(rdata, index, minX1p1, maxX2m1, maxX3);
+        distributeData(rdata, index, minX1, maxX2, maxX3m1);
+        distributeData(rdata, index, minX1, maxX2m1, maxX3);
+        distributeData(rdata, index, minX1p1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_PMP) {
+        distributeData(rdata, index, maxX1, minX2, maxX3);
+        distributeData(rdata, index, maxX1m1, minX2p1, maxX3m1);
+        distributeData(rdata, index, maxX1, minX2p1, maxX3m1);
+        distributeData(rdata, index, maxX1m1, minX2, maxX3m1);
+        distributeData(rdata, index, maxX1m1, minX2p1, maxX3);
+        distributeData(rdata, index, maxX1, minX2, maxX3m1);
+        distributeData(rdata, index, maxX1, minX2p1, maxX3);
+        distributeData(rdata, index, maxX1m1, minX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_MMP) {
+        distributeData(rdata, index, minX1, minX2, maxX3);
+        distributeData(rdata, index, minX1p1, minX2p1, maxX3m1);
+        distributeData(rdata, index, minX1, minX2p1, maxX3m1);
+        distributeData(rdata, index, minX1p1, minX2, maxX3m1);
+        distributeData(rdata, index, minX1p1, minX2p1, maxX3);
+        distributeData(rdata, index, minX1, minX2, maxX3m1);
+        distributeData(rdata, index, minX1, minX2p1, maxX3);
+        distributeData(rdata, index, minX1p1, minX2, maxX3);
+    } else
+        UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+
+}
+//////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.h
new file mode 100644
index 0000000000000000000000000000000000000000..408a8e79d8a22ae71f0f03d51205b6c01a391aae
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.h
@@ -0,0 +1,302 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 ThreeDistributionsDoubleGhostLayerFullVectorConnector.h
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef ThreeDistributionsDoubleGhostLayerFullVectorConnector_H
+#define ThreeDistributionsDoubleGhostLayerFullVectorConnector_H
+
+#include <vector>
+
+#include "FullVectorConnector.h"
+#include "D3Q27System.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "basics/container/CbArray3D.h"
+#include "basics/container/CbArray4D.h"
+#include "DataSet3D.h"
+
+class EsoTwist3D;
+class Block3D;
+
+//daten werden in einen vector (dieser befindet sich im transmitter) kopiert
+//der vector wird via transmitter uebertragen
+//transmitter kann ein lokal, MPI, RCG, CTL oder was auch immer fuer ein
+//transmitter sein, der von Transmitter abgeleitet ist ;-)
+class ThreeDistributionsDoubleGhostLayerFullVectorConnector : public FullVectorConnector
+{
+public:
+   ThreeDistributionsDoubleGhostLayerFullVectorConnector(SPtr<Block3D> block, VectorTransmitterPtr sender, VectorTransmitterPtr receiver, int sendDir);
+
+   void init() override;
+
+   void fillSendVectors() override;
+   void distributeReceiveVectors() override;
+
+protected:
+   inline void updatePointers() override;
+   void fillData() override;
+   void distributeData() override;
+   inline void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) override;
+   inline void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) override;
+
+private:
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions;
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions;
+   CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributions;
+
+   SPtr<EsoTwist3D>  fDis;
+
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localHdistributions;
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalHdistributions;
+   CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroHdistributions;
+
+   SPtr<EsoTwist3D>  hDis;
+
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localH2distributions;
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalH2distributions;
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroH2distributions;
+
+   SPtr<EsoTwist3D> h2Dis;
+
+   SPtr<PressureFieldArray3D> pressure;
+
+};
+//////////////////////////////////////////////////////////////////////////
+inline void ThreeDistributionsDoubleGhostLayerFullVectorConnector::updatePointers()
+{
+    localDistributions    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions();
+    nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions();
+    zeroDistributions     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions();
+
+    localHdistributions    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions();
+    nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions();
+    zeroHdistributions     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions();
+
+    localH2distributions    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getLocalDistributions();
+    nonLocalH2distributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getNonLocalDistributions();
+    zeroH2distributions     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getZeroDistributions();
+}
+//////////////////////////////////////////////////////////////////////////
+inline void ThreeDistributionsDoubleGhostLayerFullVectorConnector::fillData(vector_type& sdata, int& index, int x1, int x2, int x3)
+{
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroDistributions)(x1, x2, x3);
+
+
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroHdistributions)(x1, x2, x3);
+
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroH2distributions)(x1, x2, x3);
+
+   sdata[index++] = (*this->pressure)(x1, x2, x3);
+}
+//////////////////////////////////////////////////////////////////////////
+inline void ThreeDistributionsDoubleGhostLayerFullVectorConnector::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3)
+{
+   (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++];
+
+   (*this->zeroDistributions)(x1, x2, x3) = rdata[index++];
+
+   
+   (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++];
+
+   (*this->zeroHdistributions)(x1, x2, x3) = rdata[index++];
+
+   (*this->localH2distributions)(D3Q27System::ET_E, x1, x2, x3)           = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_N, x1, x2, x3)           = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_T, x1, x2, x3)           = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_NE, x1, x2, x3)          = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_NW, x1 + 1, x2, x3)      = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TE, x1, x2, x3)          = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TW, x1 + 1, x2, x3)      = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TN, x1, x2, x3)          = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TS, x1, x2 + 1, x3)      = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TNE, x1, x2, x3)         = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3)     = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3)     = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalH2distributions)(D3Q27System::ET_W, x1 + 1, x2, x3)           = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_S, x1, x2 + 1, x3)           = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_B, x1, x2, x3 + 1)           = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3)      = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_SE, x1, x2 + 1, x3)          = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1)      = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BE, x1, x2, x3 + 1)          = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1)      = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BN, x1, x2, x3 + 1)          = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1)     = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1)     = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1)         = rdata[index++];
+
+   (*this->zeroH2distributions)(x1, x2, x3) = rdata[index++];
+
+   (*this->pressure)(x1, x2, x3) = rdata[index++];
+}
+
+
+#endif 
+
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector.cpp
index 2e726fc7b88c9ef229e503924eadcf53a9b06dfd..534076b7bfcb63386c75d6d8619b4b56bbd5c5ee 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector.cpp
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector.cpp
@@ -59,37 +59,37 @@ void ThreeDistributionsFullVectorConnector::init()
    int anz = 3*27;
    switch (sendDir)
    {
-   case D3Q27System::REST: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break;
-   case D3Q27System::E:
-   case D3Q27System::W: sender->getData().resize(maxX2*maxX3*anz, 0.0);   break;
-   case D3Q27System::N:
-   case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0);   break;
-   case D3Q27System::T:
-   case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 0.0);   break;
+   case D3Q27System::DIR_000: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break;
+   case D3Q27System::DIR_P00:
+   case D3Q27System::DIR_M00: sender->getData().resize(maxX2*maxX3*anz, 0.0);   break;
+   case D3Q27System::DIR_0P0:
+   case D3Q27System::DIR_0M0: sender->getData().resize(maxX1*maxX3*anz, 0.0);   break;
+   case D3Q27System::DIR_00P:
+   case D3Q27System::DIR_00M: sender->getData().resize(maxX1*maxX2*anz, 0.0);   break;
 
-   case D3Q27System::NE:
-   case D3Q27System::SW:
-   case D3Q27System::SE:
-   case D3Q27System::NW:  sender->getData().resize(maxX3*anz, 0.0);   break;
+   case D3Q27System::DIR_PP0:
+   case D3Q27System::DIR_MM0:
+   case D3Q27System::DIR_PM0:
+   case D3Q27System::DIR_MP0:  sender->getData().resize(maxX3*anz, 0.0);   break;
 
-   case D3Q27System::TE:
-   case D3Q27System::BW:
-   case D3Q27System::BE:
-   case D3Q27System::TW:  sender->getData().resize(maxX2*anz, 0.0);   break;
+   case D3Q27System::DIR_P0P:
+   case D3Q27System::DIR_M0M:
+   case D3Q27System::DIR_P0M:
+   case D3Q27System::DIR_M0P:  sender->getData().resize(maxX2*anz, 0.0);   break;
 
-   case D3Q27System::TN:
-   case D3Q27System::BS:
-   case D3Q27System::BN:
-   case D3Q27System::TS:  sender->getData().resize(maxX1*anz, 0.0);   break;
+   case D3Q27System::DIR_0PP:
+   case D3Q27System::DIR_0MM:
+   case D3Q27System::DIR_0PM:
+   case D3Q27System::DIR_0MP:  sender->getData().resize(maxX1*anz, 0.0);   break;
 
-   case D3Q27System::TNE:
-   case D3Q27System::BSW:
-   case D3Q27System::BNE:
-   case D3Q27System::TSW:
-   case D3Q27System::TSE:
-   case D3Q27System::BNW:
-   case D3Q27System::BSE:
-   case D3Q27System::TNW:  sender->getData().resize(anz, 0.0);   break;
+   case D3Q27System::DIR_PPP:
+   case D3Q27System::DIR_MMM:
+   case D3Q27System::DIR_PPM:
+   case D3Q27System::DIR_MMP:
+   case D3Q27System::DIR_PMP:
+   case D3Q27System::DIR_MPM:
+   case D3Q27System::DIR_PMM:
+   case D3Q27System::DIR_MPP:  sender->getData().resize(anz, 0.0);   break;
 
    default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir"));
    }
diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b46ffebeb144569311272050893118f34e862398
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.cpp
@@ -0,0 +1,315 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 TwoDistributionsDoubleGhostLayerFullDirectConnector.cpp
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#include "TwoDistributionsDoubleGhostLayerFullDirectConnector.h"
+#include "LBMKernel.h"
+#include "DataSet3D.h"
+
+TwoDistributionsDoubleGhostLayerFullDirectConnector::TwoDistributionsDoubleGhostLayerFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir)
+    : FullDirectConnector(from, to, sendDir)
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+void TwoDistributionsDoubleGhostLayerFullDirectConnector::init()
+{
+    FullDirectConnector::init();
+
+	fFrom =dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getFdistributions());
+	fTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getFdistributions());
+	hFrom = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getHdistributions());
+	hTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getHdistributions());
+    pressureFrom = from.lock()->getKernel()->getDataSet()->getPressureField();
+    pressureTo   = to.lock()->getKernel()->getDataSet()->getPressureField();
+}
+//////////////////////////////////////////////////////////////////////////
+void TwoDistributionsDoubleGhostLayerFullDirectConnector::sendVectors()
+{
+    updatePointers();
+    exchangeData();
+}
+//////////////////////////////////////////////////////////////////////////
+void TwoDistributionsDoubleGhostLayerFullDirectConnector::exchangeData()
+{
+    ////////////////////////////////////////////////////////////
+    // relation between ghost layer and regular nodes
+    // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes
+    // minX1   minX1p1 ... maxX1m1 maxX1   - ghost layer
+    ////////////////////////////////////////////////////////////
+
+    int minX1   = 0;
+    int minX1p1 = minX1 + 1;
+    int minX1p2 = minX1 + 2;
+    int minX1p3 = minX1 + 3;
+    int maxX1m1 = maxX1 - 1;
+    int maxX1m2 = maxX1 - 2;
+    int maxX1m3 = maxX1 - 3;
+
+    int minX2   = 0;
+    int minX2p1 = minX2 + 1;
+    int minX2p2 = minX2 + 2;
+    int minX2p3 = minX2 + 3;
+    int maxX2m1 = maxX2 - 1;
+    int maxX2m2 = maxX2 - 2;
+    int maxX2m3 = maxX2 - 3;
+
+    int minX3   = 0;
+    int minX3p1 = minX3 + 1;
+    int minX3p2 = minX3 + 2;
+    int minX3p3 = minX3 + 3;
+    int maxX3m1 = maxX3 - 1;
+    int maxX3m2 = maxX3 - 2;
+    int maxX3m3 = maxX3 - 3;
+
+    // EAST
+    if (sendDir == D3Q27System::DIR_P00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                exchangeData(maxX1m3, x2, x3, minX1, x2, x3);
+                exchangeData(maxX1m2, x2, x3, minX1p1, x2, x3);
+            }
+        }
+    }
+    // WEST
+    else if (sendDir == D3Q27System::DIR_M00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                exchangeData(minX1p3, x2, x3, maxX1, x2, x3);
+                exchangeData(minX1p2, x2, x3, maxX1m1, x2, x3);
+            }
+        }
+    }
+    // NORTH
+    else if (sendDir == D3Q27System::DIR_0P0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                exchangeData(x1, maxX2m3, x3, x1, minX2, x3);
+                exchangeData(x1, maxX2m2, x3, x1, minX2p1, x3);
+            }
+        }
+    }
+    // SOUTH
+    else if (sendDir == D3Q27System::DIR_0M0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                exchangeData(x1, minX2p3, x3, x1, maxX2, x3);
+                exchangeData(x1, minX2p2, x3, x1, maxX2m1, x3);
+            }
+        }
+    }
+
+    // TOP
+    else if (sendDir == D3Q27System::DIR_00P) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                exchangeData(x1, x2, maxX3m3, x1, x2, minX3);
+                exchangeData(x1, x2, maxX3m2, x1, x2, minX3p1);
+            }
+        }
+    }
+    // BOTTOM
+    else if (sendDir == D3Q27System::DIR_00M) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                exchangeData(x1, x2, minX3p3, x1, x2, maxX3);
+                exchangeData(x1, x2, minX3p2, x1, x2, maxX3m1);
+            }
+        }
+    }
+    // NORTHEAST
+    else if (sendDir == D3Q27System::DIR_PP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            exchangeData(maxX1m3, maxX2m3, x3, minX1, minX2, x3);
+            exchangeData(maxX1m2, maxX2m2, x3, minX1p1, minX2p1, x3);
+            exchangeData(maxX1m3, maxX2m2, x3, minX1, minX2p1, x3);
+            exchangeData(maxX1m2, maxX2m3, x3, minX1p1, minX2, x3);
+        }
+    }
+    // NORTHWEST
+    else if (sendDir == D3Q27System::DIR_MP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            exchangeData(minX1p3, maxX2m3, x3, maxX1, minX2, x3);
+            exchangeData(minX1p2, maxX2m2, x3, maxX1m1, minX2p1, x3);
+            exchangeData(minX1p3, maxX2m2, x3, maxX1, minX2p1, x3);
+            exchangeData(minX1p2, maxX2m3, x3, maxX1m1, minX2, x3);
+        }
+    }
+    // SOUTHWEST
+    else if (sendDir == D3Q27System::DIR_MM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            exchangeData(minX1p3, minX2p3, x3, maxX1, maxX2, x3);
+            exchangeData(minX1p2, minX2p2, x3, maxX1m1, maxX2m1, x3);
+            exchangeData(minX1p3, minX2p2, x3, maxX1, maxX2m1, x3);
+            exchangeData(minX1p2, minX2p3, x3, maxX1m1, maxX2, x3);
+        }
+    }
+    // SOUTHEAST
+    else if (sendDir == D3Q27System::DIR_PM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            exchangeData(maxX1m3, minX2p3, x3, minX1, maxX2, x3);
+            exchangeData(maxX1m2, minX2p2, x3, minX1p1, maxX2m1, x3);
+            exchangeData(maxX1m3, minX2p2, x3, minX1, maxX2m1, x3);
+            exchangeData(maxX1m2, minX2p3, x3, minX1p1, maxX2, x3);
+        }
+    } else if (sendDir == D3Q27System::DIR_P0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            exchangeData(maxX1m3, x2, maxX3m3, minX1, x2, minX3);
+            exchangeData(maxX1m2, x2, maxX3m2, minX1p1, x2, minX3p1);
+            exchangeData(maxX1m3, x2, maxX3m2, minX1, x2, minX3p1);
+            exchangeData(maxX1m2, x2, maxX3m3, minX1p1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            exchangeData(minX1p3, x2, minX3p3, maxX1, x2, maxX3);
+            exchangeData(minX1p2, x2, minX3p2, maxX1m1, x2, maxX3m1);
+            exchangeData(minX1p3, x2, minX3p2, maxX1, x2, maxX3m1);
+            exchangeData(minX1p2, x2, minX3p3, maxX1m1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_P0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            exchangeData(maxX1m3, x2, minX3p3, minX1, x2, maxX3);
+            exchangeData(maxX1m2, x2, minX3p2, minX1p1, x2, maxX3m1);
+            exchangeData(maxX1m3, x2, minX3p2, minX1, x2, maxX3m1);
+            exchangeData(maxX1m2, x2, minX3p3, minX1p1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            exchangeData(minX1p3, x2, maxX3m3, maxX1, x2, minX3);
+            exchangeData(minX1p2, x2, maxX3m2, maxX1m1, x2, minX3p1);
+            exchangeData(minX1p3, x2, maxX3m2, maxX1, x2, minX3p1);
+            exchangeData(minX1p2, x2, maxX3m3, maxX1m1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            exchangeData(x1, maxX2m3, maxX3m3, x1, minX2, minX3);
+            exchangeData(x1, maxX2m2, maxX3m2, x1, minX2p1, minX3p1);
+            exchangeData(x1, maxX2m3, maxX3m2, x1, minX2, minX3p1);
+            exchangeData(x1, maxX2m2, maxX3m3, x1, minX2p1, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            exchangeData(x1, minX2p3, minX3p3, x1, maxX2, maxX3);
+            exchangeData(x1, minX2p2, minX3p2, x1, maxX2m1, maxX3m1);
+            exchangeData(x1, minX2p3, minX3p2, x1, maxX2, maxX3m1);
+            exchangeData(x1, minX2p2, minX3p3, x1, maxX2m1, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            exchangeData(x1, maxX2m3, minX3p3, x1, minX2, maxX3);
+            exchangeData(x1, maxX2m2, minX3p2, x1, minX2p1, maxX3m1);
+            exchangeData(x1, maxX2m3, minX3p2, x1, minX2, maxX3m1);
+            exchangeData(x1, maxX2m2, minX3p3, x1, minX2p1, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            exchangeData(x1, minX2p3, maxX3m3, x1, maxX2, minX3);
+            exchangeData(x1, minX2p2, maxX3m2, x1, maxX2m1, minX3p1);
+            exchangeData(x1, minX2p3, maxX3m2, x1, maxX2, minX3p1);
+            exchangeData(x1, minX2p2, maxX3m3, x1, maxX2m1, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_MMP) {
+        exchangeData(minX1p3, minX2p3, maxX3m3, maxX1, maxX2, minX3);
+        exchangeData(minX1p2, minX2p2, maxX3m2, maxX1m1, maxX2m1, minX3p1);
+        exchangeData(minX1p3, minX2p2, maxX3m2, maxX1, maxX2m1, minX3p1);
+        exchangeData(minX1p2, minX2p3, maxX3m2, maxX1m1, maxX2, minX3p1);
+        exchangeData(minX1p2, minX2p2, maxX3m3, maxX1m1, maxX2m1, minX3);
+        exchangeData(minX1p3, minX2p3, maxX3m2, maxX1, maxX2, minX3p1);
+        exchangeData(minX1p3, minX2p2, maxX3m3, maxX1, maxX2m1, minX3);
+        exchangeData(minX1p2, minX2p3, maxX3m3, maxX1m1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_PMP) {
+        exchangeData(maxX1m3, minX1p3, maxX3m3, minX1, maxX2, minX3);
+        exchangeData(maxX1m2, minX1p2, maxX3m2, minX1p1, maxX2m1, minX3p1);
+        exchangeData(maxX1m3, minX1p2, maxX3m2, minX1, maxX2m1, minX3p1);
+        exchangeData(maxX1m2, minX1p3, maxX3m2, minX1p1, maxX2, minX3p1);
+        exchangeData(maxX1m2, minX1p2, maxX3m3, minX1p1, maxX2m1, minX3);
+        exchangeData(maxX1m3, minX1p3, maxX3m2, minX1, maxX2, minX3p1);
+        exchangeData(maxX1m3, minX1p2, maxX3m3, minX1, maxX2m1, minX3);
+        exchangeData(maxX1m2, minX1p3, maxX3m3, minX1p1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_MPP) {
+        exchangeData(minX1p3, maxX2m3, maxX3m3, maxX1, minX2, minX3);
+        exchangeData(minX1p2, maxX2m2, maxX3m2, maxX1m1, minX2p1, minX3p1);
+        exchangeData(minX1p3, maxX2m2, maxX3m2, maxX1, minX2p1, minX3p1);
+        exchangeData(minX1p2, maxX2m3, maxX3m2, maxX1m1, minX2, minX3p1);
+        exchangeData(minX1p2, maxX2m2, maxX3m3, maxX1m1, minX2p1, minX3);
+        exchangeData(minX1p3, maxX2m3, maxX3m2, maxX1, minX2, minX3p1);
+        exchangeData(minX1p3, maxX2m2, maxX3m3, maxX1, minX2p1, minX3);
+        exchangeData(minX1p2, maxX2m3, maxX3m3, maxX1m1, minX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_PPP) {
+        exchangeData(maxX1m3, maxX2m3, maxX3m3, minX1, minX2, minX3);
+        exchangeData(maxX1m2, maxX2m2, maxX3m2, minX1p1, minX2p1, minX3p1);
+        exchangeData(maxX1m3, maxX2m2, maxX3m2, minX1, minX2p1, minX3p1);
+        exchangeData(maxX1m2, maxX2m3, maxX3m2, minX1p1, minX2, minX3p1);
+        exchangeData(maxX1m2, maxX2m2, maxX3m3, minX1p1, minX2p1, minX3);
+        exchangeData(maxX1m3, maxX2m3, maxX3m2, minX1, minX2, minX3p1);
+        exchangeData(maxX1m3, maxX2m2, maxX3m3, minX1, minX2p1, minX3);
+        exchangeData(maxX1m2, maxX2m3, maxX3m3, minX1p1, minX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_MMM) {
+        exchangeData(minX1p3, minX2p3, minX3p3, maxX1, maxX2, maxX3);
+        exchangeData(minX1p2, minX2p2, minX3p2, maxX1m1, maxX2m1, maxX3m1);
+        exchangeData(minX1p3, minX2p2, minX3p2, maxX1, maxX2m1, maxX3m1);
+        exchangeData(minX1p2, minX2p3, minX3p2, maxX1m1, maxX2, maxX3m1);
+        exchangeData(minX1p2, minX2p2, minX3p3, maxX1m1, maxX2m1, maxX3);
+        exchangeData(minX1p3, minX2p3, minX3p2, maxX1, maxX2, maxX3m1);
+        exchangeData(minX1p3, minX2p2, minX3p3, maxX1, maxX2m1, maxX3);
+        exchangeData(minX1p2, minX2p3, minX3p3, maxX1m1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_PMM) {
+        exchangeData(maxX1m3, minX2p3, minX3p3, minX1, maxX2, maxX3);
+        exchangeData(maxX1m2, minX2p2, minX3p2, minX1p1, maxX2m1, maxX3m1);
+        exchangeData(maxX1m3, minX2p2, minX3p2, minX1, maxX2m1, maxX3m1);
+        exchangeData(maxX1m2, minX2p3, minX3p2, minX1p1, maxX2, maxX3m1);
+        exchangeData(maxX1m2, minX2p2, minX3p3, minX1p1, maxX2m1, maxX3);
+        exchangeData(maxX1m3, minX2p3, minX3p2, minX1, maxX2, maxX3m1);
+        exchangeData(maxX1m3, minX2p2, minX3p3, minX1, maxX2m1, maxX3);
+        exchangeData(maxX1m2, minX2p3, minX3p3, minX1p1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_MPM) {
+        exchangeData(minX1p3, maxX2m3, minX3p3, maxX1, minX2, maxX3);
+        exchangeData(minX1p2, maxX2m2, minX3p2, maxX1m1, minX2p1, maxX3m1);
+        exchangeData(minX1p3, maxX2m2, minX3p2, maxX1, minX2p1, maxX3m1);
+        exchangeData(minX1p2, maxX2m3, minX3p2, maxX1m1, minX2, maxX3m1);
+        exchangeData(minX1p2, maxX2m2, minX3p3, maxX1m1, minX2p1, maxX3);
+        exchangeData(minX1p3, maxX2m3, minX3p2, maxX1, minX2, maxX3m1);
+        exchangeData(minX1p3, maxX2m2, minX3p3, maxX1, minX2p1, maxX3);
+        exchangeData(minX1p2, maxX2m3, minX3p3, maxX1m1, minX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_PPM) {
+        exchangeData(maxX1m3, maxX2m3, minX3p3, minX1, minX2, maxX3);
+        exchangeData(maxX1m2, maxX2m2, minX3p2, minX1p1, minX2p1, maxX3m1);
+        exchangeData(maxX1m3, maxX2m2, minX3p2, minX1, minX2p1, maxX3m1);
+        exchangeData(maxX1m2, maxX2m3, minX3p2, minX1p1, minX2, maxX3m1);
+        exchangeData(maxX1m2, maxX2m2, minX3p3, minX1p1, minX2p1, maxX3);
+        exchangeData(maxX1m3, maxX2m3, minX3p2, minX1, minX2, maxX3m1);
+        exchangeData(maxX1m3, maxX2m2, minX3p3, minX1, minX2p1, maxX3);
+        exchangeData(maxX1m2, maxX2m3, minX3p3, minX1p1, minX2, maxX3);
+    } else
+        UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+
+}
diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.h
new file mode 100644
index 0000000000000000000000000000000000000000..bc431f9f3bbb16587df76355c395fff780137b22
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.h
@@ -0,0 +1,167 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 TwoDistributionsDoubleGhostLayerFullDirectConnector.h
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef TwoDistributionsDoubleGhostLayerFullDirectConnector_H
+#define TwoDistributionsDoubleGhostLayerFullDirectConnector_H
+
+#include "FullDirectConnector.h"
+#include "Block3D.h"
+#include "D3Q27System.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "basics/container/CbArray3D.h"
+#include "basics/container/CbArray4D.h"
+#include "DataSet3D.h"
+
+//! \brief   Exchange data between blocks. 
+//! \details Connector send and receive full distributions between two blocks in shared memory.
+
+class TwoDistributionsDoubleGhostLayerFullDirectConnector : public FullDirectConnector
+{
+public:
+	TwoDistributionsDoubleGhostLayerFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir);
+    void init() override;
+    void sendVectors() override;
+
+protected:
+    inline void updatePointers() override;
+    void exchangeData() override;
+    inline void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) override;
+
+private:
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromf;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromf;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsFromf;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsTof;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsTof;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsTof;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromh;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromh;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsFromh;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsToh;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsToh;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsToh;
+
+	SPtr<EsoTwist3D> fFrom, hFrom;
+    SPtr<EsoTwist3D> fTo, hTo;
+
+    SPtr<PressureFieldArray3D> pressureFrom, pressureTo;
+};
+//////////////////////////////////////////////////////////////////////////
+inline void TwoDistributionsDoubleGhostLayerFullDirectConnector::updatePointers()
+{
+    localDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getLocalDistributions();
+    nonLocalDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getNonLocalDistributions();
+    zeroDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getZeroDistributions();
+
+    localDistributionsTof    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getLocalDistributions();
+    nonLocalDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getNonLocalDistributions();
+    zeroDistributionsTof     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getZeroDistributions();
+
+    localDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getLocalDistributions();
+    nonLocalDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getNonLocalDistributions();
+    zeroDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getZeroDistributions();
+
+    localDistributionsToh    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getLocalDistributions();
+    nonLocalDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getNonLocalDistributions();
+    zeroDistributionsToh     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getZeroDistributions();
+}
+//////////////////////////////////////////////////////////////////////////
+inline void TwoDistributionsDoubleGhostLayerFullDirectConnector::exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To)
+{
+	(*this->localDistributionsTof)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_E, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_N, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_T, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NE, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TE, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TN, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TS, x1From, x2From + 1, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNE, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From);
+
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_W, x1From + 1, x2From, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_S, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_B, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SE, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BE, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BN, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1);
+
+	(*this->zeroDistributionsTof)(x1To, x2To, x3To) = (*this->zeroDistributionsFromf)(x1From, x2From, x3From);
+
+
+	(*this->localDistributionsToh)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_E, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_N, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_T, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NE, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TE, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TN, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TS, x1From, x2From + 1, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNE, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From);
+
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_W, x1From + 1, x2From, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_S, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_B, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SE, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BE, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BN, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1);
+
+	(*this->zeroDistributionsToh)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh)(x1From, x2From, x3From);
+
+    (*this->pressureTo)(x1To, x2To, x3To) = (*this->pressureFrom)(x1From, x2From, x3From);
+}
+#endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9dc8a99deb20f8f49f40f7d2e7c8a0c66b687fcb
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.cpp
@@ -0,0 +1,615 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 TwoDistributionsDoubleGhostLayerFullVectorConnector.cpp
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#include "TwoDistributionsDoubleGhostLayerFullVectorConnector.h"
+#include "Block3D.h"
+#include "LBMKernel.h"
+#include "EsoTwist3D.h"
+#include "DataSet3D.h"
+
+//////////////////////////////////////////////////////////////////////////
+TwoDistributionsDoubleGhostLayerFullVectorConnector::TwoDistributionsDoubleGhostLayerFullVectorConnector(SPtr<Block3D> block,
+                                                                         VectorTransmitterPtr sender,
+                                                                         VectorTransmitterPtr receiver, int sendDir)
+    : FullVectorConnector(block, sender, receiver, sendDir)
+{
+   if (!block || !sender || !receiver)
+      UB_THROW(UbException(UB_EXARGS, "sender or receiver == NULL!!"));
+
+}
+//////////////////////////////////////////////////////////////////////////
+void TwoDistributionsDoubleGhostLayerFullVectorConnector::init()
+{
+   FullVectorConnector::init();
+
+   fDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getFdistributions());
+   hDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getHdistributions());
+   pressure   = block.lock()->getKernel()->getDataSet()->getPressureField();
+
+   int anz = 2*27+1;
+   switch (sendDir)
+   {
+   case D3Q27System::DIR_000: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break;
+   case D3Q27System::DIR_P00:
+   case D3Q27System::DIR_M00: sender->getData().resize(maxX2*maxX3*anz*2, 0.0);   break;
+   case D3Q27System::DIR_0P0:
+   case D3Q27System::DIR_0M0: sender->getData().resize(maxX1*maxX3*anz*2, 0.0);   break;
+   case D3Q27System::DIR_00P:
+   case D3Q27System::DIR_00M: sender->getData().resize(maxX1*maxX2*anz*2, 0.0);   break;
+
+   case D3Q27System::DIR_PP0:
+   case D3Q27System::DIR_MM0:
+   case D3Q27System::DIR_PM0:
+   case D3Q27System::DIR_MP0:  sender->getData().resize(maxX3*anz*4, 0.0);   break;
+
+   case D3Q27System::DIR_P0P:
+   case D3Q27System::DIR_M0M:
+   case D3Q27System::DIR_P0M:
+   case D3Q27System::DIR_M0P:  sender->getData().resize(maxX2*anz*4, 0.0);   break;
+
+   case D3Q27System::DIR_0PP:
+   case D3Q27System::DIR_0MM:
+   case D3Q27System::DIR_0PM:
+   case D3Q27System::DIR_0MP:  sender->getData().resize(maxX1*anz*4, 0.0);   break;
+
+   case D3Q27System::DIR_PPP:
+   case D3Q27System::DIR_MMM:
+   case D3Q27System::DIR_PPM:
+   case D3Q27System::DIR_MMP:
+   case D3Q27System::DIR_PMP:
+   case D3Q27System::DIR_MPM:
+   case D3Q27System::DIR_PMM:
+   case D3Q27System::DIR_MPP:  sender->getData().resize(anz*8, 0.0);   break;
+
+   default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir"));
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+void TwoDistributionsDoubleGhostLayerFullVectorConnector::fillSendVectors() 
+{ 
+    updatePointers();
+    fillData();
+}
+////////////////////////////////////////////////////////////////////////
+void TwoDistributionsDoubleGhostLayerFullVectorConnector::fillData()
+{
+    ////////////////////////////////////////////////////////////
+    // relation between ghost layer and regular nodes
+    // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes
+    // minX1   minX1p1 ... maxX1m1 maxX1   - ghost layer
+    ////////////////////////////////////////////////////////////
+
+    int minX1   = 0;
+    //int minX1p1 = minX1 + 1;
+    int minX1p2 = minX1 + 2;
+    int minX1p3 = minX1 + 3;
+    //int maxX1m1 = maxX1 - 1;
+    int maxX1m2 = maxX1 - 2;
+    int maxX1m3 = maxX1 - 3;
+
+    int minX2   = 0;
+    //int minX2p1 = minX2 + 1;
+    int minX2p2 = minX2 + 2;
+    int minX2p3 = minX2 + 3;
+    //int maxX2m1 = maxX2 - 1;
+    int maxX2m2 = maxX2 - 2;
+    int maxX2m3 = maxX2 - 3;
+
+    int minX3   = 0;
+    //int minX3p1 = minX3 + 1;
+    int minX3p2 = minX3 + 2;
+    int minX3p3 = minX3 + 3;
+    //int maxX3m1 = maxX3 - 1;
+    int maxX3m2 = maxX3 - 2;
+    int maxX3m3 = maxX3 - 3;
+
+    vector_type &sdata = sender->getData();
+
+    int index = 0;
+    // EAST
+    if (sendDir == D3Q27System::DIR_P00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                fillData(sdata, index, maxX1m3, x2, x3);
+                fillData(sdata, index, maxX1m2, x2, x3);
+            }
+        }
+    }
+    // WEST
+    else if (sendDir == D3Q27System::DIR_M00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                fillData(sdata, index, minX1p3, x2, x3);
+                fillData(sdata, index, minX1p2, x2, x3);
+            }
+        }
+    }
+    // NORTH
+    else if (sendDir == D3Q27System::DIR_0P0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, maxX2m3, x3);
+                fillData(sdata, index, x1, maxX2m2, x3);
+            }
+        }
+    }
+    // SOUTH
+    else if (sendDir == D3Q27System::DIR_0M0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, minX2p3, x3);
+                fillData(sdata, index, x1, minX2p2, x3);
+            }
+        }
+    }
+
+    // TOP
+    else if (sendDir == D3Q27System::DIR_00P) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, x2, maxX3m3);
+                fillData(sdata, index, x1, x2, maxX3m2);
+            }
+        }
+    }
+    // BOTTOM
+    else if (sendDir == D3Q27System::DIR_00M) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, x2, minX3p3);
+                fillData(sdata, index, x1, x2, minX3p2);
+            }
+        }
+    }
+    // NORTHEAST
+    else if (sendDir == D3Q27System::DIR_PP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, maxX1m3, maxX2m3, x3);
+            fillData(sdata, index, maxX1m2, maxX2m2, x3);
+            fillData(sdata, index, maxX1m3, maxX2m2, x3);
+            fillData(sdata, index, maxX1m2, maxX2m3, x3);
+        }
+    }
+    // NORTHWEST
+    else if (sendDir == D3Q27System::DIR_MP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, minX1p3, maxX2m3, x3);
+            fillData(sdata, index, minX1p2, maxX2m2, x3);
+            fillData(sdata, index, minX1p3, maxX2m2, x3);
+            fillData(sdata, index, minX1p2, maxX2m3, x3);
+        }
+    }
+    // SOUTHWEST
+    else if (sendDir == D3Q27System::DIR_MM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, minX1p3, minX2p3, x3);
+            fillData(sdata, index, minX1p2, minX2p2, x3);
+            fillData(sdata, index, minX1p3, minX2p2, x3);
+            fillData(sdata, index, minX1p2, minX2p3, x3);
+        }
+    }
+    // SOUTHEAST
+    else if (sendDir == D3Q27System::DIR_PM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, maxX1m3, minX2p3, x3);
+            fillData(sdata, index, maxX1m2, minX2p2, x3);
+            fillData(sdata, index, maxX1m3, minX2p2, x3);
+            fillData(sdata, index, maxX1m2, minX2p3, x3);
+        }
+    } else if (sendDir == D3Q27System::DIR_P0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, maxX1m3, x2, maxX3m3);
+            fillData(sdata, index, maxX1m2, x2, maxX3m2);
+            fillData(sdata, index, maxX1m3, x2, maxX3m2);
+            fillData(sdata, index, maxX1m2, x2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, minX1p3, x2, minX3p3);
+            fillData(sdata, index, minX1p2, x2, minX3p2);
+            fillData(sdata, index, minX1p3, x2, minX3p2);
+            fillData(sdata, index, minX1p2, x2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::DIR_P0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, maxX1m3, x2, minX3p3);
+            fillData(sdata, index, maxX1m2, x2, minX3p2);
+            fillData(sdata, index, maxX1m3, x2, minX3p2);
+            fillData(sdata, index, maxX1m2, x2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, minX1p3, x2, maxX3m3);
+            fillData(sdata, index, minX1p2, x2, maxX3m2);
+            fillData(sdata, index, minX1p3, x2, maxX3m2);
+            fillData(sdata, index, minX1p2, x2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, maxX2m3, maxX3m3);
+            fillData(sdata, index, x1, maxX2m2, maxX3m2);
+            fillData(sdata, index, x1, maxX2m3, maxX3m2);
+            fillData(sdata, index, x1, maxX2m2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, minX2p3, minX3p3);
+            fillData(sdata, index, x1, minX2p2, minX3p2);
+            fillData(sdata, index, x1, minX2p3, minX3p2);
+            fillData(sdata, index, x1, minX2p2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, maxX2m3, minX3p3);
+            fillData(sdata, index, x1, maxX2m2, minX3p2);
+            fillData(sdata, index, x1, maxX2m3, minX3p2);
+            fillData(sdata, index, x1, maxX2m2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, minX2p3, maxX3m3);
+            fillData(sdata, index, x1, minX2p2, maxX3m2);
+            fillData(sdata, index, x1, minX2p3, maxX3m2);
+            fillData(sdata, index, x1, minX2p2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::DIR_MMP) {
+        fillData(sdata, index, minX1p3, minX2p3, maxX3m3);
+        fillData(sdata, index, minX1p2, minX2p2, maxX3m2);
+        fillData(sdata, index, minX1p3, minX2p2, maxX3m2);
+        fillData(sdata, index, minX1p2, minX2p3, maxX3m2);
+        fillData(sdata, index, minX1p2, minX2p2, maxX3m3);
+        fillData(sdata, index, minX1p3, minX2p3, maxX3m2);
+        fillData(sdata, index, minX1p3, minX2p2, maxX3m3);
+        fillData(sdata, index, minX1p2, minX2p3, maxX3m3);
+    } else if (sendDir == D3Q27System::DIR_PMP) {
+        fillData(sdata, index, maxX1m3, minX1p3, maxX3m3);
+        fillData(sdata, index, maxX1m2, minX1p2, maxX3m2);
+        fillData(sdata, index, maxX1m3, minX1p2, maxX3m2);
+        fillData(sdata, index, maxX1m2, minX1p3, maxX3m2);
+        fillData(sdata, index, maxX1m2, minX1p2, maxX3m3);
+        fillData(sdata, index, maxX1m3, minX1p3, maxX3m2);
+        fillData(sdata, index, maxX1m3, minX1p2, maxX3m3);
+        fillData(sdata, index, maxX1m2, minX1p3, maxX3m3);
+    } else if (sendDir == D3Q27System::DIR_MPP) {
+        fillData(sdata, index, minX1p3, maxX2m3, maxX3m3);
+        fillData(sdata, index, minX1p2, maxX2m2, maxX3m2);
+        fillData(sdata, index, minX1p3, maxX2m2, maxX3m2);
+        fillData(sdata, index, minX1p2, maxX2m3, maxX3m2);
+        fillData(sdata, index, minX1p2, maxX2m2, maxX3m3);
+        fillData(sdata, index, minX1p3, maxX2m3, maxX3m2);
+        fillData(sdata, index, minX1p3, maxX2m2, maxX3m3);
+        fillData(sdata, index, minX1p2, maxX2m3, maxX3m3);
+    } else if (sendDir == D3Q27System::DIR_PPP) {
+        fillData(sdata, index, maxX1m3, maxX2m3, maxX3m3);
+        fillData(sdata, index, maxX1m2, maxX2m2, maxX3m2);
+        fillData(sdata, index, maxX1m3, maxX2m2, maxX3m2);
+        fillData(sdata, index, maxX1m2, maxX2m3, maxX3m2);
+        fillData(sdata, index, maxX1m2, maxX2m2, maxX3m3);
+        fillData(sdata, index, maxX1m3, maxX2m3, maxX3m2);
+        fillData(sdata, index, maxX1m3, maxX2m2, maxX3m3);
+        fillData(sdata, index, maxX1m2, maxX2m3, maxX3m3);
+    } else if (sendDir == D3Q27System::DIR_MMM) {
+        fillData(sdata, index, minX1p3, minX2p3, minX3p3);
+        fillData(sdata, index, minX1p2, minX2p2, minX3p2);
+        fillData(sdata, index, minX1p3, minX2p2, minX3p2);
+        fillData(sdata, index, minX1p2, minX2p3, minX3p2);
+        fillData(sdata, index, minX1p2, minX2p2, minX3p3);
+        fillData(sdata, index, minX1p3, minX2p3, minX3p2);
+        fillData(sdata, index, minX1p3, minX2p2, minX3p3);
+        fillData(sdata, index, minX1p2, minX2p3, minX3p3);
+    } else if (sendDir == D3Q27System::DIR_PMM) {
+        fillData(sdata, index, maxX1m3, minX2p3, minX3p3);
+        fillData(sdata, index, maxX1m2, minX2p2, minX3p2);
+        fillData(sdata, index, maxX1m3, minX2p2, minX3p2);
+        fillData(sdata, index, maxX1m2, minX2p3, minX3p2);
+        fillData(sdata, index, maxX1m2, minX2p2, minX3p3);
+        fillData(sdata, index, maxX1m3, minX2p3, minX3p2);
+        fillData(sdata, index, maxX1m3, minX2p2, minX3p3);
+        fillData(sdata, index, maxX1m2, minX2p3, minX3p3);
+    } else if (sendDir == D3Q27System::DIR_MPM) {
+        fillData(sdata, index, minX1p3, maxX2m3, minX3p3);
+        fillData(sdata, index, minX1p2, maxX2m2, minX3p2);
+        fillData(sdata, index, minX1p3, maxX2m2, minX3p2);
+        fillData(sdata, index, minX1p2, maxX2m3, minX3p2);
+        fillData(sdata, index, minX1p2, maxX2m2, minX3p3);
+        fillData(sdata, index, minX1p3, maxX2m3, minX3p2);
+        fillData(sdata, index, minX1p3, maxX2m2, minX3p3);
+        fillData(sdata, index, minX1p2, maxX2m3, minX3p3);
+    } else if (sendDir == D3Q27System::DIR_PPM) {
+        fillData(sdata, index, maxX1m3, maxX2m3, minX3p3);
+        fillData(sdata, index, maxX1m2, maxX2m2, minX3p2);
+        fillData(sdata, index, maxX1m3, maxX2m2, minX3p2);
+        fillData(sdata, index, maxX1m2, maxX2m3, minX3p2);
+        fillData(sdata, index, maxX1m2, maxX2m2, minX3p3);
+        fillData(sdata, index, maxX1m3, maxX2m3, minX3p2);
+        fillData(sdata, index, maxX1m3, maxX2m2, minX3p3);
+        fillData(sdata, index, maxX1m2, maxX2m3, minX3p3);
+    } else
+        UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+}
+////////////////////////////////////////////////////////////////////////
+void TwoDistributionsDoubleGhostLayerFullVectorConnector::distributeReceiveVectors() 
+{
+    updatePointers();
+    distributeData();
+}
+////////////////////////////////////////////////////////////////////////
+void TwoDistributionsDoubleGhostLayerFullVectorConnector::distributeData()
+{
+    vector_type &rdata = receiver->getData();
+
+    int index = 0;
+    ////////////////////////////////////////////////////////////
+    // relation between ghost layer and regular nodes
+    // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes
+    // minX1   minX1p1 ... maxX1m1 maxX1   - ghost layer
+    ////////////////////////////////////////////////////////////
+
+    int minX1   = 0;
+    int minX1p1 = minX1 + 1;
+    int minX1p2 = minX1 + 2;
+    //int minX1p3 = minX1 + 3;
+    int maxX1m1 = maxX1 - 1;
+    int maxX1m2 = maxX1 - 2;
+    //int maxX1m3 = maxX1 - 3;
+
+    int minX2   = 0;
+    int minX2p1 = minX2 + 1;
+    int minX2p2 = minX2 + 2;
+    //int minX2p3 = minX2 + 3;
+    int maxX2m1 = maxX2 - 1;
+    int maxX2m2 = maxX2 - 2;
+    //int maxX2m3 = maxX2 - 3;
+
+    int minX3   = 0;
+    int minX3p1 = minX3 + 1;
+    int minX3p2 = minX3 + 2;
+    //int minX3p3 = minX3 + 3;
+    int maxX3m1 = maxX3 - 1;
+    int maxX3m2 = maxX3 - 2;
+    //int maxX3m3 = maxX3 - 3;
+
+    if (sendDir == D3Q27System::DIR_M00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                distributeData(rdata, index, minX1, x2, x3);
+                distributeData(rdata, index, minX1p1, x2, x3);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_P00) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                distributeData(rdata, index, maxX1, x2, x3);
+                distributeData(rdata, index, maxX1m1, x2, x3);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_0M0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, minX2, x3);
+                distributeData(rdata, index, x1, minX2p1, x3);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_0P0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, maxX2, x3);
+                distributeData(rdata, index, x1, maxX2m1, x3);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_00M) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, x2, minX3);
+                distributeData(rdata, index, x1, x2, minX3p1);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_00P) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, x2, maxX3);
+                distributeData(rdata, index, x1, x2, maxX3m1);
+            }
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_MM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, minX1, minX2, x3);
+            distributeData(rdata, index, minX1p1, minX2p1, x3);
+            distributeData(rdata, index, minX1, minX2p1, x3);
+            distributeData(rdata, index, minX1p1, minX2, x3);
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_PM0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, maxX1, minX2, x3);
+            distributeData(rdata, index, maxX1m1, minX2p1, x3);
+            distributeData(rdata, index, maxX1, minX2p1, x3);
+            distributeData(rdata, index, maxX1m1, minX2, x3);
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_PP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, maxX1, maxX2, x3);
+            distributeData(rdata, index, maxX1m1, maxX2m1, x3);
+            distributeData(rdata, index, maxX1, maxX2m1, x3);
+            distributeData(rdata, index, maxX1m1, maxX2, x3);
+        }
+    }
+    else if (sendDir == D3Q27System::DIR_MP0) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, minX1, maxX2, x3);
+            distributeData(rdata, index, minX1p1, maxX2m1, x3);
+            distributeData(rdata, index, minX1, maxX2m1, x3);
+            distributeData(rdata, index, minX1p1, maxX2, x3);
+        }
+    } else if (sendDir == D3Q27System::DIR_M0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, minX1, x2, minX3);
+            distributeData(rdata, index, minX1p1, x2, minX3p1);
+            distributeData(rdata, index, minX1, x2, minX3p1);
+            distributeData(rdata, index, minX1p1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_P0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, maxX1, x2, maxX3);
+            distributeData(rdata, index, maxX1m1, x2, maxX3m1);
+            distributeData(rdata, index, maxX1, x2, maxX3m1);
+            distributeData(rdata, index, maxX1m1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_M0P)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, minX1, x2, maxX3);
+            distributeData(rdata, index, minX1p1, x2, maxX3m1);
+            distributeData(rdata, index, minX1, x2, maxX3m1);
+            distributeData(rdata, index, minX1p1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_P0M)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, maxX1, x2, minX3);
+            distributeData(rdata, index, maxX1m1, x2, minX3p1);
+            distributeData(rdata, index, maxX1, x2, minX3p1);
+            distributeData(rdata, index, maxX1m1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, minX2, minX3);
+            distributeData(rdata, index, x1, minX2p1, minX3p1);
+            distributeData(rdata, index, x1, minX2, minX3p1);
+            distributeData(rdata, index, x1, minX2p1, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, maxX2, maxX3);
+            distributeData(rdata, index, x1, maxX2m1, maxX3m1);
+            distributeData(rdata, index, x1, maxX2, maxX3m1);
+            distributeData(rdata, index, x1, maxX2m1, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0MP)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, minX2, maxX3);
+            distributeData(rdata, index, x1, minX2p1, maxX3m1);
+            distributeData(rdata, index, x1, minX2, maxX3m1);
+            distributeData(rdata, index, x1, minX2p1, maxX3);
+        }
+    else if (sendDir == D3Q27System::DIR_0PM)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, maxX2, minX3);
+            distributeData(rdata, index, x1, maxX2m1, minX3p1);
+            distributeData(rdata, index, x1, maxX2, minX3p1);
+            distributeData(rdata, index, x1, maxX2m1, minX3);
+        }
+    else if (sendDir == D3Q27System::DIR_PPM) {
+        distributeData(rdata, index, maxX1, maxX2, minX3);
+        distributeData(rdata, index, maxX1m1, maxX2m1, minX3p1);
+        distributeData(rdata, index, maxX1, maxX2m1, minX3p1);
+        distributeData(rdata, index, maxX1m1, maxX2, minX3p1);
+        distributeData(rdata, index, maxX1m1, maxX2m1, minX3);
+        distributeData(rdata, index, maxX1, maxX2, minX3p1);
+        distributeData(rdata, index, maxX1, maxX2m1, minX3);
+        distributeData(rdata, index, maxX1m1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_MPM) {
+        distributeData(rdata, index, minX1, maxX2, minX3);
+        distributeData(rdata, index, minX1p1, maxX2m1, minX3p1);
+        distributeData(rdata, index, minX1, maxX2m1, minX3p1);
+        distributeData(rdata, index, minX1p1, maxX2, minX3p1);
+        distributeData(rdata, index, minX1p1, maxX2m1, minX3);
+        distributeData(rdata, index, minX1, maxX2, minX3p1);
+        distributeData(rdata, index, minX1, maxX2m1, minX3);
+        distributeData(rdata, index, minX1p1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_PMM) {
+        distributeData(rdata, index, maxX1, minX2, minX3);
+        distributeData(rdata, index, maxX1m1, minX2p1, minX3p1);
+        distributeData(rdata, index, maxX1, minX2p1, minX3p1);
+        distributeData(rdata, index, maxX1m1, minX2, minX3p1);
+        distributeData(rdata, index, maxX1m1, minX2p1, minX3);
+        distributeData(rdata, index, maxX1, minX2, minX3p1);
+        distributeData(rdata, index, maxX1, minX2p1, minX3);
+        distributeData(rdata, index, maxX1m1, minX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_MMM) {
+        distributeData(rdata, index, minX1, minX2, minX3);
+        distributeData(rdata, index, minX1p1, minX2p1, minX3p1);
+        distributeData(rdata, index, minX1, minX2p1, minX3p1);
+        distributeData(rdata, index, minX1p1, minX2, minX3p1);
+        distributeData(rdata, index, minX1p1, minX2p1, minX3);
+        distributeData(rdata, index, minX1, minX2, minX3p1);
+        distributeData(rdata, index, minX1, minX2p1, minX3);
+        distributeData(rdata, index, minX1p1, minX2, minX3);
+    } else if (sendDir == D3Q27System::DIR_PPP) {
+        distributeData(rdata, index, maxX1, maxX2, maxX3);
+        distributeData(rdata, index, maxX1m1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, maxX1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, maxX1m1, maxX2, maxX3m1);
+        distributeData(rdata, index, maxX1m1, maxX2m1, maxX3);
+        distributeData(rdata, index, maxX1, maxX2, maxX3m1);
+        distributeData(rdata, index, maxX1, maxX2m1, maxX3);
+        distributeData(rdata, index, maxX1m1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_MPP) {
+        distributeData(rdata, index, minX1, maxX2, maxX3);
+        distributeData(rdata, index, minX1p1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, minX1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, minX1p1, maxX2, maxX3m1);
+        distributeData(rdata, index, minX1p1, maxX2m1, maxX3);
+        distributeData(rdata, index, minX1, maxX2, maxX3m1);
+        distributeData(rdata, index, minX1, maxX2m1, maxX3);
+        distributeData(rdata, index, minX1p1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_PMP) {
+        distributeData(rdata, index, maxX1, minX2, maxX3);
+        distributeData(rdata, index, maxX1m1, minX2p1, maxX3m1);
+        distributeData(rdata, index, maxX1, minX2p1, maxX3m1);
+        distributeData(rdata, index, maxX1m1, minX2, maxX3m1);
+        distributeData(rdata, index, maxX1m1, minX2p1, maxX3);
+        distributeData(rdata, index, maxX1, minX2, maxX3m1);
+        distributeData(rdata, index, maxX1, minX2p1, maxX3);
+        distributeData(rdata, index, maxX1m1, minX2, maxX3);
+    } else if (sendDir == D3Q27System::DIR_MMP) {
+        distributeData(rdata, index, minX1, minX2, maxX3);
+        distributeData(rdata, index, minX1p1, minX2p1, maxX3m1);
+        distributeData(rdata, index, minX1, minX2p1, maxX3m1);
+        distributeData(rdata, index, minX1p1, minX2, maxX3m1);
+        distributeData(rdata, index, minX1p1, minX2p1, maxX3);
+        distributeData(rdata, index, minX1, minX2, maxX3m1);
+        distributeData(rdata, index, minX1, minX2p1, maxX3);
+        distributeData(rdata, index, minX1p1, minX2, maxX3);
+    } else
+        UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+
+}
+//////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.h
new file mode 100644
index 0000000000000000000000000000000000000000..508c9e90a2bced8560dcda6098d0fb4aea8b4d9a
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.h
@@ -0,0 +1,232 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 TwoDistributionsDoubleGhostLayerFullVectorConnector.h
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef TwoDistributionsDoubleGhostLayerFullVectorConnector_H
+#define TwoDistributionsDoubleGhostLayerFullVectorConnector_H
+
+#include <vector>
+
+#include "FullVectorConnector.h"
+#include "D3Q27System.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "basics/container/CbArray3D.h"
+#include "basics/container/CbArray4D.h"
+#include "DataSet3D.h"
+
+class EsoTwist3D;
+class Block3D;
+
+//daten werden in einen vector (dieser befindet sich im transmitter) kopiert
+//der vector wird via transmitter uebertragen
+//transmitter kann ein lokal, MPI, RCG, CTL oder was auch immer fuer ein
+//transmitter sein, der von Transmitter abgeleitet ist ;-)
+class TwoDistributionsDoubleGhostLayerFullVectorConnector : public FullVectorConnector
+{
+public:
+   TwoDistributionsDoubleGhostLayerFullVectorConnector(SPtr<Block3D> block, VectorTransmitterPtr sender, VectorTransmitterPtr receiver, int sendDir);
+
+   void init() override;
+
+   void fillSendVectors() override;
+   void distributeReceiveVectors() override;
+
+protected:
+   inline void updatePointers() override;
+   void fillData() override;
+   void distributeData() override;
+   inline void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) override;
+   inline void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) override;
+
+private:
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions;
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions;
+   CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributions;
+
+   SPtr<EsoTwist3D>  fDis;
+
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localHdistributions;
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalHdistributions;
+   CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroHdistributions;
+
+   SPtr<EsoTwist3D>  hDis;
+
+   SPtr<PressureFieldArray3D> pressure;
+
+};
+//////////////////////////////////////////////////////////////////////////
+inline void TwoDistributionsDoubleGhostLayerFullVectorConnector::updatePointers()
+{
+    localDistributions    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions();
+    nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions();
+    zeroDistributions     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions();
+
+    localHdistributions    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions();
+    nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions();
+    zeroHdistributions     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions();
+}
+//////////////////////////////////////////////////////////////////////////
+inline void TwoDistributionsDoubleGhostLayerFullVectorConnector::fillData(vector_type& sdata, int& index, int x1, int x2, int x3)
+{
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroDistributions)(x1, x2, x3);
+
+
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroHdistributions)(x1, x2, x3);
+
+   sdata[index++] = (*this->pressure)(x1, x2, x3);
+}
+//////////////////////////////////////////////////////////////////////////
+inline void TwoDistributionsDoubleGhostLayerFullVectorConnector::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3)
+{
+   (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++];
+
+   (*this->zeroDistributions)(x1, x2, x3) = rdata[index++];
+
+   
+   (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++];
+
+   (*this->zeroHdistributions)(x1, x2, x3) = rdata[index++];
+
+   (*this->pressure)(x1, x2, x3) = rdata[index++];
+}
+
+
+#endif 
+
diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsFullVectorConnector.cpp
index 7fe8bc3643c337323ef25ee35c260597744e6191..bab931d93dd99cf89f4517159cef1d6efc000eff 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsFullVectorConnector.cpp
+++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsFullVectorConnector.cpp
@@ -58,37 +58,37 @@ void TwoDistributionsFullVectorConnector::init()
    int anz = 2*27;
    switch (sendDir)
    {
-   case D3Q27System::REST: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break;
-   case D3Q27System::E:
-   case D3Q27System::W: sender->getData().resize(maxX2*maxX3*anz, 0.0);   break;
-   case D3Q27System::N:
-   case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0);   break;
-   case D3Q27System::T:
-   case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 0.0);   break;
+   case D3Q27System::DIR_000: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break;
+   case D3Q27System::DIR_P00:
+   case D3Q27System::DIR_M00: sender->getData().resize(maxX2*maxX3*anz, 0.0);   break;
+   case D3Q27System::DIR_0P0:
+   case D3Q27System::DIR_0M0: sender->getData().resize(maxX1*maxX3*anz, 0.0);   break;
+   case D3Q27System::DIR_00P:
+   case D3Q27System::DIR_00M: sender->getData().resize(maxX1*maxX2*anz, 0.0);   break;
 
-   case D3Q27System::NE:
-   case D3Q27System::SW:
-   case D3Q27System::SE:
-   case D3Q27System::NW:  sender->getData().resize(maxX3*anz, 0.0);   break;
+   case D3Q27System::DIR_PP0:
+   case D3Q27System::DIR_MM0:
+   case D3Q27System::DIR_PM0:
+   case D3Q27System::DIR_MP0:  sender->getData().resize(maxX3*anz, 0.0);   break;
 
-   case D3Q27System::TE:
-   case D3Q27System::BW:
-   case D3Q27System::BE:
-   case D3Q27System::TW:  sender->getData().resize(maxX2*anz, 0.0);   break;
+   case D3Q27System::DIR_P0P:
+   case D3Q27System::DIR_M0M:
+   case D3Q27System::DIR_P0M:
+   case D3Q27System::DIR_M0P:  sender->getData().resize(maxX2*anz, 0.0);   break;
 
-   case D3Q27System::TN:
-   case D3Q27System::BS:
-   case D3Q27System::BN:
-   case D3Q27System::TS:  sender->getData().resize(maxX1*anz, 0.0);   break;
+   case D3Q27System::DIR_0PP:
+   case D3Q27System::DIR_0MM:
+   case D3Q27System::DIR_0PM:
+   case D3Q27System::DIR_0MP:  sender->getData().resize(maxX1*anz, 0.0);   break;
 
-   case D3Q27System::TNE:
-   case D3Q27System::BSW:
-   case D3Q27System::BNE:
-   case D3Q27System::TSW:
-   case D3Q27System::TSE:
-   case D3Q27System::BNW:
-   case D3Q27System::BSE:
-   case D3Q27System::TNW:  sender->getData().resize(anz, 0.0);   break;
+   case D3Q27System::DIR_PPP:
+   case D3Q27System::DIR_MMM:
+   case D3Q27System::DIR_PPM:
+   case D3Q27System::DIR_MMP:
+   case D3Q27System::DIR_PMP:
+   case D3Q27System::DIR_MPM:
+   case D3Q27System::DIR_PMM:
+   case D3Q27System::DIR_MPP:  sender->getData().resize(anz, 0.0);   break;
 
    default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir"));
    }
diff --git a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSoA.cpp b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSoA.cpp
index bd6d46c2bdaeb72244578b4e3f3625cd2dfe7ff1..0585947928e4fdc626659ed1a1d0e956fdd62de6 100644
--- a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSoA.cpp
+++ b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSoA.cpp
@@ -91,35 +91,35 @@ void D3Q27EsoTwist3DSoA::getDistribution(LBMReal *const f, size_t x1, size_t x2,
     size_t x2p = x2 + 1;
     size_t x3p = x3 + 1;
 
-    f[D3Q27System::E]   = (*d.E)(x1, x2, x3);
-    f[D3Q27System::N]   = (*d.N)(x1, x2, x3);
-    f[D3Q27System::T]   = (*d.T)(x1, x2, x3);
-    f[D3Q27System::NE]  = (*d.NE)(x1, x2, x3);
-    f[D3Q27System::NW]  = (*d.NW)(x1p, x2, x3);
-    f[D3Q27System::TE]  = (*d.TE)(x1, x2, x3);
-    f[D3Q27System::TW]  = (*d.TW)(x1p, x2, x3);
-    f[D3Q27System::TN]  = (*d.TN)(x1, x2, x3);
-    f[D3Q27System::TS]  = (*d.TS)(x1, x2p, x3);
-    f[D3Q27System::TNE] = (*d.TNE)(x1, x2, x3);
-    f[D3Q27System::TNW] = (*d.TNW)(x1p, x2, x3);
-    f[D3Q27System::TSE] = (*d.TSE)(x1, x2p, x3);
-    f[D3Q27System::TSW] = (*d.TSW)(x1p, x2p, x3);
+    f[D3Q27System::DIR_P00]   = (*d.E)(x1, x2, x3);
+    f[D3Q27System::DIR_0P0]   = (*d.N)(x1, x2, x3);
+    f[D3Q27System::DIR_00P]   = (*d.T)(x1, x2, x3);
+    f[D3Q27System::DIR_PP0]  = (*d.NE)(x1, x2, x3);
+    f[D3Q27System::DIR_MP0]  = (*d.NW)(x1p, x2, x3);
+    f[D3Q27System::DIR_P0P]  = (*d.TE)(x1, x2, x3);
+    f[D3Q27System::DIR_M0P]  = (*d.TW)(x1p, x2, x3);
+    f[D3Q27System::DIR_0PP]  = (*d.TN)(x1, x2, x3);
+    f[D3Q27System::DIR_0MP]  = (*d.TS)(x1, x2p, x3);
+    f[D3Q27System::DIR_PPP] = (*d.TNE)(x1, x2, x3);
+    f[D3Q27System::DIR_MPP] = (*d.TNW)(x1p, x2, x3);
+    f[D3Q27System::DIR_PMP] = (*d.TSE)(x1, x2p, x3);
+    f[D3Q27System::DIR_MMP] = (*d.TSW)(x1p, x2p, x3);
 
-    f[D3Q27System::W]   = (*d.W)(x1p, x2, x3);
-    f[D3Q27System::S]   = (*d.S)(x1, x2p, x3);
-    f[D3Q27System::B]   = (*d.B)(x1, x2, x3p);
-    f[D3Q27System::SW]  = (*d.SW)(x1p, x2p, x3);
-    f[D3Q27System::SE]  = (*d.SE)(x1, x2p, x3);
-    f[D3Q27System::BW]  = (*d.BW)(x1p, x2, x3p);
-    f[D3Q27System::BE]  = (*d.BE)(x1, x2, x3p);
-    f[D3Q27System::BS]  = (*d.BS)(x1, x2p, x3p);
-    f[D3Q27System::BN]  = (*d.BN)(x1, x2, x3p);
-    f[D3Q27System::BSW] = (*d.BSW)(x1p, x2p, x3p);
-    f[D3Q27System::BSE] = (*d.BSE)(x1, x2p, x3p);
-    f[D3Q27System::BNW] = (*d.BNW)(x1p, x2, x3p);
-    f[D3Q27System::BNE] = (*d.BNE)(x1, x2, x3p);
+    f[D3Q27System::DIR_M00]   = (*d.W)(x1p, x2, x3);
+    f[D3Q27System::DIR_0M0]   = (*d.S)(x1, x2p, x3);
+    f[D3Q27System::DIR_00M]   = (*d.B)(x1, x2, x3p);
+    f[D3Q27System::DIR_MM0]  = (*d.SW)(x1p, x2p, x3);
+    f[D3Q27System::DIR_PM0]  = (*d.SE)(x1, x2p, x3);
+    f[D3Q27System::DIR_M0M]  = (*d.BW)(x1p, x2, x3p);
+    f[D3Q27System::DIR_P0M]  = (*d.BE)(x1, x2, x3p);
+    f[D3Q27System::DIR_0MM]  = (*d.BS)(x1, x2p, x3p);
+    f[D3Q27System::DIR_0PM]  = (*d.BN)(x1, x2, x3p);
+    f[D3Q27System::DIR_MMM] = (*d.BSW)(x1p, x2p, x3p);
+    f[D3Q27System::DIR_PMM] = (*d.BSE)(x1, x2p, x3p);
+    f[D3Q27System::DIR_MPM] = (*d.BNW)(x1p, x2, x3p);
+    f[D3Q27System::DIR_PPM] = (*d.BNE)(x1, x2, x3p);
 
-    f[D3Q27System::REST] = (*d.REST)(x1, x2, x3);
+    f[D3Q27System::DIR_000] = (*d.REST)(x1, x2, x3);
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSoA::setDistribution(const LBMReal *const f, size_t x1, size_t x2, size_t x3)
@@ -128,99 +128,99 @@ void D3Q27EsoTwist3DSoA::setDistribution(const LBMReal *const f, size_t x1, size
     size_t x2p = x2 + 1;
     size_t x3p = x3 + 1;
 
-    (*d.E)(x1, x2, x3)     = f[D3Q27System::INV_E];
-    (*d.N)(x1, x2, x3)     = f[D3Q27System::INV_N];
-    (*d.T)(x1, x2, x3)     = f[D3Q27System::INV_T];
-    (*d.NE)(x1, x2, x3)    = f[D3Q27System::INV_NE];
-    (*d.NW)(x1p, x2, x3)   = f[D3Q27System::INV_NW];
-    (*d.TE)(x1, x2, x3)    = f[D3Q27System::INV_TE];
-    (*d.TW)(x1p, x2, x3)   = f[D3Q27System::INV_TW];
-    (*d.TN)(x1, x2, x3)    = f[D3Q27System::INV_TN];
-    (*d.TS)(x1, x2p, x3)   = f[D3Q27System::INV_TS];
-    (*d.TNE)(x1, x2, x3)   = f[D3Q27System::INV_TNE];
-    (*d.TNW)(x1p, x2, x3)  = f[D3Q27System::INV_TNW];
-    (*d.TSE)(x1, x2p, x3)  = f[D3Q27System::INV_TSE];
-    (*d.TSW)(x1p, x2p, x3) = f[D3Q27System::INV_TSW];
+    (*d.E)(x1, x2, x3)     = f[D3Q27System::INV_P00];
+    (*d.N)(x1, x2, x3)     = f[D3Q27System::INV_0P0];
+    (*d.T)(x1, x2, x3)     = f[D3Q27System::INV_00P];
+    (*d.NE)(x1, x2, x3)    = f[D3Q27System::INV_PP0];
+    (*d.NW)(x1p, x2, x3)   = f[D3Q27System::INV_MP0];
+    (*d.TE)(x1, x2, x3)    = f[D3Q27System::INV_P0P];
+    (*d.TW)(x1p, x2, x3)   = f[D3Q27System::INV_M0P];
+    (*d.TN)(x1, x2, x3)    = f[D3Q27System::INV_0PP];
+    (*d.TS)(x1, x2p, x3)   = f[D3Q27System::INV_0MP];
+    (*d.TNE)(x1, x2, x3)   = f[D3Q27System::INV_PPP];
+    (*d.TNW)(x1p, x2, x3)  = f[D3Q27System::INV_MPP];
+    (*d.TSE)(x1, x2p, x3)  = f[D3Q27System::INV_PMP];
+    (*d.TSW)(x1p, x2p, x3) = f[D3Q27System::INV_MMP];
 
-    (*d.W)(x1p, x2, x3)     = f[D3Q27System::INV_W];
-    (*d.S)(x1, x2p, x3)     = f[D3Q27System::INV_S];
-    (*d.B)(x1, x2, x3p)     = f[D3Q27System::INV_B];
-    (*d.SW)(x1p, x2p, x3)   = f[D3Q27System::INV_SW];
-    (*d.SE)(x1, x2p, x3)    = f[D3Q27System::INV_SE];
-    (*d.BW)(x1p, x2, x3p)   = f[D3Q27System::INV_BW];
-    (*d.BE)(x1, x2, x3p)    = f[D3Q27System::INV_BE];
-    (*d.BS)(x1, x2p, x3p)   = f[D3Q27System::INV_BS];
-    (*d.BN)(x1, x2, x3p)    = f[D3Q27System::INV_BN];
-    (*d.BSW)(x1p, x2p, x3p) = f[D3Q27System::INV_BSW];
-    (*d.BSE)(x1, x2p, x3p)  = f[D3Q27System::INV_BSE];
-    (*d.BNW)(x1p, x2, x3p)  = f[D3Q27System::INV_BNW];
-    (*d.BNE)(x1, x2, x3p)   = f[D3Q27System::INV_BNE];
+    (*d.W)(x1p, x2, x3)     = f[D3Q27System::INV_M00];
+    (*d.S)(x1, x2p, x3)     = f[D3Q27System::INV_0M0];
+    (*d.B)(x1, x2, x3p)     = f[D3Q27System::INV_00M];
+    (*d.SW)(x1p, x2p, x3)   = f[D3Q27System::INV_MM0];
+    (*d.SE)(x1, x2p, x3)    = f[D3Q27System::INV_PM0];
+    (*d.BW)(x1p, x2, x3p)   = f[D3Q27System::INV_M0M];
+    (*d.BE)(x1, x2, x3p)    = f[D3Q27System::INV_P0M];
+    (*d.BS)(x1, x2p, x3p)   = f[D3Q27System::INV_0MM];
+    (*d.BN)(x1, x2, x3p)    = f[D3Q27System::INV_0PM];
+    (*d.BSW)(x1p, x2p, x3p) = f[D3Q27System::INV_MMM];
+    (*d.BSE)(x1, x2p, x3p)  = f[D3Q27System::INV_PMM];
+    (*d.BNW)(x1p, x2, x3p)  = f[D3Q27System::INV_MPM];
+    (*d.BNE)(x1, x2, x3p)   = f[D3Q27System::INV_PPM];
 
-    (*d.REST)(x1, x2, x3) = f[D3Q27System::REST];
+    (*d.REST)(x1, x2, x3) = f[D3Q27System::DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSoA::getDistributionInv(LBMReal *const f, size_t x1, size_t x2, size_t x3)
 {
-    f[D3Q27System::INV_E]   = (*d.E)(x1, x2, x3);
-    f[D3Q27System::INV_N]   = (*d.N)(x1, x2, x3);
-    f[D3Q27System::INV_T]   = (*d.T)(x1, x2, x3);
-    f[D3Q27System::INV_NE]  = (*d.NE)(x1, x2, x3);
-    f[D3Q27System::INV_NW]  = (*d.NW)(x1 + 1, x2, x3);
-    f[D3Q27System::INV_TE]  = (*d.TE)(x1, x2, x3);
-    f[D3Q27System::INV_TW]  = (*d.TW)(x1 + 1, x2, x3);
-    f[D3Q27System::INV_TN]  = (*d.TN)(x1, x2, x3);
-    f[D3Q27System::INV_TS]  = (*d.TS)(x1, x2 + 1, x3);
-    f[D3Q27System::INV_TNE] = (*d.TNE)(x1, x2, x3);
-    f[D3Q27System::INV_TNW] = (*d.TNW)(x1 + 1, x2, x3);
-    f[D3Q27System::INV_TSE] = (*d.TSE)(x1, x2 + 1, x3);
-    f[D3Q27System::INV_TSW] = (*d.TSW)(x1 + 1, x2 + 1, x3);
+    f[D3Q27System::INV_P00]   = (*d.E)(x1, x2, x3);
+    f[D3Q27System::INV_0P0]   = (*d.N)(x1, x2, x3);
+    f[D3Q27System::INV_00P]   = (*d.T)(x1, x2, x3);
+    f[D3Q27System::INV_PP0]  = (*d.NE)(x1, x2, x3);
+    f[D3Q27System::INV_MP0]  = (*d.NW)(x1 + 1, x2, x3);
+    f[D3Q27System::INV_P0P]  = (*d.TE)(x1, x2, x3);
+    f[D3Q27System::INV_M0P]  = (*d.TW)(x1 + 1, x2, x3);
+    f[D3Q27System::INV_0PP]  = (*d.TN)(x1, x2, x3);
+    f[D3Q27System::INV_0MP]  = (*d.TS)(x1, x2 + 1, x3);
+    f[D3Q27System::INV_PPP] = (*d.TNE)(x1, x2, x3);
+    f[D3Q27System::INV_MPP] = (*d.TNW)(x1 + 1, x2, x3);
+    f[D3Q27System::INV_PMP] = (*d.TSE)(x1, x2 + 1, x3);
+    f[D3Q27System::INV_MMP] = (*d.TSW)(x1 + 1, x2 + 1, x3);
 
-    f[D3Q27System::INV_W]   = (*d.W)(x1 + 1, x2, x3);
-    f[D3Q27System::INV_S]   = (*d.S)(x1, x2 + 1, x3);
-    f[D3Q27System::INV_B]   = (*d.B)(x1, x2, x3 + 1);
-    f[D3Q27System::INV_SW]  = (*d.SW)(x1 + 1, x2 + 1, x3);
-    f[D3Q27System::INV_SE]  = (*d.SE)(x1, x2 + 1, x3);
-    f[D3Q27System::INV_BW]  = (*d.BW)(x1 + 1, x2, x3 + 1);
-    f[D3Q27System::INV_BE]  = (*d.BE)(x1, x2, x3 + 1);
-    f[D3Q27System::INV_BS]  = (*d.BS)(x1, x2 + 1, x3 + 1);
-    f[D3Q27System::INV_BN]  = (*d.BN)(x1, x2, x3 + 1);
-    f[D3Q27System::INV_BSW] = (*d.BSW)(x1 + 1, x2 + 1, x3 + 1);
-    f[D3Q27System::INV_BSE] = (*d.BSE)(x1, x2 + 1, x3 + 1);
-    f[D3Q27System::INV_BNW] = (*d.BNW)(x1 + 1, x2, x3 + 1);
-    f[D3Q27System::INV_BNE] = (*d.BNE)(x1, x2, x3 + 1);
+    f[D3Q27System::INV_M00]   = (*d.W)(x1 + 1, x2, x3);
+    f[D3Q27System::INV_0M0]   = (*d.S)(x1, x2 + 1, x3);
+    f[D3Q27System::INV_00M]   = (*d.B)(x1, x2, x3 + 1);
+    f[D3Q27System::INV_MM0]  = (*d.SW)(x1 + 1, x2 + 1, x3);
+    f[D3Q27System::INV_PM0]  = (*d.SE)(x1, x2 + 1, x3);
+    f[D3Q27System::INV_M0M]  = (*d.BW)(x1 + 1, x2, x3 + 1);
+    f[D3Q27System::INV_P0M]  = (*d.BE)(x1, x2, x3 + 1);
+    f[D3Q27System::INV_0MM]  = (*d.BS)(x1, x2 + 1, x3 + 1);
+    f[D3Q27System::INV_0PM]  = (*d.BN)(x1, x2, x3 + 1);
+    f[D3Q27System::INV_MMM] = (*d.BSW)(x1 + 1, x2 + 1, x3 + 1);
+    f[D3Q27System::INV_PMM] = (*d.BSE)(x1, x2 + 1, x3 + 1);
+    f[D3Q27System::INV_MPM] = (*d.BNW)(x1 + 1, x2, x3 + 1);
+    f[D3Q27System::INV_PPM] = (*d.BNE)(x1, x2, x3 + 1);
 
-    f[D3Q27System::REST] = (*d.REST)(x1, x2, x3);
+    f[D3Q27System::DIR_000] = (*d.REST)(x1, x2, x3);
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSoA::setDistributionInv(const LBMReal *const f, size_t x1, size_t x2, size_t x3)
 {
-    //(*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f[D3Q27System::E];
-    //(*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f[D3Q27System::N];
-    //(*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f[D3Q27System::T];
-    //(*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f[D3Q27System::NE];
-    //(*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2,  x3) = f[D3Q27System::NW];
-    //(*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f[D3Q27System::TE];
-    //(*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2,  x3) = f[D3Q27System::TW];
-    //(*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f[D3Q27System::TN];
-    //(*this->localDistributions)(D3Q27System::ET_TS,x1,  x2+1,x3) = f[D3Q27System::TS];
-    //(*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3) = f[D3Q27System::TNE];
-    //(*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2,  x3) = f[D3Q27System::TNW];
-    //(*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2+1,x3) = f[D3Q27System::TSE];
-    //(*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::TSW];
+    //(*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f[D3Q27System::DIR_P00];
+    //(*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f[D3Q27System::DIR_0P0];
+    //(*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f[D3Q27System::DIR_00P];
+    //(*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f[D3Q27System::DIR_PP0];
+    //(*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2,  x3) = f[D3Q27System::DIR_MP0];
+    //(*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f[D3Q27System::DIR_P0P];
+    //(*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2,  x3) = f[D3Q27System::DIR_M0P];
+    //(*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f[D3Q27System::DIR_0PP];
+    //(*this->localDistributions)(D3Q27System::ET_TS,x1,  x2+1,x3) = f[D3Q27System::DIR_0MP];
+    //(*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3) = f[D3Q27System::DIR_PPP];
+    //(*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2,  x3) = f[D3Q27System::DIR_MPP];
+    //(*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2+1,x3) = f[D3Q27System::DIR_PMP];
+    //(*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::DIR_MMP];
 
-    //(*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2,  x3    ) = f[D3Q27System::W ];
-    //(*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2+1,x3    ) = f[D3Q27System::S ];
-    //(*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3+1  ) = f[D3Q27System::B ];
-    //(*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3   ) = f[D3Q27System::SW];
-    //(*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2+1,x3   ) = f[D3Q27System::SE];
-    //(*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2,  x3+1 ) = f[D3Q27System::BW];
-    //(*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3+1 ) = f[D3Q27System::BE];
-    //(*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2+1,x3+1 ) = f[D3Q27System::BS];
-    //(*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3+1 ) = f[D3Q27System::BN];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2,  x3    ) = f[D3Q27System::DIR_M00 ];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2+1,x3    ) = f[D3Q27System::DIR_0M0 ];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3+1  ) = f[D3Q27System::DIR_00M ];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3   ) = f[D3Q27System::DIR_MM0];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2+1,x3   ) = f[D3Q27System::DIR_PM0];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2,  x3+1 ) = f[D3Q27System::DIR_M0M];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3+1 ) = f[D3Q27System::DIR_P0M];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2+1,x3+1 ) = f[D3Q27System::DIR_0MM];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3+1 ) = f[D3Q27System::DIR_0PM];
     //(*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f[D3Q27System::BSW];
     //(*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,  x2+1,x3+1) = f[D3Q27System::BSE];
     //(*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2,  x3+1) = f[D3Q27System::BNW];
-    //(*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3+1) = f[D3Q27System::BNE];
+    //(*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3+1) = f[D3Q27System::DIR_DIR_PPM];
 
     //(*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::REST];
 }
@@ -230,57 +230,57 @@ void D3Q27EsoTwist3DSoA::setDistributionForDirection(const LBMReal *const f, siz
 {
     // bool directionFlag = false;
     // if ((direction & EsoTwistD3Q27System::etE) == EsoTwistD3Q27System::etE)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2,  x3    ) = f[D3Q27System::E]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2,  x3    ) = f[D3Q27System::DIR_P00]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etW) == EsoTwistD3Q27System::etW)
-    //   (*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f[D3Q27System::W]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f[D3Q27System::DIR_M00]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etS) == EsoTwistD3Q27System::etS)
-    //   (*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f[D3Q27System::S]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f[D3Q27System::DIR_0M0]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etN) == EsoTwistD3Q27System::etN)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2+1,x3    ) = f[D3Q27System::N]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2+1,x3    ) = f[D3Q27System::DIR_0P0]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etB) == EsoTwistD3Q27System::etB)
-    //   (*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f[D3Q27System::B]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f[D3Q27System::DIR_00M]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etT) == EsoTwistD3Q27System::etT)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3+1  ) = f[D3Q27System::T]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3+1  ) = f[D3Q27System::DIR_00P]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etSW) == EsoTwistD3Q27System::etSW)
-    //   (*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f[D3Q27System::SW]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f[D3Q27System::DIR_MM0]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etNE) == EsoTwistD3Q27System::etNE)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3   ) = f[D3Q27System::NE]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3   ) = f[D3Q27System::DIR_PP0]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etNW) == EsoTwistD3Q27System::etNW)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2+1,x3   ) = f[D3Q27System::NW]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2+1,x3   ) = f[D3Q27System::DIR_MP0]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etSE) == EsoTwistD3Q27System::etSE)
-    //   (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2,  x3) = f[D3Q27System::SE]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2,  x3) = f[D3Q27System::DIR_PM0]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etBW) == EsoTwistD3Q27System::etBW)
-    //   (*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f[D3Q27System::BW]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f[D3Q27System::DIR_M0M]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etTE) == EsoTwistD3Q27System::etTE)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2,  x3+1 ) = f[D3Q27System::TE]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2,  x3+1 ) = f[D3Q27System::DIR_P0P]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etTW) == EsoTwistD3Q27System::etTW)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3+1 ) = f[D3Q27System::TW]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3+1 ) = f[D3Q27System::DIR_M0P]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etBE) == EsoTwistD3Q27System::etBE)
-    //   (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2,  x3) = f[D3Q27System::BE]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2,  x3) = f[D3Q27System::DIR_P0M]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etBS) == EsoTwistD3Q27System::etBS)
-    //   (*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f[D3Q27System::BS]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f[D3Q27System::DIR_0MM]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etTN) == EsoTwistD3Q27System::etTN)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2+1,x3+1 ) = f[D3Q27System::TN]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2+1,x3+1 ) = f[D3Q27System::DIR_0PP]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etTS) == EsoTwistD3Q27System::etTS)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3+1 ) = f[D3Q27System::TS]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3+1 ) = f[D3Q27System::DIR_0MP]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etBN) == EsoTwistD3Q27System::etBN)
-    //   (*this->localDistributions)(D3Q27System::ET_TS,x1,  x2+1,x3) = f[D3Q27System::BN]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_TS,x1,  x2+1,x3) = f[D3Q27System::DIR_0PM]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etBSW) == EsoTwistD3Q27System::etBSW)
     //   (*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3) = f[D3Q27System::BSW]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etTNE) == EsoTwistD3Q27System::etTNE)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f[D3Q27System::TNE]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f[D3Q27System::DIR_PPP]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etBSE) == EsoTwistD3Q27System::etBSE)
     //   (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2,  x3) = f[D3Q27System::BSE]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etTNW) == EsoTwistD3Q27System::etTNW)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,  x2+1,x3+1) = f[D3Q27System::TNW]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,  x2+1,x3+1) = f[D3Q27System::DIR_MPP]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etBNW) == EsoTwistD3Q27System::etBNW)
     //   (*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2+1,x3) = f[D3Q27System::BNW]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etTSE) == EsoTwistD3Q27System::etTSE)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2,  x3+1) = f[D3Q27System::TSE]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2,  x3+1) = f[D3Q27System::DIR_PMP]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etBNE) == EsoTwistD3Q27System::etBNE)
-    //   (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::BNE]; directionFlag=true;
+    //   (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::DIR_DIR_PPM]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::etTSW) == EsoTwistD3Q27System::etTSW)
-    //   (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3+1) = f[D3Q27System::TSW]; directionFlag=true;
+    //   (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3+1) = f[D3Q27System::DIR_MMP]; directionFlag=true;
     // if ((direction & EsoTwistD3Q27System::REST) == EsoTwistD3Q27System::REST)
     //   (*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::REST]; directionFlag=true;
     //#ifdef _DEBUG
@@ -292,82 +292,82 @@ void D3Q27EsoTwist3DSoA::setDistributionForDirection(LBMReal f, size_t x1, size_
 {
     // switch (direction)
     //{
-    // case D3Q27System::E :
+    // case D3Q27System::DIR_P00 :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2,  x3    ) = f;
     //   break;
-    // case D3Q27System::W :
+    // case D3Q27System::DIR_M00 :
     //   (*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::S :
+    // case D3Q27System::DIR_0M0 :
     //   (*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::N :
+    // case D3Q27System::DIR_0P0 :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2+1,x3    ) = f;
     //   break;
-    // case D3Q27System::B :
+    // case D3Q27System::DIR_00M :
     //   (*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::T :
+    // case D3Q27System::DIR_00P :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3+1  ) = f;
     //   break;
-    // case D3Q27System::SW :
+    // case D3Q27System::DIR_MM0 :
     //   (*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::NE :
+    // case D3Q27System::DIR_PP0 :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3   ) = f;
     //   break;
-    // case D3Q27System::NW :
+    // case D3Q27System::DIR_MP0 :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2+1,x3   ) = f;
     //   break;
-    // case D3Q27System::SE :
+    // case D3Q27System::DIR_PM0 :
     //   (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2,  x3) = f;
     //   break;
-    // case D3Q27System::BW :
+    // case D3Q27System::DIR_M0M :
     //   (*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::TE :
+    // case D3Q27System::DIR_P0P :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2,  x3+1 ) = f;
     //   break;
-    // case D3Q27System::TW :
+    // case D3Q27System::DIR_M0P :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3+1 ) = f;
     //   break;
-    // case D3Q27System::BE :
+    // case D3Q27System::DIR_P0M :
     //   (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2,  x3) = f;
     //   break;
-    // case D3Q27System::BS :
+    // case D3Q27System::DIR_0MM :
     //   (*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::TN :
+    // case D3Q27System::DIR_0PP :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2+1,x3+1 ) = f;
     //   break;
-    // case D3Q27System::TS :
+    // case D3Q27System::DIR_0MP :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3+1 ) = f;
     //   break;
-    // case D3Q27System::BN :
+    // case D3Q27System::DIR_0PM :
     //   (*this->localDistributions)(D3Q27System::ET_TS,x1,  x2+1,x3) = f;
     //   break;
     // case D3Q27System::BSW :
     //   (*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::TNE :
+    // case D3Q27System::DIR_PPP :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f;
     //   break;
     // case D3Q27System::BSE :
     //   (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2,  x3) = f;
     //   break;
-    // case D3Q27System::TNW :
+    // case D3Q27System::DIR_MPP :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,  x2+1,x3+1) = f;
     //   break;
     // case D3Q27System::BNW :
     //   (*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2+1,x3) = f;
     //   break;
-    // case D3Q27System::TSE :
+    // case D3Q27System::DIR_PMP :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2,  x3+1) = f;
     //   break;
-    // case D3Q27System::BNE :
+    // case D3Q27System::DIR_DIR_PPM :
     //   (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f;
     //   break;
-    // case D3Q27System::TSW :
+    // case D3Q27System::DIR_MMP :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3+1) = f;
     //   break;
     // case D3Q27System::REST :
@@ -383,60 +383,60 @@ void D3Q27EsoTwist3DSoA::setDistributionInvForDirection(const LBMReal *const f,
 {
     //   bool directionFlag = false;
     //   if ((direction & EsoTwistD3Q27System::etE) == EsoTwistD3Q27System::etE)
-    //      (*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f[D3Q27System::E]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f[D3Q27System::DIR_P00]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etW) == EsoTwistD3Q27System::etW)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2,  x3    ) = f[D3Q27System::W]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2,  x3    ) = f[D3Q27System::DIR_M00]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etS) == EsoTwistD3Q27System::etS)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2+1,x3    ) = f[D3Q27System::S]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2+1,x3    ) = f[D3Q27System::DIR_0M0]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etN) == EsoTwistD3Q27System::etN)
-    //      (*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f[D3Q27System::N]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f[D3Q27System::DIR_0P0]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etB) == EsoTwistD3Q27System::etB)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3+1  ) = f[D3Q27System::B]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3+1  ) = f[D3Q27System::DIR_00M]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etT) == EsoTwistD3Q27System::etT)
-    //      (*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f[D3Q27System::T]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f[D3Q27System::DIR_00P]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etSW) == EsoTwistD3Q27System::etSW)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3   ) = f[D3Q27System::SW]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3   ) = f[D3Q27System::DIR_MM0]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etNE) == EsoTwistD3Q27System::etNE)
-    //      (*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f[D3Q27System::NE]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f[D3Q27System::DIR_PP0]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etNW) == EsoTwistD3Q27System::etNW)
-    //      (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2,  x3) = f[D3Q27System::NW]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2,  x3) = f[D3Q27System::DIR_MP0]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etSE) == EsoTwistD3Q27System::etSE)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2+1,x3   ) = f[D3Q27System::SE]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2+1,x3   ) = f[D3Q27System::DIR_PM0]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etBW) == EsoTwistD3Q27System::etBW)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2,  x3+1 ) = f[D3Q27System::BW]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2,  x3+1 ) = f[D3Q27System::DIR_M0M]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etTE) == EsoTwistD3Q27System::etTE)
-    //      (*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f[D3Q27System::TE]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f[D3Q27System::DIR_P0P]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etTW) == EsoTwistD3Q27System::etTW)
-    //      (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2,  x3) = f[D3Q27System::TW]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2,  x3) = f[D3Q27System::DIR_M0P]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etBE) == EsoTwistD3Q27System::etBE)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3+1 ) = f[D3Q27System::BE]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3+1 ) = f[D3Q27System::DIR_P0M]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etBS) == EsoTwistD3Q27System::etBS)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2+1,x3+1 ) = f[D3Q27System::BS]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2+1,x3+1 ) = f[D3Q27System::DIR_0MM]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etTN) == EsoTwistD3Q27System::etTN)
-    //      (*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f[D3Q27System::TN]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f[D3Q27System::DIR_0PP]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etTS) == EsoTwistD3Q27System::etTS)
-    //      (*this->localDistributions)(D3Q27System::ET_TS,x1,  x2+1,x3) = f[D3Q27System::TS]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_TS,x1,  x2+1,x3) = f[D3Q27System::DIR_0MP]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etBN) == EsoTwistD3Q27System::etBN)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3+1 ) = f[D3Q27System::BN]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3+1 ) = f[D3Q27System::DIR_0PM]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etBSW) == EsoTwistD3Q27System::etBSW)
     //      (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f[D3Q27System::BSW];
     //      directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etTNE) == EsoTwistD3Q27System::etTNE)
-    //      (*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3) = f[D3Q27System::TNE]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3) = f[D3Q27System::DIR_PPP]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etBSE) == EsoTwistD3Q27System::etBSE)
     //      (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,  x2+1,x3+1) = f[D3Q27System::BSE];
     //      directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etTNW) == EsoTwistD3Q27System::etTNW)
-    //      (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2,  x3) = f[D3Q27System::TNW]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2,  x3) = f[D3Q27System::DIR_MPP]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etBNW) == EsoTwistD3Q27System::etBNW)
     //      (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2,  x3+1) = f[D3Q27System::BNW];
     //      directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etTSE) == EsoTwistD3Q27System::etTSE)
-    //      (*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2+1,x3) = f[D3Q27System::TSE]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2+1,x3) = f[D3Q27System::DIR_PMP]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etBNE) == EsoTwistD3Q27System::etBNE)
-    //      (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3+1)= f[D3Q27System::BNE]; directionFlag=true;
+    //      (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3+1)= f[D3Q27System::DIR_DIR_PPM]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::etTSW) == EsoTwistD3Q27System::etTSW)
-    //      (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::TSW]; directionFlag=true;
+    //      (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::DIR_MMP]; directionFlag=true;
     //   if ((direction & EsoTwistD3Q27System::REST) == EsoTwistD3Q27System::REST)
     //      (*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::REST]; directionFlag=true;
     //#ifdef _DEBUG
@@ -449,82 +449,82 @@ void D3Q27EsoTwist3DSoA::setDistributionInvForDirection(LBMReal f, size_t x1, si
 {
     // switch (direction)
     //{
-    // case D3Q27System::E :
+    // case D3Q27System::DIR_P00 :
     //   (*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::W :
+    // case D3Q27System::DIR_M00 :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2,  x3    ) = f;
     //   break;
-    // case D3Q27System::S :
+    // case D3Q27System::DIR_0M0 :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2+1,x3    ) = f;
     //   break;
-    // case D3Q27System::N :
+    // case D3Q27System::DIR_0P0 :
     //   (*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::B :
+    // case D3Q27System::DIR_00M :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3+1  ) = f;
     //   break;
-    // case D3Q27System::T :
+    // case D3Q27System::DIR_00P :
     //   (*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::SW :
+    // case D3Q27System::DIR_MM0 :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3   ) = f;
     //   break;
-    // case D3Q27System::NE :
+    // case D3Q27System::DIR_PP0 :
     //   (*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::NW :
+    // case D3Q27System::DIR_MP0 :
     //   (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2,  x3) = f;
     //   break;
-    // case D3Q27System::SE :
+    // case D3Q27System::DIR_PM0 :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2+1,x3   ) = f;
     //   break;
-    // case D3Q27System::BW :
+    // case D3Q27System::DIR_M0M :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2,  x3+1 ) = f;
     //   break;
-    // case D3Q27System::TE :
+    // case D3Q27System::DIR_P0P :
     //   (*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::TW :
+    // case D3Q27System::DIR_M0P :
     //   (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2,  x3) = f;
     //   break;
-    // case D3Q27System::BE :
+    // case D3Q27System::DIR_P0M :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3+1 ) = f;
     //   break;
-    // case D3Q27System::BS :
+    // case D3Q27System::DIR_0MM :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2+1,x3+1 ) = f;
     //   break;
-    // case D3Q27System::TN :
+    // case D3Q27System::DIR_0PP :
     //   (*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f;
     //   break;
-    // case D3Q27System::TS :
+    // case D3Q27System::DIR_0MP :
     //   (*this->localDistributions)(D3Q27System::ET_TS,x1,  x2+1,x3) = f;
     //   break;
-    // case D3Q27System::BN :
+    // case D3Q27System::DIR_0PM :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3+1 ) = f;
     //   break;
     // case D3Q27System::BSW :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f;
     //   break;
-    // case D3Q27System::TNE :
+    // case D3Q27System::DIR_PPP :
     //   (*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3) = f;
     //   break;
     // case D3Q27System::BSE :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,  x2+1,x3+1) = f;
     //   break;
-    // case D3Q27System::TNW :
+    // case D3Q27System::DIR_MPP :
     //   (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2,  x3) = f;
     //   break;
     // case D3Q27System::BNW :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2,  x3+1) = f;
     //   break;
-    // case D3Q27System::TSE :
+    // case D3Q27System::DIR_PMP :
     //   (*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2+1,x3) = f;
     //   break;
-    // case D3Q27System::BNE :
+    // case D3Q27System::DIR_DIR_PPM :
     //   (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3+1) = f;
     //   break;
-    // case D3Q27System::TSW :
+    // case D3Q27System::DIR_MMP :
     //   (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f;
     //   break;
     // case D3Q27System::REST :
@@ -540,57 +540,57 @@ LBMReal D3Q27EsoTwist3DSoA::getDistributionInvForDirection(size_t /*x1*/, size_t
 {
     // switch (direction)
     //{
-    // case D3Q27System::E :
+    // case D3Q27System::DIR_P00 :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2,  x3    );
-    // case D3Q27System::W :
+    // case D3Q27System::DIR_M00 :
     //   return (*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3);
-    // case D3Q27System::S :
+    // case D3Q27System::DIR_0M0 :
     //   return (*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3);
-    // case D3Q27System::N :
+    // case D3Q27System::DIR_0P0 :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2+1,x3    );
-    // case D3Q27System::B :
+    // case D3Q27System::DIR_00M :
     //   return (*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3);
-    // case D3Q27System::T :
+    // case D3Q27System::DIR_00P :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3+1  );
-    // case D3Q27System::SW :
+    // case D3Q27System::DIR_MM0 :
     //   return (*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3);
-    // case D3Q27System::NE :
+    // case D3Q27System::DIR_PP0 :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3   );
-    // case D3Q27System::NW :
+    // case D3Q27System::DIR_MP0 :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2+1,x3   );
-    // case D3Q27System::SE :
+    // case D3Q27System::DIR_PM0 :
     //   return (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2,  x3);
-    // case D3Q27System::BW :
+    // case D3Q27System::DIR_M0M :
     //   return (*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3);
-    // case D3Q27System::TE :
+    // case D3Q27System::DIR_P0P :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2,  x3+1 );
-    // case D3Q27System::TW :
+    // case D3Q27System::DIR_M0P :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3+1 );
-    // case D3Q27System::BE :
+    // case D3Q27System::DIR_P0M :
     //   return (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2,  x3);
-    // case D3Q27System::BS :
+    // case D3Q27System::DIR_0MM :
     //   return (*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3);
-    // case D3Q27System::TN :
+    // case D3Q27System::DIR_0PP :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2+1,x3+1 );
-    // case D3Q27System::TS :
+    // case D3Q27System::DIR_0MP :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3+1 );
-    // case D3Q27System::BN :
+    // case D3Q27System::DIR_0PM :
     //   return (*this->localDistributions)(D3Q27System::ET_TS,x1,  x2+1,x3);
     // case D3Q27System::BSW :
     //   return (*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3);
-    // case D3Q27System::TNE :
+    // case D3Q27System::DIR_PPP :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1);
     // case D3Q27System::BSE :
     //   return (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2,  x3);
-    // case D3Q27System::TNW :
+    // case D3Q27System::DIR_MPP :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,  x2+1,x3+1);
     // case D3Q27System::BNW :
     //   return (*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2+1,x3);
-    // case D3Q27System::TSE :
+    // case D3Q27System::DIR_PMP :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2,  x3+1);
-    // case D3Q27System::BNE :
+    // case D3Q27System::DIR_DIR_PPM :
     //   return (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3);
-    // case D3Q27System::TSW :
+    // case D3Q27System::DIR_MMP :
     //   return (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3+1);
     // case D3Q27System::REST :
     //   return (*this->zeroDistributions)(x1,x2,x3);
diff --git a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.cpp b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.cpp
index 5e762c68bab806ee7c892c000869bce8c76431af..684238baad1752ab3fad051666da459fd8e11095 100644
--- a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.cpp
+++ b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.cpp
@@ -56,278 +56,278 @@ void D3Q27EsoTwist3DSplittedVector::swap() { std::swap(this->localDistributions,
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSplittedVector::getDistribution(LBMReal *const f, size_t x1, size_t x2, size_t x3)
 {
-    f[D3Q27System::E]   = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
-    f[D3Q27System::N]   = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
-    f[D3Q27System::T]   = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
-    f[D3Q27System::NE]  = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
-    f[D3Q27System::NW]  = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
-    f[D3Q27System::TE]  = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
-    f[D3Q27System::TW]  = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
-    f[D3Q27System::TN]  = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
-    f[D3Q27System::TS]  = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
-    f[D3Q27System::TNE] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
-    f[D3Q27System::TNW] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
-    f[D3Q27System::TSE] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
-    f[D3Q27System::TSW] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+    f[D3Q27System::DIR_P00]   = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
+    f[D3Q27System::DIR_0P0]   = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
+    f[D3Q27System::DIR_00P]   = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
+    f[D3Q27System::DIR_PP0]  = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
+    f[D3Q27System::DIR_MP0]  = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+    f[D3Q27System::DIR_P0P]  = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
+    f[D3Q27System::DIR_M0P]  = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+    f[D3Q27System::DIR_0PP]  = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
+    f[D3Q27System::DIR_0MP]  = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+    f[D3Q27System::DIR_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+    f[D3Q27System::DIR_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+    f[D3Q27System::DIR_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+    f[D3Q27System::DIR_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
 
-    f[D3Q27System::W]   = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
-    f[D3Q27System::S]   = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
-    f[D3Q27System::B]   = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
-    f[D3Q27System::SW]  = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
-    f[D3Q27System::SE]  = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
-    f[D3Q27System::BW]  = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
-    f[D3Q27System::BE]  = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
-    f[D3Q27System::BS]  = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
-    f[D3Q27System::BN]  = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
-    f[D3Q27System::BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
-    f[D3Q27System::BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
-    f[D3Q27System::BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
-    f[D3Q27System::BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+    f[D3Q27System::DIR_M00]   = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+    f[D3Q27System::DIR_0M0]   = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+    f[D3Q27System::DIR_00M]   = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+    f[D3Q27System::DIR_MM0]  = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+    f[D3Q27System::DIR_PM0]  = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+    f[D3Q27System::DIR_M0M]  = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+    f[D3Q27System::DIR_P0M]  = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+    f[D3Q27System::DIR_0MM]  = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+    f[D3Q27System::DIR_0PM]  = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+    f[D3Q27System::DIR_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+    f[D3Q27System::DIR_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+    f[D3Q27System::DIR_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+    f[D3Q27System::DIR_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
 
-    f[D3Q27System::REST] = (*this->zeroDistributions)(x1, x2, x3);
+    f[D3Q27System::DIR_000] = (*this->zeroDistributions)(x1, x2, x3);
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSplittedVector::setDistribution(const LBMReal *const f, size_t x1, size_t x2, size_t x3)
 {
-    (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3)           = f[D3Q27System::INV_E];
-    (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3)           = f[D3Q27System::INV_N];
-    (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3)           = f[D3Q27System::INV_T];
-    (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3)          = f[D3Q27System::INV_NE];
-    (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3)      = f[D3Q27System::INV_NW];
-    (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3)          = f[D3Q27System::INV_TE];
-    (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3)      = f[D3Q27System::INV_TW];
-    (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3)          = f[D3Q27System::INV_TN];
-    (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3)      = f[D3Q27System::INV_TS];
-    (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3)         = f[D3Q27System::INV_TNE];
-    (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3)     = f[D3Q27System::INV_TNW];
-    (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3)     = f[D3Q27System::INV_TSE];
-    (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::INV_TSW];
+    (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3)           = f[D3Q27System::INV_P00];
+    (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3)           = f[D3Q27System::INV_0P0];
+    (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3)           = f[D3Q27System::INV_00P];
+    (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3)          = f[D3Q27System::INV_PP0];
+    (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3)      = f[D3Q27System::INV_MP0];
+    (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3)          = f[D3Q27System::INV_P0P];
+    (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3)      = f[D3Q27System::INV_M0P];
+    (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3)          = f[D3Q27System::INV_0PP];
+    (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3)      = f[D3Q27System::INV_0MP];
+    (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3)         = f[D3Q27System::INV_PPP];
+    (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3)     = f[D3Q27System::INV_MPP];
+    (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3)     = f[D3Q27System::INV_PMP];
+    (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::INV_MMP];
 
-    (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3)           = f[D3Q27System::INV_W];
-    (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3)           = f[D3Q27System::INV_S];
-    (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1)           = f[D3Q27System::INV_B];
-    (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3)      = f[D3Q27System::INV_SW];
-    (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3)          = f[D3Q27System::INV_SE];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1)      = f[D3Q27System::INV_BW];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1)          = f[D3Q27System::INV_BE];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1)      = f[D3Q27System::INV_BS];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1)          = f[D3Q27System::INV_BN];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::INV_BSW];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1)     = f[D3Q27System::INV_BSE];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1)     = f[D3Q27System::INV_BNW];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1)         = f[D3Q27System::INV_BNE];
+    (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3)           = f[D3Q27System::INV_M00];
+    (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3)           = f[D3Q27System::INV_0M0];
+    (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1)           = f[D3Q27System::INV_00M];
+    (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3)      = f[D3Q27System::INV_MM0];
+    (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3)          = f[D3Q27System::INV_PM0];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1)      = f[D3Q27System::INV_M0M];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1)          = f[D3Q27System::INV_P0M];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1)      = f[D3Q27System::INV_0MM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1)          = f[D3Q27System::INV_0PM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::INV_MMM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1)     = f[D3Q27System::INV_PMM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1)     = f[D3Q27System::INV_MPM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1)         = f[D3Q27System::INV_PPM];
 
-    (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST];
+    (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSplittedVector::getDistributionInv(LBMReal *const f, size_t x1, size_t x2, size_t x3)
 {
-    f[D3Q27System::INV_E]   = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
-    f[D3Q27System::INV_N]   = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
-    f[D3Q27System::INV_T]   = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
-    f[D3Q27System::INV_NE]  = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
-    f[D3Q27System::INV_NW]  = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
-    f[D3Q27System::INV_TE]  = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
-    f[D3Q27System::INV_TW]  = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
-    f[D3Q27System::INV_TN]  = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
-    f[D3Q27System::INV_TS]  = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
-    f[D3Q27System::INV_TNE] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
-    f[D3Q27System::INV_TNW] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
-    f[D3Q27System::INV_TSE] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
-    f[D3Q27System::INV_TSW] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+    f[D3Q27System::INV_P00]   = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
+    f[D3Q27System::INV_0P0]   = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
+    f[D3Q27System::INV_00P]   = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
+    f[D3Q27System::INV_PP0]  = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
+    f[D3Q27System::INV_MP0]  = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+    f[D3Q27System::INV_P0P]  = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
+    f[D3Q27System::INV_M0P]  = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+    f[D3Q27System::INV_0PP]  = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
+    f[D3Q27System::INV_0MP]  = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+    f[D3Q27System::INV_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+    f[D3Q27System::INV_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+    f[D3Q27System::INV_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+    f[D3Q27System::INV_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
 
-    f[D3Q27System::INV_W]   = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
-    f[D3Q27System::INV_S]   = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
-    f[D3Q27System::INV_B]   = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
-    f[D3Q27System::INV_SW]  = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
-    f[D3Q27System::INV_SE]  = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
-    f[D3Q27System::INV_BW]  = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
-    f[D3Q27System::INV_BE]  = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
-    f[D3Q27System::INV_BS]  = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
-    f[D3Q27System::INV_BN]  = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
-    f[D3Q27System::INV_BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
-    f[D3Q27System::INV_BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
-    f[D3Q27System::INV_BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
-    f[D3Q27System::INV_BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+    f[D3Q27System::INV_M00]   = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+    f[D3Q27System::INV_0M0]   = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+    f[D3Q27System::INV_00M]   = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+    f[D3Q27System::INV_MM0]  = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+    f[D3Q27System::INV_PM0]  = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+    f[D3Q27System::INV_M0M]  = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+    f[D3Q27System::INV_P0M]  = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+    f[D3Q27System::INV_0MM]  = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+    f[D3Q27System::INV_0PM]  = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+    f[D3Q27System::INV_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+    f[D3Q27System::INV_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+    f[D3Q27System::INV_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+    f[D3Q27System::INV_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
 
-    f[D3Q27System::REST] = (*this->zeroDistributions)(x1, x2, x3);
+    f[D3Q27System::DIR_000] = (*this->zeroDistributions)(x1, x2, x3);
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSplittedVector::setDistributionInv(const LBMReal *const f, size_t x1, size_t x2, size_t x3)
 {
-    (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3)           = f[D3Q27System::E];
-    (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3)           = f[D3Q27System::N];
-    (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3)           = f[D3Q27System::T];
-    (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3)          = f[D3Q27System::NE];
-    (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3)      = f[D3Q27System::NW];
-    (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3)          = f[D3Q27System::TE];
-    (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3)      = f[D3Q27System::TW];
-    (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3)          = f[D3Q27System::TN];
-    (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3)      = f[D3Q27System::TS];
-    (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3)         = f[D3Q27System::TNE];
-    (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3)     = f[D3Q27System::TNW];
-    (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3)     = f[D3Q27System::TSE];
-    (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::TSW];
+    (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3)           = f[D3Q27System::DIR_P00];
+    (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3)           = f[D3Q27System::DIR_0P0];
+    (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3)           = f[D3Q27System::DIR_00P];
+    (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3)          = f[D3Q27System::DIR_PP0];
+    (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3)      = f[D3Q27System::DIR_MP0];
+    (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3)          = f[D3Q27System::DIR_P0P];
+    (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3)      = f[D3Q27System::DIR_M0P];
+    (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3)          = f[D3Q27System::DIR_0PP];
+    (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3)      = f[D3Q27System::DIR_0MP];
+    (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3)         = f[D3Q27System::DIR_PPP];
+    (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3)     = f[D3Q27System::DIR_MPP];
+    (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3)     = f[D3Q27System::DIR_PMP];
+    (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_MMP];
 
-    (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3)           = f[D3Q27System::W];
-    (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3)           = f[D3Q27System::S];
-    (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1)           = f[D3Q27System::B];
-    (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3)      = f[D3Q27System::SW];
-    (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3)          = f[D3Q27System::SE];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1)      = f[D3Q27System::BW];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1)          = f[D3Q27System::BE];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1)      = f[D3Q27System::BS];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1)          = f[D3Q27System::BN];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::BSW];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1)     = f[D3Q27System::BSE];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1)     = f[D3Q27System::BNW];
-    (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1)         = f[D3Q27System::BNE];
+    (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3)           = f[D3Q27System::DIR_M00];
+    (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3)           = f[D3Q27System::DIR_0M0];
+    (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1)           = f[D3Q27System::DIR_00M];
+    (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3)      = f[D3Q27System::DIR_MM0];
+    (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3)          = f[D3Q27System::DIR_PM0];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1)      = f[D3Q27System::DIR_M0M];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1)          = f[D3Q27System::DIR_P0M];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1)      = f[D3Q27System::DIR_0MM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1)          = f[D3Q27System::DIR_0PM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_MMM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1)     = f[D3Q27System::DIR_PMM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1)     = f[D3Q27System::DIR_MPM];
+    (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1)         = f[D3Q27System::DIR_PPM];
 
-    (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST];
+    (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSplittedVector::setDistributionForDirection(const LBMReal *const f, size_t x1, size_t x2, size_t x3,
                                                                 unsigned long int direction)
 {
     if ((direction & EsoTwistD3Q27System::etE) == EsoTwistD3Q27System::etE)
-        (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::E];
+        (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::DIR_P00];
     if ((direction & EsoTwistD3Q27System::etW) == EsoTwistD3Q27System::etW)
-        (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::W];
+        (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::DIR_M00];
     if ((direction & EsoTwistD3Q27System::etS) == EsoTwistD3Q27System::etS)
-        (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::S];
+        (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::DIR_0M0];
     if ((direction & EsoTwistD3Q27System::etN) == EsoTwistD3Q27System::etN)
-        (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::N];
+        (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::DIR_0P0];
     if ((direction & EsoTwistD3Q27System::etB) == EsoTwistD3Q27System::etB)
-        (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::B];
+        (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::DIR_00M];
     if ((direction & EsoTwistD3Q27System::etT) == EsoTwistD3Q27System::etT)
-        (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::T];
+        (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::DIR_00P];
     if ((direction & EsoTwistD3Q27System::etSW) == EsoTwistD3Q27System::etSW)
-        (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::SW];
+        (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::DIR_MM0];
     if ((direction & EsoTwistD3Q27System::etNE) == EsoTwistD3Q27System::etNE)
-        (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::NE];
+        (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_PP0];
     if ((direction & EsoTwistD3Q27System::etNW) == EsoTwistD3Q27System::etNW)
-        (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::NW];
+        (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::DIR_MP0];
     if ((direction & EsoTwistD3Q27System::etSE) == EsoTwistD3Q27System::etSE)
-        (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::SE];
+        (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::DIR_PM0];
     if ((direction & EsoTwistD3Q27System::etBW) == EsoTwistD3Q27System::etBW)
-        (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::BW];
+        (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::DIR_M0M];
     if ((direction & EsoTwistD3Q27System::etTE) == EsoTwistD3Q27System::etTE)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::TE];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_P0P];
     if ((direction & EsoTwistD3Q27System::etTW) == EsoTwistD3Q27System::etTW)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::TW];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::DIR_M0P];
     if ((direction & EsoTwistD3Q27System::etBE) == EsoTwistD3Q27System::etBE)
-        (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::BE];
+        (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::DIR_P0M];
     if ((direction & EsoTwistD3Q27System::etBS) == EsoTwistD3Q27System::etBS)
-        (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::BS];
+        (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::DIR_0MM];
     if ((direction & EsoTwistD3Q27System::etTN) == EsoTwistD3Q27System::etTN)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::TN];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_0PP];
     if ((direction & EsoTwistD3Q27System::etTS) == EsoTwistD3Q27System::etTS)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::TS];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::DIR_0MP];
     if ((direction & EsoTwistD3Q27System::etBN) == EsoTwistD3Q27System::etBN)
-        (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::BN];
+        (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::DIR_0PM];
     if ((direction & EsoTwistD3Q27System::etBSW) == EsoTwistD3Q27System::etBSW)
-        (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::BSW];
+        (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::DIR_MMM];
     if ((direction & EsoTwistD3Q27System::etTNE) == EsoTwistD3Q27System::etTNE)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::TNE];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_PPP];
     if ((direction & EsoTwistD3Q27System::etBSE) == EsoTwistD3Q27System::etBSE)
-        (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::BSE];
+        (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::DIR_PMM];
     if ((direction & EsoTwistD3Q27System::etTNW) == EsoTwistD3Q27System::etTNW)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::TNW];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_MPP];
     if ((direction & EsoTwistD3Q27System::etBNW) == EsoTwistD3Q27System::etBNW)
-        (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::BNW];
+        (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::DIR_MPM];
     if ((direction & EsoTwistD3Q27System::etTSE) == EsoTwistD3Q27System::etTSE)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::TSE];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_PMP];
     if ((direction & EsoTwistD3Q27System::etBNE) == EsoTwistD3Q27System::etBNE)
-        (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::BNE];
+        (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_PPM];
     if ((direction & EsoTwistD3Q27System::etTSW) == EsoTwistD3Q27System::etTSW)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::TSW];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::DIR_MMP];
     if ((direction & EsoTwistD3Q27System::REST) == EsoTwistD3Q27System::REST)
-        (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST];
+        (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSplittedVector::setDistributionForDirection(LBMReal f, size_t x1, size_t x2, size_t x3,
                                                                 int direction)
 {
     switch (direction) {
-        case D3Q27System::E:
+        case D3Q27System::DIR_P00:
             (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f;
             break;
-        case D3Q27System::W:
+        case D3Q27System::DIR_M00:
             (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f;
             break;
-        case D3Q27System::S:
+        case D3Q27System::DIR_0M0:
             (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f;
             break;
-        case D3Q27System::N:
+        case D3Q27System::DIR_0P0:
             (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::B:
+        case D3Q27System::DIR_00M:
             (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f;
             break;
-        case D3Q27System::T:
+        case D3Q27System::DIR_00P:
             (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::SW:
+        case D3Q27System::DIR_MM0:
             (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f;
             break;
-        case D3Q27System::NE:
+        case D3Q27System::DIR_PP0:
             (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::NW:
+        case D3Q27System::DIR_MP0:
             (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::SE:
+        case D3Q27System::DIR_PM0:
             (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f;
             break;
-        case D3Q27System::BW:
+        case D3Q27System::DIR_M0M:
             (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f;
             break;
-        case D3Q27System::TE:
+        case D3Q27System::DIR_P0P:
             (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::TW:
+        case D3Q27System::DIR_M0P:
             (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::BE:
+        case D3Q27System::DIR_P0M:
             (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f;
             break;
-        case D3Q27System::BS:
+        case D3Q27System::DIR_0MM:
             (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f;
             break;
-        case D3Q27System::TN:
+        case D3Q27System::DIR_0PP:
             (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f;
             break;
-        case D3Q27System::TS:
+        case D3Q27System::DIR_0MP:
             (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::BN:
+        case D3Q27System::DIR_0PM:
             (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::BSW:
+        case D3Q27System::DIR_MMM:
             (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f;
             break;
-        case D3Q27System::TNE:
+        case D3Q27System::DIR_PPP:
             (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f;
             break;
-        case D3Q27System::BSE:
+        case D3Q27System::DIR_PMM:
             (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f;
             break;
-        case D3Q27System::TNW:
+        case D3Q27System::DIR_MPP:
             (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f;
             break;
-        case D3Q27System::BNW:
+        case D3Q27System::DIR_MPM:
             (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::TSE:
+        case D3Q27System::DIR_PMP:
             (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::BNE:
+        case D3Q27System::DIR_PPM:
             (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::TSW:
+        case D3Q27System::DIR_MMP:
             (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::REST:
+        case D3Q27System::DIR_000:
             (*this->zeroDistributions)(x1, x2, x3) = f;
             break;
         default:
@@ -339,144 +339,144 @@ void D3Q27EsoTwist3DSplittedVector::setDistributionInvForDirection(const LBMReal
                                                                    size_t x3, unsigned long int direction)
 {
     if ((direction & EsoTwistD3Q27System::etE) == EsoTwistD3Q27System::etE)
-        (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::E];
+        (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::DIR_P00];
     if ((direction & EsoTwistD3Q27System::etW) == EsoTwistD3Q27System::etW)
-        (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::W];
+        (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::DIR_M00];
     if ((direction & EsoTwistD3Q27System::etS) == EsoTwistD3Q27System::etS)
-        (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::S];
+        (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::DIR_0M0];
     if ((direction & EsoTwistD3Q27System::etN) == EsoTwistD3Q27System::etN)
-        (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::N];
+        (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::DIR_0P0];
     if ((direction & EsoTwistD3Q27System::etB) == EsoTwistD3Q27System::etB)
-        (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::B];
+        (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::DIR_00M];
     if ((direction & EsoTwistD3Q27System::etT) == EsoTwistD3Q27System::etT)
-        (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::T];
+        (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::DIR_00P];
     if ((direction & EsoTwistD3Q27System::etSW) == EsoTwistD3Q27System::etSW)
-        (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::SW];
+        (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_MM0];
     if ((direction & EsoTwistD3Q27System::etNE) == EsoTwistD3Q27System::etNE)
-        (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::NE];
+        (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::DIR_PP0];
     if ((direction & EsoTwistD3Q27System::etNW) == EsoTwistD3Q27System::etNW)
-        (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::NW];
+        (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::DIR_MP0];
     if ((direction & EsoTwistD3Q27System::etSE) == EsoTwistD3Q27System::etSE)
-        (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::SE];
+        (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::DIR_PM0];
     if ((direction & EsoTwistD3Q27System::etBW) == EsoTwistD3Q27System::etBW)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::BW];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_M0M];
     if ((direction & EsoTwistD3Q27System::etTE) == EsoTwistD3Q27System::etTE)
-        (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::TE];
+        (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::DIR_P0P];
     if ((direction & EsoTwistD3Q27System::etTW) == EsoTwistD3Q27System::etTW)
-        (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::TW];
+        (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::DIR_M0P];
     if ((direction & EsoTwistD3Q27System::etBE) == EsoTwistD3Q27System::etBE)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::BE];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::DIR_P0M];
     if ((direction & EsoTwistD3Q27System::etBS) == EsoTwistD3Q27System::etBS)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::BS];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_0MM];
     if ((direction & EsoTwistD3Q27System::etTN) == EsoTwistD3Q27System::etTN)
-        (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::TN];
+        (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::DIR_0PP];
     if ((direction & EsoTwistD3Q27System::etTS) == EsoTwistD3Q27System::etTS)
-        (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::TS];
+        (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::DIR_0MP];
     if ((direction & EsoTwistD3Q27System::etBN) == EsoTwistD3Q27System::etBN)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::BN];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::DIR_0PM];
     if ((direction & EsoTwistD3Q27System::etBSW) == EsoTwistD3Q27System::etBSW)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::BSW];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_MMM];
     if ((direction & EsoTwistD3Q27System::etTNE) == EsoTwistD3Q27System::etTNE)
-        (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::TNE];
+        (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::DIR_PPP];
     if ((direction & EsoTwistD3Q27System::etBSE) == EsoTwistD3Q27System::etBSE)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::BSE];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_PMM];
     if ((direction & EsoTwistD3Q27System::etTNW) == EsoTwistD3Q27System::etTNW)
-        (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::TNW];
+        (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::DIR_MPP];
     if ((direction & EsoTwistD3Q27System::etBNW) == EsoTwistD3Q27System::etBNW)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::BNW];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_MPM];
     if ((direction & EsoTwistD3Q27System::etTSE) == EsoTwistD3Q27System::etTSE)
-        (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::TSE];
+        (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::DIR_PMP];
     if ((direction & EsoTwistD3Q27System::etBNE) == EsoTwistD3Q27System::etBNE)
-        (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::BNE];
+        (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::DIR_PPM];
     if ((direction & EsoTwistD3Q27System::etTSW) == EsoTwistD3Q27System::etTSW)
-        (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::TSW];
+        (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_MMP];
     if ((direction & EsoTwistD3Q27System::REST) == EsoTwistD3Q27System::REST)
-        (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST];
+        (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27EsoTwist3DSplittedVector::setDistributionInvForDirection(LBMReal f, size_t x1, size_t x2, size_t x3,
                                                                    unsigned long int direction)
 {
     switch (direction) {
-        case D3Q27System::E:
+        case D3Q27System::DIR_P00:
             (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f;
             break;
-        case D3Q27System::W:
+        case D3Q27System::DIR_M00:
             (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f;
             break;
-        case D3Q27System::S:
+        case D3Q27System::DIR_0M0:
             (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::N:
+        case D3Q27System::DIR_0P0:
             (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f;
             break;
-        case D3Q27System::B:
+        case D3Q27System::DIR_00M:
             (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::T:
+        case D3Q27System::DIR_00P:
             (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f;
             break;
-        case D3Q27System::SW:
+        case D3Q27System::DIR_MM0:
             (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::NE:
+        case D3Q27System::DIR_PP0:
             (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f;
             break;
-        case D3Q27System::NW:
+        case D3Q27System::DIR_MP0:
             (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f;
             break;
-        case D3Q27System::SE:
+        case D3Q27System::DIR_PM0:
             (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::BW:
+        case D3Q27System::DIR_M0M:
             (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::TE:
+        case D3Q27System::DIR_P0P:
             (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f;
             break;
-        case D3Q27System::TW:
+        case D3Q27System::DIR_M0P:
             (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f;
             break;
-        case D3Q27System::BE:
+        case D3Q27System::DIR_P0M:
             (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::BS:
+        case D3Q27System::DIR_0MM:
             (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f;
             break;
-        case D3Q27System::TN:
+        case D3Q27System::DIR_0PP:
             (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f;
             break;
-        case D3Q27System::TS:
+        case D3Q27System::DIR_0MP:
             (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::BN:
+        case D3Q27System::DIR_0PM:
             (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::BSW:
+        case D3Q27System::DIR_MMM:
             (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f;
             break;
-        case D3Q27System::TNE:
+        case D3Q27System::DIR_PPP:
             (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f;
             break;
-        case D3Q27System::BSE:
+        case D3Q27System::DIR_PMM:
             (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f;
             break;
-        case D3Q27System::TNW:
+        case D3Q27System::DIR_MPP:
             (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f;
             break;
-        case D3Q27System::BNW:
+        case D3Q27System::DIR_MPM:
             (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::TSE:
+        case D3Q27System::DIR_PMP:
             (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::BNE:
+        case D3Q27System::DIR_PPM:
             (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f;
             break;
-        case D3Q27System::TSW:
+        case D3Q27System::DIR_MMP:
             (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f;
             break;
-        case D3Q27System::REST:
+        case D3Q27System::DIR_000:
             (*this->zeroDistributions)(x1, x2, x3) = f;
             break;
         default:
@@ -487,59 +487,59 @@ void D3Q27EsoTwist3DSplittedVector::setDistributionInvForDirection(LBMReal f, si
 LBMReal D3Q27EsoTwist3DSplittedVector::getDistributionForDirection(size_t x1, size_t x2, size_t x3, int direction)
 {
     switch (direction) {
-        case D3Q27System::W:
+        case D3Q27System::DIR_M00:
             return (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
-        case D3Q27System::E:
+        case D3Q27System::DIR_P00:
             return (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
-        case D3Q27System::N:
+        case D3Q27System::DIR_0P0:
             return (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
-        case D3Q27System::S:
+        case D3Q27System::DIR_0M0:
             return (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
-        case D3Q27System::T:
+        case D3Q27System::DIR_00P:
             return (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
-        case D3Q27System::B:
+        case D3Q27System::DIR_00M:
             return (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
-        case D3Q27System::NE:
+        case D3Q27System::DIR_PP0:
             return (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
-        case D3Q27System::SW:
+        case D3Q27System::DIR_MM0:
             return (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
-        case D3Q27System::SE:
+        case D3Q27System::DIR_PM0:
             return (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
-        case D3Q27System::NW:
+        case D3Q27System::DIR_MP0:
             return (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
-        case D3Q27System::TE:
+        case D3Q27System::DIR_P0P:
             return (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
-        case D3Q27System::BW:
+        case D3Q27System::DIR_M0M:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
-        case D3Q27System::BE:
+        case D3Q27System::DIR_P0M:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
-        case D3Q27System::TW:
+        case D3Q27System::DIR_M0P:
             return (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
-        case D3Q27System::TN:
+        case D3Q27System::DIR_0PP:
             return (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
-        case D3Q27System::BS:
+        case D3Q27System::DIR_0MM:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
-        case D3Q27System::BN:
+        case D3Q27System::DIR_0PM:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
-        case D3Q27System::TS:
+        case D3Q27System::DIR_0MP:
             return (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
-        case D3Q27System::TNE:
+        case D3Q27System::DIR_PPP:
             return (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
-        case D3Q27System::BSW:
+        case D3Q27System::DIR_MMM:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
-        case D3Q27System::TNW:
+        case D3Q27System::DIR_MPP:
             return (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
-        case D3Q27System::BSE:
+        case D3Q27System::DIR_PMM:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
-        case D3Q27System::TSE:
+        case D3Q27System::DIR_PMP:
             return (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
-        case D3Q27System::BNW:
+        case D3Q27System::DIR_MPM:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
-        case D3Q27System::TSW:
+        case D3Q27System::DIR_MMP:
             return (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
-        case D3Q27System::BNE:
+        case D3Q27System::DIR_PPM:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
-        case D3Q27System::REST:
+        case D3Q27System::DIR_000:
             return (*this->zeroDistributions)(x1, x2, x3);
         default:
             UB_THROW(UbException(UB_EXARGS, "Direction didn't find"));
@@ -549,59 +549,59 @@ LBMReal D3Q27EsoTwist3DSplittedVector::getDistributionForDirection(size_t x1, si
 LBMReal D3Q27EsoTwist3DSplittedVector::getDistributionInvForDirection(size_t x1, size_t x2, size_t x3, int direction)
 {
     switch (direction) {
-        case D3Q27System::E:
+        case D3Q27System::DIR_P00:
             return (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
-        case D3Q27System::W:
+        case D3Q27System::DIR_M00:
             return (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
-        case D3Q27System::S:
+        case D3Q27System::DIR_0M0:
             return (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
-        case D3Q27System::N:
+        case D3Q27System::DIR_0P0:
             return (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
-        case D3Q27System::B:
+        case D3Q27System::DIR_00M:
             return (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
-        case D3Q27System::T:
+        case D3Q27System::DIR_00P:
             return (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
-        case D3Q27System::SW:
+        case D3Q27System::DIR_MM0:
             return (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
-        case D3Q27System::NE:
+        case D3Q27System::DIR_PP0:
             return (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
-        case D3Q27System::NW:
+        case D3Q27System::DIR_MP0:
             return (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
-        case D3Q27System::SE:
+        case D3Q27System::DIR_PM0:
             return (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
-        case D3Q27System::BW:
+        case D3Q27System::DIR_M0M:
             return (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
-        case D3Q27System::TE:
+        case D3Q27System::DIR_P0P:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
-        case D3Q27System::TW:
+        case D3Q27System::DIR_M0P:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
-        case D3Q27System::BE:
+        case D3Q27System::DIR_P0M:
             return (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
-        case D3Q27System::BS:
+        case D3Q27System::DIR_0MM:
             return (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
-        case D3Q27System::TN:
+        case D3Q27System::DIR_0PP:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
-        case D3Q27System::TS:
+        case D3Q27System::DIR_0MP:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
-        case D3Q27System::BN:
+        case D3Q27System::DIR_0PM:
             return (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
-        case D3Q27System::BSW:
+        case D3Q27System::DIR_MMM:
             return (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
-        case D3Q27System::TNE:
+        case D3Q27System::DIR_PPP:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
-        case D3Q27System::BSE:
+        case D3Q27System::DIR_PMM:
             return (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
-        case D3Q27System::TNW:
+        case D3Q27System::DIR_MPP:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
-        case D3Q27System::BNW:
+        case D3Q27System::DIR_MPM:
             return (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
-        case D3Q27System::TSE:
+        case D3Q27System::DIR_PMP:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
-        case D3Q27System::BNE:
+        case D3Q27System::DIR_PPM:
             return (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
-        case D3Q27System::TSW:
+        case D3Q27System::DIR_MMP:
             return (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
-        case D3Q27System::REST:
+        case D3Q27System::DIR_000:
             return (*this->zeroDistributions)(x1, x2, x3);
         default:
             UB_THROW(UbException(UB_EXARGS, "Direction didn't find"));
diff --git a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h
index e53e38a74daea2a2a40ca53eff1aa1f4febcc27a..12b9e57489e39c15e912b5b679b768c16b89a83b 100644
--- a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h
+++ b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h
@@ -44,6 +44,7 @@ using AverageValuesArray3D     = CbArray4D<LBMReal, IndexerX4X3X2X1>;
 using ShearStressValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>;
 using RelaxationFactorArray3D  = CbArray3D<LBMReal, IndexerX3X2X1>;
 using PhaseFieldArray3D        = CbArray3D<LBMReal, IndexerX3X2X1>;
+using PressureFieldArray3D     = CbArray3D<LBMReal, IndexerX3X2X1>;
 
 //! A class provides an interface for data structures in the kernel.
 class DataSet3D
@@ -88,6 +89,9 @@ public:
     SPtr<PhaseFieldArray3D> getPhaseField2() const;
     void setPhaseField2(SPtr<PhaseFieldArray3D> values);
 
+    SPtr<PressureFieldArray3D> getPressureField() const;
+    void setPressureField(SPtr<PressureFieldArray3D> values);
+
 protected:
 private:
     SPtr<DistributionArray3D> fdistributions;
@@ -103,8 +107,10 @@ private:
     SPtr<ShearStressValuesArray3D> shearStressValues;
 
     SPtr<RelaxationFactorArray3D> relaxationFactor;
+    
     SPtr<PhaseFieldArray3D> phaseField;
     SPtr<PhaseFieldArray3D> phaseField2;
+    SPtr<PressureFieldArray3D> pressureField;
 };
 
 inline SPtr<DistributionArray3D> DataSet3D::getFdistributions() const { return fdistributions; }
@@ -162,4 +168,8 @@ inline SPtr<PhaseFieldArray3D> DataSet3D::getPhaseField2() const { return phaseF
 
 inline void DataSet3D::setPhaseField2(SPtr<PhaseFieldArray3D> values) { phaseField2 = values; }
 
+inline SPtr<PressureFieldArray3D> DataSet3D::getPressureField() const { return pressureField; }
+
+inline void DataSet3D::setPressureField(SPtr<PressureFieldArray3D> values) { pressureField = values; }
+
 #endif
diff --git a/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.cpp b/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.cpp
index c456be678449744475a0ac6932850dceb0ee6f1c..b9a2e069edea6fa3e514b64e4e4174f0964a3a20 100644
--- a/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.cpp
+++ b/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.cpp
@@ -44,12 +44,12 @@ const int EsoTwistD3Q27System::ETX3[EsoTwistD3Q27System::ENDF + 1] = { 0, 0, 0,
                                                                        0, 1, 1, 0, 0, -1, 0, -1, 0, 1, 0, 1, 0 };
 
 const int EsoTwistD3Q27System::etINVDIR[EsoTwistD3Q27System::ENDF + 1] = {
-    D3Q27System::INV_E,   D3Q27System::INV_W,   D3Q27System::INV_N,   D3Q27System::INV_S,   D3Q27System::INV_T,
-    D3Q27System::INV_B,   D3Q27System::INV_NE,  D3Q27System::INV_SW,  D3Q27System::INV_SE,  D3Q27System::INV_NW,
-    D3Q27System::INV_TE,  D3Q27System::INV_BW,  D3Q27System::INV_BE,  D3Q27System::INV_TW,  D3Q27System::INV_TN,
-    D3Q27System::INV_BS,  D3Q27System::INV_BN,  D3Q27System::INV_TS,  D3Q27System::INV_TNE, D3Q27System::INV_TNW,
-    D3Q27System::INV_TSE, D3Q27System::INV_TSW, D3Q27System::INV_BNE, D3Q27System::INV_BNW, D3Q27System::INV_BSE,
-    D3Q27System::INV_BSW, D3Q27System::REST
+    D3Q27System::INV_P00,   D3Q27System::INV_M00,   D3Q27System::INV_0P0,   D3Q27System::INV_0M0,   D3Q27System::INV_00P,
+    D3Q27System::INV_00M,   D3Q27System::INV_PP0,  D3Q27System::INV_MM0,  D3Q27System::INV_PM0,  D3Q27System::INV_MP0,
+    D3Q27System::INV_P0P,  D3Q27System::INV_M0M,  D3Q27System::INV_P0M,  D3Q27System::INV_M0P,  D3Q27System::INV_0PP,
+    D3Q27System::INV_0MM,  D3Q27System::INV_0PM,  D3Q27System::INV_0MP,  D3Q27System::INV_PPP, D3Q27System::INV_MPP,
+    D3Q27System::INV_PMP, D3Q27System::INV_MMP, D3Q27System::INV_PPM, D3Q27System::INV_MPM, D3Q27System::INV_PMM,
+    D3Q27System::INV_MMM, D3Q27System::DIR_000
 };
 
 const unsigned long int EsoTwistD3Q27System::etDIR[EsoTwistD3Q27System::ENDF + 1] = {
diff --git a/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.h b/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.h
index 21752cc48a84b02bc24cb7efe9e3c5912f476dfd..7ccd413c662206ab3a12b3a1c88fcc81450f7a75 100644
--- a/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.h
+++ b/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.h
@@ -47,60 +47,60 @@ struct EsoTwistD3Q27System {
     const static int STARTDIR = D3Q27System::STARTDIR;
     const static int ENDDIR   = D3Q27System::ENDDIR;
 
-    static const int REST = D3Q27System::REST; /*f0 */
-    static const int E    = D3Q27System::E;    /*f1 */
-    static const int W    = D3Q27System::W;    /*f2 */
-    static const int N    = D3Q27System::N;    /*f3 */
-    static const int S    = D3Q27System::S;    /*f4 */
-    static const int T    = D3Q27System::T;    /*f5 */
-    static const int B    = D3Q27System::B;    /*f6 */
-    static const int NE   = D3Q27System::NE;   /*f7 */
-    static const int SW   = D3Q27System::SW;   /*f8 */
-    static const int SE   = D3Q27System::SE;   /*f9 */
-    static const int NW   = D3Q27System::NW;   /*f10*/
-    static const int TE   = D3Q27System::TE;   /*f11*/
-    static const int BW   = D3Q27System::BW;   /*f12*/
-    static const int BE   = D3Q27System::BE;   /*f13*/
-    static const int TW   = D3Q27System::TW;   /*f14*/
-    static const int TN   = D3Q27System::TN;   /*f15*/
-    static const int BS   = D3Q27System::BS;   /*f16*/
-    static const int BN   = D3Q27System::BN;   /*f17*/
-    static const int TS   = D3Q27System::TS;   /*f18*/
-    static const int TNE  = D3Q27System::TNE;
-    static const int TNW  = D3Q27System::TNW;
-    static const int TSE  = D3Q27System::TSE;
-    static const int TSW  = D3Q27System::TSW;
-    static const int BNE  = D3Q27System::BNE;
-    static const int BNW  = D3Q27System::BNW;
-    static const int BSE  = D3Q27System::BSE;
-    static const int BSW  = D3Q27System::BSW;
+    static const int REST = D3Q27System::DIR_000; /*f0 */
+    static const int E    = D3Q27System::DIR_P00;    /*f1 */
+    static const int W    = D3Q27System::DIR_M00;    /*f2 */
+    static const int N    = D3Q27System::DIR_0P0;    /*f3 */
+    static const int S    = D3Q27System::DIR_0M0;    /*f4 */
+    static const int T    = D3Q27System::DIR_00P;    /*f5 */
+    static const int B    = D3Q27System::DIR_00M;    /*f6 */
+    static const int NE   = D3Q27System::DIR_PP0;   /*f7 */
+    static const int SW   = D3Q27System::DIR_MM0;   /*f8 */
+    static const int SE   = D3Q27System::DIR_PM0;   /*f9 */
+    static const int NW   = D3Q27System::DIR_MP0;   /*f10*/
+    static const int TE   = D3Q27System::DIR_P0P;   /*f11*/
+    static const int BW   = D3Q27System::DIR_M0M;   /*f12*/
+    static const int BE   = D3Q27System::DIR_P0M;   /*f13*/
+    static const int TW   = D3Q27System::DIR_M0P;   /*f14*/
+    static const int TN   = D3Q27System::DIR_0PP;   /*f15*/
+    static const int BS   = D3Q27System::DIR_0MM;   /*f16*/
+    static const int BN   = D3Q27System::DIR_0PM;   /*f17*/
+    static const int TS   = D3Q27System::DIR_0MP;   /*f18*/
+    static const int TNE  = D3Q27System::DIR_PPP;
+    static const int TNW  = D3Q27System::DIR_MPP;
+    static const int TSE  = D3Q27System::DIR_PMP;
+    static const int TSW  = D3Q27System::DIR_MMP;
+    static const int BNE  = D3Q27System::DIR_PPM;
+    static const int BNW  = D3Q27System::DIR_MPM;
+    static const int BSE  = D3Q27System::DIR_PMM;
+    static const int BSW  = D3Q27System::DIR_MMM;
 
-    static const int INV_E   = D3Q27System::W;
-    static const int INV_W   = D3Q27System::E;
-    static const int INV_N   = D3Q27System::S;
-    static const int INV_S   = D3Q27System::N;
-    static const int INV_T   = D3Q27System::B;
-    static const int INV_B   = D3Q27System::T;
-    static const int INV_NE  = D3Q27System::SW;
-    static const int INV_SW  = D3Q27System::NE;
-    static const int INV_SE  = D3Q27System::NW;
-    static const int INV_NW  = D3Q27System::SE;
-    static const int INV_TE  = D3Q27System::BW;
-    static const int INV_BW  = D3Q27System::TE;
-    static const int INV_BE  = D3Q27System::TW;
-    static const int INV_TW  = D3Q27System::BE;
-    static const int INV_TN  = D3Q27System::BS;
-    static const int INV_BS  = D3Q27System::TN;
-    static const int INV_BN  = D3Q27System::TS;
-    static const int INV_TS  = D3Q27System::BN;
-    static const int INV_TNE = D3Q27System::BSW;
-    static const int INV_TNW = D3Q27System::BSE;
-    static const int INV_TSE = D3Q27System::BNW;
-    static const int INV_TSW = D3Q27System::BNE;
-    static const int INV_BNE = D3Q27System::TSW;
-    static const int INV_BNW = D3Q27System::TSE;
-    static const int INV_BSE = D3Q27System::TNW;
-    static const int INV_BSW = D3Q27System::TNE;
+    static const int INV_E   = D3Q27System::DIR_M00;
+    static const int INV_W   = D3Q27System::DIR_P00;
+    static const int INV_N   = D3Q27System::DIR_0M0;
+    static const int INV_S   = D3Q27System::DIR_0P0;
+    static const int INV_T   = D3Q27System::DIR_00M;
+    static const int INV_B   = D3Q27System::DIR_00P;
+    static const int INV_NE  = D3Q27System::DIR_MM0;
+    static const int INV_SW  = D3Q27System::DIR_PP0;
+    static const int INV_SE  = D3Q27System::DIR_MP0;
+    static const int INV_NW  = D3Q27System::DIR_PM0;
+    static const int INV_TE  = D3Q27System::DIR_M0M;
+    static const int INV_BW  = D3Q27System::DIR_P0P;
+    static const int INV_BE  = D3Q27System::DIR_M0P;
+    static const int INV_TW  = D3Q27System::DIR_P0M;
+    static const int INV_TN  = D3Q27System::DIR_0MM;
+    static const int INV_BS  = D3Q27System::DIR_0PP;
+    static const int INV_BN  = D3Q27System::DIR_0MP;
+    static const int INV_TS  = D3Q27System::DIR_0PM;
+    static const int INV_TNE = D3Q27System::DIR_MMM;
+    static const int INV_TNW = D3Q27System::DIR_PMM;
+    static const int INV_TSE = D3Q27System::DIR_MPM;
+    static const int INV_TSW = D3Q27System::DIR_PPM;
+    static const int INV_BNE = D3Q27System::DIR_MMP;
+    static const int INV_BNW = D3Q27System::DIR_PMP;
+    static const int INV_BSE = D3Q27System::DIR_MPP;
+    static const int INV_BSW = D3Q27System::DIR_PPP;
 
     static const unsigned long int etZERO; // 1;/*f0 */
     static const unsigned long int etE;    //  2;    /*f1 */
diff --git a/src/cpu/VirtualFluidsCore/Grid/Block3D.cpp b/src/cpu/VirtualFluidsCore/Grid/Block3D.cpp
index 79753c144f5cfff831f1d0415e9434c50b11bcea..c6a75187047f1b507389642baaa8471abecd1683 100644
--- a/src/cpu/VirtualFluidsCore/Grid/Block3D.cpp
+++ b/src/cpu/VirtualFluidsCore/Grid/Block3D.cpp
@@ -34,7 +34,7 @@
 #include "Block3D.h"
 
 #include "Block3DConnector.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMKernel.h"
 
 int Block3D::counter = 0;
@@ -262,28 +262,27 @@ int Block3D::getNumberOfLocalConnectorsForSurfaces()
     if (connectors.size() < 6)
         return count;
 
-    for (int dir = 0; dir <= 5; dir++) // Hard coding. It works if you have 0...5 for E, N ... B
-    {
-        SPtr<Block3DConnector> connector = this->connectors[dir];
-        if (this->connectors[dir]) {
-            if (connector->isLocalConnector())
+    for (SPtr<Block3DConnector> c : connectors) {
+        if (c) {
+            if (c->getSendDir() >= D3Q27System::DIR_P00 && c->getSendDir() <= D3Q27System ::DIR_00M && c->isLocalConnector())
                 count++;
         }
     }
+
     return count;
 }
 //////////////////////////////////////////////////////////////////////////
 int Block3D::getNumberOfRemoteConnectorsForSurfaces()
 {
     int count = 0;
-    for (int dir = 0; dir <= 5; dir++) // Hard coding. It works if you have 0...5 for E, N ... B
-    {
-        SPtr<Block3DConnector> connector = this->connectors[dir];
-        if (this->connectors[dir]) {
-            if (connector->isRemoteConnector())
+
+    for (SPtr<Block3DConnector> c : connectors) {
+        if (c) {
+            if (c->getSendDir() >= D3Q27System::DIR_P00 && c->getSendDir() <= D3Q27System ::DIR_00M && c->isRemoteConnector())
                 count++;
         }
     }
+
     return count;
 }
 void Block3D::setCollectionOfInterpolationFlagCF(int flags) { interpolationFlagCF = flags; }
@@ -335,13 +334,13 @@ std::string Block3D::toString()
     for (std::size_t i = 0; i < connectors.size(); i++)
         if (connectors[i]) {
             if (connectors[i]->isLocalConnector())
-                ss << "l." << Grid3DSystem::getDirectionString(connectors[i]->getSendDir()) << ", ";
+                ss << "l." << D3Q27System::getDirectionString(connectors[i]->getSendDir()) << ", ";
             if (connectors[i]->isRemoteConnector())
-                ss << "r." << Grid3DSystem::getDirectionString(connectors[i]->getSendDir()) << ", ";
+                ss << "r." << D3Q27System::getDirectionString(connectors[i]->getSendDir()) << ", ";
             if (connectors[i]->isInterpolationConnectorCF())
-                ss << "cf." << Grid3DSystem::getDirectionString(connectors[i]->getSendDir()) << ", ";
+                ss << "cf." << D3Q27System::getDirectionString(connectors[i]->getSendDir()) << ", ";
             if (connectors[i]->isInterpolationConnectorFC())
-                ss << "fc." << Grid3DSystem::getDirectionString(connectors[i]->getSendDir()) << ", ";
+                ss << "fc." << D3Q27System::getDirectionString(connectors[i]->getSendDir()) << ", ";
         }
     return ss.str();
 }
diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp b/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp
index 9965b511d615a2cd7764a07cd234012a442fa675..8c9ccab62fa18f96abeca389ab437e62cdc80d7b 100644
--- a/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp
+++ b/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp
@@ -39,21 +39,21 @@
 #include <geometry3d/CoordinateTransformation3D.h>
 
 #include "Block3DVisitor.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "Grid3DVisitor.h"
 #include "Interactor3D.h"
-#include "LBMSystem.h"
+#include "D3Q27System.h"
 #include <Block3D.h>
 #include <Communicator.h>
 
 using namespace std;
 
-Grid3D::Grid3D() { levelSet.resize(Grid3DSystem::MAXLEVEL + 1); }
+Grid3D::Grid3D() { levelSet.resize(D3Q27System::MAXLEVEL + 1); }
 //////////////////////////////////////////////////////////////////////////
 Grid3D::Grid3D(std::shared_ptr<vf::mpi::Communicator> comm)
 
 {
-    levelSet.resize(Grid3DSystem::MAXLEVEL + 1);
+    levelSet.resize(D3Q27System::MAXLEVEL + 1);
     bundle = comm->getBundleID();
     rank = comm->getProcessID();
 }
@@ -63,7 +63,7 @@ Grid3D::Grid3D(std::shared_ptr<vf::mpi::Communicator> comm, int blockNx1, int bl
 
       blockNx1(blockNx1), blockNx2(blockNx2), blockNx3(blockNx2), nx1(gridNx1), nx2(gridNx2), nx3(gridNx3)
 {
-    levelSet.resize(Grid3DSystem::MAXLEVEL + 1);
+    levelSet.resize(D3Q27System::MAXLEVEL + 1);
     bundle = comm->getBundleID();
     rank  = comm->getProcessID();
     trafo = std::make_shared<CoordinateTransformation3D>(0.0, 0.0, 0.0, (double)blockNx1, (double)blockNx2,
@@ -88,7 +88,7 @@ void Grid3D::accept(Block3DVisitor &blockVisitor)
     int startLevel = blockVisitor.getStartLevel();
     int stopLevel  = blockVisitor.getStopLevel();
 
-    if (startLevel < 0 || stopLevel < 0 || startLevel > Grid3DSystem::MAXLEVEL || stopLevel > Grid3DSystem::MAXLEVEL)
+    if (startLevel < 0 || stopLevel < 0 || startLevel > D3Q27System::MAXLEVEL || stopLevel > D3Q27System::MAXLEVEL)
         throw UbException(UB_EXARGS, "not valid level!");
 
     bool dir = startLevel < stopLevel;
@@ -158,8 +158,8 @@ bool Grid3D::deleteBlock(int ix1, int ix2, int ix3, int level)
 void Grid3D::deleteBlocks()
 {
     std::vector<std::vector<SPtr<Block3D>>> blocksVector(25);
-    int minInitLevel = Grid3DSystem::MINLEVEL;
-    int maxInitLevel = Grid3DSystem::MAXLEVEL;
+    int minInitLevel = D3Q27System::MINLEVEL;
+    int maxInitLevel = D3Q27System::MAXLEVEL;
     for (int level = minInitLevel; level < maxInitLevel; level++) {
         getBlocks(level, blocksVector[level]);
         for (SPtr<Block3D> block : blocksVector[level]) //	blocks of the current level
@@ -265,7 +265,7 @@ void Grid3D::getSubBlocks(int ix1, int ix2, int ix3, int level, int levelDepth,
         return;
     if (level > 0 && !this->getSuperBlock(ix1, ix2, ix3, level))
         return;
-    if (level >= Grid3DSystem::MAXLEVEL)
+    if (level >= D3Q27System::MAXLEVEL)
         throw UbException(UB_EXARGS, "Level bigger then MAXLEVEL");
 
     int x1[] = { ix1 << 1, (ix1 << 1) + 1 };
@@ -300,7 +300,7 @@ bool Grid3D::expandBlock(int ix1, int ix2, int ix3, int level)
     ix3 = block->getX3();
 
     int l = level + 1;
-    if (l > Grid3DSystem::MAXLEVEL)
+    if (l > D3Q27System::MAXLEVEL)
         throw UbException(UB_EXARGS, "level > Grid3D::MAXLEVEL");
 
     int west   = ix1 << 1;
@@ -501,7 +501,7 @@ double Grid3D::getDeltaX(SPtr<Block3D> block) const { return getDeltaX(block->ge
 UbTupleDouble3 Grid3D::getNodeOffset(SPtr<Block3D> block) const
 {
     double delta = this->getDeltaX(block);
-    return makeUbTuple(OFFSET * delta, OFFSET * delta, OFFSET * delta);
+    return makeUbTuple(offset * delta, offset * delta, offset * delta);
 }
 ////////////////////////////////////////////////////////////////////////////
 Vector3D Grid3D::getNodeCoordinates(SPtr<Block3D> block, int ix1, int ix2, int ix3) const
@@ -584,7 +584,7 @@ void Grid3D::checkLevel(int level)
     if (level < 0) {
         throw UbException(UB_EXARGS, "l(" + UbSystem::toString(level) + (string) ")<0");
     }
-    if (level > Grid3DSystem::MAXLEVEL) {
+    if (level > D3Q27System::MAXLEVEL) {
         throw UbException(UB_EXARGS, "l(" + UbSystem::toString(level) + (string) ")>MAXLEVEL");
     }
     if (this->levelSet[level].size() == 0) {
@@ -596,7 +596,7 @@ bool Grid3D::hasLevel(int level) const
 {
     if (level < 0)
         return false;
-    if (level > Grid3DSystem::MAXLEVEL)
+    if (level > D3Q27System::MAXLEVEL)
         return false;
     if (this->levelSet[level].size() == 0)
         return false;
@@ -616,7 +616,7 @@ UbTupleInt3 Grid3D::getBlockNX() const { return makeUbTuple(blockNx1, blockNx2,
 
 SPtr<Block3D> Grid3D::getNeighborBlock(int dir, int ix1, int ix2, int ix3, int level) const
 {
-    return this->getBlock(ix1 + Grid3DSystem::EX1[dir], ix2 + Grid3DSystem::EX2[dir], ix3 + Grid3DSystem::EX3[dir],
+    return this->getBlock(ix1 + D3Q27System::DX1[dir], ix2 + D3Q27System::DX2[dir], ix3 + D3Q27System::DX3[dir],
                           level);
 }
 //////////////////////////////////////////////////////////////////////////
@@ -631,8 +631,7 @@ SPtr<Block3D> Grid3D::getNeighborBlock(int dir, SPtr<Block3D> block) const
 //////////////////////////////////////////////////////////////////////////
 void Grid3D::getAllNeighbors(int ix1, int ix2, int ix3, int level, int levelDepth, std::vector<SPtr<Block3D>> &blocks)
 {
-    for (int dir = Grid3DSystem::STARTDIR; dir <= Grid3DSystem::ENDDIR; dir++)
-    // for (int dir = Grid3DSystem::STARTDIR; dir<=Grid3DSystem::TS; dir++)
+    for (int dir = D3Q27System::STARTDIR; dir <= D3Q27System::ENDDIR; dir++)
     {
         this->getNeighborBlocksForDirection(dir, ix1, ix2, ix3, level, levelDepth, blocks);
     }
@@ -1100,82 +1099,82 @@ void Grid3D::getNeighborBlocksForDirection(int dir, int ix1, int ix2, int ix3, i
                                            std::vector<SPtr<Block3D>> &blocks)
 {
     switch (dir) {
-        case Grid3DSystem::E:
+        case D3Q27System::DIR_P00:
             this->getNeighborsEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::W:
+        case D3Q27System::DIR_M00:
             this->getNeighborsWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::N:
+        case D3Q27System::DIR_0P0:
             this->getNeighborsNorth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::S:
+        case D3Q27System::DIR_0M0:
             this->getNeighborsSouth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::T:
+        case D3Q27System::DIR_00P:
             this->getNeighborsTop(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::B:
+        case D3Q27System::DIR_00M:
             this->getNeighborsBottom(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::NE:
+        case D3Q27System::DIR_PP0:
             this->getNeighborsNorthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::SW:
+        case D3Q27System::DIR_MM0:
             this->getNeighborsSouthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::SE:
+        case D3Q27System::DIR_PM0:
             this->getNeighborsSouthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::NW:
+        case D3Q27System::DIR_MP0:
             this->getNeighborsNorthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TE:
+        case D3Q27System::DIR_P0P:
             this->getNeighborsTopEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BW:
+        case D3Q27System::DIR_M0M:
             this->getNeighborsBottomWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BE:
+        case D3Q27System::DIR_P0M:
             this->getNeighborsBottomEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TW:
+        case D3Q27System::DIR_M0P:
             this->getNeighborsTopWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TN:
+        case D3Q27System::DIR_0PP:
             this->getNeighborsTopNorth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BS:
+        case D3Q27System::DIR_0MM:
             this->getNeighborsBottomSouth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BN:
+        case D3Q27System::DIR_0PM:
             this->getNeighborsBottomNorth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TS:
+        case D3Q27System::DIR_0MP:
             this->getNeighborsTopSouth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TNE:
+        case D3Q27System::DIR_PPP:
             this->getNeighborsTopNorthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TNW:
+        case D3Q27System::DIR_MPP:
             this->getNeighborsTopNorthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TSE:
+        case D3Q27System::DIR_PMP:
             this->getNeighborsTopSouthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TSW:
+        case D3Q27System::DIR_MMP:
             this->getNeighborsTopSouthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BNE:
+        case D3Q27System::DIR_PPM:
             this->getNeighborsBottomNorthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BNW:
+        case D3Q27System::DIR_MPM:
             this->getNeighborsBottomNorthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BSE:
+        case D3Q27System::DIR_PMM:
             this->getNeighborsBottomSouthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BSW:
+        case D3Q27System::DIR_MMM:
             this->getNeighborsBottomSouthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
         default:
@@ -1263,85 +1262,85 @@ void Grid3D::getNeighborBlocksForDirectionWithREST(int dir, int ix1, int ix2, in
                                                       std::vector<SPtr<Block3D>> &blocks)
 {
     switch (dir) {
-        case Grid3DSystem::E:
+        case D3Q27System::DIR_P00:
             this->getNeighborsEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::W:
+        case D3Q27System::DIR_M00:
             this->getNeighborsWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::N:
+        case D3Q27System::DIR_0P0:
             this->getNeighborsNorth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::S:
+        case D3Q27System::DIR_0M0:
             this->getNeighborsSouth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::T:
+        case D3Q27System::DIR_00P:
             this->getNeighborsTop(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::B:
+        case D3Q27System::DIR_00M:
             this->getNeighborsBottom(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::NE:
+        case D3Q27System::DIR_PP0:
             this->getNeighborsNorthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::SW:
+        case D3Q27System::DIR_MM0:
             this->getNeighborsSouthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::SE:
+        case D3Q27System::DIR_PM0:
             this->getNeighborsSouthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::NW:
+        case D3Q27System::DIR_MP0:
             this->getNeighborsNorthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TE:
+        case D3Q27System::DIR_P0P:
             this->getNeighborsTopEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BW:
+        case D3Q27System::DIR_M0M:
             this->getNeighborsBottomWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BE:
+        case D3Q27System::DIR_P0M:
             this->getNeighborsBottomEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TW:
+        case D3Q27System::DIR_M0P:
             this->getNeighborsTopWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TN:
+        case D3Q27System::DIR_0PP:
             this->getNeighborsTopNorth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BS:
+        case D3Q27System::DIR_0MM:
             this->getNeighborsBottomSouth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BN:
+        case D3Q27System::DIR_0PM:
             this->getNeighborsBottomNorth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TS:
+        case D3Q27System::DIR_0MP:
             this->getNeighborsTopSouth(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TNE:
+        case D3Q27System::DIR_PPP:
             this->getNeighborsTopNorthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TNW:
+        case D3Q27System::DIR_MPP:
             this->getNeighborsTopNorthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TSE:
+        case D3Q27System::DIR_PMP:
             this->getNeighborsTopSouthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::TSW:
+        case D3Q27System::DIR_MMP:
             this->getNeighborsTopSouthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BNE:
+        case D3Q27System::DIR_PPM:
             this->getNeighborsBottomNorthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BNW:
+        case D3Q27System::DIR_MPM:
             this->getNeighborsBottomNorthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BSE:
+        case D3Q27System::DIR_PMM:
             this->getNeighborsBottomSouthEast(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::BSW:
+        case D3Q27System::DIR_MMM:
             this->getNeighborsBottomSouthWest(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
-        case Grid3DSystem::REST:
+        case D3Q27System::DIR_000:
             this->getNeighborsZero(ix1, ix2, ix3, level, levelDepth, blocks);
             break;
         default:
@@ -1980,7 +1979,7 @@ void Grid3D::getBlocks(int level, int rank, bool active, std::vector<SPtr<Block3
 //////////////////////////////////////////////////////////////////////////
 int Grid3D::getFinestInitializedLevel()
 {
-    for (int i = Grid3DSystem::MAXLEVEL; i >= 0; i--)
+    for (int i = D3Q27System::MAXLEVEL; i >= 0; i--)
         if (this->levelSet[i].size() > 0)
             return (i);
     return (-1);
@@ -1988,7 +1987,7 @@ int Grid3D::getFinestInitializedLevel()
 //////////////////////////////////////////////////////////////////////////
 int Grid3D::getCoarsestInitializedLevel()
 {
-    for (int i = 0; i <= Grid3DSystem::MAXLEVEL; i++)
+    for (int i = 0; i <= D3Q27System::MAXLEVEL; i++)
         if (this->levelSet[i].size() > 0)
             return (i);
     return (-1);
@@ -2221,6 +2220,16 @@ void Grid3D::calcStartCoordinatesWithOutOverlap(SPtr<Block3D> block, double &wor
     }
 }
 //////////////////////////////////////////////////////////////////////////
+int Grid3D::getGhostLayerWidth() const
+{
+    return static_cast<int>(offset + 0.5);
+}
+//////////////////////////////////////////////////////////////////////////
+void Grid3D::setGhostLayerWidth(int ghostLayerWidth)
+{
+    this->offset = static_cast<double>(ghostLayerWidth) - 0.5;
+}
+//////////////////////////////////////////////////////////////////////////
 void Grid3D::setTimeStep(double step) { timeStep = step; }
 //////////////////////////////////////////////////////////////////////////
 double Grid3D::getTimeStep() const { return timeStep; }
@@ -2333,7 +2342,7 @@ void Grid3D::updateDistributedBlocks(std::shared_ptr<vf::mpi::Communicator> comm
             levelSet[l].clear();
         }
         this->levelSet.clear();
-        levelSet.resize(Grid3DSystem::MAXLEVEL + 1);
+        levelSet.resize(D3Q27System::MAXLEVEL + 1);
 
         int rsize = (int)blocks.size();
         for (int i = 0; i < rsize; i += 5) {
diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3D.h b/src/cpu/VirtualFluidsCore/Grid/Grid3D.h
index 7527880cd5360d3006af2edcce2d5b56131d6e37..fabaaa655e2b63201256802473ec037279f0ea3b 100644
--- a/src/cpu/VirtualFluidsCore/Grid/Grid3D.h
+++ b/src/cpu/VirtualFluidsCore/Grid/Grid3D.h
@@ -51,8 +51,6 @@ namespace vf::mpi {class Communicator;}
 class Block3D;
 class Interactor3D;
 
-#define OFFSET 0.5
-
 //! A class implements block grid
 //////////////////////////////////////////////////////////////////////////
 class Grid3D : public enableSharedFromThis<Grid3D>
@@ -214,9 +212,10 @@ public:
     int getNX1() const;
     int getNX2() const;
     int getNX3() const;
-    void calcStartCoordinatesAndDelta(SPtr<Block3D> block, double &worldX1, double &worldX2, double &worldX3,
-                                      double &deltaX);
+    void calcStartCoordinatesAndDelta(SPtr<Block3D> block, double &worldX1, double &worldX2, double &worldX3, double &deltaX);
     void calcStartCoordinatesWithOutOverlap(SPtr<Block3D> block, double &worldX1, double &worldX2, double &worldX3);
+    int getGhostLayerWidth() const;
+    void setGhostLayerWidth(int ghostLayerWidth);
     //////////////////////////////////////////////////////////////////////////
     // LBM
     // double getDeltaT(SPtr<Block3D>) const;
@@ -313,6 +312,8 @@ private:
     double orgDeltaX{ 1.0 };
 
     double timeStep{ 0.0 };
+
+    double offset{ 0.5 };
 };
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.h b/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.h
deleted file mode 100644
index 94c3bf2a75bf8e7137b08c113c1caa878d8c0896..0000000000000000000000000000000000000000
--- a/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.h
+++ /dev/null
@@ -1,291 +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 Grid3DSystem.h
-//! \ingroup Grid
-//! \author Konstantin Kutscher
-//=======================================================================================
-
-#ifndef Grid3DSystem_H
-#define Grid3DSystem_H
-
-#include <cmath>
-#include <iostream>
-#include <string>
-
-#include <basics/utilities/UbException.h>
-#include <basics/utilities/UbMath.h>
-
-namespace Grid3DSystem
-{
-static const int STARTDIR = 0;
-
-static const int E /*f1 */    = 0;
-static const int W /*f2 */    = 1;
-static const int N /*f3 */    = 2;
-static const int S /*f4 */    = 3;
-static const int T /*f5 */    = 4;
-static const int B /*f6 */    = 5;
-static const int NE /*f7 */   = 6;
-static const int SW /*f8 */   = 7;
-static const int SE /*f9 */   = 8;
-static const int NW /*f10*/   = 9;
-static const int TE /*f11*/   = 10;
-static const int BW /*f12*/   = 11;
-static const int BE /*f13*/   = 12;
-static const int TW /*f14*/   = 13;
-static const int TN /*f15*/   = 14;
-static const int BS /*f16*/   = 15;
-static const int BN /*f17*/   = 16;
-static const int TS /*f18*/   = 17;
-static const int TNE          = 18;
-static const int TNW          = 19;
-static const int TSE          = 20;
-static const int TSW          = 21;
-static const int BNE          = 22;
-static const int BNW          = 23;
-static const int BSE          = 24;
-static const int BSW          = 25;
-static const int REST /*f0 */ = 26;
-
-static const int ENDDIR = 25;
-
-static const int INV_E   = W;
-static const int INV_W   = E;
-static const int INV_N   = S;
-static const int INV_S   = N;
-static const int INV_T   = B;
-static const int INV_B   = T;
-static const int INV_NE  = SW;
-static const int INV_NW  = SE;
-static const int INV_SE  = NW;
-static const int INV_SW  = NE;
-static const int INV_TE  = BW;
-static const int INV_TW  = BE;
-static const int INV_BE  = TW;
-static const int INV_BW  = TE;
-static const int INV_TN  = BS;
-static const int INV_TS  = BN;
-static const int INV_BN  = TS;
-static const int INV_BS  = TN;
-static const int INV_TNE = BSW;
-static const int INV_TNW = BSE;
-static const int INV_TSE = BNW;
-static const int INV_TSW = BNE;
-static const int INV_BNE = TSW;
-static const int INV_BNW = TSE;
-static const int INV_BSE = TNW;
-static const int INV_BSW = TNE;
-
-extern const int INVDIR[ENDDIR + 1];
-
-static const int MINLEVEL = 0;
-static const int MAXLEVEL = 25;
-
-extern const int EX1[ENDDIR + 1];
-extern const int EX2[ENDDIR + 1];
-extern const int EX3[ENDDIR + 1];
-
-inline std::string getDirectionString(int direction)
-{
-    switch (direction) {
-        case E:
-            return "E";
-        case W:
-            return "W";
-        case N:
-            return "N";
-        case S:
-            return "S";
-        case T:
-            return "T";
-        case B:
-            return "B";
-        case NE:
-            return "NE";
-        case NW:
-            return "NW";
-        case SE:
-            return "SE";
-        case SW:
-            return "SW";
-        case TE:
-            return "TE";
-        case TW:
-            return "TW";
-        case BE:
-            return "BE";
-        case BW:
-            return "BW";
-        case TN:
-            return "TN";
-        case TS:
-            return "TS";
-        case BN:
-            return "BN";
-        case BS:
-            return "BS";
-        case TNE:
-            return "TNE";
-        case TNW:
-            return "TNW";
-        case TSE:
-            return "TSE";
-        case TSW:
-            return "TSW";
-        case BNE:
-            return "BNE";
-        case BNW:
-            return "BNW";
-        case BSE:
-            return "BSE";
-        case BSW:
-            return "BSW";
-        default:
-            return "Cell3DSystem::getDrectionString(...) - unknown dir";
-    }
-}
-static const int &getInvertDirection(const int &direction);
-
-//////////////////////////////////////////////////////////////////////////
-static inline void setNeighborCoordinatesForDirection(int &x1, int &x2, int &x3, const int &direction)
-{
-    switch (direction) {
-        case Grid3DSystem::E:
-            x1++;
-            break;
-        case Grid3DSystem::N:
-            x2++;
-            break;
-        case Grid3DSystem::T:
-            x3++;
-            break;
-        case Grid3DSystem::W:
-            x1--;
-            break;
-        case Grid3DSystem::S:
-            x2--;
-            break;
-        case Grid3DSystem::B:
-            x3--;
-            break;
-        case Grid3DSystem::NE:
-            x1++;
-            x2++;
-            break;
-        case Grid3DSystem::NW:
-            x1--;
-            x2++;
-            break;
-        case Grid3DSystem::SW:
-            x1--;
-            x2--;
-            break;
-        case Grid3DSystem::SE:
-            x1++;
-            x2--;
-            break;
-        case Grid3DSystem::TE:
-            x1++;
-            x3++;
-            break;
-        case Grid3DSystem::BW:
-            x1--;
-            x3--;
-            break;
-        case Grid3DSystem::BE:
-            x1++;
-            x3--;
-            break;
-        case Grid3DSystem::TW:
-            x1--;
-            x3++;
-            break;
-        case Grid3DSystem::TN:
-            x2++;
-            x3++;
-            break;
-        case Grid3DSystem::BS:
-            x2--;
-            x3--;
-            break;
-        case Grid3DSystem::BN:
-            x2++;
-            x3--;
-            break;
-        case Grid3DSystem::TS:
-            x2--;
-            x3++;
-            break;
-        case Grid3DSystem::TNE:
-            x1++;
-            x2++;
-            x3++;
-            break;
-        case Grid3DSystem::TNW:
-            x1--;
-            x2++;
-            x3++;
-            break;
-        case Grid3DSystem::TSE:
-            x1++;
-            x2--;
-            x3++;
-            break;
-        case Grid3DSystem::TSW:
-            x1--;
-            x2--;
-            x3++;
-            break;
-        case Grid3DSystem::BNE:
-            x1++;
-            x2++;
-            x3--;
-            break;
-        case Grid3DSystem::BNW:
-            x1--;
-            x2++;
-            x3--;
-            break;
-        case Grid3DSystem::BSE:
-            x1++;
-            x2--;
-            x3--;
-            break;
-        case Grid3DSystem::BSW:
-            x1--;
-            x2--;
-            x3--;
-            break;
-        default:
-            throw UbException(UB_EXARGS, "no direction ...");
-    }
-}
-} // namespace Grid3DSystem
-
-#endif
diff --git a/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp b/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp
index bf1895b930f1c61d36d537319b53fe4b0abcd960..a834466f85b85890bf7c1a5a264807e6a0b13ee1 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp
+++ b/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp
@@ -90,108 +90,108 @@ void D3Q27Interactor::initRayVectors()
     int fdir;
     double c1oS2 = UbMath::one_over_sqrt2;
     double c1oS3 = UbMath::one_over_sqrt3;
-    fdir         = D3Q27System::E;
+    fdir         = D3Q27System::DIR_P00;
     rayX1[fdir]  = 1.0;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = 0.0;
-    fdir         = D3Q27System::W;
+    fdir         = D3Q27System::DIR_M00;
     rayX1[fdir]  = -1.0;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = 0.0;
-    fdir         = D3Q27System::N;
+    fdir         = D3Q27System::DIR_0P0;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = 1.0;
     rayX3[fdir]  = 0.0;
-    fdir         = D3Q27System::S;
+    fdir         = D3Q27System::DIR_0M0;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = -1.0;
     rayX3[fdir]  = 0.0;
-    fdir         = D3Q27System::T;
+    fdir         = D3Q27System::DIR_00P;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = 1.0;
-    fdir         = D3Q27System::B;
+    fdir         = D3Q27System::DIR_00M;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = -1.0;
-    fdir         = D3Q27System::NE;
+    fdir         = D3Q27System::DIR_PP0;
     rayX1[fdir]  = c1oS2;
     rayX2[fdir]  = c1oS2;
     rayX3[fdir]  = 0.0;
-    fdir         = D3Q27System::SW;
+    fdir         = D3Q27System::DIR_MM0;
     rayX1[fdir]  = -c1oS2;
     rayX2[fdir]  = -c1oS2;
     rayX3[fdir]  = 0.0;
-    fdir         = D3Q27System::SE;
+    fdir         = D3Q27System::DIR_PM0;
     rayX1[fdir]  = c1oS2;
     rayX2[fdir]  = -c1oS2;
     rayX3[fdir]  = 0.0;
-    fdir         = D3Q27System::NW;
+    fdir         = D3Q27System::DIR_MP0;
     rayX1[fdir]  = -c1oS2;
     rayX2[fdir]  = c1oS2;
     rayX3[fdir]  = 0.0;
-    fdir         = D3Q27System::TE;
+    fdir         = D3Q27System::DIR_P0P;
     rayX1[fdir]  = c1oS2;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = c1oS2;
-    fdir         = D3Q27System::BW;
+    fdir         = D3Q27System::DIR_M0M;
     rayX1[fdir]  = -c1oS2;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = -c1oS2;
-    fdir         = D3Q27System::BE;
+    fdir         = D3Q27System::DIR_P0M;
     rayX1[fdir]  = c1oS2;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = -c1oS2;
-    fdir         = D3Q27System::TW;
+    fdir         = D3Q27System::DIR_M0P;
     rayX1[fdir]  = -c1oS2;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = c1oS2;
-    fdir         = D3Q27System::TN;
+    fdir         = D3Q27System::DIR_0PP;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = c1oS2;
     rayX3[fdir]  = c1oS2;
-    fdir         = D3Q27System::BS;
+    fdir         = D3Q27System::DIR_0MM;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = -c1oS2;
     rayX3[fdir]  = -c1oS2;
-    fdir         = D3Q27System::BN;
+    fdir         = D3Q27System::DIR_0PM;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = c1oS2;
     rayX3[fdir]  = -c1oS2;
-    fdir         = D3Q27System::TS;
+    fdir         = D3Q27System::DIR_0MP;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = -c1oS2;
     rayX3[fdir]  = c1oS2;
 
-    fdir        = D3Q27System::TNW;
+    fdir        = D3Q27System::DIR_MPP;
     rayX1[fdir] = -c1oS3;
     rayX2[fdir] = c1oS3;
     rayX3[fdir] = c1oS3;
-    fdir        = D3Q27System::TNE;
+    fdir        = D3Q27System::DIR_PPP;
     rayX1[fdir] = c1oS3;
     rayX2[fdir] = c1oS3;
     rayX3[fdir] = c1oS3;
-    fdir        = D3Q27System::TSW;
+    fdir        = D3Q27System::DIR_MMP;
     rayX1[fdir] = -c1oS3;
     rayX2[fdir] = -c1oS3;
     rayX3[fdir] = c1oS3;
-    fdir        = D3Q27System::TSE;
+    fdir        = D3Q27System::DIR_PMP;
     rayX1[fdir] = c1oS3;
     rayX2[fdir] = -c1oS3;
     rayX3[fdir] = c1oS3;
-    fdir        = D3Q27System::BNW;
+    fdir        = D3Q27System::DIR_MPM;
     rayX1[fdir] = -c1oS3;
     rayX2[fdir] = c1oS3;
     rayX3[fdir] = -c1oS3;
-    fdir        = D3Q27System::BNE;
+    fdir        = D3Q27System::DIR_PPM;
     rayX1[fdir] = c1oS3;
     rayX2[fdir] = c1oS3;
     rayX3[fdir] = -c1oS3;
-    fdir        = D3Q27System::BSW;
+    fdir        = D3Q27System::DIR_MMM;
     rayX1[fdir] = -c1oS3;
     rayX2[fdir] = -c1oS3;
     rayX3[fdir] = -c1oS3;
-    fdir        = D3Q27System::BSE;
+    fdir        = D3Q27System::DIR_PMM;
     rayX1[fdir] = c1oS3;
     rayX2[fdir] = -c1oS3;
     rayX3[fdir] = -c1oS3;
@@ -327,18 +327,18 @@ bool D3Q27Interactor::setDifferencesToGbObject3D(const SPtr<Block3D> block)
                 UB_EXARGS, "fuer den bei LB nicht vorkommenden Fall deltaX1!=deltaX2!=deltaX3  nicht implementiert ");
 
         vector<double> distNeigh(D3Q27System::FENDDIR + 1, UbMath::sqrt2 * deltaX1);
-        distNeigh[D3Q27System::E] = distNeigh[D3Q27System::W] = distNeigh[D3Q27System::N] = deltaX1;
-        distNeigh[D3Q27System::S] = distNeigh[D3Q27System::T] = distNeigh[D3Q27System::B] = deltaX1;
-        distNeigh[D3Q27System::NE] = distNeigh[D3Q27System::NW] = distNeigh[D3Q27System::SW] =
-            distNeigh[D3Q27System::SE]                          = UbMath::sqrt2 * deltaX1;
-        distNeigh[D3Q27System::TE] = distNeigh[D3Q27System::TN] = distNeigh[D3Q27System::TW] =
-            distNeigh[D3Q27System::TS]                          = UbMath::sqrt2 * deltaX1;
-        distNeigh[D3Q27System::BE] = distNeigh[D3Q27System::BN] = distNeigh[D3Q27System::BW] =
-            distNeigh[D3Q27System::BS]                          = UbMath::sqrt2 * deltaX1;
-        distNeigh[D3Q27System::TNE] = distNeigh[D3Q27System::TNW] = distNeigh[D3Q27System::TSE] =
-            distNeigh[D3Q27System::TSW]                           = UbMath::sqrt3 * deltaX1;
-        distNeigh[D3Q27System::BNE] = distNeigh[D3Q27System::BNW] = distNeigh[D3Q27System::BSE] =
-            distNeigh[D3Q27System::BSW]                           = UbMath::sqrt3 * deltaX1;
+        distNeigh[D3Q27System::DIR_P00] = distNeigh[D3Q27System::DIR_M00] = distNeigh[D3Q27System::DIR_0P0] = deltaX1;
+        distNeigh[D3Q27System::DIR_0M0] = distNeigh[D3Q27System::DIR_00P] = distNeigh[D3Q27System::DIR_00M] = deltaX1;
+        distNeigh[D3Q27System::DIR_PP0] = distNeigh[D3Q27System::DIR_MP0] = distNeigh[D3Q27System::DIR_MM0] =
+            distNeigh[D3Q27System::DIR_PM0]                          = UbMath::sqrt2 * deltaX1;
+        distNeigh[D3Q27System::DIR_P0P] = distNeigh[D3Q27System::DIR_0PP] = distNeigh[D3Q27System::DIR_M0P] =
+            distNeigh[D3Q27System::DIR_0MP]                          = UbMath::sqrt2 * deltaX1;
+        distNeigh[D3Q27System::DIR_P0M] = distNeigh[D3Q27System::DIR_0PM] = distNeigh[D3Q27System::DIR_M0M] =
+            distNeigh[D3Q27System::DIR_0MM]                          = UbMath::sqrt2 * deltaX1;
+        distNeigh[D3Q27System::DIR_PPP] = distNeigh[D3Q27System::DIR_MPP] = distNeigh[D3Q27System::DIR_PMP] =
+            distNeigh[D3Q27System::DIR_MMP]                           = UbMath::sqrt3 * deltaX1;
+        distNeigh[D3Q27System::DIR_PPM] = distNeigh[D3Q27System::DIR_MPM] = distNeigh[D3Q27System::DIR_PMM] =
+            distNeigh[D3Q27System::DIR_MMM]                           = UbMath::sqrt3 * deltaX1;
         double q;
         bool pointOnBoundary = false;
 
@@ -613,132 +613,132 @@ void D3Q27Interactor::addQsLineSet(std::vector<UbTupleFloat3> &nodes, std::vecto
                     if (bc->hasBoundaryConditionFlag(D3Q27System::INVDIR[dir])) {
                         double x1b, x2b, x3b, q = bc->getQ(dir);
                         switch (dir) {
-                            case D3Q27System::E:
+                            case D3Q27System::DIR_P00:
                                 x1b = x1a + q * dx;
                                 x2b = x2a;
                                 x3b = x3a;
                                 break;
-                            case D3Q27System::N:
+                            case D3Q27System::DIR_0P0:
                                 x1b = x1a;
                                 x2b = x2a + q * dx;
                                 x3b = x3a;
                                 break;
-                            case D3Q27System::W:
+                            case D3Q27System::DIR_M00:
                                 x1b = x1a - q * dx;
                                 x2b = x2a;
                                 x3b = x3a;
                                 break;
-                            case D3Q27System::S:
+                            case D3Q27System::DIR_0M0:
                                 x1b = x1a;
                                 x2b = x2a - q * dx;
                                 x3b = x3a;
                                 break;
-                            case D3Q27System::NE:
+                            case D3Q27System::DIR_PP0:
                                 x1b = x1a + q * dx;
                                 x2b = x2a + q * dx;
                                 x3b = x3a;
                                 break;
-                            case D3Q27System::NW:
+                            case D3Q27System::DIR_MP0:
                                 x1b = x1a - q * dx;
                                 x2b = x2a + q * dx;
                                 x3b = x3a;
                                 break;
-                            case D3Q27System::SW:
+                            case D3Q27System::DIR_MM0:
                                 x1b = x1a - q * dx;
                                 x2b = x2a - q * dx;
                                 x3b = x3a;
                                 break;
-                            case D3Q27System::SE:
+                            case D3Q27System::DIR_PM0:
                                 x1b = x1a + q * dx;
                                 x2b = x2a - q * dx;
                                 x3b = x3a;
                                 break;
-                            case D3Q27System::T:
+                            case D3Q27System::DIR_00P:
                                 x1b = x1a;
                                 x2b = x2a;
                                 x3b = x3a + q * dx;
                                 break;
-                            case D3Q27System::TE:
+                            case D3Q27System::DIR_P0P:
                                 x1b = x1a + q * dx;
                                 x2b = x2a;
                                 x3b = x3a + q * dx;
                                 break;
-                            case D3Q27System::TN:
+                            case D3Q27System::DIR_0PP:
                                 x1b = x1a;
                                 x2b = x2a + q * dx;
                                 x3b = x3a + q * dx;
                                 break;
-                            case D3Q27System::TW:
+                            case D3Q27System::DIR_M0P:
                                 x1b = x1a - q * dx;
                                 x2b = x2a;
                                 x3b = x3a + q * dx;
                                 break;
-                            case D3Q27System::TS:
+                            case D3Q27System::DIR_0MP:
                                 x1b = x1a;
                                 x2b = x2a - q * dx;
                                 x3b = x3a + q * dx;
                                 break;
-                            case D3Q27System::B:
+                            case D3Q27System::DIR_00M:
                                 x1b = x1a;
                                 x2b = x2a;
                                 x3b = x3a - q * dx;
                                 break;
-                            case D3Q27System::BE:
+                            case D3Q27System::DIR_P0M:
                                 x1b = x1a + q * dx;
                                 x2b = x2a;
                                 x3b = x3a - q * dx;
                                 break;
-                            case D3Q27System::BN:
+                            case D3Q27System::DIR_0PM:
                                 x1b = x1a;
                                 x2b = x2a + q * dx;
                                 x3b = x3a - q * dx;
                                 break;
-                            case D3Q27System::BW:
+                            case D3Q27System::DIR_M0M:
                                 x1b = x1a - q * dx;
                                 x2b = x2a;
                                 x3b = x3a - q * dx;
                                 break;
-                            case D3Q27System::BS:
+                            case D3Q27System::DIR_0MM:
                                 x1b = x1a;
                                 x2b = x2a - q * dx;
                                 x3b = x3a - q * dx;
                                 break;
-                            case D3Q27System::TNE:
+                            case D3Q27System::DIR_PPP:
                                 x1b = x1a + q * dx;
                                 x2b = x2a + q * dx;
                                 x3b = x3a + q * dx;
                                 break;
-                            case D3Q27System::BSW:
+                            case D3Q27System::DIR_MMM:
                                 x1b = x1a - q * dx;
                                 x2b = x2a - q * dx;
                                 x3b = x3a - q * dx;
                                 break;
-                            case D3Q27System::BNE:
+                            case D3Q27System::DIR_PPM:
                                 x1b = x1a + q * dx;
                                 x2b = x2a + q * dx;
                                 x3b = x3a - q * dx;
                                 break;
-                            case D3Q27System::TSW:
+                            case D3Q27System::DIR_MMP:
                                 x1b = x1a - q * dx;
                                 x2b = x2a - q * dx;
                                 x3b = x3a + q * dx;
                                 break;
-                            case D3Q27System::TSE:
+                            case D3Q27System::DIR_PMP:
                                 x1b = x1a + q * dx;
                                 x2b = x2a - q * dx;
                                 x3b = x3a + q * dx;
                                 break;
-                            case D3Q27System::BNW:
+                            case D3Q27System::DIR_MPM:
                                 x1b = x1a - q * dx;
                                 x2b = x2a + q * dx;
                                 x3b = x3a - q * dx;
                                 break;
-                            case D3Q27System::BSE:
+                            case D3Q27System::DIR_PMM:
                                 x1b = x1a + q * dx;
                                 x2b = x2a - q * dx;
                                 x3b = x3a - q * dx;
                                 break;
-                            case D3Q27System::TNW:
+                            case D3Q27System::DIR_MPP:
                                 x1b = x1a - q * dx;
                                 x2b = x2a + q * dx;
                                 x3b = x3a + q * dx;
@@ -782,17 +782,17 @@ vector<pair<GbPoint3D, GbPoint3D>> D3Q27Interactor::getQsLineSet()
         bool include_TN_Edge = false; //(x1/x2/x3)=([0..blocknx1[/blocknx2/blocknx1)
         bool include_TE_Edge = false; //(x1/x2/x3)=(blocknx1/[0..blocknx2[/blocknx2)
         if (block) {
-            if (!block->getConnector(D3Q27System::N))
+            if (!block->getConnector(D3Q27System::DIR_0P0))
                 include_N_Face = true;
-            if (!block->getConnector(D3Q27System::E))
+            if (!block->getConnector(D3Q27System::DIR_P00))
                 include_E_Face = true;
-            if (!block->getConnector(D3Q27System::T))
+            if (!block->getConnector(D3Q27System::DIR_00P))
                 include_T_Face = true;
-            if (!block->getConnector(D3Q27System::NE) && include_N_Face && include_E_Face)
+            if (!block->getConnector(D3Q27System::DIR_PP0) && include_N_Face && include_E_Face)
                 include_NE_Edge = true;
-            if (!block->getConnector(D3Q27System::TN) && include_T_Face && include_N_Face)
+            if (!block->getConnector(D3Q27System::DIR_0PP) && include_T_Face && include_N_Face)
                 include_TN_Edge = true;
-            if (!block->getConnector(D3Q27System::TE) && include_T_Face && include_E_Face)
+            if (!block->getConnector(D3Q27System::DIR_P0P) && include_T_Face && include_E_Face)
                 include_TE_Edge = true;
         }
 
@@ -834,132 +834,132 @@ vector<pair<GbPoint3D, GbPoint3D>> D3Q27Interactor::getQsLineSet()
                         if (bc->hasBoundaryConditionFlag(D3Q27System::INVDIR[dir])) {
                             double x1b, x2b, x3b, q = bc->getQ(dir);
                             switch (dir) {
-                                case D3Q27System::E:
+                                case D3Q27System::DIR_P00:
                                     x1b = x1a + q * dx;
                                     x2b = x2a;
                                     x3b = x3a;
                                     break;
-                                case D3Q27System::N:
+                                case D3Q27System::DIR_0P0:
                                     x1b = x1a;
                                     x2b = x2a + q * dx;
                                     x3b = x3a;
                                     break;
-                                case D3Q27System::W:
+                                case D3Q27System::DIR_M00:
                                     x1b = x1a - q * dx;
                                     x2b = x2a;
                                     x3b = x3a;
                                     break;
-                                case D3Q27System::S:
+                                case D3Q27System::DIR_0M0:
                                     x1b = x1a;
                                     x2b = x2a - q * dx;
                                     x3b = x3a;
                                     break;
-                                case D3Q27System::NE:
+                                case D3Q27System::DIR_PP0:
                                     x1b = x1a + q * dx;
                                     x2b = x2a + q * dx;
                                     x3b = x3a;
                                     break;
-                                case D3Q27System::NW:
+                                case D3Q27System::DIR_MP0:
                                     x1b = x1a - q * dx;
                                     x2b = x2a + q * dx;
                                     x3b = x3a;
                                     break;
-                                case D3Q27System::SW:
+                                case D3Q27System::DIR_MM0:
                                     x1b = x1a - q * dx;
                                     x2b = x2a - q * dx;
                                     x3b = x3a;
                                     break;
-                                case D3Q27System::SE:
+                                case D3Q27System::DIR_PM0:
                                     x1b = x1a + q * dx;
                                     x2b = x2a - q * dx;
                                     x3b = x3a;
                                     break;
-                                case D3Q27System::T:
+                                case D3Q27System::DIR_00P:
                                     x1b = x1a;
                                     x2b = x2a;
                                     x3b = x3a + q * dx;
                                     break;
-                                case D3Q27System::TE:
+                                case D3Q27System::DIR_P0P:
                                     x1b = x1a + q * dx;
                                     x2b = x2a;
                                     x3b = x3a + q * dx;
                                     break;
-                                case D3Q27System::TN:
+                                case D3Q27System::DIR_0PP:
                                     x1b = x1a;
                                     x2b = x2a + q * dx;
                                     x3b = x3a + q * dx;
                                     break;
-                                case D3Q27System::TW:
+                                case D3Q27System::DIR_M0P:
                                     x1b = x1a - q * dx;
                                     x2b = x2a;
                                     x3b = x3a + q * dx;
                                     break;
-                                case D3Q27System::TS:
+                                case D3Q27System::DIR_0MP:
                                     x1b = x1a;
                                     x2b = x2a - q * dx;
                                     x3b = x3a + q * dx;
                                     break;
-                                case D3Q27System::B:
+                                case D3Q27System::DIR_00M:
                                     x1b = x1a;
                                     x2b = x2a;
                                     x3b = x3a - q * dx;
                                     break;
-                                case D3Q27System::BE:
+                                case D3Q27System::DIR_P0M:
                                     x1b = x1a + q * dx;
                                     x2b = x2a;
                                     x3b = x3a - q * dx;
                                     break;
-                                case D3Q27System::BN:
+                                case D3Q27System::DIR_0PM:
                                     x1b = x1a;
                                     x2b = x2a + q * dx;
                                     x3b = x3a - q * dx;
                                     break;
-                                case D3Q27System::BW:
+                                case D3Q27System::DIR_M0M:
                                     x1b = x1a - q * dx;
                                     x2b = x2a;
                                     x3b = x3a - q * dx;
                                     break;
-                                case D3Q27System::BS:
+                                case D3Q27System::DIR_0MM:
                                     x1b = x1a;
                                     x2b = x2a - q * dx;
                                     x3b = x3a - q * dx;
                                     break;
-                                case D3Q27System::TNE:
+                                case D3Q27System::DIR_PPP:
                                     x1b = x1a + q * dx;
                                     x2b = x2a + q * dx;
                                     x3b = x3a + q * dx;
                                     break;
-                                case D3Q27System::BSW:
+                                case D3Q27System::DIR_MMM:
                                     x1b = x1a - q * dx;
                                     x2b = x2a - q * dx;
                                     x3b = x3a - q * dx;
                                     break;
-                                case D3Q27System::BNE:
+                                case D3Q27System::DIR_PPM:
                                     x1b = x1a + q * dx;
                                     x2b = x2a + q * dx;
                                     x3b = x3a - q * dx;
                                     break;
-                                case D3Q27System::TSW:
+                                case D3Q27System::DIR_MMP:
                                     x1b = x1a - q * dx;
                                     x2b = x2a - q * dx;
                                     x3b = x3a + q * dx;
                                     break;
-                                case D3Q27System::TSE:
+                                case D3Q27System::DIR_PMP:
                                     x1b = x1a + q * dx;
                                     x2b = x2a - q * dx;
                                     x3b = x3a + q * dx;
                                     break;
-                                case D3Q27System::BNW:
+                                case D3Q27System::DIR_MPM:
                                     x1b = x1a - q * dx;
                                     x2b = x2a + q * dx;
                                     x3b = x3a - q * dx;
                                     break;
-                                case D3Q27System::BSE:
+                                case D3Q27System::DIR_PMM:
                                     x1b = x1a + q * dx;
                                     x2b = x2a - q * dx;
                                     x3b = x3a - q * dx;
                                     break;
-                                case D3Q27System::TNW:
+                                case D3Q27System::DIR_MPP:
                                     x1b = x1a - q * dx;
                                     x2b = x2a + q * dx;
                                     x3b = x3a + q * dx;
diff --git a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp
index 37c6c47f05215b1d210ef943e639b1cb957ca63d..c7b13d3834a6bb822b945f9425ba21b8d5be399d 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp
+++ b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp
@@ -364,9 +364,9 @@ void D3Q27TriFaceMeshInteractor::setQs(const double &timeStep)
                 //            tmpSolidNodesFromOtherInteractors[block];
                 double q, distance;
 
-                double &nodeDx1 = nodeDeltaToNeigh[level][D3Q27System::E];
-                double &nodeDx2 = nodeDeltaToNeigh[level][D3Q27System::N];
-                double &nodeDx3 = nodeDeltaToNeigh[level][D3Q27System::T];
+                double &nodeDx1 = nodeDeltaToNeigh[level][D3Q27System::DIR_P00];
+                double &nodeDx2 = nodeDeltaToNeigh[level][D3Q27System::DIR_0P0];
+                double &nodeDx3 = nodeDeltaToNeigh[level][D3Q27System::DIR_00P];
 
                 // fuer OBB-Test
                 double qEinflussDelta = 1.1 * sqrt(nodeDx1 * nodeDx1 + nodeDx2 * nodeDx2 + nodeDx3 * nodeDx3);
@@ -522,7 +522,8 @@ void D3Q27TriFaceMeshInteractor::setQs(const double &timeStep)
                                         bc = SPtr<BoundaryConditions>(new BoundaryConditions);
                                         ;
                                         bcMatrix->setBC(ix1, ix2, ix3, bc);
-                                    } else if (UbMath::less(bc->getQ(fdir), q)) // schon ein kuerzeres q voehanden?
+                                    } else if (UbMath::less(bc->getQ(fdir), q) &&
+                                               UbMath::equal(-999.0, q)) // schon ein kuerzeres q voehanden?
                                     {
                                         // neu:: 18.05.2010
                                         // um falsche qs die evtl durch die "wand" gehen zu vermeiden
@@ -879,9 +880,9 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const double &timeStep)
                 std::set<std::vector<int>> &solidsFromOtherInteractors = tmpSolidNodesFromOtherInteractors[block];
                 double q, internX1, internX2, internX3, distance;
 
-                double &nodeDx1 = nodeDeltaToNeigh[level][D3Q27System::E];
-                double &nodeDx2 = nodeDeltaToNeigh[level][D3Q27System::N];
-                double &nodeDx3 = nodeDeltaToNeigh[level][D3Q27System::T];
+                double &nodeDx1 = nodeDeltaToNeigh[level][D3Q27System::DIR_P00];
+                double &nodeDx2 = nodeDeltaToNeigh[level][D3Q27System::DIR_0P0];
+                double &nodeDx3 = nodeDeltaToNeigh[level][D3Q27System::DIR_00P];
 
                 // fuer OBB-Test
                 double qEinflussDelta = 1.1 * sqrt(nodeDx1 * nodeDx1 + nodeDx2 * nodeDx2 + nodeDx3 * nodeDx3);
@@ -1180,9 +1181,9 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const double &timeStep)
 
                 std::set<UbTupleInt3> &solidNodeIndices = this->solidNodeIndicesMap[block];
 
-                float nodeDeltaX1 = (float)nodeDeltaToNeigh[level][D3Q27System::E];
-                float nodeDeltaX2 = (float)nodeDeltaToNeigh[level][D3Q27System::N];
-                float nodeDeltaX3 = (float)nodeDeltaToNeigh[level][D3Q27System::T];
+                float nodeDeltaX1 = (float)nodeDeltaToNeigh[level][D3Q27System::DIR_P00];
+                float nodeDeltaX2 = (float)nodeDeltaToNeigh[level][D3Q27System::DIR_0P0];
+                float nodeDeltaX3 = (float)nodeDeltaToNeigh[level][D3Q27System::DIR_00P];
 
                 // flagfield matrix initialisieren
                 CbArray3D<FLAGS> flagField(blocknx1, blocknx2, blocknx3, UNDEF_FLAG);
diff --git a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp
index f96c7aa2f75391c667b873e8a91a758a989d9cc2..38e5be2e5d35a51f79cb1da8ff7ce9b8b5589656 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp
@@ -80,7 +80,7 @@ void InteractorsHelper::deleteSolidBlocks()
         }
     }
 
-    if (deleteBlocks)
+    if (interactors.size() > 0 && deleteBlocks)
         updateGrid();
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp
index 20851b019a3a0abd2c8865c7c40530e73bcf6245..50a5339ea01d70ff0076ef81bda16db22e56ffe7 100644
--- a/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp
@@ -91,117 +91,117 @@ void BGKLBMKernel::calculate(int step)
                     //////////////////////////////////////////////////////////////////////////
                     // read distribution
                     ////////////////////////////////////////////////////////////////////////////
-                    f[REST] = (*this->zeroDistributions)(x1, x2, x3);
+                    f[DIR_000] = (*this->zeroDistributions)(x1, x2, x3);
 
-                    f[E]   = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
-                    f[N]   = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
-                    f[T]   = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
-                    f[NE]  = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
-                    f[NW]  = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3);
-                    f[TE]  = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
-                    f[TW]  = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3);
-                    f[TN]  = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
-                    f[TS]  = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3);
-                    f[TNE] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
-                    f[TNW] = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3);
-                    f[TSE] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3);
-                    f[TSW] = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3);
+                    f[DIR_P00]   = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
+                    f[DIR_0P0]   = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
+                    f[DIR_00P]   = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
+                    f[DIR_PP0]  = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
+                    f[DIR_MP0]  = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3);
+                    f[DIR_P0P]  = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
+                    f[DIR_M0P]  = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3);
+                    f[DIR_0PP]  = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
+                    f[DIR_0MP]  = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3);
+                    f[DIR_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+                    f[DIR_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3);
+                    f[DIR_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3);
+                    f[DIR_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3);
 
-                    f[W]   = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3);
-                    f[S]   = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3);
-                    f[B]   = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p);
-                    f[SW]  = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3);
-                    f[SE]  = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3);
-                    f[BW]  = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p);
-                    f[BE]  = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p);
-                    f[BS]  = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p);
-                    f[BN]  = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p);
-                    f[BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-                    f[BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p);
-                    f[BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p);
-                    f[BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p);
+                    f[DIR_M00]   = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3);
+                    f[DIR_0M0]   = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3);
+                    f[DIR_00M]   = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p);
+                    f[DIR_MM0]  = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3);
+                    f[DIR_PM0]  = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3);
+                    f[DIR_M0M]  = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p);
+                    f[DIR_P0M]  = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p);
+                    f[DIR_0MM]  = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p);
+                    f[DIR_0PM]  = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p);
+                    f[DIR_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                    f[DIR_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                    f[DIR_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                    f[DIR_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p);
                     //////////////////////////////////////////////////////////////////////////
 
-                    drho = f[REST] + f[E] + f[W] + f[N] + f[S] + f[T] + f[B] + f[NE] + f[SW] + f[SE] + f[NW] + f[TE] +
-                           f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS] + f[TNE] + f[TSW] + f[TSE] + f[TNW] +
-                           f[BNE] + f[BSW] + f[BSE] + f[BNW];
+                    drho = f[DIR_000] + f[DIR_P00] + f[DIR_M00] + f[DIR_0P0] + f[DIR_0M0] + f[DIR_00P] + f[DIR_00M] + f[DIR_PP0] + f[DIR_MM0] + f[DIR_PM0] + f[DIR_MP0] + f[DIR_P0P] +
+                           f[DIR_M0M] + f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] + f[DIR_0MM] + f[DIR_0PM] + f[DIR_0MP] + f[DIR_PPP] + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] +
+                           f[DIR_PPM] + f[DIR_MMM] + f[DIR_PMM] + f[DIR_MPM];
 
-                    vx1 = f[E] - f[W] + f[NE] - f[SW] + f[SE] - f[NW] + f[TE] - f[BW] + f[BE] - f[TW] + f[TNE] -
-                          f[TSW] + f[TSE] - f[TNW] + f[BNE] - f[BSW] + f[BSE] - f[BNW];
+                    vx1 = f[DIR_P00] - f[DIR_M00] + f[DIR_PP0] - f[DIR_MM0] + f[DIR_PM0] - f[DIR_MP0] + f[DIR_P0P] - f[DIR_M0M] + f[DIR_P0M] - f[DIR_M0P] + f[DIR_PPP] -
+                          f[DIR_MMP] + f[DIR_PMP] - f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] + f[DIR_PMM] - f[DIR_MPM];
 
-                    vx2 = f[N] - f[S] + f[NE] - f[SW] - f[SE] + f[NW] + f[TN] - f[BS] + f[BN] - f[TS] + f[TNE] -
-                          f[TSW] - f[TSE] + f[TNW] + f[BNE] - f[BSW] - f[BSE] + f[BNW];
+                    vx2 = f[DIR_0P0] - f[DIR_0M0] + f[DIR_PP0] - f[DIR_MM0] - f[DIR_PM0] + f[DIR_MP0] + f[DIR_0PP] - f[DIR_0MM] + f[DIR_0PM] - f[DIR_0MP] + f[DIR_PPP] -
+                          f[DIR_MMP] - f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] + f[DIR_MPM];
 
-                    vx3 = f[T] - f[B] + f[TE] - f[BW] - f[BE] + f[TW] + f[TN] - f[BS] - f[BN] + f[TS] + f[TNE] +
-                          f[TSW] + f[TSE] + f[TNW] - f[BNE] - f[BSW] - f[BSE] - f[BNW];
+                    vx3 = f[DIR_00P] - f[DIR_00M] + f[DIR_P0P] - f[DIR_M0M] - f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] - f[DIR_0MM] - f[DIR_0PM] + f[DIR_0MP] + f[DIR_PPP] +
+                          f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] - f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] - f[DIR_MPM];
 
                     LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
 
-                    feq[REST] = c8o27 * (drho - cu_sq);
-                    feq[E]    = c2o27 * (drho + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq);
-                    feq[W]    = c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq);
-                    feq[N]    = c2o27 * (drho + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq);
-                    feq[S]    = c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq);
-                    feq[T]    = c2o27 * (drho + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq);
-                    feq[B]    = c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq);
-                    feq[NE]   = c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
-                    feq[SW]   = c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
-                    feq[SE]   = c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
-                    feq[NW]   = c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
-                    feq[TE]   = c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
-                    feq[BW]   = c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
-                    feq[BE]   = c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
-                    feq[TW]   = c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
-                    feq[TN]   = c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
-                    feq[BS]   = c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
-                    feq[BN]   = c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
-                    feq[TS]   = c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
-                    feq[TNE]  = c1o216 *
+                    feq[DIR_000] = c8o27 * (drho - cu_sq);
+                    feq[DIR_P00]    = c2o27 * (drho + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq);
+                    feq[DIR_M00]    = c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq);
+                    feq[DIR_0P0]    = c2o27 * (drho + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq);
+                    feq[DIR_0M0]    = c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq);
+                    feq[DIR_00P]    = c2o27 * (drho + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq);
+                    feq[DIR_00M]    = c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq);
+                    feq[DIR_PP0]   = c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
+                    feq[DIR_MM0]   = c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
+                    feq[DIR_PM0]   = c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
+                    feq[DIR_MP0]   = c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
+                    feq[DIR_P0P]   = c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
+                    feq[DIR_M0M]   = c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
+                    feq[DIR_P0M]   = c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
+                    feq[DIR_M0P]   = c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
+                    feq[DIR_0PP]   = c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
+                    feq[DIR_0MM]   = c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
+                    feq[DIR_0PM]   = c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
+                    feq[DIR_0MP]   = c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
+                    feq[DIR_PPP]  = c1o216 *
                                (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq);
-                    feq[BSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) +
+                    feq[DIR_MMM] = c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) +
                                          c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq);
-                    feq[BNE] = c1o216 *
+                    feq[DIR_PPM] = c1o216 *
                                (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq);
-                    feq[TSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) +
+                    feq[DIR_MMP] = c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) +
                                          c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq);
-                    feq[TSE] = c1o216 *
+                    feq[DIR_PMP] = c1o216 *
                                (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq);
-                    feq[BNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) +
+                    feq[DIR_MPM] = c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) +
                                          c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq);
-                    feq[BSE] = c1o216 *
+                    feq[DIR_PMM] = c1o216 *
                                (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq);
-                    feq[TNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) +
+                    feq[DIR_MPP] = c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) +
                                          c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq);
 
                     // Relaxation
-                    f[REST] += (feq[REST] - f[REST]) * collFactor;
-                    f[E] += (feq[E] - f[E]) * collFactor;
-                    f[W] += (feq[W] - f[W]) * collFactor;
-                    f[N] += (feq[N] - f[N]) * collFactor;
-                    f[S] += (feq[S] - f[S]) * collFactor;
-                    f[T] += (feq[T] - f[T]) * collFactor;
-                    f[B] += (feq[B] - f[B]) * collFactor;
-                    f[NE] += (feq[NE] - f[NE]) * collFactor;
-                    f[SW] += (feq[SW] - f[SW]) * collFactor;
-                    f[SE] += (feq[SE] - f[SE]) * collFactor;
-                    f[NW] += (feq[NW] - f[NW]) * collFactor;
-                    f[TE] += (feq[TE] - f[TE]) * collFactor;
-                    f[BW] += (feq[BW] - f[BW]) * collFactor;
-                    f[BE] += (feq[BE] - f[BE]) * collFactor;
-                    f[TW] += (feq[TW] - f[TW]) * collFactor;
-                    f[TN] += (feq[TN] - f[TN]) * collFactor;
-                    f[BS] += (feq[BS] - f[BS]) * collFactor;
-                    f[BN] += (feq[BN] - f[BN]) * collFactor;
-                    f[TS] += (feq[TS] - f[TS]) * collFactor;
+                    f[DIR_000] += (feq[DIR_000] - f[DIR_000]) * collFactor;
+                    f[DIR_P00] += (feq[DIR_P00] - f[DIR_P00]) * collFactor;
+                    f[DIR_M00] += (feq[DIR_M00] - f[DIR_M00]) * collFactor;
+                    f[DIR_0P0] += (feq[DIR_0P0] - f[DIR_0P0]) * collFactor;
+                    f[DIR_0M0] += (feq[DIR_0M0] - f[DIR_0M0]) * collFactor;
+                    f[DIR_00P] += (feq[DIR_00P] - f[DIR_00P]) * collFactor;
+                    f[DIR_00M] += (feq[DIR_00M] - f[DIR_00M]) * collFactor;
+                    f[DIR_PP0] += (feq[DIR_PP0] - f[DIR_PP0]) * collFactor;
+                    f[DIR_MM0] += (feq[DIR_MM0] - f[DIR_MM0]) * collFactor;
+                    f[DIR_PM0] += (feq[DIR_PM0] - f[DIR_PM0]) * collFactor;
+                    f[DIR_MP0] += (feq[DIR_MP0] - f[DIR_MP0]) * collFactor;
+                    f[DIR_P0P] += (feq[DIR_P0P] - f[DIR_P0P]) * collFactor;
+                    f[DIR_M0M] += (feq[DIR_M0M] - f[DIR_M0M]) * collFactor;
+                    f[DIR_P0M] += (feq[DIR_P0M] - f[DIR_P0M]) * collFactor;
+                    f[DIR_M0P] += (feq[DIR_M0P] - f[DIR_M0P]) * collFactor;
+                    f[DIR_0PP] += (feq[DIR_0PP] - f[DIR_0PP]) * collFactor;
+                    f[DIR_0MM] += (feq[DIR_0MM] - f[DIR_0MM]) * collFactor;
+                    f[DIR_0PM] += (feq[DIR_0PM] - f[DIR_0PM]) * collFactor;
+                    f[DIR_0MP] += (feq[DIR_0MP] - f[DIR_0MP]) * collFactor;
 
-                    f[TNE] += (feq[TNE] - f[TNE]) * collFactor;
-                    f[BSW] += (feq[BSW] - f[BSW]) * collFactor;
-                    f[BNE] += (feq[BNE] - f[BNE]) * collFactor;
-                    f[TSW] += (feq[TSW] - f[TSW]) * collFactor;
-                    f[TSE] += (feq[TSE] - f[TSE]) * collFactor;
-                    f[BNW] += (feq[BNW] - f[BNW]) * collFactor;
-                    f[BSE] += (feq[BSE] - f[BSE]) * collFactor;
-                    f[TNW] += (feq[TNW] - f[TNW]) * collFactor;
+                    f[DIR_PPP] += (feq[DIR_PPP] - f[DIR_PPP]) * collFactor;
+                    f[DIR_MMM] += (feq[DIR_MMM] - f[DIR_MMM]) * collFactor;
+                    f[DIR_PPM] += (feq[DIR_PPM] - f[DIR_PPM]) * collFactor;
+                    f[DIR_MMP] += (feq[DIR_MMP] - f[DIR_MMP]) * collFactor;
+                    f[DIR_PMP] += (feq[DIR_PMP] - f[DIR_PMP]) * collFactor;
+                    f[DIR_MPM] += (feq[DIR_MPM] - f[DIR_MPM]) * collFactor;
+                    f[DIR_PMM] += (feq[DIR_PMM] - f[DIR_PMM]) * collFactor;
+                    f[DIR_MPP] += (feq[DIR_MPP] - f[DIR_MPP]) * collFactor;
 
                     //////////////////////////////////////////////////////////////////////////
                     // forcing
@@ -214,39 +214,39 @@ void BGKLBMKernel::calculate(int step)
                         forcingX2 = muForcingX2.Eval();
                         forcingX3 = muForcingX3.Eval();
 
-                        f[REST] += 0.0;
-                        f[E] += 3.0 * c2o27 * (forcingX1);
-                        f[W] += 3.0 * c2o27 * (-forcingX1);
-                        f[N] += 3.0 * c2o27 * (forcingX2);
-                        f[S] += 3.0 * c2o27 * (-forcingX2);
-                        f[T] += 3.0 * c2o27 * (forcingX3);
-                        f[B] += 3.0 * c2o27 * (-forcingX3);
-                        f[NE] += 3.0 * c1o54 * (forcingX1 + forcingX2);
-                        f[SW] += 3.0 * c1o54 * (-forcingX1 - forcingX2);
-                        f[SE] += 3.0 * c1o54 * (forcingX1 - forcingX2);
-                        f[NW] += 3.0 * c1o54 * (-forcingX1 + forcingX2);
-                        f[TE] += 3.0 * c1o54 * (forcingX1 + forcingX3);
-                        f[BW] += 3.0 * c1o54 * (-forcingX1 - forcingX3);
-                        f[BE] += 3.0 * c1o54 * (forcingX1 - forcingX3);
-                        f[TW] += 3.0 * c1o54 * (-forcingX1 + forcingX3);
-                        f[TN] += 3.0 * c1o54 * (forcingX2 + forcingX3);
-                        f[BS] += 3.0 * c1o54 * (-forcingX2 - forcingX3);
-                        f[BN] += 3.0 * c1o54 * (forcingX2 - forcingX3);
-                        f[TS] += 3.0 * c1o54 * (-forcingX2 + forcingX3);
-                        f[TNE] += 3.0 * c1o216 * (forcingX1 + forcingX2 + forcingX3);
-                        f[BSW] += 3.0 * c1o216 * (-forcingX1 - forcingX2 - forcingX3);
-                        f[BNE] += 3.0 * c1o216 * (forcingX1 + forcingX2 - forcingX3);
-                        f[TSW] += 3.0 * c1o216 * (-forcingX1 - forcingX2 + forcingX3);
-                        f[TSE] += 3.0 * c1o216 * (forcingX1 - forcingX2 + forcingX3);
-                        f[BNW] += 3.0 * c1o216 * (-forcingX1 + forcingX2 - forcingX3);
-                        f[BSE] += 3.0 * c1o216 * (forcingX1 - forcingX2 - forcingX3);
-                        f[TNW] += 3.0 * c1o216 * (-forcingX1 + forcingX2 + forcingX3);
+                        f[DIR_000] += 0.0;
+                        f[DIR_P00] += 3.0 * c2o27 * (forcingX1);
+                        f[DIR_M00] += 3.0 * c2o27 * (-forcingX1);
+                        f[DIR_0P0] += 3.0 * c2o27 * (forcingX2);
+                        f[DIR_0M0] += 3.0 * c2o27 * (-forcingX2);
+                        f[DIR_00P] += 3.0 * c2o27 * (forcingX3);
+                        f[DIR_00M] += 3.0 * c2o27 * (-forcingX3);
+                        f[DIR_PP0] += 3.0 * c1o54 * (forcingX1 + forcingX2);
+                        f[DIR_MM0] += 3.0 * c1o54 * (-forcingX1 - forcingX2);
+                        f[DIR_PM0] += 3.0 * c1o54 * (forcingX1 - forcingX2);
+                        f[DIR_MP0] += 3.0 * c1o54 * (-forcingX1 + forcingX2);
+                        f[DIR_P0P] += 3.0 * c1o54 * (forcingX1 + forcingX3);
+                        f[DIR_M0M] += 3.0 * c1o54 * (-forcingX1 - forcingX3);
+                        f[DIR_P0M] += 3.0 * c1o54 * (forcingX1 - forcingX3);
+                        f[DIR_M0P] += 3.0 * c1o54 * (-forcingX1 + forcingX3);
+                        f[DIR_0PP] += 3.0 * c1o54 * (forcingX2 + forcingX3);
+                        f[DIR_0MM] += 3.0 * c1o54 * (-forcingX2 - forcingX3);
+                        f[DIR_0PM] += 3.0 * c1o54 * (forcingX2 - forcingX3);
+                        f[DIR_0MP] += 3.0 * c1o54 * (-forcingX2 + forcingX3);
+                        f[DIR_PPP] += 3.0 * c1o216 * (forcingX1 + forcingX2 + forcingX3);
+                        f[DIR_MMM] += 3.0 * c1o216 * (-forcingX1 - forcingX2 - forcingX3);
+                        f[DIR_PPM] += 3.0 * c1o216 * (forcingX1 + forcingX2 - forcingX3);
+                        f[DIR_MMP] += 3.0 * c1o216 * (-forcingX1 - forcingX2 + forcingX3);
+                        f[DIR_PMP] += 3.0 * c1o216 * (forcingX1 - forcingX2 + forcingX3);
+                        f[DIR_MPM] += 3.0 * c1o216 * (-forcingX1 + forcingX2 - forcingX3);
+                        f[DIR_PMM] += 3.0 * c1o216 * (forcingX1 - forcingX2 - forcingX3);
+                        f[DIR_MPP] += 3.0 * c1o216 * (-forcingX1 + forcingX2 + forcingX3);
                     }
                     //////////////////////////////////////////////////////////////////////////
 #ifdef PROOF_CORRECTNESS
-                    LBMReal rho_post = f[REST] + f[E] + f[W] + f[N] + f[S] + f[T] + f[B] + f[NE] + f[SW] + f[SE] +
-                                       f[NW] + f[TE] + f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS] + f[TNE] +
-                                       f[TSW] + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW];
+                    LBMReal rho_post = f[DIR_000] + f[DIR_P00] + f[DIR_M00] + f[DIR_0P0] + f[DIR_0M0] + f[DIR_00P] + f[DIR_00M] + f[DIR_PP0] + f[DIR_MM0] + f[DIR_PM0] +
+                                       f[DIR_MP0] + f[DIR_P0P] + f[DIR_M0M] + f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] + f[DIR_0MM] + f[DIR_0PM] + f[DIR_0MP] + f[DIR_PPP] +
+                                       f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] + f[DIR_MMM] + f[DIR_PMM] + f[DIR_MPM];
                     LBMReal dif = drho - rho_post;
 #ifdef SINGLEPRECISION
                     if (dif > 10.0E-7 || dif < -10.0E-7)
@@ -263,35 +263,35 @@ void BGKLBMKernel::calculate(int step)
                     //////////////////////////////////////////////////////////////////////////
                     // write distribution
                     //////////////////////////////////////////////////////////////////////////
-                    (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3)     = f[D3Q27System::INV_E];
-                    (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3)     = f[D3Q27System::INV_N];
-                    (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3)     = f[D3Q27System::INV_T];
-                    (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3)    = f[D3Q27System::INV_NE];
-                    (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3)   = f[D3Q27System::INV_NW];
-                    (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3)    = f[D3Q27System::INV_TE];
-                    (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3)   = f[D3Q27System::INV_TW];
-                    (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3)    = f[D3Q27System::INV_TN];
-                    (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3)   = f[D3Q27System::INV_TS];
-                    (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3)   = f[D3Q27System::INV_TNE];
-                    (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3)  = f[D3Q27System::INV_TNW];
-                    (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3)  = f[D3Q27System::INV_TSE];
-                    (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = f[D3Q27System::INV_TSW];
+                    (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3)     = f[D3Q27System::INV_P00];
+                    (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3)     = f[D3Q27System::INV_0P0];
+                    (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3)     = f[D3Q27System::INV_00P];
+                    (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3)    = f[D3Q27System::INV_PP0];
+                    (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3)   = f[D3Q27System::INV_MP0];
+                    (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3)    = f[D3Q27System::INV_P0P];
+                    (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3)   = f[D3Q27System::INV_M0P];
+                    (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3)    = f[D3Q27System::INV_0PP];
+                    (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3)   = f[D3Q27System::INV_0MP];
+                    (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3)   = f[D3Q27System::INV_PPP];
+                    (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3)  = f[D3Q27System::INV_MPP];
+                    (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3)  = f[D3Q27System::INV_PMP];
+                    (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = f[D3Q27System::INV_MMP];
 
-                    (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3)     = f[D3Q27System::INV_W];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3)     = f[D3Q27System::INV_S];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p)     = f[D3Q27System::INV_B];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3)   = f[D3Q27System::INV_SW];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3)    = f[D3Q27System::INV_SE];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p)   = f[D3Q27System::INV_BW];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p)    = f[D3Q27System::INV_BE];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p)   = f[D3Q27System::INV_BS];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p)    = f[D3Q27System::INV_BN];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = f[D3Q27System::INV_BSW];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p)  = f[D3Q27System::INV_BSE];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p)  = f[D3Q27System::INV_BNW];
-                    (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p)   = f[D3Q27System::INV_BNE];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3)     = f[D3Q27System::INV_M00];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3)     = f[D3Q27System::INV_0M0];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p)     = f[D3Q27System::INV_00M];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3)   = f[D3Q27System::INV_MM0];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3)    = f[D3Q27System::INV_PM0];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p)   = f[D3Q27System::INV_M0M];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p)    = f[D3Q27System::INV_P0M];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p)   = f[D3Q27System::INV_0MM];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p)    = f[D3Q27System::INV_0PM];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = f[D3Q27System::INV_MMM];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p)  = f[D3Q27System::INV_PMM];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p)  = f[D3Q27System::INV_MPM];
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p)   = f[D3Q27System::INV_PPM];
 
-                    (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST];
+                    (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000];
                     //////////////////////////////////////////////////////////////////////////
                 }
             }
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp
index 94635f85810d81563efafb4a560a230ac3bc3056..b1e48abd9ed3c0a2b4bff26090c20512d94eff7f 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp
@@ -117,7 +117,7 @@ void CompressibleCumulant4thOrderViscosityLBMKernel::calculate(int step)
    //LBMReal B = (four + twentyeight*omega - fourteen*omega*omega) / (six - twentyone*omega + fiveteen*omega*omega);
 
    LBMReal A = (4.0*omega*omega+2.0*omega*OxxPyyPzz*(omega-6.0)+OxxPyyPzz*OxxPyyPzz*(omega*(10.0-3.0*omega)-4.0))/((omega-OxxPyyPzz)*(OxxPyyPzz*(2.0+3.0*omega)-8.0*omega));
-   //FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::B' )
+   //FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' )
    LBMReal B = (4.0*omega*OxxPyyPzz*(9.0*omega-16.0)-4.0*omega*omega-2.0*OxxPyyPzz*OxxPyyPzz*(2.0+9.0*omega*(omega-2.0)))/(3.0*(omega-OxxPyyPzz)*(OxxPyyPzz*(2.0+3.0*omega)-8.0*omega));
 
    for (int x3 = minX3; x3 < maxX3; x3++)
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp
index 036b35379ec218585a43a67d03f2a03deb79d6e5..a359db9cd61ef3042130f5148abdc4cf1488617a 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp
@@ -66,11 +66,11 @@ void CompressibleOffsetInterpolationProcessor::calcMoments(const LBMReal* const
    
    press = drho; //interpolate rho!
 
-   kxy   = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
-   kyz   = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))/(one + drho)-(vx2*vx3));
-   kxz   = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))/(one + drho)-(vx1*vx3));
-   kxxMyy = -3./2.*omega*((((f[BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))/(one + drho)-(vx1*vx1-vx2*vx2));
-   kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))/(one + drho)-(vx1*vx1-vx3*vx3));
+   kxy   = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
+   kyz   = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(one + drho)-(vx2*vx3));
+   kxz   = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(one + drho)-(vx1*vx3));
+   kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(one + drho)-(vx1*vx1-vx2*vx2));
+   kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(one + drho)-(vx1*vx1-vx3*vx3));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, LBMReal omega, LBMReal eps_new)
@@ -471,33 +471,33 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeCF(LBMReal* f
    LBMReal feq[ENDF+1];
    D3Q27System::calcCompFeq(feq,rho,vx1,vx2,vx3);
 
-   f[E]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[E];
-   f[W]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[W];
-   f[N]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[N];
-   f[S]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[S];
-   f[T]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[T];
-   f[B]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[B];
-   f[NE]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[NE];
-   f[SW]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[SW];
-   f[SE]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[SE];
-   f[NW]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[NW];
-   f[TE]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[TE];
-   f[BW]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[BW];
-   f[BE]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[BE];
-   f[TW]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[TW];
-   f[TN]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[TN];
-   f[BS]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[BS];
-   f[BN]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[BN];
-   f[TS]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[TS];
-   f[TNE]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[TNE];
-   f[TSW]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[TSW];
-   f[TSE]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[TSE];
-   f[TNW]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[TNW];
-   f[BNE]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[BNE];
-   f[BSW]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[BSW];
-   f[BSE]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[BSE];
-   f[BNW]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[BNW];
-   f[REST] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO                                                 + feq[REST];
+   f[DIR_P00]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[DIR_P00];
+   f[DIR_M00]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[DIR_M00];
+   f[DIR_0P0]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[DIR_0P0];
+   f[DIR_0M0]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[DIR_0M0];
+   f[DIR_00P]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[DIR_00P];
+   f[DIR_00M]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[DIR_00M];
+   f[DIR_PP0]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[DIR_PP0];
+   f[DIR_MM0]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[DIR_MM0];
+   f[DIR_PM0]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[DIR_PM0];
+   f[DIR_MP0]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[DIR_MP0];
+   f[DIR_P0P]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[DIR_P0P];
+   f[DIR_M0M]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[DIR_M0M];
+   f[DIR_P0M]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[DIR_P0M];
+   f[DIR_M0P]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[DIR_M0P];
+   f[DIR_0PP]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[DIR_0PP];
+   f[DIR_0MM]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[DIR_0MM];
+   f[DIR_0PM]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[DIR_0PM];
+   f[DIR_0MP]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[DIR_0MP];
+   f[DIR_PPP]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[DIR_PPP];
+   f[DIR_MMP]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[DIR_MMP];
+   f[DIR_PMP]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[DIR_PMP];
+   f[DIR_MPP]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[DIR_MPP];
+   f[DIR_PPM]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[DIR_PPM];
+   f[DIR_MMM]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[DIR_MMM];
+   f[DIR_PMM]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[DIR_PMM];
+   f[DIR_MPM]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[DIR_MPM];
+   f[DIR_000] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO                                                 + feq[DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SWB -0.25, -0.25, -0.25
@@ -665,33 +665,33 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(LBMReal* f
    f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o));
    f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o));
 
-   f[E]    = f_E    + feq[E];
-   f[W]    = f_E    + feq[W];
-   f[N]    = f_N    + feq[N];
-   f[S]    = f_N    + feq[S];
-   f[T]    = f_T    + feq[T];
-   f[B]    = f_T    + feq[B];
-   f[NE]   = f_NE   + feq[NE];
-   f[SW]   = f_NE   + feq[SW];
-   f[SE]   = f_SE   + feq[SE];
-   f[NW]   = f_SE   + feq[NW];
-   f[TE]   = f_TE   + feq[TE];
-   f[BW]   = f_TE   + feq[BW];
-   f[BE]   = f_BE   + feq[BE];
-   f[TW]   = f_BE   + feq[TW];
-   f[TN]   = f_TN   + feq[TN];
-   f[BS]   = f_TN   + feq[BS];
-   f[BN]   = f_BN   + feq[BN];
-   f[TS]   = f_BN   + feq[TS];
-   f[TNE]  = f_TNE  + feq[TNE];
-   f[TNW]  = f_TNW  + feq[TNW];
-   f[TSE]  = f_TSE  + feq[TSE];
-   f[TSW]  = f_TSW  + feq[TSW];
-   f[BNE]  = f_TSW  + feq[BNE];
-   f[BNW]  = f_TSE  + feq[BNW];
-   f[BSE]  = f_TNW  + feq[BSE];
-   f[BSW]  = f_TNE  + feq[BSW];
-   f[REST] = f_ZERO + feq[REST];
+   f[DIR_P00]    = f_E    + feq[DIR_P00];
+   f[DIR_M00]    = f_E    + feq[DIR_M00];
+   f[DIR_0P0]    = f_N    + feq[DIR_0P0];
+   f[DIR_0M0]    = f_N    + feq[DIR_0M0];
+   f[DIR_00P]    = f_T    + feq[DIR_00P];
+   f[DIR_00M]    = f_T    + feq[DIR_00M];
+   f[DIR_PP0]   = f_NE   + feq[DIR_PP0];
+   f[DIR_MM0]   = f_NE   + feq[DIR_MM0];
+   f[DIR_PM0]   = f_SE   + feq[DIR_PM0];
+   f[DIR_MP0]   = f_SE   + feq[DIR_MP0];
+   f[DIR_P0P]   = f_TE   + feq[DIR_P0P];
+   f[DIR_M0M]   = f_TE   + feq[DIR_M0M];
+   f[DIR_P0M]   = f_BE   + feq[DIR_P0M];
+   f[DIR_M0P]   = f_BE   + feq[DIR_M0P];
+   f[DIR_0PP]   = f_TN   + feq[DIR_0PP];
+   f[DIR_0MM]   = f_TN   + feq[DIR_0MM];
+   f[DIR_0PM]   = f_BN   + feq[DIR_0PM];
+   f[DIR_0MP]   = f_BN   + feq[DIR_0MP];
+   f[DIR_PPP]  = f_TNE  + feq[DIR_PPP];
+   f[DIR_MPP]  = f_TNW  + feq[DIR_MPP];
+   f[DIR_PMP]  = f_TSE  + feq[DIR_PMP];
+   f[DIR_MMP]  = f_TSW  + feq[DIR_MMP];
+   f[DIR_PPM]  = f_TSW  + feq[DIR_PPM];
+   f[DIR_MPM]  = f_TSE  + feq[DIR_MPM];
+   f[DIR_PMM]  = f_TNW  + feq[DIR_PMM];
+   f[DIR_MMM]  = f_TNE  + feq[DIR_MMM];
+   f[DIR_000] = f_ZERO + feq[DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3)
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp
index 4dec637580458cfa77d151b810df04a853116de8..e6883626c94e8de2b01f0c331f7580a7a7b9b9d2 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp
@@ -95,11 +95,11 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcMoments(const LBMReal*
    
    press = drho; //interpolate rho!
 
-   kxy   = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
-   kyz   = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))/(one + drho)-(vx2*vx3));
-   kxz   = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))/(one + drho)-(vx1*vx3));
-   kxxMyy = -3./2.*omega*((((f[BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))/(one + drho)-(vx1*vx1-vx2*vx2));
-   kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))/(one + drho)-(vx1*vx1-vx3*vx3));
+   kxy   = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
+   kyz   = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(one + drho)-(vx2*vx3));
+   kxz   = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(one + drho)-(vx1*vx3));
+   kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(one + drho)-(vx1*vx1-vx2*vx2));
+   kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(one + drho)-(vx1*vx1-vx3*vx3));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, LBMReal omega, LBMReal eps_new)
@@ -785,33 +785,33 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeCF(LBM
    mfccc = m2;
    ////////////////////////////////////////////////////////////////////////////////////
 
-   f[E]    = mfcbb;
-   f[W]    = mfabb;
-   f[N]    = mfbcb;
-   f[S]    = mfbab;
-   f[T]    = mfbbc;
-   f[B]    = mfbba;
-   f[NE]   = mfccb;
-   f[SW]   = mfaab;
-   f[SE]   = mfcab;
-   f[NW]   = mfacb;
-   f[TE]   = mfcbc;
-   f[BW]   = mfaba;
-   f[BE]   = mfcba;
-   f[TW]   = mfabc;
-   f[TN]   = mfbcc;
-   f[BS]   = mfbaa;
-   f[BN]   = mfbca;
-   f[TS]   = mfbac;
-   f[REST] = mfbbb;
-   f[TNE]  = mfccc;
-   f[TSE]  = mfcac;
-   f[BNE]  = mfcca;
-   f[BSE]  = mfcaa;
-   f[TNW]  = mfacc;
-   f[TSW]  = mfaac;
-   f[BNW]  = mfaca;
-   f[BSW]  = mfaaa;
+   f[DIR_P00] = mfcbb;
+   f[DIR_M00] = mfabb;
+   f[DIR_0P0] = mfbcb;
+   f[DIR_0M0] = mfbab;
+   f[DIR_00P] = mfbbc;
+   f[DIR_00M] = mfbba;
+   f[DIR_PP0] = mfccb;
+   f[DIR_MM0] = mfaab;
+   f[DIR_PM0] = mfcab;
+   f[DIR_MP0] = mfacb;
+   f[DIR_P0P] = mfcbc;
+   f[DIR_M0M] = mfaba;
+   f[DIR_P0M] = mfcba;
+   f[DIR_M0P] = mfabc;
+   f[DIR_0PP] = mfbcc;
+   f[DIR_0MM] = mfbaa;
+   f[DIR_0PM] = mfbca;
+   f[DIR_0MP] = mfbac;
+   f[DIR_000] = mfbbb;
+   f[DIR_PPP] = mfccc;
+   f[DIR_PMP] = mfcac;
+   f[DIR_PPM] = mfcca;
+   f[DIR_PMM] = mfcaa;
+   f[DIR_MPP] = mfacc;
+   f[DIR_MMP] = mfaac;
+   f[DIR_MPM] = mfaca;
+   f[DIR_MMM] = mfaaa;
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SWB -0.25, -0.25, -0.25
@@ -1004,7 +1004,7 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeFC(LBM
    LBMReal mxxyMyzz = zeroReal;
    LBMReal mxxzPyyz = zeroReal;
    LBMReal mxxzMyyz = zeroReal;
-   LBMReal mxyyPxzz =  zeroReal;
+   LBMReal mxyyPxzz = zeroReal;
    LBMReal mxyyMxzz = zeroReal;
 
    // linear combinations back
@@ -1233,33 +1233,33 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeFC(LBM
    mfccc = m2;
    ////////////////////////////////////////////////////////////////////////////////////
 
-   f[E]    = mfcbb;
-   f[W]    = mfabb;
-   f[N]    = mfbcb;
-   f[S]    = mfbab;
-   f[T]    = mfbbc;
-   f[B]    = mfbba;
-   f[NE]   = mfccb;
-   f[SW]   = mfaab;
-   f[SE]   = mfcab;
-   f[NW]   = mfacb;
-   f[TE]   = mfcbc;
-   f[BW]   = mfaba;
-   f[BE]   = mfcba;
-   f[TW]   = mfabc;
-   f[TN]   = mfbcc;
-   f[BS]   = mfbaa;
-   f[BN]   = mfbca;
-   f[TS]   = mfbac;
-   f[REST] = mfbbb;
-   f[TNE]  = mfccc;
-   f[TSE]  = mfcac;
-   f[BNE]  = mfcca;
-   f[BSE]  = mfcaa;
-   f[TNW]  = mfacc;
-   f[TSW]  = mfaac;
-   f[BNW]  = mfaca;
-   f[BSW]  = mfaaa;
+   f[DIR_P00] = mfcbb;
+   f[DIR_M00] = mfabb;
+   f[DIR_0P0] = mfbcb;
+   f[DIR_0M0] = mfbab;
+   f[DIR_00P] = mfbbc;
+   f[DIR_00M] = mfbba;
+   f[DIR_PP0] = mfccb;
+   f[DIR_MM0] = mfaab;
+   f[DIR_PM0] = mfcab;
+   f[DIR_MP0] = mfacb;
+   f[DIR_P0P] = mfcbc;
+   f[DIR_M0M] = mfaba;
+   f[DIR_P0M] = mfcba;
+   f[DIR_M0P] = mfabc;
+   f[DIR_0PP] = mfbcc;
+   f[DIR_0MM] = mfbaa;
+   f[DIR_0PM] = mfbca;
+   f[DIR_0MP] = mfbac;
+   f[DIR_000] = mfbbb;
+   f[DIR_PPP] = mfccc;
+   f[DIR_PMP] = mfcac;
+   f[DIR_PPM] = mfcca;
+   f[DIR_PMM] = mfcaa;
+   f[DIR_MPP] = mfacc;
+   f[DIR_MMP] = mfaac;
+   f[DIR_MPM] = mfaca;
+   f[DIR_MMM] = mfaaa;
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3)
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp
index 7a19f156e4447acd9d4451ce4c1a1de7bf5c990d..c9cc8138dcf1d4ce11ee4e2aa7b733f2174f367d 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp
@@ -85,11 +85,11 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcMoments(const L
    
    press = drho; //interpolate rho!
 
-   kxy   = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
-   kyz   = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))/(one + drho)-(vx2*vx3));
-   kxz   = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))/(one + drho)-(vx1*vx3));
-   kxxMyy = -3./2.*omega*((((f[BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))/(one + drho)-(vx1*vx1-vx2*vx2));
-   kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))/(one + drho)-(vx1*vx1-vx3*vx3));
+   kxy   = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13
+   kyz   = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(one + drho)-(vx2*vx3));
+   kxz   = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(one + drho)-(vx1*vx3));
+   kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(one + drho)-(vx1*vx1-vx2*vx2));
+   kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(one + drho)-(vx1*vx1-vx3*vx3));
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, LBMReal omega, LBMReal eps_new)
@@ -780,33 +780,33 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNod
    mfccc = m2;
    ////////////////////////////////////////////////////////////////////////////////////
 
-   f[E]    = mfcbb;
-   f[W]    = mfabb;
-   f[N]    = mfbcb;
-   f[S]    = mfbab;
-   f[T]    = mfbbc;
-   f[B]    = mfbba;
-   f[NE]   = mfccb;
-   f[SW]   = mfaab;
-   f[SE]   = mfcab;
-   f[NW]   = mfacb;
-   f[TE]   = mfcbc;
-   f[BW]   = mfaba;
-   f[BE]   = mfcba;
-   f[TW]   = mfabc;
-   f[TN]   = mfbcc;
-   f[BS]   = mfbaa;
-   f[BN]   = mfbca;
-   f[TS]   = mfbac;
-   f[REST] = mfbbb;
-   f[TNE]  = mfccc;
-   f[TSE]  = mfcac;
-   f[BNE]  = mfcca;
-   f[BSE]  = mfcaa;
-   f[TNW]  = mfacc;
-   f[TSW]  = mfaac;
-   f[BNW]  = mfaca;
-   f[BSW]  = mfaaa;
+   f[DIR_P00]    = mfcbb;
+   f[DIR_M00]    = mfabb;
+   f[DIR_0P0]    = mfbcb;
+   f[DIR_0M0]    = mfbab;
+   f[DIR_00P]    = mfbbc;
+   f[DIR_00M]    = mfbba;
+   f[DIR_PP0]   = mfccb;
+   f[DIR_MM0]   = mfaab;
+   f[DIR_PM0]   = mfcab;
+   f[DIR_MP0]   = mfacb;
+   f[DIR_P0P]   = mfcbc;
+   f[DIR_M0M]   = mfaba;
+   f[DIR_P0M]   = mfcba;
+   f[DIR_M0P]   = mfabc;
+   f[DIR_0PP]   = mfbcc;
+   f[DIR_0MM]   = mfbaa;
+   f[DIR_0PM]   = mfbca;
+   f[DIR_0MP]   = mfbac;
+   f[DIR_000] = mfbbb;
+   f[DIR_PPP]  = mfccc;
+   f[DIR_PMP]  = mfcac;
+   f[DIR_PPM]  = mfcca;
+   f[DIR_PMM]  = mfcaa;
+   f[DIR_MPP]  = mfacc;
+   f[DIR_MMP]  = mfaac;
+   f[DIR_MPM]  = mfaca;
+   f[DIR_MMM]  = mfaaa;
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SWB -0.25, -0.25, -0.25
@@ -1233,33 +1233,33 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNod
    mfccc = m2;
    ////////////////////////////////////////////////////////////////////////////////////
 
-   f[E]    = mfcbb;
-   f[W]    = mfabb;
-   f[N]    = mfbcb;
-   f[S]    = mfbab;
-   f[T]    = mfbbc;
-   f[B]    = mfbba;
-   f[NE]   = mfccb;
-   f[SW]   = mfaab;
-   f[SE]   = mfcab;
-   f[NW]   = mfacb;
-   f[TE]   = mfcbc;
-   f[BW]   = mfaba;
-   f[BE]   = mfcba;
-   f[TW]   = mfabc;
-   f[TN]   = mfbcc;
-   f[BS]   = mfbaa;
-   f[BN]   = mfbca;
-   f[TS]   = mfbac;
-   f[REST] = mfbbb;
-   f[TNE]  = mfccc;
-   f[TSE]  = mfcac;
-   f[BNE]  = mfcca;
-   f[BSE]  = mfcaa;
-   f[TNW]  = mfacc;
-   f[TSW]  = mfaac;
-   f[BNW]  = mfaca;
-   f[BSW]  = mfaaa;
+   f[DIR_P00]    = mfcbb;
+   f[DIR_M00]    = mfabb;
+   f[DIR_0P0]    = mfbcb;
+   f[DIR_0M0]    = mfbab;
+   f[DIR_00P]    = mfbbc;
+   f[DIR_00M]    = mfbba;
+   f[DIR_PP0]   = mfccb;
+   f[DIR_MM0]   = mfaab;
+   f[DIR_PM0]   = mfcab;
+   f[DIR_MP0]   = mfacb;
+   f[DIR_P0P]   = mfcbc;
+   f[DIR_M0M]   = mfaba;
+   f[DIR_P0M]   = mfcba;
+   f[DIR_M0P]   = mfabc;
+   f[DIR_0PP]   = mfbcc;
+   f[DIR_0MM]   = mfbaa;
+   f[DIR_0PM]   = mfbca;
+   f[DIR_0MP]   = mfbac;
+   f[DIR_000] = mfbbb;
+   f[DIR_PPP]  = mfccc;
+   f[DIR_PMP]  = mfcac;
+   f[DIR_PPM]  = mfcca;
+   f[DIR_PMM]  = mfcaa;
+   f[DIR_MPP]  = mfacc;
+   f[DIR_MMP]  = mfaac;
+   f[DIR_MPM]  = mfaca;
+   f[DIR_MMM]  = mfaaa;
 }
 //////////////////////////////////////////////////////////////////////////
 void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3)
diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp
index 105603b35d043799672a58fda83ba503af70b703..7e2fd17c0577ea4606f4b38530985411764b5bdb 100644
--- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp
@@ -6,20 +6,35 @@ namespace D3Q27System
 {
 using namespace UbMath;
 
-// index            0   1   2   3   4   5  6   7   8   9   10  11  12  13  14  15  16  17  18  20  21  22  23  24  25  26
+// index            0   1   2   3   4   5  6   7   8   9   10  11  12  13  14  15  16  17   18  19  20  21  22  23  24  25
 // f:               E,  W,  N,  S,  T,  B, NE, SW, SE, NW, TE, BW, BE, TW, TN, BS, BN, TS, TNE TNW TSE TSW BNE BNW BSE BSW
-const int DX1[] = { 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1 };
-const int DX2[] = { 0, 0, 1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, -1 };
-const int DX3[] = { 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1 };
-
-const double WEIGTH[] = { c2o27,  c2o27,  c2o27,  c2o27,  c2o27,  c2o27,  c1o54,  c1o54,  c1o54,
-                          c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,
-                          c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c8o27 };
-
-const int INVDIR[] = { INV_E,   INV_W,   INV_N,   INV_S,   INV_T,   INV_B,   INV_NE,  INV_SW, INV_SE,
-                       INV_NW,  INV_TE,  INV_BW,  INV_BE,  INV_TW,  INV_TN,  INV_BS,  INV_BN, INV_TS,
-                       INV_TNE, INV_TNW, INV_TSE, INV_TSW, INV_BNE, INV_BNW, INV_BSE, INV_BSW };
-
+//const int DX1[] = { 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1 };
+//const int DX2[] = { 0, 0, 1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, -1 };
+//const int DX3[] = { 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1 };
+
+// index            0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18   19  20  21  22  23  24  25  26
+// f:             REST, E,  W,  N,  S,  T,  B, NE, SW, SE, NW, TE, BW, BE, TW, TN, BS, BN, TS, TNE TNW TSE TSW BNE BNW BSE BSW
+const int DX1[] = { 0,  1, -1,  0,  0,  0,  0,  1, -1,  1, -1,  1, -1,  1, -1,  0,  0,  0,  0,   1, -1,  1, -1,  1, -1,  1, -1 };
+const int DX2[] = { 0,  0,  0,  1, -1,  0,  0,  1, -1, -1,  1,  0,  0,  0,  0,  1, -1,  1, -1,   1,  1, -1, -1,  1,  1, -1, -1 };
+const int DX3[] = { 0,  0,  0,  0,  0,  1, -1,  0,  0,  0,  0,  1, -1, -1,  1,  1, -1, -1,  1,   1,  1,  1,  1, -1, -1, -1, -1 };
+
+const double WEIGTH[] = { c8o27,  
+                          c2o27,  c2o27,  c2o27,  c2o27,  c2o27,  c2o27,  
+                          c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,  c1o54,
+                          c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c1o216 };
+
+const int INVDIR[] = { DIR_000, INV_P00,   INV_M00,   INV_0P0,   INV_0M0,   INV_00P,   INV_00M,   INV_PP0,  INV_MM0, INV_PM0,
+                       INV_MP0,  INV_P0P,  INV_M0M,  INV_P0M,  INV_M0P,  INV_0PP,  INV_0MM,  INV_0PM, INV_0MP,
+                       INV_PPP, INV_MPP, INV_PMP, INV_MMP, INV_PPM, INV_MPM, INV_PMM, INV_MMM };
+
+// index             0   1   2   3   4   5  6   7   8    9  10  11  12  13  14  15  16  17  18
+// direction:        E,  W,  N,  S,  T,  B, NE, SW, SE, NW, TE, BW, BE, TW, TN, BS, BN, TS, TNE TNW TSE TSW BNE BNW BSE
+// BSW
+const int EX1[] = { 0, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1 };
+const int EX2[] = { 0, 0, 0, 1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, -1 };
+const int EX3[] = { 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1 };
+
+//////////////////////////////////////////////////////////////////////////
 
 
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
index bdb443ee2e40bf53a60ebf61c249a8e80aedd4b3..d8822219484599e8f31fa86564ecdaf844679d52 100644
--- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
+++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
@@ -47,14 +47,14 @@ namespace D3Q27System
 {
 //////////////////////////////////////////////////////////////////////////
 // DIRECTION STUFF
-static const int FSTARTDIR = 0;
-static const int FENDDIR   = 25; // D3Q27
+static const int FSTARTDIR = 1;
+static const int FENDDIR   = 26; // D3Q27
 
 static const int STARTF = 0;
 static const int ENDF   = 26; // D3Q27
 
-static const int STARTDIR = 0;
-static const int ENDDIR   = 26; // all geometric directions
+static const int STARTDIR = 1; //0
+static const int ENDDIR   = 26;//26 // all geometric directions
 
 extern const int DX1[ENDDIR + 1];
 extern const int DX2[ENDDIR + 1];
@@ -63,60 +63,123 @@ extern const double WEIGTH[ENDDIR + 1];
 
 extern const double cNorm[3][ENDDIR];
 
-static const int E    = 0;
-static const int W    = 1;
-static const int N    = 2;
-static const int S    = 3;
-static const int T    = 4;
-static const int B    = 5;
-static const int NE   = 6;
-static const int SW   = 7;
-static const int SE   = 8;
-static const int NW   = 9;
-static const int TE   = 10;
-static const int BW   = 11;
-static const int BE   = 12;
-static const int TW   = 13;
-static const int TN   = 14;
-static const int BS   = 15;
-static const int BN   = 16;
-static const int TS   = 17;
-static const int TNE  = 18;
-static const int TNW  = 19;
-static const int TSE  = 20;
-static const int TSW  = 21;
-static const int BNE  = 22;
-static const int BNW  = 23;
-static const int BSE  = 24;
-static const int BSW  = 25;
-static const int REST = 26;
+static const int MINLEVEL = 0;
+static const int MAXLEVEL = 25;
 
-static const int INV_E   = W;
-static const int INV_W   = E;
-static const int INV_N   = S;
-static const int INV_S   = N;
-static const int INV_T   = B;
-static const int INV_B   = T;
-static const int INV_NE  = SW;
-static const int INV_SW  = NE;
-static const int INV_SE  = NW;
-static const int INV_NW  = SE;
-static const int INV_TE  = BW;
-static const int INV_BW  = TE;
-static const int INV_BE  = TW;
-static const int INV_TW  = BE;
-static const int INV_TN  = BS;
-static const int INV_BS  = TN;
-static const int INV_BN  = TS;
-static const int INV_TS  = BN;
-static const int INV_TNE = BSW;
-static const int INV_TNW = BSE;
-static const int INV_TSE = BNW;
-static const int INV_TSW = BNE;
-static const int INV_BNE = TSW;
-static const int INV_BNW = TSE;
-static const int INV_BSE = TNW;
-static const int INV_BSW = TNE;
+extern const int EX1[ENDDIR + 1];
+extern const int EX2[ENDDIR + 1];
+extern const int EX3[ENDDIR + 1];
+
+//static const int E    = 0;
+//static const int W    = 1;
+//static const int N    = 2;
+//static const int S    = 3;
+//static const int T    = 4;
+//static const int B    = 5;
+//static const int NE   = 6;
+//static const int SW   = 7;
+//static const int SE   = 8;
+//static const int NW   = 9;
+//static const int TE   = 10;
+//static const int BW   = 11;
+//static const int BE   = 12;
+//static const int TW   = 13;
+//static const int TN   = 14;
+//static const int BS   = 15;
+//static const int BN   = 16;
+//static const int TS   = 17;
+//static const int TNE  = 18;
+//static const int TNW  = 19;
+//static const int TSE  = 20;
+//static const int TSW  = 21;
+//static const int BNE  = 22;
+//static const int BNW  = 23;
+//static const int BSE  = 24;
+//static const int BSW  = 25;
+//static const int REST = 26;
+
+//static constexpr int REST = 0;
+//static constexpr int E = 1;
+//static constexpr int W = 2;
+//static constexpr int N = 3;
+//static constexpr int S = 4;
+//static constexpr int T = 5;
+//static constexpr int B = 6;
+//static constexpr int NE = 7;
+//static constexpr int SW = 8;
+//static constexpr int SE = 9;
+//static constexpr int NW = 10;
+//static constexpr int TE = 11;
+//static constexpr int BW = 12;
+//static constexpr int BE = 13;
+//static constexpr int TW = 14;
+//static constexpr int TN = 15;
+//static constexpr int BS = 16;
+//static constexpr int BN = 17;
+//static constexpr int TS = 18;
+//static constexpr int TNE = 19;
+//static constexpr int TNW = 20;
+//static constexpr int TSE = 21;
+//static constexpr int TSW = 22;
+//static constexpr int BNE = 23;
+//static constexpr int BNW = 24;
+//static constexpr int BSE = 25;
+//static constexpr int BSW = 26;
+
+static constexpr int DIR_000 = 0;
+static constexpr int DIR_P00 = 1;
+static constexpr int DIR_M00 = 2;
+static constexpr int DIR_0P0 = 3;
+static constexpr int DIR_0M0 = 4;
+static constexpr int DIR_00P = 5;
+static constexpr int DIR_00M = 6;
+static constexpr int DIR_PP0 = 7;
+static constexpr int DIR_MM0 = 8;
+static constexpr int DIR_PM0 = 9;
+static constexpr int DIR_MP0 = 10;
+static constexpr int DIR_P0P = 11;
+static constexpr int DIR_M0M = 12;
+static constexpr int DIR_P0M = 13;
+static constexpr int DIR_M0P = 14;
+static constexpr int DIR_0PP = 15;
+static constexpr int DIR_0MM = 16;
+static constexpr int DIR_0PM = 17;
+static constexpr int DIR_0MP = 18;
+static constexpr int DIR_PPP = 19;
+static constexpr int DIR_MPP = 20;
+static constexpr int DIR_PMP = 21;
+static constexpr int DIR_MMP = 22;
+static constexpr int DIR_PPM = 23;
+static constexpr int DIR_MPM = 24;
+static constexpr int DIR_PMM = 25;
+static constexpr int DIR_MMM = 26;
+
+static constexpr int INV_P00 = DIR_M00;
+static constexpr int INV_M00 = DIR_P00;
+static constexpr int INV_0P0 = DIR_0M0;
+static constexpr int INV_0M0 = DIR_0P0;
+static constexpr int INV_00P = DIR_00M;
+static constexpr int INV_00M = DIR_00P;
+static constexpr int INV_PP0 = DIR_MM0;
+static constexpr int INV_MM0 = DIR_PP0;
+static constexpr int INV_PM0 = DIR_MP0;
+static constexpr int INV_MP0 = DIR_PM0;
+static constexpr int INV_P0P = DIR_M0M;
+static constexpr int INV_M0M = DIR_P0P;
+static constexpr int INV_P0M = DIR_M0P;
+static constexpr int INV_M0P = DIR_P0M;
+static constexpr int INV_0PP = DIR_0MM;
+static constexpr int INV_0MM = DIR_0PP;
+static constexpr int INV_0PM = DIR_0MP;
+static constexpr int INV_0MP = DIR_0PM;
+static constexpr int INV_PPP = DIR_MMM;
+static constexpr int INV_MPP = DIR_PMM;
+static constexpr int INV_PMP = DIR_MPM;
+static constexpr int INV_MMP = DIR_PPM;
+static constexpr int INV_PPM = DIR_MMP;
+static constexpr int INV_MPM = DIR_PMP;
+static constexpr int INV_PMM = DIR_MPP;
+static constexpr int INV_MMM = DIR_PPP;
 
 extern const int INVDIR[ENDDIR + 1];
 
@@ -147,6 +210,181 @@ static const int ET_BNW = 11;
 static const int ET_TSW = 12;
 static const int ET_BNE = 12;
 
+//////////////////////////////////////////////////////////////////////////
+inline std::string getDirectionString(int direction)
+{
+    switch (direction) {
+        case DIR_P00:
+            return "E";
+        case DIR_M00:
+            return "W";
+        case DIR_0P0:
+            return "N";
+        case DIR_0M0:
+            return "S";
+        case DIR_00P:
+            return "T";
+        case DIR_00M:
+            return "B";
+        case DIR_PP0:
+            return "NE";
+        case DIR_MP0:
+            return "NW";
+        case DIR_PM0:
+            return "SE";
+        case DIR_MM0:
+            return "SW";
+        case DIR_P0P:
+            return "TE";
+        case DIR_M0P:
+            return "TW";
+        case DIR_P0M:
+            return "BE";
+        case DIR_M0M:
+            return "BW";
+        case DIR_0PP:
+            return "TN";
+        case DIR_0MP:
+            return "TS";
+        case DIR_0PM:
+            return "BN";
+        case DIR_0MM:
+            return "BS";
+        case DIR_PPP:
+            return "TNE";
+        case DIR_MPP:
+            return "TNW";
+        case DIR_PMP:
+            return "TSE";
+        case DIR_MMP:
+            return "TSW";
+        case DIR_PPM:
+            return "BNE";
+        case DIR_MPM:
+            return "BNW";
+        case DIR_PMM:
+            return "BSE";
+        case DIR_MMM:
+            return "BSW";
+        default:
+            return "Cell3DSystem::getDrectionString(...) - unknown dir";
+    }
+}
+//////////////////////////////////////////////////////////////////////////
+static inline void setNeighborCoordinatesForDirection(int &x1, int &x2, int &x3, const int &direction)
+{
+    switch (direction) {
+        case D3Q27System::DIR_P00:
+            x1++;
+            break;
+        case D3Q27System::DIR_0P0:
+            x2++;
+            break;
+        case D3Q27System::DIR_00P:
+            x3++;
+            break;
+        case D3Q27System::DIR_M00:
+            x1--;
+            break;
+        case D3Q27System::DIR_0M0:
+            x2--;
+            break;
+        case D3Q27System::DIR_00M:
+            x3--;
+            break;
+        case D3Q27System::DIR_PP0:
+            x1++;
+            x2++;
+            break;
+        case D3Q27System::DIR_MP0:
+            x1--;
+            x2++;
+            break;
+        case D3Q27System::DIR_MM0:
+            x1--;
+            x2--;
+            break;
+        case D3Q27System::DIR_PM0:
+            x1++;
+            x2--;
+            break;
+        case D3Q27System::DIR_P0P:
+            x1++;
+            x3++;
+            break;
+        case D3Q27System::DIR_M0M:
+            x1--;
+            x3--;
+            break;
+        case D3Q27System::DIR_P0M:
+            x1++;
+            x3--;
+            break;
+        case D3Q27System::DIR_M0P:
+            x1--;
+            x3++;
+            break;
+        case D3Q27System::DIR_0PP:
+            x2++;
+            x3++;
+            break;
+        case D3Q27System::DIR_0MM:
+            x2--;
+            x3--;
+            break;
+        case D3Q27System::DIR_0PM:
+            x2++;
+            x3--;
+            break;
+        case D3Q27System::DIR_0MP:
+            x2--;
+            x3++;
+            break;
+        case D3Q27System::DIR_PPP:
+            x1++;
+            x2++;
+            x3++;
+            break;
+        case D3Q27System::DIR_MPP:
+            x1--;
+            x2++;
+            x3++;
+            break;
+        case D3Q27System::DIR_PMP:
+            x1++;
+            x2--;
+            x3++;
+            break;
+        case D3Q27System::DIR_MMP:
+            x1--;
+            x2--;
+            x3++;
+            break;
+        case D3Q27System::DIR_PPM:
+            x1++;
+            x2++;
+            x3--;
+            break;
+        case D3Q27System::DIR_MPM:
+            x1--;
+            x2++;
+            x3--;
+            break;
+        case D3Q27System::DIR_PMM:
+            x1++;
+            x2--;
+            x3--;
+            break;
+        case D3Q27System::DIR_MMM:
+            x1--;
+            x2--;
+            x3--;
+            break;
+        default:
+            throw UbException(UB_EXARGS, "no direction ...");
+    }
+}
+
 //////////////////////////////////////////////////////////////////////////
 // MACROSCOPIC VALUES
 /*=====================================================================*/
@@ -164,69 +402,69 @@ LBMReal getIncompVelocityX3(const LBMReal *const &f /*[27]*/);
 /*=====================================================================*/
 static void calcDensity(const LBMReal *const &f /*[27]*/, LBMReal &rho)
 {
-    rho = ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) +
-          (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) +
-           ((f[BN] + f[TS]) + (f[TN] + f[BS]))) +
-          ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[REST];
+    rho = ((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) +
+          (((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) + ((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) +
+           ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) +
+          ((f[DIR_P00] + f[DIR_M00]) + (f[DIR_0P0] + f[DIR_0M0]) + (f[DIR_00P] + f[DIR_00M])) + f[DIR_000];
 }
 /*=====================================================================*/
 static void calcIncompVelocityX1(const LBMReal *const &f /*[27]*/, LBMReal &vx1)
 {
-    vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
-           (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W]));
+    vx1 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+           (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00]));
 }
 /*=====================================================================*/
 static void calcIncompVelocityX2(const LBMReal *const &f /*[27]*/, LBMReal &vx2)
 {
-    vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
-           (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S]));
+    vx2 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+           (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0]));
 }
 /*=====================================================================*/
 static void calcIncompVelocityX3(const LBMReal *const &f /*[27]*/, LBMReal &vx3)
 {
-    vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
-           (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B]));
+    vx3 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) +
+           (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M]));
 }
 /*=====================================================================*/
 static LBMReal getCompVelocityX1(const LBMReal *const &f /*[27]*/)
 {
-    return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
-            (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) /
+    return ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+            (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])) /
            getDensity(f);
 }
 /*=====================================================================*/
 static LBMReal getCompVelocityX2(const LBMReal *const &f /*[27]*/)
 {
-    return ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
-            (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) /
+    return ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+            (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])) /
            getDensity(f);
 }
 /*=====================================================================*/
 static LBMReal getCompVelocityX3(const LBMReal *const &f /*[27]*/)
 {
-    return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
-            (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) /
+    return ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) +
+            (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M])) /
            getDensity(f);
 }
 /*=====================================================================*/
 static void calcCompVelocityX1(const LBMReal *const &f /*[27]*/, LBMReal &vx1)
 {
-    vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
-           (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) /
+    vx1 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+           (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])) /
           getDensity(f);
 }
 /*=====================================================================*/
 static void calcCompVelocityX2(const LBMReal *const &f /*[27]*/, LBMReal &vx2)
 {
-    vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
-           (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) /
+    vx2 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) +
+           (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])) /
           getDensity(f);
 }
 /*=====================================================================*/
 static void calcCompVelocityX3(const LBMReal *const &f /*[27]*/, LBMReal &vx3)
 {
-    vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
-           (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) /
+    vx3 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) +
+           (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M])) /
           getDensity(f);
 }
 /*=====================================================================*/
@@ -259,85 +497,85 @@ static LBMReal getCompFeqForDirection(const int &direction, const LBMReal &drho,
     LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
     LBMReal rho   = drho + UbMath::one;
     switch (direction) {
-        case REST:
+        case DIR_000:
             return REAL_CAST(UbMath::c8o27 * (drho + rho * (-cu_sq)));
-        case E:
+        case DIR_P00:
             return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq)));
-        case W:
+        case DIR_M00:
             return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq)));
-        case N:
+        case DIR_0P0:
             return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq)));
-        case S:
+        case DIR_0M0:
             return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq)));
-        case T:
+        case DIR_00P:
             return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq)));
-        case B:
+        case DIR_00M:
             return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq)));
-        case NE:
+        case DIR_PP0:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)));
-        case SW:
+        case DIR_MM0:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)));
-        case SE:
+        case DIR_PM0:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)));
-        case NW:
+        case DIR_MP0:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)));
-        case TE:
+        case DIR_P0P:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)));
-        case BW:
+        case DIR_M0M:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)));
-        case BE:
+        case DIR_P0M:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)));
-        case TW:
+        case DIR_M0P:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)));
-        case TN:
+        case DIR_0PP:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)));
-        case BS:
+        case DIR_0MM:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)));
-        case BN:
+        case DIR_0PM:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)));
-        case TS:
+        case DIR_0MP:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)));
-        case TNE:
+        case DIR_PPP:
             return REAL_CAST(UbMath::c1o216 *
                              (drho + rho * (3.0 * (vx1 + vx2 + vx3) +
                                             UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)));
-        case BSW:
+        case DIR_MMM:
             return REAL_CAST(UbMath::c1o216 *
                              (drho + rho * (3.0 * (-vx1 - vx2 - vx3) +
                                             UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)));
-        case BNE:
+        case DIR_PPM:
             return REAL_CAST(UbMath::c1o216 *
                              (drho + rho * (3.0 * (vx1 + vx2 - vx3) +
                                             UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)));
-        case TSW:
+        case DIR_MMP:
             return REAL_CAST(UbMath::c1o216 *
                              (drho + rho * (3.0 * (-vx1 - vx2 + vx3) +
                                             UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)));
-        case TSE:
+        case DIR_PMP:
             return REAL_CAST(UbMath::c1o216 *
                              (drho + rho * (3.0 * (vx1 - vx2 + vx3) +
                                             UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)));
-        case BNW:
+        case DIR_MPM:
             return REAL_CAST(UbMath::c1o216 *
                              (drho + rho * (3.0 * (-vx1 + vx2 - vx3) +
                                             UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)));
-        case BSE:
+        case DIR_PMM:
             return REAL_CAST(UbMath::c1o216 *
                              (drho + rho * (3.0 * (vx1 - vx2 - vx3) +
                                             UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)));
-        case TNW:
+        case DIR_MPP:
             return REAL_CAST(UbMath::c1o216 *
                              (drho + rho * (3.0 * (-vx1 + vx2 + vx3) +
                                             UbMath::c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)));
@@ -352,43 +590,43 @@ static void calcCompFeq(LBMReal *const &feq /*[27]*/, const LBMReal &drho, const
     LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
     LBMReal rho   = drho + UbMath::one;
 
-    feq[REST] = UbMath::c8o27 * (drho + rho * (-cu_sq));
-    feq[E]    = UbMath::c2o27 * (drho + rho * (3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq));
-    feq[W]    = UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq));
-    feq[N]    = UbMath::c2o27 * (drho + rho * (3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq));
-    feq[S]    = UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq));
-    feq[T]    = UbMath::c2o27 * (drho + rho * (3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq));
-    feq[B]    = UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq));
-    feq[NE]   = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
-    feq[SW]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
-    feq[SE]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
-    feq[NW]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
-    feq[TE]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
-    feq[BW]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
-    feq[BE]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
-    feq[TW]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
-    feq[TN]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
-    feq[BS]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
-    feq[BN]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
-    feq[TS]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
-    feq[TNE] = UbMath::c1o216 *
+    feq[DIR_000] = UbMath::c8o27 * (drho + rho * (-cu_sq));
+    feq[DIR_P00]    = UbMath::c2o27 * (drho + rho * (3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq));
+    feq[DIR_M00]    = UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq));
+    feq[DIR_0P0]    = UbMath::c2o27 * (drho + rho * (3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq));
+    feq[DIR_0M0]    = UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq));
+    feq[DIR_00P]    = UbMath::c2o27 * (drho + rho * (3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq));
+    feq[DIR_00M]    = UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq));
+    feq[DIR_PP0]   = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
+    feq[DIR_MM0]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
+    feq[DIR_PM0]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
+    feq[DIR_MP0]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
+    feq[DIR_P0P]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
+    feq[DIR_M0M]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
+    feq[DIR_P0M]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
+    feq[DIR_M0P]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
+    feq[DIR_0PP]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
+    feq[DIR_0MM]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
+    feq[DIR_0PM]  = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
+    feq[DIR_0MP]  = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
+    feq[DIR_PPP] = UbMath::c1o216 *
                (drho + rho * (3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq));
-    feq[BSW] =
+    feq[DIR_MMM] =
         UbMath::c1o216 *
         (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq));
-    feq[BNE] = UbMath::c1o216 *
+    feq[DIR_PPM] = UbMath::c1o216 *
                (drho + rho * (3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq));
-    feq[TSW] =
+    feq[DIR_MMP] =
         UbMath::c1o216 *
         (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq));
-    feq[TSE] = UbMath::c1o216 *
+    feq[DIR_PMP] = UbMath::c1o216 *
                (drho + rho * (3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq));
-    feq[BNW] =
+    feq[DIR_MPM] =
         UbMath::c1o216 *
         (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq));
-    feq[BSE] = UbMath::c1o216 *
+    feq[DIR_PMM] = UbMath::c1o216 *
                (drho + rho * (3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq));
-    feq[TNW] =
+    feq[DIR_MPP] =
         UbMath::c1o216 *
         (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + UbMath::c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq));
 }
@@ -399,78 +637,78 @@ static LBMReal getIncompFeqForDirection(const int &direction, const LBMReal &drh
     LBMReal cu_sq = 1.5f * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
 
     switch (direction) {
-        case REST:
+        case DIR_000:
             return REAL_CAST(UbMath::c8o27 * (drho - cu_sq));
-        case E:
+        case DIR_P00:
             return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq));
-        case W:
+        case DIR_M00:
             return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq));
-        case N:
+        case DIR_0P0:
             return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq));
-        case S:
+        case DIR_0M0:
             return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq));
-        case T:
+        case DIR_00P:
             return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq));
-        case B:
+        case DIR_00M:
             return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq));
-        case NE:
+        case DIR_PP0:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
-        case SW:
+        case DIR_MM0:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
-        case SE:
+        case DIR_PM0:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
-        case NW:
+        case DIR_MP0:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
-        case TE:
+        case DIR_P0P:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
-        case BW:
+        case DIR_M0M:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
-        case BE:
+        case DIR_P0M:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
-        case TW:
+        case DIR_M0P:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
-        case TN:
+        case DIR_0PP:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
-        case BS:
+        case DIR_0MM:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
-        case BN:
+        case DIR_0PM:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
-        case TS:
+        case DIR_0MP:
             return REAL_CAST(UbMath::c1o54 *
                              (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
-        case TNE:
+        case DIR_PPP:
             return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) +
                                                UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq));
-        case BSW:
+        case DIR_MMM:
             return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) +
                                                UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq));
-        case BNE:
+        case DIR_PPM:
             return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) +
                                                UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq));
-        case TSW:
+        case DIR_MMP:
             return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) +
                                                UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq));
-        case TSE:
+        case DIR_PMP:
             return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) +
                                                UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq));
-        case BNW:
+        case DIR_MPM:
             return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) +
                                                UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq));
-        case BSE:
+        case DIR_PMM:
             return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) +
                                                UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq));
-        case TNW:
+        case DIR_MPP:
             return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) +
                                                UbMath::c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq));
         default:
@@ -483,40 +721,40 @@ static void calcIncompFeq(LBMReal *const &feq /*[27]*/, const LBMReal &drho, con
 {
     LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
 
-    feq[REST] = UbMath::c8o27 * (drho - cu_sq);
-    feq[E]    = UbMath::c2o27 * (drho + 3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq);
-    feq[W]    = UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq);
-    feq[N]    = UbMath::c2o27 * (drho + 3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq);
-    feq[S]    = UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq);
-    feq[T]    = UbMath::c2o27 * (drho + 3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq);
-    feq[B]    = UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq);
-    feq[NE]   = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
-    feq[SW]   = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
-    feq[SE]   = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
-    feq[NW]   = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
-    feq[TE]   = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
-    feq[BW]   = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
-    feq[BE]   = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
-    feq[TW]   = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
-    feq[TN]   = UbMath::c1o54 * (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
-    feq[BS]   = UbMath::c1o54 * (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
-    feq[BN]   = UbMath::c1o54 * (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
-    feq[TS]   = UbMath::c1o54 * (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
-    feq[TNE]  = UbMath::c1o216 *
+    feq[DIR_000] = UbMath::c8o27 * (drho - cu_sq);
+    feq[DIR_P00]    = UbMath::c2o27 * (drho + 3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq);
+    feq[DIR_M00]    = UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq);
+    feq[DIR_0P0]    = UbMath::c2o27 * (drho + 3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq);
+    feq[DIR_0M0]    = UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq);
+    feq[DIR_00P]    = UbMath::c2o27 * (drho + 3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq);
+    feq[DIR_00M]    = UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq);
+    feq[DIR_PP0]   = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
+    feq[DIR_MM0]   = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
+    feq[DIR_PM0]   = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
+    feq[DIR_MP0]   = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
+    feq[DIR_P0P]   = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
+    feq[DIR_M0M]   = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
+    feq[DIR_P0M]   = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
+    feq[DIR_M0P]   = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
+    feq[DIR_0PP]   = UbMath::c1o54 * (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
+    feq[DIR_0MM]   = UbMath::c1o54 * (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
+    feq[DIR_0PM]   = UbMath::c1o54 * (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
+    feq[DIR_0MP]   = UbMath::c1o54 * (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
+    feq[DIR_PPP]  = UbMath::c1o216 *
                (drho + 3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq);
-    feq[BSW] = UbMath::c1o216 *
+    feq[DIR_MMM] = UbMath::c1o216 *
                (drho + 3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq);
-    feq[BNE] = UbMath::c1o216 *
+    feq[DIR_PPM] = UbMath::c1o216 *
                (drho + 3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq);
-    feq[TSW] = UbMath::c1o216 *
+    feq[DIR_MMP] = UbMath::c1o216 *
                (drho + 3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq);
-    feq[TSE] = UbMath::c1o216 *
+    feq[DIR_PMP] = UbMath::c1o216 *
                (drho + 3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq);
-    feq[BNW] = UbMath::c1o216 *
+    feq[DIR_MPM] = UbMath::c1o216 *
                (drho + 3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq);
-    feq[BSE] = UbMath::c1o216 *
+    feq[DIR_PMM] = UbMath::c1o216 *
                (drho + 3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq);
-    feq[TNW] = UbMath::c1o216 *
+    feq[DIR_MPP] = UbMath::c1o216 *
                (drho + 3.0 * (-vx1 + vx2 + vx3) + UbMath::c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq);
 }
 //////////////////////////////////////////////////////////////////////////
@@ -524,57 +762,57 @@ static inline float getBoundaryVelocityForDirection(const int &direction, const
                                                     const float &bcVelocityX2, const float &bcVelocityX3)
 {
     switch (direction) {
-        case E:
+        case DIR_P00:
             return (float)(UbMath::c4o9 * (+bcVelocityX1));
-        case W:
+        case DIR_M00:
             return (float)(UbMath::c4o9 * (-bcVelocityX1));
-        case N:
+        case DIR_0P0:
             return (float)(UbMath::c4o9 * (+bcVelocityX2));
-        case S:
+        case DIR_0M0:
             return (float)(UbMath::c4o9 * (-bcVelocityX2));
-        case T:
+        case DIR_00P:
             return (float)(UbMath::c4o9 * (+bcVelocityX3));
-        case B:
+        case DIR_00M:
             return (float)(UbMath::c4o9 * (-bcVelocityX3));
-        case NE:
+        case DIR_PP0:
             return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2));
-        case SW:
+        case DIR_MM0:
             return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2));
-        case SE:
+        case DIR_PM0:
             return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2));
-        case NW:
+        case DIR_MP0:
             return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2));
-        case TE:
+        case DIR_P0P:
             return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3));
-        case BW:
+        case DIR_M0M:
             return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3));
-        case BE:
+        case DIR_P0M:
             return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3));
-        case TW:
+        case DIR_M0P:
             return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3));
-        case TN:
+        case DIR_0PP:
             return (float)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3));
-        case BS:
+        case DIR_0MM:
             return (float)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3));
-        case BN:
+        case DIR_0PM:
             return (float)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3));
-        case TS:
+        case DIR_0MP:
             return (float)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3));
-        case TNE:
+        case DIR_PPP:
             return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3));
-        case BSW:
+        case DIR_MMM:
             return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3));
-        case BNE:
+        case DIR_PPM:
             return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3));
-        case TSW:
+        case DIR_MMP:
             return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3));
-        case TSE:
+        case DIR_PMP:
             return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3));
-        case BNW:
+        case DIR_MPM:
             return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3));
-        case BSE:
+        case DIR_PMM:
             return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3));
-        case TNW:
+        case DIR_MPP:
             return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3));
         default:
             throw UbException(UB_EXARGS, "unknown direction");
@@ -612,15 +850,15 @@ static std::vector<int> getEX(const int &exn)
     ex.resize(ENDDIR + 1);
     switch (exn) {
         case 1:
-            for (int dir = STARTDIR; dir < ENDDIR; ++dir)
+            for (int dir = STARTDIR; dir <= ENDDIR; ++dir)
                 ex[dir] = DX1[dir];
             break;
         case 2:
-            for (int dir = STARTDIR; dir < ENDDIR; ++dir)
+            for (int dir = STARTDIR; dir <= ENDDIR; ++dir)
                 ex[dir] = DX2[dir];
             break;
         case 3:
-            for (int dir = STARTDIR; dir < ENDDIR; ++dir)
+            for (int dir = STARTDIR; dir <= ENDDIR; ++dir)
                 ex[dir] = DX3[dir];
             break;
     }
@@ -631,28 +869,28 @@ static inline void calcDistanceToNeighbors(std::vector<double> &distNeigh, const
 {
     // distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1);
 
-    distNeigh[E] = distNeigh[W] = distNeigh[N] = deltaX1;
-    distNeigh[S] = distNeigh[T] = distNeigh[B] = deltaX1;
-    distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = UbMath::sqrt2 * deltaX1;
-    distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = UbMath::sqrt2 * deltaX1;
-    distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = UbMath::sqrt2 * deltaX1;
-    distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = UbMath::sqrt3 * deltaX1;
-    distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = UbMath::sqrt3 * deltaX1;
+    distNeigh[DIR_P00] = distNeigh[DIR_M00] = distNeigh[DIR_0P0] = deltaX1;
+    distNeigh[DIR_0M0] = distNeigh[DIR_00P] = distNeigh[DIR_00M] = deltaX1;
+    distNeigh[DIR_PP0] = distNeigh[DIR_MP0] = distNeigh[DIR_MM0] = distNeigh[DIR_PM0] = UbMath::sqrt2 * deltaX1;
+    distNeigh[DIR_P0P] = distNeigh[DIR_0PP] = distNeigh[DIR_M0P] = distNeigh[DIR_0MP] = UbMath::sqrt2 * deltaX1;
+    distNeigh[DIR_P0M] = distNeigh[DIR_0PM] = distNeigh[DIR_M0M] = distNeigh[DIR_0MM] = UbMath::sqrt2 * deltaX1;
+    distNeigh[DIR_PPP] = distNeigh[DIR_MPP] = distNeigh[DIR_PMP] = distNeigh[DIR_MMP] = UbMath::sqrt3 * deltaX1;
+    distNeigh[DIR_PPM] = distNeigh[DIR_MPM] = distNeigh[DIR_PMM] = distNeigh[DIR_MMM] = UbMath::sqrt3 * deltaX1;
 }
 //////////////////////////////////////////////////////////////////////////
 static inline void calcDistanceToNeighbors(std::vector<double> &distNeigh, const double &deltaX1, const double &deltaX2,
                                            const double &deltaX3)
 {
     // distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1);
-    distNeigh[E] = distNeigh[W] = deltaX1;
-    distNeigh[N] = distNeigh[S] = deltaX2;
-    distNeigh[T] = distNeigh[B] = deltaX3;
-    distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2);
-    distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt(deltaX1 * deltaX1 + deltaX3 * deltaX3);
-    distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt(deltaX2 * deltaX2 + deltaX3 * deltaX3);
-    distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] =
+    distNeigh[DIR_P00] = distNeigh[DIR_M00] = deltaX1;
+    distNeigh[DIR_0P0] = distNeigh[DIR_0M0] = deltaX2;
+    distNeigh[DIR_00P] = distNeigh[DIR_00M] = deltaX3;
+    distNeigh[DIR_PP0] = distNeigh[DIR_MP0] = distNeigh[DIR_MM0] = distNeigh[DIR_PM0] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2);
+    distNeigh[DIR_P0P] = distNeigh[DIR_0PP] = distNeigh[DIR_M0P] = distNeigh[DIR_0MP] = sqrt(deltaX1 * deltaX1 + deltaX3 * deltaX3);
+    distNeigh[DIR_P0M] = distNeigh[DIR_0PM] = distNeigh[DIR_M0M] = distNeigh[DIR_0MM] = sqrt(deltaX2 * deltaX2 + deltaX3 * deltaX3);
+    distNeigh[DIR_PPP] = distNeigh[DIR_MPP] = distNeigh[DIR_PMP] = distNeigh[DIR_MMP] =
         sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3);
-    distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] =
+    distNeigh[DIR_PPM] = distNeigh[DIR_MPM] = distNeigh[DIR_PMM] = distNeigh[DIR_MMM] =
         sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3);
 }
 //////////////////////////////////////////////////////////////////////////
@@ -661,107 +899,107 @@ static inline void initRayVectors(double *const &rayX1, double *const &rayX2, do
     int fdir;
     double c1oS2 = UbMath::one_over_sqrt2;
     double c1oS3 = UbMath::one_over_sqrt3;
-    fdir         = E;
+    fdir         = DIR_P00;
     rayX1[fdir]  = 1.0;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = 0.0;
-    fdir         = W;
+    fdir         = DIR_M00;
     rayX1[fdir]  = -1.0;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = 0.0;
-    fdir         = N;
+    fdir         = DIR_0P0;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = 1.0;
     rayX3[fdir]  = 0.0;
-    fdir         = S;
+    fdir         = DIR_0M0;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = -1.0;
     rayX3[fdir]  = 0.0;
-    fdir         = T;
+    fdir         = DIR_00P;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = 1.0;
-    fdir         = B;
+    fdir         = DIR_00M;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = -1.0;
-    fdir         = NE;
+    fdir         = DIR_PP0;
     rayX1[fdir]  = c1oS2;
     rayX2[fdir]  = c1oS2;
     rayX3[fdir]  = 0.0;
-    fdir         = SW;
+    fdir         = DIR_MM0;
     rayX1[fdir]  = -c1oS2;
     rayX2[fdir]  = -c1oS2;
     rayX3[fdir]  = 0.0;
-    fdir         = SE;
+    fdir         = DIR_PM0;
     rayX1[fdir]  = c1oS2;
     rayX2[fdir]  = -c1oS2;
     rayX3[fdir]  = 0.0;
-    fdir         = NW;
+    fdir         = DIR_MP0;
     rayX1[fdir]  = -c1oS2;
     rayX2[fdir]  = c1oS2;
     rayX3[fdir]  = 0.0;
-    fdir         = TE;
+    fdir         = DIR_P0P;
     rayX1[fdir]  = c1oS2;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = c1oS2;
-    fdir         = BW;
+    fdir         = DIR_M0M;
     rayX1[fdir]  = -c1oS2;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = -c1oS2;
-    fdir         = BE;
+    fdir         = DIR_P0M;
     rayX1[fdir]  = c1oS2;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = -c1oS2;
-    fdir         = TW;
+    fdir         = DIR_M0P;
     rayX1[fdir]  = -c1oS2;
     rayX2[fdir]  = 0.0;
     rayX3[fdir]  = c1oS2;
-    fdir         = TN;
+    fdir         = DIR_0PP;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = c1oS2;
     rayX3[fdir]  = c1oS2;
-    fdir         = BS;
+    fdir         = DIR_0MM;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = -c1oS2;
     rayX3[fdir]  = -c1oS2;
-    fdir         = BN;
+    fdir         = DIR_0PM;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = c1oS2;
     rayX3[fdir]  = -c1oS2;
-    fdir         = TS;
+    fdir         = DIR_0MP;
     rayX1[fdir]  = 0.0;
     rayX2[fdir]  = -c1oS2;
     rayX3[fdir]  = c1oS2;
-    fdir         = TNE;
+    fdir         = DIR_PPP;
     rayX1[fdir]  = c1oS3;
     rayX2[fdir]  = c1oS3;
     rayX3[fdir]  = c1oS3;
-    fdir         = TNW;
+    fdir         = DIR_MPP;
     rayX1[fdir]  = -c1oS3;
     rayX2[fdir]  = c1oS3;
     rayX3[fdir]  = c1oS3;
-    fdir         = TSE;
+    fdir         = DIR_PMP;
     rayX1[fdir]  = c1oS3;
     rayX2[fdir]  = -c1oS3;
     rayX3[fdir]  = c1oS3;
-    fdir         = TSW;
+    fdir         = DIR_MMP;
     rayX1[fdir]  = -c1oS3;
     rayX2[fdir]  = -c1oS3;
     rayX3[fdir]  = c1oS3;
-    fdir         = BNE;
+    fdir         = DIR_PPM;
     rayX1[fdir]  = c1oS3;
     rayX2[fdir]  = c1oS3;
     rayX3[fdir]  = -c1oS3;
-    fdir         = BNW;
+    fdir         = DIR_MPM;
     rayX1[fdir]  = -c1oS3;
     rayX2[fdir]  = c1oS3;
     rayX3[fdir]  = -c1oS3;
-    fdir         = BSE;
+    fdir         = DIR_PMM;
     rayX1[fdir]  = c1oS3;
     rayX2[fdir]  = -c1oS3;
     rayX3[fdir]  = -c1oS3;
-    fdir         = BSW;
+    fdir         = DIR_MMM;
     rayX1[fdir]  = -c1oS3;
     rayX2[fdir]  = -c1oS3;
     rayX3[fdir]  = -c1oS3;
@@ -770,9 +1008,9 @@ static inline void initRayVectors(double *const &rayX1, double *const &rayX2, do
 static inline LBMReal calcPress(const LBMReal *const f, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3)
 {
     LBMReal op = 1.0;
-    return ((f[E] + f[W] + f[N] + f[S] + f[T] + f[B] +
-             2. * (f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS]) +
-             3. * (f[TNE] + f[TSW] + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW]) -
+    return ((f[DIR_P00] + f[DIR_M00] + f[DIR_0P0] + f[DIR_0M0] + f[DIR_00P] + f[DIR_00M] +
+             2. * (f[DIR_PP0] + f[DIR_MM0] + f[DIR_PM0] + f[DIR_MP0] + f[DIR_P0P] + f[DIR_M0M] + f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] + f[DIR_0MM] + f[DIR_0PM] + f[DIR_0MP]) +
+             3. * (f[DIR_PPP] + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] + f[DIR_MMM] + f[DIR_PMM] + f[DIR_MPM]) -
              (vx1 * vx1 + vx2 * vx2 + vx3 * vx3)) *
                 (1 - 0.5 * op) +
             op * 0.5 * (rho)) *
@@ -781,35 +1019,35 @@ static inline LBMReal calcPress(const LBMReal *const f, LBMReal rho, LBMReal vx1
 //////////////////////////////////////////////////////////////////////////
 static inline LBMReal getShearRate(const LBMReal *const f, LBMReal collFactorF)
 {
-    LBMReal mfcbb = f[E];
-    LBMReal mfbcb = f[N];
-    LBMReal mfbbc = f[T];
-    LBMReal mfccb = f[NE];
-    LBMReal mfacb = f[NW];
-    LBMReal mfcbc = f[TE];
-    LBMReal mfabc = f[TW];
-    LBMReal mfbcc = f[TN];
-    LBMReal mfbac = f[TS];
-    LBMReal mfccc = f[TNE];
-    LBMReal mfacc = f[TNW];
-    LBMReal mfcac = f[TSE];
-    LBMReal mfaac = f[TSW];
+    LBMReal mfcbb = f[DIR_P00];
+    LBMReal mfbcb = f[DIR_0P0];
+    LBMReal mfbbc = f[DIR_00P];
+    LBMReal mfccb = f[DIR_PP0];
+    LBMReal mfacb = f[DIR_MP0];
+    LBMReal mfcbc = f[DIR_P0P];
+    LBMReal mfabc = f[DIR_M0P];
+    LBMReal mfbcc = f[DIR_0PP];
+    LBMReal mfbac = f[DIR_0MP];
+    LBMReal mfccc = f[DIR_PPP];
+    LBMReal mfacc = f[DIR_MPP];
+    LBMReal mfcac = f[DIR_PMP];
+    LBMReal mfaac = f[DIR_MMP];
 
-    LBMReal mfabb = f[W];
-    LBMReal mfbab = f[S];
-    LBMReal mfbba = f[B];
-    LBMReal mfaab = f[SW];
-    LBMReal mfcab = f[SE];
-    LBMReal mfaba = f[BW];
-    LBMReal mfcba = f[BE];
-    LBMReal mfbaa = f[BS];
-    LBMReal mfbca = f[BN];
-    LBMReal mfaaa = f[BSW];
-    LBMReal mfcaa = f[BSE];
-    LBMReal mfaca = f[BNW];
-    LBMReal mfcca = f[BNE];
+    LBMReal mfabb = f[DIR_M00];
+    LBMReal mfbab = f[DIR_0M0];
+    LBMReal mfbba = f[DIR_00M];
+    LBMReal mfaab = f[DIR_MM0];
+    LBMReal mfcab = f[DIR_PM0];
+    LBMReal mfaba = f[DIR_M0M];
+    LBMReal mfcba = f[DIR_P0M];
+    LBMReal mfbaa = f[DIR_0MM];
+    LBMReal mfbca = f[DIR_0PM];
+    LBMReal mfaaa = f[DIR_MMM];
+    LBMReal mfcaa = f[DIR_PMM];
+    LBMReal mfaca = f[DIR_MPM];
+    LBMReal mfcca = f[DIR_PPM];
 
-    LBMReal mfbbb = f[REST];
+    LBMReal mfbbb = f[DIR_000];
 
     LBMReal m0, m1, m2;
 
@@ -1113,40 +1351,40 @@ static void calcMultiphaseFeq(LBMReal *const &feq /*[27]*/, const LBMReal &rho,
     using namespace UbMath;
     LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
 
-    feq[REST] = c8o27 * (p1 + rho * c1o3 * (-cu_sq));
-    feq[E]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq));
-    feq[W]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq));
-    feq[N]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq));
-    feq[S]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq));
-    feq[T]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq));
-    feq[B]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq));
-    feq[NE]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
-    feq[SW]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
-    feq[SE]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
-    feq[NW]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
-    feq[TE]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
-    feq[BW]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
-    feq[BE]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
-    feq[TW]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
-    feq[TN]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
-    feq[BS]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
-    feq[BN]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
-    feq[TS]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
-    feq[TNE] =
+    feq[DIR_000] = c8o27 * (p1 + rho * c1o3 * (-cu_sq));
+    feq[DIR_P00]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq));
+    feq[DIR_M00]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq));
+    feq[DIR_0P0]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq));
+    feq[DIR_0M0]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq));
+    feq[DIR_00P]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq));
+    feq[DIR_00M]    = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq));
+    feq[DIR_PP0]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
+    feq[DIR_MM0]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
+    feq[DIR_PM0]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
+    feq[DIR_MP0]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
+    feq[DIR_P0P]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
+    feq[DIR_M0M]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
+    feq[DIR_P0M]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
+    feq[DIR_M0P]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
+    feq[DIR_0PP]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
+    feq[DIR_0MM]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
+    feq[DIR_0PM]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
+    feq[DIR_0MP]   = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
+    feq[DIR_PPP] =
         c1o216 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq));
-    feq[BSW] = c1o216 *
+    feq[DIR_MMM] = c1o216 *
                (p1 + rho * c1o3 * (3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq));
-    feq[BNE] =
+    feq[DIR_PPM] =
         c1o216 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq));
-    feq[TSW] = c1o216 *
+    feq[DIR_MMP] = c1o216 *
                (p1 + rho * c1o3 * (3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq));
-    feq[TSE] =
+    feq[DIR_PMP] =
         c1o216 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq));
-    feq[BNW] = c1o216 *
+    feq[DIR_MPM] = c1o216 *
                (p1 + rho * c1o3 * (3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq));
-    feq[BSE] =
+    feq[DIR_PMM] =
         c1o216 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq));
-    feq[TNW] = c1o216 *
+    feq[DIR_MPP] = c1o216 *
                (p1 + rho * c1o3 * (3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq));
 }
 //////////////////////////////////////////////////////////////////////////
@@ -1156,33 +1394,33 @@ static void calcMultiphaseFeqVB(LBMReal *const &feq /*[27]*/, const LBMReal &p1,
     using namespace UbMath;
     LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
 
-    feq[REST] = p1 + c8o27 * (-cu_sq);
-    feq[E]    = c2o27 * ((3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq));
-    feq[W]    = c2o27 * ((3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq));
-    feq[N]    = c2o27 * ((3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq));
-    feq[S]    = c2o27 * ((3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq));
-    feq[T]    = c2o27 * ((3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq));
-    feq[B]    = c2o27 * ((3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq));
-    feq[NE]   = c1o54 * ((3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
-    feq[SW]   = c1o54 * ((3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
-    feq[SE]   = c1o54 * ((3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
-    feq[NW]   = c1o54 * ((3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
-    feq[TE]   = c1o54 * ((3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
-    feq[BW]   = c1o54 * ((3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
-    feq[BE]   = c1o54 * ((3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
-    feq[TW]   = c1o54 * ((3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
-    feq[TN]   = c1o54 * ((3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
-    feq[BS]   = c1o54 * ((3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
-    feq[BN]   = c1o54 * ((3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
-    feq[TS]   = c1o54 * ((3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
-    feq[TNE]  = c1o216 * ((3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq));
-    feq[BSW]  = c1o216 * ((3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq));
-    feq[BNE]  = c1o216 * ((3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq));
-    feq[TSW]  = c1o216 * ((3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq));
-    feq[TSE]  = c1o216 * ((3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq));
-    feq[BNW]  = c1o216 * ((3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq));
-    feq[BSE]  = c1o216 * ((3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq));
-    feq[TNW]  = c1o216 * ((3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq));
+    feq[DIR_000] = p1 + c8o27 * (-cu_sq);
+    feq[DIR_P00]    = c2o27 * ((3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq));
+    feq[DIR_M00]    = c2o27 * ((3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq));
+    feq[DIR_0P0]    = c2o27 * ((3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq));
+    feq[DIR_0M0]    = c2o27 * ((3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq));
+    feq[DIR_00P]    = c2o27 * ((3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq));
+    feq[DIR_00M]    = c2o27 * ((3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq));
+    feq[DIR_PP0]   = c1o54 * ((3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
+    feq[DIR_MM0]   = c1o54 * ((3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
+    feq[DIR_PM0]   = c1o54 * ((3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
+    feq[DIR_MP0]   = c1o54 * ((3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
+    feq[DIR_P0P]   = c1o54 * ((3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
+    feq[DIR_M0M]   = c1o54 * ((3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
+    feq[DIR_P0M]   = c1o54 * ((3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
+    feq[DIR_M0P]   = c1o54 * ((3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
+    feq[DIR_0PP]   = c1o54 * ((3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
+    feq[DIR_0MM]   = c1o54 * ((3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
+    feq[DIR_0PM]   = c1o54 * ((3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
+    feq[DIR_0MP]   = c1o54 * ((3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
+    feq[DIR_PPP]  = c1o216 * ((3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq));
+    feq[DIR_MMM]  = c1o216 * ((3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq));
+    feq[DIR_PPM]  = c1o216 * ((3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq));
+    feq[DIR_MMP]  = c1o216 * ((3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq));
+    feq[DIR_PMP]  = c1o216 * ((3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq));
+    feq[DIR_MPM]  = c1o216 * ((3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq));
+    feq[DIR_PMM]  = c1o216 * ((3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq));
+    feq[DIR_MPP]  = c1o216 * ((3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq));
 }
 //////////////////////////////////////////////////////////////////////////
 static void calcMultiphaseHeq(LBMReal *const &heq /*[27]*/, const LBMReal &phi, const LBMReal &vx1, const LBMReal &vx2,
@@ -1191,35 +1429,34 @@ static void calcMultiphaseHeq(LBMReal *const &heq /*[27]*/, const LBMReal &phi,
     using namespace UbMath;
     LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
 
-    heq[REST] = c8o27 * phi * (1.0 - cu_sq);
-    heq[E]    = c2o27 * phi * (1.0 + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq);
-    heq[W]    = c2o27 * phi * (1.0 + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq);
-    heq[N]    = c2o27 * phi * (1.0 + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq);
-    heq[S]    = c2o27 * phi * (1.0 + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq);
-    heq[T]    = c2o27 * phi * (1.0 + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq);
-    heq[B]    = c2o27 * phi * (1.0 + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq);
-    heq[NE]   = c1o54 * phi * (1.0 + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
-    heq[SW]   = c1o54 * phi * (1.0 + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
-    heq[SE]   = c1o54 * phi * (1.0 + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
-    heq[NW]   = c1o54 * phi * (1.0 + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
-    heq[TE]   = c1o54 * phi * (1.0 + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
-    heq[BW]   = c1o54 * phi * (1.0 + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
-    heq[BE]   = c1o54 * phi * (1.0 + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
-    heq[TW]   = c1o54 * phi * (1.0 + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
-    heq[TN]   = c1o54 * phi * (1.0 + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
-    heq[BS]   = c1o54 * phi * (1.0 + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
-    heq[BN]   = c1o54 * phi * (1.0 + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
-    heq[TS]   = c1o54 * phi * (1.0 + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
-    heq[TNE]  = c1o216 * phi * (1.0 + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq);
-    heq[BSW] = c1o216 * phi * (1.0 + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq);
-    heq[BNE] = c1o216 * phi * (1.0 + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq);
-    heq[TSW] = c1o216 * phi * (1.0 + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq);
-    heq[TSE] = c1o216 * phi * (1.0 + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq);
-    heq[BNW] = c1o216 * phi * (1.0 + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq);
-    heq[BSE] = c1o216 * phi * (1.0 + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq);
-    heq[TNW] = c1o216 * phi * (1.0 + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq);
+    heq[DIR_000] = c8o27 * phi * (1.0 - cu_sq);
+    heq[DIR_P00]    = c2o27 * phi * (1.0 + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq);
+    heq[DIR_M00]    = c2o27 * phi * (1.0 + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq);
+    heq[DIR_0P0]    = c2o27 * phi * (1.0 + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq);
+    heq[DIR_0M0]    = c2o27 * phi * (1.0 + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq);
+    heq[DIR_00P]    = c2o27 * phi * (1.0 + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq);
+    heq[DIR_00M]    = c2o27 * phi * (1.0 + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq);
+    heq[DIR_PP0]   = c1o54 * phi * (1.0 + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
+    heq[DIR_MM0]   = c1o54 * phi * (1.0 + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
+    heq[DIR_PM0]   = c1o54 * phi * (1.0 + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
+    heq[DIR_MP0]   = c1o54 * phi * (1.0 + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
+    heq[DIR_P0P]   = c1o54 * phi * (1.0 + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
+    heq[DIR_M0M]   = c1o54 * phi * (1.0 + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
+    heq[DIR_P0M]   = c1o54 * phi * (1.0 + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
+    heq[DIR_M0P]   = c1o54 * phi * (1.0 + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
+    heq[DIR_0PP]   = c1o54 * phi * (1.0 + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
+    heq[DIR_0MM]   = c1o54 * phi * (1.0 + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
+    heq[DIR_0PM]   = c1o54 * phi * (1.0 + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
+    heq[DIR_0MP]   = c1o54 * phi * (1.0 + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
+    heq[DIR_PPP]  = c1o216 * phi * (1.0 + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq);
+    heq[DIR_MMM] = c1o216 * phi * (1.0 + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq);
+    heq[DIR_PPM] = c1o216 * phi * (1.0 + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq);
+    heq[DIR_MMP] = c1o216 * phi * (1.0 + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq);
+    heq[DIR_PMP] = c1o216 * phi * (1.0 + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq);
+    heq[DIR_MPM] = c1o216 * phi * (1.0 + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq);
+    heq[DIR_PMM] = c1o216 * phi * (1.0 + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq);
+    heq[DIR_MPP] = c1o216 * phi * (1.0 + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq);
 }
-//////////////////////////////////////////////////////////////////////////
 
 } // namespace D3Q27System
 #endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp
index 089b505a5f5d357e378c1e556caeffc3e51bc411..90bc1998454e980c86054934222b251699f1412a 100644
--- a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp
@@ -68,37 +68,37 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::initRelaxFactor(int vdir, d
          {
             switch (direction)
             {
-            case D3Q27System::E:
+            case D3Q27System::DIR_P00:
                muX1 = (double)(x1 + ix1 * maxX1);
                if (muX1 >= (sizeX - sizeSP) / deltaT)
                   spongeFactor = (sizeX - (muX1 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
                else spongeFactor = 1.0;
                break;
-            case D3Q27System::W:
+            case D3Q27System::DIR_M00:
                muX1 = (double)(x1 + ix1 * maxX1);
                if (muX1 <= sizeSP / deltaT)
                   spongeFactor = (sizeSP - (muX1 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
                else spongeFactor = 1.0;
                break;
-            case D3Q27System::N:
+            case D3Q27System::DIR_0P0:
                muX2 = (double)(x2 + ix2 * maxX2);
                if (muX2 >= (sizeX - sizeSP) / deltaT)
                   spongeFactor = (sizeX - (muX2 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
                else spongeFactor = 1.0;
                break;
-            case D3Q27System::S:
+            case D3Q27System::DIR_0M0:
                muX2 = (double)(x2 + ix2 * maxX2);
                if (muX2 <= sizeSP / deltaT)
                   spongeFactor = (sizeSP - (muX2 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
                else spongeFactor = 1.0;
                break;
-            case D3Q27System::T:
+            case D3Q27System::DIR_00P:
                muX3 = (double)(x3 + ix3 * maxX3);
                if (muX3 >= (sizeX - sizeSP) / deltaT)
                   spongeFactor = (sizeX - (muX3 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
                else spongeFactor = 1.0;
                break;
-            case D3Q27System::B:
+            case D3Q27System::DIR_00M:
                muX3 = (double)(x3 + ix3 * maxX3);
                if (muX3 <= sizeSP / deltaT)
                   spongeFactor = (sizeSP - (muX3 * deltaT + 1)) / sizeSP / 2.0 + 0.5;
diff --git a/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp
index 15e6f1dddb88f31e7bf57e2d3235e04b48da1080..39b83f72a835ade4f903910a502383c6e3cd2323 100644
--- a/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp
@@ -61,7 +61,7 @@ void IncompressibleOffsetInterpolationProcessor::calcMoments(const LBMReal* cons
 {
    using namespace D3Q27System;
 
-   //UBLOG(logINFO,"D3Q27System::BW  = " << D3Q27System::BW);
+   //UBLOG(logINFO,"D3Q27System::DIR_M0M  = " << D3Q27System::DIR_M0M);
    //UBLOG(logINFO,"BW  = " << BW);
 
    LBMReal rho = 0.0;
@@ -82,14 +82,14 @@ void IncompressibleOffsetInterpolationProcessor::calcMoments(const LBMReal* cons
    //press = D3Q27System::calcPress(f,rho,vx1,vx2,vx3);
    press = rho; //interpolate rho!
 
-   kxy   = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))-(vx1*vx2));// might not be optimal MG 25.2.13
-   kyz   = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))-(vx2*vx3));
-   kxz   = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))-(vx1*vx3));
-   kxxMyy = -3./2.*omega*((((f[D3Q27System::BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))-(vx1*vx1-vx2*vx2));
-   kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))-(vx1*vx1-vx3*vx3));
-   //kxxMzz = -3./2.*omega*(((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[E])-(f[B]+f[T])))-(vx1*vx1-vx3*vx3));
+   kxy   = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))-(vx1*vx2));// might not be optimal MG 25.2.13
+   kyz   = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))-(vx2*vx3));
+   kxz   = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))-(vx1*vx3));
+   kxxMyy = -3./2.*omega*((((f[D3Q27System::DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))-(vx1*vx1-vx2*vx2));
+   kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))-(vx1*vx1-vx3*vx3));
+   //kxxMzz = -3./2.*omega*(((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[DIR_P00])-(f[B]+f[T])))-(vx1*vx1-vx3*vx3));
 
-   //UBLOG(logINFO, "t1 = "<<(((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[E])-(f[B]+f[T])));
+   //UBLOG(logINFO, "t1 = "<<(((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[DIR_P00])-(f[B]+f[T])));
    //UBLOG(logINFO, "kxxMzz = "<<kxxMzz);
 
    //UBLOG(logINFO,"f[BW]  = " << f[BW] << " BW  = " << BW);
@@ -543,33 +543,33 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedNode(LBMReal* f
    LBMReal feq[ENDF+1];
    D3Q27System::calcIncompFeq(feq,rho,vx1,vx2,vx3);
 
-   f[E]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[E];
-   f[W]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[W];
-   f[N]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[N];
-   f[S]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[S];
-   f[T]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[T];
-   f[B]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[B];
-   f[NE]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[NE];
-   f[SW]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[SW];
-   f[SE]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[SE];
-   f[NW]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[NW];
-   f[TE]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[TE];
-   f[BW]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[BW];
-   f[BE]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[BE];
-   f[TW]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[TW];
-   f[TN]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[TN];
-   f[BS]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[BS];
-   f[BN]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[BN];
-   f[TS]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[TS];
-   f[TNE]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[TNE];
-   f[TSW]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[TSW];
-   f[TSE]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[TSE];
-   f[TNW]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[TNW];
-   f[BNE]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[BNE];
-   f[BSW]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[BSW];
-   f[BSE]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[BSE];
-   f[BNW]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[BNW];
-   f[REST] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO                                                 + feq[REST];
+   f[DIR_P00]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[DIR_P00];
+   f[DIR_M00]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[DIR_M00];
+   f[DIR_0P0]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[DIR_0P0];
+   f[DIR_0M0]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[DIR_0M0];
+   f[DIR_00P]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[DIR_00P];
+   f[DIR_00M]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[DIR_00M];
+   f[DIR_PP0]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[DIR_PP0];
+   f[DIR_MM0]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[DIR_MM0];
+   f[DIR_PM0]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[DIR_PM0];
+   f[DIR_MP0]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[DIR_MP0];
+   f[DIR_P0P]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[DIR_P0P];
+   f[DIR_M0M]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[DIR_M0M];
+   f[DIR_P0M]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[DIR_P0M];
+   f[DIR_M0P]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[DIR_M0P];
+   f[DIR_0PP]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[DIR_0PP];
+   f[DIR_0MM]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[DIR_0MM];
+   f[DIR_0PM]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[DIR_0PM];
+   f[DIR_0MP]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[DIR_0MP];
+   f[DIR_PPP]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[DIR_PPP];
+   f[DIR_MMP]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[DIR_MMP];
+   f[DIR_PMP]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[DIR_PMP];
+   f[DIR_MPP]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[DIR_MPP];
+   f[DIR_PPM]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[DIR_PPM];
+   f[DIR_MMM]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[DIR_MMM];
+   f[DIR_PMM]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[DIR_PMM];
+   f[DIR_MPM]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[DIR_MPM];
+   f[DIR_000] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO                                                 + feq[DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SWB -0.25, -0.25, -0.25
@@ -737,33 +737,33 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(LBMReal*
    f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o));
    f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o));
 
-   f[E]    = f_E    + feq[E];
-   f[W]    = f_E    + feq[W];
-   f[N]    = f_N    + feq[N];
-   f[S]    = f_N    + feq[S];
-   f[T]    = f_T    + feq[T];
-   f[B]    = f_T    + feq[B];
-   f[NE]   = f_NE   + feq[NE];
-   f[SW]   = f_NE   + feq[SW];
-   f[SE]   = f_SE   + feq[SE];
-   f[NW]   = f_SE   + feq[NW];
-   f[TE]   = f_TE   + feq[TE];
-   f[BW]   = f_TE   + feq[BW];
-   f[BE]   = f_BE   + feq[BE];
-   f[TW]   = f_BE   + feq[TW];
-   f[TN]   = f_TN   + feq[TN];
-   f[BS]   = f_TN   + feq[BS];
-   f[BN]   = f_BN   + feq[BN];
-   f[TS]   = f_BN   + feq[TS];
-   f[TNE]  = f_TNE  + feq[TNE];
-   f[TNW]  = f_TNW  + feq[TNW];
-   f[TSE]  = f_TSE  + feq[TSE];
-   f[TSW]  = f_TSW  + feq[TSW];
-   f[BNE]  = f_TSW  + feq[BNE];
-   f[BNW]  = f_TSE  + feq[BNW];
-   f[BSE]  = f_TNW  + feq[BSE];
-   f[BSW]  = f_TNE  + feq[BSW];
-   f[REST] = f_ZERO + feq[REST];
+   f[DIR_P00]    = f_E    + feq[DIR_P00];
+   f[DIR_M00]    = f_E    + feq[DIR_M00];
+   f[DIR_0P0]    = f_N    + feq[DIR_0P0];
+   f[DIR_0M0]    = f_N    + feq[DIR_0M0];
+   f[DIR_00P]    = f_T    + feq[DIR_00P];
+   f[DIR_00M]    = f_T    + feq[DIR_00M];
+   f[DIR_PP0]   = f_NE   + feq[DIR_PP0];
+   f[DIR_MM0]   = f_NE   + feq[DIR_MM0];
+   f[DIR_PM0]   = f_SE   + feq[DIR_PM0];
+   f[DIR_MP0]   = f_SE   + feq[DIR_MP0];
+   f[DIR_P0P]   = f_TE   + feq[DIR_P0P];
+   f[DIR_M0M]   = f_TE   + feq[DIR_M0M];
+   f[DIR_P0M]   = f_BE   + feq[DIR_P0M];
+   f[DIR_M0P]   = f_BE   + feq[DIR_M0P];
+   f[DIR_0PP]   = f_TN   + feq[DIR_0PP];
+   f[DIR_0MM]   = f_TN   + feq[DIR_0MM];
+   f[DIR_0PM]   = f_BN   + feq[DIR_0PM];
+   f[DIR_0MP]   = f_BN   + feq[DIR_0MP];
+   f[DIR_PPP]  = f_TNE  + feq[DIR_PPP];
+   f[DIR_MPP]  = f_TNW  + feq[DIR_MPP];
+   f[DIR_PMP]  = f_TSE  + feq[DIR_PMP];
+   f[DIR_MMP]  = f_TSW  + feq[DIR_MMP];
+   f[DIR_PPM]  = f_TSW  + feq[DIR_PPM];
+   f[DIR_MPM]  = f_TSE  + feq[DIR_MPM];
+   f[DIR_PMM]  = f_TNW  + feq[DIR_PMM];
+   f[DIR_MMM]  = f_TNE  + feq[DIR_MMM];
+   f[DIR_000] = f_ZERO + feq[DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 void IncompressibleOffsetInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3)
diff --git a/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp
index 554fc6614c11e2e8b96f5829d81d1c27e9365870..c37571337e537c324b557ac6c76680a63fc89b00 100644
--- a/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp
@@ -894,45 +894,45 @@ void InitDensityLBMKernel::calculate(int  /*step*/)
                //////////////////////////////////////////////////////////////////////////
                //read distribution
                ////////////////////////////////////////////////////////////////////////////
-               f[REST] = (*this->zeroDistributions)(x1, x2, x3);
+               f[DIR_000] = (*this->zeroDistributions)(x1, x2, x3);
 
-               f[E] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
-               f[N] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
-               f[T] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
-               f[NE] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
-               f[NW] = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3);
-               f[TE] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
-               f[TW] = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3);
-               f[TN] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
-               f[TS] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3);
-               f[TNE] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
-               f[TNW] = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3);
-               f[TSE] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3);
-               f[TSW] = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3);
+               f[DIR_P00] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
+               f[DIR_0P0] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
+               f[DIR_00P] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
+               f[DIR_PP0] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
+               f[DIR_MP0] = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3);
+               f[DIR_P0P] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
+               f[DIR_M0P] = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3);
+               f[DIR_0PP] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
+               f[DIR_0MP] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3);
+               f[DIR_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+               f[DIR_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3);
+               f[DIR_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3);
+               f[DIR_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3);
 
-               f[W] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3);
-               f[S] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3);
-               f[B] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p);
-               f[SW] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3);
-               f[SE] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3);
-               f[BW] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p);
-               f[BE] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p);
-               f[BS] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p);
-               f[BN] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p);
-               f[BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-               f[BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p);
-               f[BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p);
-               f[BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p);
+               f[DIR_M00] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3);
+               f[DIR_0M0] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3);
+               f[DIR_00M] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p);
+               f[DIR_MM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3);
+               f[DIR_PM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3);
+               f[DIR_M0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p);
+               f[DIR_P0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p);
+               f[DIR_0MM] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p);
+               f[DIR_0PM] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p);
+               f[DIR_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+               f[DIR_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p);
+               f[DIR_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p);
+               f[DIR_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p);
                //////////////////////////////////////////////////////////////////////////
 
-               drho = ((f[TNE]+f[BSW])+(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])+(f[TSW]+f[BNE]))
-                  +(((f[NE]+f[SW])+(f[SE]+f[NW]))+((f[TE]+f[BW])+(f[BE]+f[TW]))
-                     +((f[BN]+f[TS])+(f[TN]+f[BS])))+((f[E]+f[W])+(f[N]+f[S])
-                        +(f[T]+f[B]))+f[REST];
+               drho = ((f[DIR_PPP]+f[DIR_MMM])+(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])+(f[DIR_MMP]+f[DIR_PPM]))
+                  +(((f[DIR_PP0]+f[DIR_MM0])+(f[DIR_PM0]+f[DIR_MP0]))+((f[DIR_P0P]+f[DIR_M0M])+(f[DIR_P0M]+f[DIR_M0P]))
+                     +((f[DIR_0PM]+f[DIR_0MP])+(f[DIR_0PP]+f[DIR_0MM])))+((f[DIR_P00]+f[DIR_M00])+(f[DIR_0P0]+f[DIR_0M0])
+                        +(f[DIR_00P]+f[DIR_00M]))+f[DIR_000];
 
                //vx1 = ((((f[TNE]-f[BSW])+(f[TSE]-f[BNW]))+((f[BSE]-f[TNW])+(f[BNE]-f[TSW])))+
                //   (((f[BE]-f[TW])+(f[TE]-f[BW]))+((f[SE]-f[NW])+(f[NE]-f[SW])))+
-               //   (f[E]-f[W]));
+               //   (f[DIR_P00]-f[W]));
 
                //vx2 = ((((f[TNE]-f[BSW])+(f[BNW]-f[TSE]))+((f[TNW]-f[BSE])+(f[BNE]-f[TSW])))+
                //   (((f[BN]-f[TS])+(f[TN]-f[BS]))+((f[NW]-f[SE])+(f[NE]-f[SW])))+
@@ -956,67 +956,67 @@ void InitDensityLBMKernel::calculate(int  /*step*/)
 
                LBMReal cu_sq = 1.5*(vx1*vx1+vx2*vx2+vx3*vx3);
 
-               feq[REST] = c8o27*(drho-cu_sq);
-               feq[E] = c2o27*(drho+3.0*(vx1)+c9o2*(vx1)*(vx1)-cu_sq);
-               feq[W] = c2o27*(drho+3.0*(-vx1)+c9o2*(-vx1)*(-vx1)-cu_sq);
-               feq[N] = c2o27*(drho+3.0*(vx2)+c9o2*(vx2)*(vx2)-cu_sq);
-               feq[S] = c2o27*(drho+3.0*(-vx2)+c9o2*(-vx2)*(-vx2)-cu_sq);
-               feq[T] = c2o27*(drho+3.0*(vx3)+c9o2*(vx3)*(vx3)-cu_sq);
-               feq[B] = c2o27*(drho+3.0*(-vx3)+c9o2*(-vx3)*(-vx3)-cu_sq);
-               feq[NE] = c1o54*(drho+3.0*(vx1+vx2)+c9o2*(vx1+vx2)*(vx1+vx2)-cu_sq);
-               feq[SW] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq);
-               feq[SE] = c1o54*(drho+3.0*(vx1-vx2)+c9o2*(vx1-vx2)*(vx1-vx2)-cu_sq);
-               feq[NW] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq);
-               feq[TE] = c1o54*(drho+3.0*(vx1+vx3)+c9o2*(vx1+vx3)*(vx1+vx3)-cu_sq);
-               feq[BW] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq);
-               feq[BE] = c1o54*(drho+3.0*(vx1-vx3)+c9o2*(vx1-vx3)*(vx1-vx3)-cu_sq);
-               feq[TW] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq);
-               feq[TN] = c1o54*(drho+3.0*(vx2+vx3)+c9o2*(vx2+vx3)*(vx2+vx3)-cu_sq);
-               feq[BS] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq);
-               feq[BN] = c1o54*(drho+3.0*(vx2-vx3)+c9o2*(vx2-vx3)*(vx2-vx3)-cu_sq);
-               feq[TS] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq);
-               feq[TNE] = c1o216*(drho+3.0*(vx1+vx2+vx3)+c9o2*(vx1+vx2+vx3)*(vx1+vx2+vx3)-cu_sq);
-               feq[BSW] = c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
-               feq[BNE] = c1o216*(drho+3.0*(vx1+vx2-vx3)+c9o2*(vx1+vx2-vx3)*(vx1+vx2-vx3)-cu_sq);
-               feq[TSW] = c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
-               feq[TSE] = c1o216*(drho+3.0*(vx1-vx2+vx3)+c9o2*(vx1-vx2+vx3)*(vx1-vx2+vx3)-cu_sq);
-               feq[BNW] = c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
-               feq[BSE] = c1o216*(drho+3.0*(vx1-vx2-vx3)+c9o2*(vx1-vx2-vx3)*(vx1-vx2-vx3)-cu_sq);
-               feq[TNW] = c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+               feq[DIR_000] = c8o27*(drho-cu_sq);
+               feq[DIR_P00] = c2o27*(drho+3.0*(vx1)+c9o2*(vx1)*(vx1)-cu_sq);
+               feq[DIR_M00] = c2o27*(drho+3.0*(-vx1)+c9o2*(-vx1)*(-vx1)-cu_sq);
+               feq[DIR_0P0] = c2o27*(drho+3.0*(vx2)+c9o2*(vx2)*(vx2)-cu_sq);
+               feq[DIR_0M0] = c2o27*(drho+3.0*(-vx2)+c9o2*(-vx2)*(-vx2)-cu_sq);
+               feq[DIR_00P] = c2o27*(drho+3.0*(vx3)+c9o2*(vx3)*(vx3)-cu_sq);
+               feq[DIR_00M] = c2o27*(drho+3.0*(-vx3)+c9o2*(-vx3)*(-vx3)-cu_sq);
+               feq[DIR_PP0] = c1o54*(drho+3.0*(vx1+vx2)+c9o2*(vx1+vx2)*(vx1+vx2)-cu_sq);
+               feq[DIR_MM0] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq);
+               feq[DIR_PM0] = c1o54*(drho+3.0*(vx1-vx2)+c9o2*(vx1-vx2)*(vx1-vx2)-cu_sq);
+               feq[DIR_MP0] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq);
+               feq[DIR_P0P] = c1o54*(drho+3.0*(vx1+vx3)+c9o2*(vx1+vx3)*(vx1+vx3)-cu_sq);
+               feq[DIR_M0M] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq);
+               feq[DIR_P0M] = c1o54*(drho+3.0*(vx1-vx3)+c9o2*(vx1-vx3)*(vx1-vx3)-cu_sq);
+               feq[DIR_M0P] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq);
+               feq[DIR_0PP] = c1o54*(drho+3.0*(vx2+vx3)+c9o2*(vx2+vx3)*(vx2+vx3)-cu_sq);
+               feq[DIR_0MM] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq);
+               feq[DIR_0PM] = c1o54*(drho+3.0*(vx2-vx3)+c9o2*(vx2-vx3)*(vx2-vx3)-cu_sq);
+               feq[DIR_0MP] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq);
+               feq[DIR_PPP] = c1o216*(drho+3.0*(vx1+vx2+vx3)+c9o2*(vx1+vx2+vx3)*(vx1+vx2+vx3)-cu_sq);
+               feq[DIR_MMM] = c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+               feq[DIR_PPM] = c1o216*(drho+3.0*(vx1+vx2-vx3)+c9o2*(vx1+vx2-vx3)*(vx1+vx2-vx3)-cu_sq);
+               feq[DIR_MMP] = c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+               feq[DIR_PMP] = c1o216*(drho+3.0*(vx1-vx2+vx3)+c9o2*(vx1-vx2+vx3)*(vx1-vx2+vx3)-cu_sq);
+               feq[DIR_MPM] = c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+               feq[DIR_PMM] = c1o216*(drho+3.0*(vx1-vx2-vx3)+c9o2*(vx1-vx2-vx3)*(vx1-vx2-vx3)-cu_sq);
+               feq[DIR_MPP] = c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
 
                //Relaxation
-               f[REST] += (feq[REST]-f[REST])*collFactor;
-               f[E] += (feq[E]-f[E])*collFactor;
-               f[W] += (feq[W]-f[W])*collFactor;
-               f[N] += (feq[N]-f[N])*collFactor;
-               f[S] += (feq[S]-f[S])*collFactor;
-               f[T] += (feq[T]-f[T])*collFactor;
-               f[B] += (feq[B]-f[B])*collFactor;
-               f[NE] += (feq[NE]-f[NE])*collFactor;
-               f[SW] += (feq[SW]-f[SW])*collFactor;
-               f[SE] += (feq[SE]-f[SE])*collFactor;
-               f[NW] += (feq[NW]-f[NW])*collFactor;
-               f[TE] += (feq[TE]-f[TE])*collFactor;
-               f[BW] += (feq[BW]-f[BW])*collFactor;
-               f[BE] += (feq[BE]-f[BE])*collFactor;
-               f[TW] += (feq[TW]-f[TW])*collFactor;
-               f[TN] += (feq[TN]-f[TN])*collFactor;
-               f[BS] += (feq[BS]-f[BS])*collFactor;
-               f[BN] += (feq[BN]-f[BN])*collFactor;
-               f[TS] += (feq[TS]-f[TS])*collFactor;
+               f[DIR_000] += (feq[DIR_000]-f[DIR_000])*collFactor;
+               f[DIR_P00] += (feq[DIR_P00]-f[DIR_P00])*collFactor;
+               f[DIR_M00] += (feq[DIR_M00]-f[DIR_M00])*collFactor;
+               f[DIR_0P0] += (feq[DIR_0P0]-f[DIR_0P0])*collFactor;
+               f[DIR_0M0] += (feq[DIR_0M0]-f[DIR_0M0])*collFactor;
+               f[DIR_00P] += (feq[DIR_00P]-f[DIR_00P])*collFactor;
+               f[DIR_00M] += (feq[DIR_00M]-f[DIR_00M])*collFactor;
+               f[DIR_PP0] += (feq[DIR_PP0]-f[DIR_PP0])*collFactor;
+               f[DIR_MM0] += (feq[DIR_MM0]-f[DIR_MM0])*collFactor;
+               f[DIR_PM0] += (feq[DIR_PM0]-f[DIR_PM0])*collFactor;
+               f[DIR_MP0] += (feq[DIR_MP0]-f[DIR_MP0])*collFactor;
+               f[DIR_P0P] += (feq[DIR_P0P]-f[DIR_P0P])*collFactor;
+               f[DIR_M0M] += (feq[DIR_M0M]-f[DIR_M0M])*collFactor;
+               f[DIR_P0M] += (feq[DIR_P0M]-f[DIR_P0M])*collFactor;
+               f[DIR_M0P] += (feq[DIR_M0P]-f[DIR_M0P])*collFactor;
+               f[DIR_0PP] += (feq[DIR_0PP]-f[DIR_0PP])*collFactor;
+               f[DIR_0MM] += (feq[DIR_0MM]-f[DIR_0MM])*collFactor;
+               f[DIR_0PM] += (feq[DIR_0PM]-f[DIR_0PM])*collFactor;
+               f[DIR_0MP] += (feq[DIR_0MP]-f[DIR_0MP])*collFactor;
 
-               f[TNE] += (feq[TNE]-f[TNE])*collFactor;
-               f[BSW] += (feq[BSW]-f[BSW])*collFactor;
-               f[BNE] += (feq[BNE]-f[BNE])*collFactor;
-               f[TSW] += (feq[TSW]-f[TSW])*collFactor;
-               f[TSE] += (feq[TSE]-f[TSE])*collFactor;
-               f[BNW] += (feq[BNW]-f[BNW])*collFactor;
-               f[BSE] += (feq[BSE]-f[BSE])*collFactor;
-               f[TNW] += (feq[TNW]-f[TNW])*collFactor;
+               f[DIR_PPP] += (feq[DIR_PPP]-f[DIR_PPP])*collFactor;
+               f[DIR_MMM] += (feq[DIR_MMM]-f[DIR_MMM])*collFactor;
+               f[DIR_PPM] += (feq[DIR_PPM]-f[DIR_PPM])*collFactor;
+               f[DIR_MMP] += (feq[DIR_MMP]-f[DIR_MMP])*collFactor;
+               f[DIR_PMP] += (feq[DIR_PMP]-f[DIR_PMP])*collFactor;
+               f[DIR_MPM] += (feq[DIR_MPM]-f[DIR_MPM])*collFactor;
+               f[DIR_PMM] += (feq[DIR_PMM]-f[DIR_PMM])*collFactor;
+               f[DIR_MPP] += (feq[DIR_MPP]-f[DIR_MPP])*collFactor;
 
                //////////////////////////////////////////////////////////////////////////
 #ifdef  PROOF_CORRECTNESS
-               LBMReal rho_post = f[REST]+f[E]+f[W]+f[N]+f[S]+f[T]+f[B]
+               LBMReal rho_post = f[REST]+f[DIR_P00]+f[W]+f[N]+f[S]+f[T]+f[B]
                   +f[NE]+f[SW]+f[SE]+f[NW]+f[TE]+f[BW]+f[BE]
                   +f[TW]+f[TN]+f[BS]+f[BN]+f[TS]+f[TNE]+f[TSW]
                   +f[TSE]+f[TNW]+f[BNE]+f[BSW]+f[BSE]+f[BNW];
@@ -1033,35 +1033,35 @@ void InitDensityLBMKernel::calculate(int  /*step*/)
                //////////////////////////////////////////////////////////////////////////
                //write distribution
                //////////////////////////////////////////////////////////////////////////
-               (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::INV_E];
-               (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::INV_N];
-               (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::INV_T];
-               (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::INV_NE];
-               (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = f[D3Q27System::INV_NW];
-               (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::INV_TE];
-               (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = f[D3Q27System::INV_TW];
-               (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::INV_TN];
-               (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = f[D3Q27System::INV_TS];
-               (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::INV_TNE];
-               (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = f[D3Q27System::INV_TNW];
-               (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = f[D3Q27System::INV_TSE];
-               (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = f[D3Q27System::INV_TSW];
+               (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::INV_P00];
+               (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::INV_0P0];
+               (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::INV_00P];
+               (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::INV_PP0];
+               (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = f[D3Q27System::INV_MP0];
+               (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::INV_P0P];
+               (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = f[D3Q27System::INV_M0P];
+               (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::INV_0PP];
+               (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = f[D3Q27System::INV_0MP];
+               (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::INV_PPP];
+               (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = f[D3Q27System::INV_MPP];
+               (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = f[D3Q27System::INV_PMP];
+               (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = f[D3Q27System::INV_MMP];
 
-               (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = f[D3Q27System::INV_W];
-               (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = f[D3Q27System::INV_S];
-               (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = f[D3Q27System::INV_B];
-               (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = f[D3Q27System::INV_SW];
-               (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = f[D3Q27System::INV_SE];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = f[D3Q27System::INV_BW];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = f[D3Q27System::INV_BE];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = f[D3Q27System::INV_BS];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = f[D3Q27System::INV_BN];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = f[D3Q27System::INV_BSW];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = f[D3Q27System::INV_BSE];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = f[D3Q27System::INV_BNW];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = f[D3Q27System::INV_BNE];
+               (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = f[D3Q27System::INV_M00];
+               (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = f[D3Q27System::INV_0M0];
+               (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = f[D3Q27System::INV_00M];
+               (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = f[D3Q27System::INV_MM0];
+               (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = f[D3Q27System::INV_PM0];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = f[D3Q27System::INV_M0M];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = f[D3Q27System::INV_P0M];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = f[D3Q27System::INV_0MM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = f[D3Q27System::INV_0PM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = f[D3Q27System::INV_MMM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = f[D3Q27System::INV_PMM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = f[D3Q27System::INV_MPM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = f[D3Q27System::INV_PPM];
 
-               (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST];
+               (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000];
                //////////////////////////////////////////////////////////////////////////
 
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp
index fa0fd08c9ac1da11483dad6061c96fd3672ad3a4..3c588e1506d8649149daad5588e2290c0832334a 100644
--- a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp
@@ -111,12 +111,13 @@ void LBMKernel::setForcingX3(const std::string &muParserString)
 //////////////////////////////////////////////////////////////////////////
 void LBMKernel::checkFunction(mu::Parser fct)
 {
-    double x1 = 1.0, x2 = 1.0, x3 = 1.0, dt = 1.0, nue = 1.0;
+    double x1 = 1.0, x2 = 1.0, x3 = 1.0, dt = 1.0, nue = 1.0, rho = 1.0;
     fct.DefineVar("x1", &x1);
     fct.DefineVar("x2", &x2);
     fct.DefineVar("x3", &x3);
     fct.DefineVar("dt", &dt);
     fct.DefineVar("nue", &nue);
+    fct.DefineVar("rho", &rho);
 
     try {
         fct.Eval();
@@ -231,3 +232,5 @@ double LBMKernel::getPhaseFieldRelaxation() const { return tauH; }
 //////////////////////////////////////////////////////////////////////////
 void LBMKernel::setMobility(double mob) { this->mob = mob; }
 //////////////////////////////////////////////////////////////////////////
+void LBMKernel::setInterfaceWidth(double w) { this->interfaceWidth = w; }
+//////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h
index d4c477dee5fbdaa4b66b3d0d3200d4cab761dc0f..d5eb02d4c0ef310cdfd63d283abc9719996e5f84 100644
--- a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h
@@ -128,6 +128,7 @@ public:
     void setPhaseFieldRelaxation(double tauH);
     double getPhaseFieldRelaxation() const;
     void setMobility(double mob);
+    void setInterfaceWidth(double w);
 
 protected:
     SPtr<DataSet3D> dataSet;
@@ -163,6 +164,7 @@ protected:
     LBMReal phiH;
     LBMReal tauH;
     LBMReal mob;
+    LBMReal interfaceWidth { 4.0 };
 
 private:
     void checkFunction(mu::Parser fct);
diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp b/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp
index 6076eb018097dc77afcf37af2d14206325be463c..1fcdf118fa920d648b511c60ebbc48542e164be0 100644
--- a/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp
@@ -88,113 +88,113 @@ void LBMKernelETD3Q27BGK::calculate(int  /*step*/)
                //////////////////////////////////////////////////////////////////////////
                //read distribution
                ////////////////////////////////////////////////////////////////////////////
-               f[REST] = (*this->zeroDistributions)(x1,x2,x3);
+               f[DIR_000] = (*this->zeroDistributions)(x1,x2,x3);
 
-               f[E] = (*this->localDistributions)(D3Q27System::ET_E, x1,x2,x3);
-               f[N] = (*this->localDistributions)(D3Q27System::ET_N,x1,x2,x3);  
-               f[T] = (*this->localDistributions)(D3Q27System::ET_T,x1,x2,x3);
-               f[NE] = (*this->localDistributions)(D3Q27System::ET_NE,x1,x2,x3);
-               f[NW] = (*this->localDistributions)(D3Q27System::ET_NW,x1p,x2,x3);
-               f[TE] = (*this->localDistributions)(D3Q27System::ET_TE,x1,x2,x3);
-               f[TW] = (*this->localDistributions)(D3Q27System::ET_TW, x1p,x2,x3);
-               f[TN] = (*this->localDistributions)(D3Q27System::ET_TN,x1,x2,x3);
-               f[TS] = (*this->localDistributions)(D3Q27System::ET_TS,x1,x2p,x3);
-               f[TNE] = (*this->localDistributions)(D3Q27System::ET_TNE,x1,x2,x3);
-               f[TNW] = (*this->localDistributions)(D3Q27System::ET_TNW,x1p,x2,x3);
-               f[TSE] = (*this->localDistributions)(D3Q27System::ET_TSE,x1,x2p,x3);
-               f[TSW] = (*this->localDistributions)(D3Q27System::ET_TSW,x1p,x2p,x3);
+               f[DIR_P00] = (*this->localDistributions)(D3Q27System::ET_E, x1,x2,x3);
+               f[DIR_0P0] = (*this->localDistributions)(D3Q27System::ET_N,x1,x2,x3);
+               f[DIR_00P] = (*this->localDistributions)(D3Q27System::ET_T,x1,x2,x3);
+               f[DIR_PP0] = (*this->localDistributions)(D3Q27System::ET_NE,x1,x2,x3);
+               f[DIR_MP0] = (*this->localDistributions)(D3Q27System::ET_NW,x1p,x2,x3);
+               f[DIR_P0P] = (*this->localDistributions)(D3Q27System::ET_TE,x1,x2,x3);
+               f[DIR_M0P] = (*this->localDistributions)(D3Q27System::ET_TW, x1p,x2,x3);
+               f[DIR_0PP] = (*this->localDistributions)(D3Q27System::ET_TN,x1,x2,x3);
+               f[DIR_0MP] = (*this->localDistributions)(D3Q27System::ET_TS,x1,x2p,x3);
+               f[DIR_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE,x1,x2,x3);
+               f[DIR_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW,x1p,x2,x3);
+               f[DIR_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE,x1,x2p,x3);
+               f[DIR_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW,x1p,x2p,x3);
 
-               f[W ] = (*this->nonLocalDistributions)(D3Q27System::ET_W,x1p,x2,x3  );
-               f[S ] = (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,x2p,x3  );
-               f[B ] = (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,x2,x3p  );
-               f[SW] = (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1p,x2p,x3 );
-               f[SE] = (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,x2p,x3 );
-               f[BW] = (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1p,x2,x3p );
-               f[BE] = (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,x2,x3p );
-               f[BS] = (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,x2p,x3p );
-               f[BN] = (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,x2,x3p );
-               f[BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1p,x2p,x3p);
-               f[BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,x2p,x3p);
-               f[BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1p,x2,x3p);
-               f[BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,x2,x3p);
+               f[DIR_M00] = (*this->nonLocalDistributions)(D3Q27System::ET_W,x1p,x2,x3  );
+               f[DIR_0M0] = (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,x2p,x3  );
+               f[DIR_00M] = (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,x2,x3p  );
+               f[DIR_MM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1p,x2p,x3 );
+               f[DIR_PM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,x2p,x3 );
+               f[DIR_M0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1p,x2,x3p );
+               f[DIR_P0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,x2,x3p );
+               f[DIR_0MM] = (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,x2p,x3p );
+               f[DIR_0PM] = (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,x2,x3p );
+               f[DIR_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1p,x2p,x3p);
+               f[DIR_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,x2p,x3p);
+               f[DIR_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1p,x2,x3p);
+               f[DIR_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,x2,x3p);
                //////////////////////////////////////////////////////////////////////////
 
-               drho = f[REST] + f[E] + f[W] + f[N] + f[S] + f[T] + f[B] 
-               + f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE]
-               + f[TW] + f[TN] + f[BS] + f[BN] + f[TS] + f[TNE] + f[TSW]
-               + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW];
+               drho = f[DIR_000] + f[DIR_P00] + f[DIR_M00] + f[DIR_0P0] + f[DIR_0M0] + f[DIR_00P] + f[DIR_00M]
+               + f[DIR_PP0] + f[DIR_MM0] + f[DIR_PM0] + f[DIR_MP0] + f[DIR_P0P] + f[DIR_M0M] + f[DIR_P0M]
+               + f[DIR_M0P] + f[DIR_0PP] + f[DIR_0MM] + f[DIR_0PM] + f[DIR_0MP] + f[DIR_PPP] + f[DIR_MMP]
+               + f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] + f[DIR_MMM] + f[DIR_PMM] + f[DIR_MPM];
 
-               vx1 = f[E] - f[W] + f[NE] - f[SW] + f[SE] - f[NW] + f[TE] - f[BW]
-               + f[BE] - f[TW] + f[TNE] - f[TSW] + f[TSE] - f[TNW] + f[BNE] - f[BSW]
-               + f[BSE] - f[BNW]; 
+               vx1 = f[DIR_P00] - f[DIR_M00] + f[DIR_PP0] - f[DIR_MM0] + f[DIR_PM0] - f[DIR_MP0] + f[DIR_P0P] - f[DIR_M0M]
+               + f[DIR_P0M] - f[DIR_M0P] + f[DIR_PPP] - f[DIR_MMP] + f[DIR_PMP] - f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM]
+               + f[DIR_PMM] - f[DIR_MPM]; 
 
-               vx2 = f[N] - f[S] + f[NE] - f[SW] - f[SE] + f[NW] + f[TN] - f[BS] + f[BN]
-               - f[TS] + f[TNE] - f[TSW] - f[TSE] + f[TNW] + f[BNE] - f[BSW] - f[BSE] 
-               + f[BNW]; 
+               vx2 = f[DIR_0P0] - f[DIR_0M0] + f[DIR_PP0] - f[DIR_MM0] - f[DIR_PM0] + f[DIR_MP0] + f[DIR_0PP] - f[DIR_0MM] + f[DIR_0PM]
+               - f[DIR_0MP] + f[DIR_PPP] - f[DIR_MMP] - f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] 
+               + f[DIR_MPM]; 
 
-               vx3 = f[T] - f[B] + f[TE] - f[BW] - f[BE] + f[TW] + f[TN] - f[BS] - f[BN] 
-               + f[TS] + f[TNE] + f[TSW] + f[TSE] + f[TNW] - f[BNE] - f[BSW] - f[BSE] 
-               - f[BNW];
+               vx3 = f[DIR_00P] - f[DIR_00M] + f[DIR_P0P] - f[DIR_M0M] - f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] - f[DIR_0MM] - f[DIR_0PM]
+               + f[DIR_0MP] + f[DIR_PPP] + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] - f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] 
+               - f[DIR_MPM];
 
                LBMReal cu_sq=1.5*(vx1*vx1+vx2*vx2+vx3*vx3);
 
-               feq[REST] =  c8o27*(drho-cu_sq);
-               feq[E] =  c2o27*(drho+3.0*( vx1   )+c9o2*( vx1   )*( vx1   )-cu_sq);
-               feq[W] =  c2o27*(drho+3.0*(-vx1   )+c9o2*(-vx1   )*(-vx1   )-cu_sq);
-               feq[N] =  c2o27*(drho+3.0*(    vx2)+c9o2*(    vx2)*(    vx2)-cu_sq);
-               feq[S] =  c2o27*(drho+3.0*(   -vx2)+c9o2*(   -vx2)*(   -vx2)-cu_sq);
-               feq[T] =  c2o27*(drho+3.0*( vx3   )+c9o2*(    vx3)*(    vx3)-cu_sq);
-               feq[B] =  c2o27*(drho+3.0*(   -vx3)+c9o2*(   -vx3)*(   -vx3)-cu_sq);
-               feq[NE] = c1o54*(drho+3.0*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq);
-               feq[SW] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq);
-               feq[SE] = c1o54*(drho+3.0*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq);
-               feq[NW] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq);
-               feq[TE] = c1o54*(drho+3.0*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq);
-               feq[BW] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq);
-               feq[BE] = c1o54*(drho+3.0*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq);
-               feq[TW] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq);
-               feq[TN] = c1o54*(drho+3.0*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq);
-               feq[BS] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq);
-               feq[BN] = c1o54*(drho+3.0*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq);
-               feq[TS] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq);
-               feq[TNE]= c1o216*(drho+3.0*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
-               feq[BSW]= c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
-               feq[BNE]= c1o216*(drho+3.0*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
-               feq[TSW]= c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
-               feq[TSE]= c1o216*(drho+3.0*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
-               feq[BNW]= c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
-               feq[BSE]= c1o216*(drho+3.0*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
-               feq[TNW]= c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+               feq[DIR_000] =  c8o27*(drho-cu_sq);
+               feq[DIR_P00] =  c2o27*(drho+3.0*( vx1   )+c9o2*( vx1   )*( vx1   )-cu_sq);
+               feq[DIR_M00] =  c2o27*(drho+3.0*(-vx1   )+c9o2*(-vx1   )*(-vx1   )-cu_sq);
+               feq[DIR_0P0] =  c2o27*(drho+3.0*(    vx2)+c9o2*(    vx2)*(    vx2)-cu_sq);
+               feq[DIR_0M0] =  c2o27*(drho+3.0*(   -vx2)+c9o2*(   -vx2)*(   -vx2)-cu_sq);
+               feq[DIR_00P] =  c2o27*(drho+3.0*( vx3   )+c9o2*(    vx3)*(    vx3)-cu_sq);
+               feq[DIR_00M] =  c2o27*(drho+3.0*(   -vx3)+c9o2*(   -vx3)*(   -vx3)-cu_sq);
+               feq[DIR_PP0] = c1o54*(drho+3.0*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq);
+               feq[DIR_MM0] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq);
+               feq[DIR_PM0] = c1o54*(drho+3.0*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq);
+               feq[DIR_MP0] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq);
+               feq[DIR_P0P] = c1o54*(drho+3.0*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq);
+               feq[DIR_M0M] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq);
+               feq[DIR_P0M] = c1o54*(drho+3.0*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq);
+               feq[DIR_M0P] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq);
+               feq[DIR_0PP] = c1o54*(drho+3.0*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq);
+               feq[DIR_0MM] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq);
+               feq[DIR_0PM] = c1o54*(drho+3.0*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq);
+               feq[DIR_0MP] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq);
+               feq[DIR_PPP]= c1o216*(drho+3.0*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+               feq[DIR_MMM]= c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+               feq[DIR_PPM]= c1o216*(drho+3.0*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+               feq[DIR_MMP]= c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+               feq[DIR_PMP]= c1o216*(drho+3.0*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+               feq[DIR_MPM]= c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+               feq[DIR_PMM]= c1o216*(drho+3.0*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+               feq[DIR_MPP]= c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
 
                //Relaxation
-               f[REST] += (feq[REST]-f[REST])*collFactor;
-               f[E] += (feq[E]-f[E])*collFactor;
-               f[W] += (feq[W]-f[W])*collFactor;
-               f[N] += (feq[N]-f[N])*collFactor;
-               f[S] += (feq[S]-f[S])*collFactor;
-               f[T] += (feq[T]-f[T])*collFactor;
-               f[B] += (feq[B]-f[B])*collFactor;
-               f[NE] += (feq[NE]-f[NE])*collFactor;
-               f[SW] += (feq[SW]-f[SW])*collFactor;
-               f[SE] += (feq[SE]-f[SE])*collFactor;
-               f[NW] += (feq[NW]-f[NW])*collFactor;
-               f[TE] += (feq[TE]-f[TE])*collFactor;
-               f[BW] += (feq[BW]-f[BW])*collFactor;
-               f[BE] += (feq[BE]-f[BE])*collFactor;
-               f[TW] += (feq[TW]-f[TW])*collFactor;
-               f[TN] += (feq[TN]-f[TN])*collFactor;
-               f[BS] += (feq[BS]-f[BS])*collFactor;
-               f[BN] += (feq[BN]-f[BN])*collFactor;
-               f[TS] += (feq[TS]-f[TS])*collFactor;
+               f[DIR_000] += (feq[DIR_000]-f[DIR_000])*collFactor;
+               f[DIR_P00] += (feq[DIR_P00]-f[DIR_P00])*collFactor;
+               f[DIR_M00] += (feq[DIR_M00]-f[DIR_M00])*collFactor;
+               f[DIR_0P0] += (feq[DIR_0P0]-f[DIR_0P0])*collFactor;
+               f[DIR_0M0] += (feq[DIR_0M0]-f[DIR_0M0])*collFactor;
+               f[DIR_00P] += (feq[DIR_00P]-f[DIR_00P])*collFactor;
+               f[DIR_00M] += (feq[DIR_00M]-f[DIR_00M])*collFactor;
+               f[DIR_PP0] += (feq[DIR_PP0]-f[DIR_PP0])*collFactor;
+               f[DIR_MM0] += (feq[DIR_MM0]-f[DIR_MM0])*collFactor;
+               f[DIR_PM0] += (feq[DIR_PM0]-f[DIR_PM0])*collFactor;
+               f[DIR_MP0] += (feq[DIR_MP0]-f[DIR_MP0])*collFactor;
+               f[DIR_P0P] += (feq[DIR_P0P]-f[DIR_P0P])*collFactor;
+               f[DIR_M0M] += (feq[DIR_M0M]-f[DIR_M0M])*collFactor;
+               f[DIR_P0M] += (feq[DIR_P0M]-f[DIR_P0M])*collFactor;
+               f[DIR_M0P] += (feq[DIR_M0P]-f[DIR_M0P])*collFactor;
+               f[DIR_0PP] += (feq[DIR_0PP]-f[DIR_0PP])*collFactor;
+               f[DIR_0MM] += (feq[DIR_0MM]-f[DIR_0MM])*collFactor;
+               f[DIR_0PM] += (feq[DIR_0PM]-f[DIR_0PM])*collFactor;
+               f[DIR_0MP] += (feq[DIR_0MP]-f[DIR_0MP])*collFactor;
 
-               f[TNE] += (feq[TNE]-f[TNE])*collFactor;
-               f[BSW] += (feq[BSW]-f[BSW])*collFactor;
-               f[BNE] += (feq[BNE]-f[BNE])*collFactor;
-               f[TSW] += (feq[TSW]-f[TSW])*collFactor;
-               f[TSE] += (feq[TSE]-f[TSE])*collFactor;
-               f[BNW] += (feq[BNW]-f[BNW])*collFactor;
-               f[BSE] += (feq[BSE]-f[BSE])*collFactor;
-               f[TNW] += (feq[TNW]-f[TNW])*collFactor;
+               f[DIR_PPP] += (feq[DIR_PPP]-f[DIR_PPP])*collFactor;
+               f[DIR_MMM] += (feq[DIR_MMM]-f[DIR_MMM])*collFactor;
+               f[DIR_PPM] += (feq[DIR_PPM]-f[DIR_PPM])*collFactor;
+               f[DIR_MMP] += (feq[DIR_MMP]-f[DIR_MMP])*collFactor;
+               f[DIR_PMP] += (feq[DIR_PMP]-f[DIR_PMP])*collFactor;
+               f[DIR_MPM] += (feq[DIR_MPM]-f[DIR_MPM])*collFactor;
+               f[DIR_PMM] += (feq[DIR_PMM]-f[DIR_PMM])*collFactor;
+               f[DIR_MPP] += (feq[DIR_MPP]-f[DIR_MPP])*collFactor;
 
                //////////////////////////////////////////////////////////////////////////
                //forcing
@@ -208,37 +208,37 @@ void LBMKernelETD3Q27BGK::calculate(int  /*step*/)
                   forcingX2 = muForcingX2.Eval();
                   forcingX3 = muForcingX3.Eval();
 
-                  f[REST] +=                   0.0                        ;
-                  f[E  ] +=  3.0*c2o27  *  (forcingX1)                    ;
-                  f[W  ] +=  3.0*c2o27  *  (-forcingX1)                   ;
-                  f[N  ] +=  3.0*c2o27  *             (forcingX2)         ;
-                  f[S  ] +=  3.0*c2o27  *             (-forcingX2)        ;
-                  f[T  ] +=  3.0*c2o27  *                     (forcingX3) ;
-                  f[B  ] +=  3.0*c2o27  *                     (-forcingX3);
-                  f[NE ] +=  3.0*c1o54 * ( forcingX1+forcingX2          ) ;
-                  f[SW ] +=  3.0*c1o54 * (-forcingX1-forcingX2          ) ;
-                  f[SE ] +=  3.0*c1o54 * ( forcingX1-forcingX2          ) ;
-                  f[NW ] +=  3.0*c1o54 * (-forcingX1+forcingX2          ) ;
-                  f[TE ] +=  3.0*c1o54 * ( forcingX1          +forcingX3) ;
-                  f[BW ] +=  3.0*c1o54 * (-forcingX1          -forcingX3) ;
-                  f[BE ] +=  3.0*c1o54 * ( forcingX1          -forcingX3) ;
-                  f[TW ] +=  3.0*c1o54 * (-forcingX1          +forcingX3) ;
-                  f[TN ] +=  3.0*c1o54 * (           forcingX2+forcingX3) ;
-                  f[BS ] +=  3.0*c1o54 * (          -forcingX2-forcingX3) ;
-                  f[BN ] +=  3.0*c1o54 * (           forcingX2-forcingX3) ;
-                  f[TS ] +=  3.0*c1o54 * (          -forcingX2+forcingX3) ;
-                  f[TNE] +=  3.0*c1o216* ( forcingX1+forcingX2+forcingX3) ;
-                  f[BSW] +=  3.0*c1o216* (-forcingX1-forcingX2-forcingX3) ;
-                  f[BNE] +=  3.0*c1o216* ( forcingX1+forcingX2-forcingX3) ;
-                  f[TSW] +=  3.0*c1o216* (-forcingX1-forcingX2+forcingX3) ;
-                  f[TSE] +=  3.0*c1o216* ( forcingX1-forcingX2+forcingX3) ;
-                  f[BNW] +=  3.0*c1o216* (-forcingX1+forcingX2-forcingX3) ;
-                  f[BSE] +=  3.0*c1o216* ( forcingX1-forcingX2-forcingX3) ;
-                  f[TNW] +=  3.0*c1o216* (-forcingX1+forcingX2+forcingX3) ;
+                  f[DIR_000] +=                   0.0                        ;
+                  f[DIR_P00] +=  3.0*c2o27  *  (forcingX1)                    ;
+                  f[DIR_M00] +=  3.0*c2o27  *  (-forcingX1)                   ;
+                  f[DIR_0P0] +=  3.0*c2o27  *             (forcingX2)         ;
+                  f[DIR_0M0] +=  3.0*c2o27  *             (-forcingX2)        ;
+                  f[DIR_00P] +=  3.0*c2o27  *                     (forcingX3) ;
+                  f[DIR_00M] +=  3.0*c2o27  *                     (-forcingX3);
+                  f[DIR_PP0] +=  3.0*c1o54 * ( forcingX1+forcingX2          ) ;
+                  f[DIR_MM0 ] +=  3.0*c1o54 * (-forcingX1-forcingX2          ) ;
+                  f[DIR_PM0 ] +=  3.0*c1o54 * ( forcingX1-forcingX2          ) ;
+                  f[DIR_MP0 ] +=  3.0*c1o54 * (-forcingX1+forcingX2          ) ;
+                  f[DIR_P0P ] +=  3.0*c1o54 * ( forcingX1          +forcingX3) ;
+                  f[DIR_M0M ] +=  3.0*c1o54 * (-forcingX1          -forcingX3) ;
+                  f[DIR_P0M ] +=  3.0*c1o54 * ( forcingX1          -forcingX3) ;
+                  f[DIR_M0P ] +=  3.0*c1o54 * (-forcingX1          +forcingX3) ;
+                  f[DIR_0PP ] +=  3.0*c1o54 * (           forcingX2+forcingX3) ;
+                  f[DIR_0MM ] +=  3.0*c1o54 * (          -forcingX2-forcingX3) ;
+                  f[DIR_0PM ] +=  3.0*c1o54 * (           forcingX2-forcingX3) ;
+                  f[DIR_0MP ] +=  3.0*c1o54 * (          -forcingX2+forcingX3) ;
+                  f[DIR_PPP] +=  3.0*c1o216* ( forcingX1+forcingX2+forcingX3) ;
+                  f[DIR_MMM] +=  3.0*c1o216* (-forcingX1-forcingX2-forcingX3) ;
+                  f[DIR_PPM] +=  3.0*c1o216* ( forcingX1+forcingX2-forcingX3) ;
+                  f[DIR_MMP] +=  3.0*c1o216* (-forcingX1-forcingX2+forcingX3) ;
+                  f[DIR_PMP] +=  3.0*c1o216* ( forcingX1-forcingX2+forcingX3) ;
+                  f[DIR_MPM] +=  3.0*c1o216* (-forcingX1+forcingX2-forcingX3) ;
+                  f[DIR_PMM] +=  3.0*c1o216* ( forcingX1-forcingX2-forcingX3) ;
+                  f[DIR_MPP] +=  3.0*c1o216* (-forcingX1+forcingX2+forcingX3) ;
                }
                //////////////////////////////////////////////////////////////////////////
 #ifdef  PROOF_CORRECTNESS
-               LBMReal rho_post = f[REST] + f[E] + f[W] + f[N] + f[S] + f[T] + f[B] 
+               LBMReal rho_post = f[REST] + f[DIR_P00] + f[W] + f[N] + f[S] + f[T] + f[B] 
                + f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE]
                + f[TW] + f[TN] + f[BS] + f[BN] + f[TS] + f[TNE] + f[TSW]
                + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW];
@@ -255,35 +255,35 @@ void LBMKernelETD3Q27BGK::calculate(int  /*step*/)
                //////////////////////////////////////////////////////////////////////////
                //write distribution
                //////////////////////////////////////////////////////////////////////////
-               (*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f[D3Q27System::INV_E];
-               (*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f[D3Q27System::INV_N];
-               (*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f[D3Q27System::INV_T];
-               (*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f[D3Q27System::INV_NE];
-               (*this->localDistributions)(D3Q27System::ET_NW,x1p,x2,  x3) = f[D3Q27System::INV_NW];
-               (*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f[D3Q27System::INV_TE];
-               (*this->localDistributions)(D3Q27System::ET_TW,x1p,x2,  x3) = f[D3Q27System::INV_TW];
-               (*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f[D3Q27System::INV_TN];
-               (*this->localDistributions)(D3Q27System::ET_TS,x1,  x2p,x3) = f[D3Q27System::INV_TS];
-               (*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3) = f[D3Q27System::INV_TNE];
-               (*this->localDistributions)(D3Q27System::ET_TNW,x1p,x2,  x3) = f[D3Q27System::INV_TNW];
-               (*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2p,x3) = f[D3Q27System::INV_TSE];
-               (*this->localDistributions)(D3Q27System::ET_TSW,x1p,x2p,x3) = f[D3Q27System::INV_TSW];
+               (*this->localDistributions)(D3Q27System::ET_E,x1,  x2,  x3) = f[D3Q27System::INV_P00];
+               (*this->localDistributions)(D3Q27System::ET_N,x1,  x2,  x3) = f[D3Q27System::INV_0P0];
+               (*this->localDistributions)(D3Q27System::ET_T,x1,  x2,  x3) = f[D3Q27System::INV_00P];
+               (*this->localDistributions)(D3Q27System::ET_NE,x1,  x2,  x3) = f[D3Q27System::INV_PP0];
+               (*this->localDistributions)(D3Q27System::ET_NW,x1p,x2,  x3) = f[D3Q27System::INV_MP0];
+               (*this->localDistributions)(D3Q27System::ET_TE,x1,  x2,  x3) = f[D3Q27System::INV_P0P];
+               (*this->localDistributions)(D3Q27System::ET_TW,x1p,x2,  x3) = f[D3Q27System::INV_M0P];
+               (*this->localDistributions)(D3Q27System::ET_TN,x1,  x2,  x3) = f[D3Q27System::INV_0PP];
+               (*this->localDistributions)(D3Q27System::ET_TS,x1,  x2p,x3) = f[D3Q27System::INV_0MP];
+               (*this->localDistributions)(D3Q27System::ET_TNE,x1,  x2,  x3) = f[D3Q27System::INV_PPP];
+               (*this->localDistributions)(D3Q27System::ET_TNW,x1p,x2,  x3) = f[D3Q27System::INV_MPP];
+               (*this->localDistributions)(D3Q27System::ET_TSE,x1,  x2p,x3) = f[D3Q27System::INV_PMP];
+               (*this->localDistributions)(D3Q27System::ET_TSW,x1p,x2p,x3) = f[D3Q27System::INV_MMP];
 
-               (*this->nonLocalDistributions)(D3Q27System::ET_W,x1p,x2,  x3    ) = f[D3Q27System::INV_W ];
-               (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2p,x3    ) = f[D3Q27System::INV_S ];
-               (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3p  ) = f[D3Q27System::INV_B ];
-               (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1p,x2p,x3   ) = f[D3Q27System::INV_SW];
-               (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2p,x3   ) = f[D3Q27System::INV_SE];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1p,x2,  x3p ) = f[D3Q27System::INV_BW];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3p ) = f[D3Q27System::INV_BE];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2p,x3p ) = f[D3Q27System::INV_BS];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3p ) = f[D3Q27System::INV_BN];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1p,x2p,x3p) = f[D3Q27System::INV_BSW];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,  x2p,x3p) = f[D3Q27System::INV_BSE];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1p,x2,  x3p) = f[D3Q27System::INV_BNW];
-               (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3p) = f[D3Q27System::INV_BNE];
+               (*this->nonLocalDistributions)(D3Q27System::ET_W,x1p,x2,  x3    ) = f[D3Q27System::INV_M00 ];
+               (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,  x2p,x3    ) = f[D3Q27System::INV_0M0 ];
+               (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,  x2,  x3p  ) = f[D3Q27System::INV_00M ];
+               (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1p,x2p,x3   ) = f[D3Q27System::INV_MM0];
+               (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,  x2p,x3   ) = f[D3Q27System::INV_PM0];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1p,x2,  x3p ) = f[D3Q27System::INV_M0M];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,  x2,  x3p ) = f[D3Q27System::INV_P0M];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,  x2p,x3p ) = f[D3Q27System::INV_0MM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,  x2,  x3p ) = f[D3Q27System::INV_0PM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1p,x2p,x3p) = f[D3Q27System::INV_MMM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,  x2p,x3p) = f[D3Q27System::INV_PMM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1p,x2,  x3p) = f[D3Q27System::INV_MPM];
+               (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,  x2,  x3p) = f[D3Q27System::INV_PPM];
 
-               (*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::REST];
+               (*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::DIR_000];
                //////////////////////////////////////////////////////////////////////////
 
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h b/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h
index 40570cc3847f71a1942791afa7e95145daafb53b..de485c28da920b150476ad8e7b4e1f03019e132e 100644
--- a/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h
+++ b/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h
@@ -97,14 +97,6 @@ public:
         this->init(refLengthWorld, csWorld, rhoWorld, csWorld, refLengthLb, rhoLb, csLb);
     }
 
-    LBMUnitConverter(int /*dummy*/, double uReal, double uLB, double nuReal, double nuLB)
-    {
-        factorVelocityLbToW  = uReal / uLB;
-        factorViscosityLbToW = nuReal / nuLB;
-        factorDensityLbToW   = factorViscosityLbToW * factorVelocityLbToW * factorVelocityLbToW;
-        factorPressureLbToW  = factorDensityLbToW;
-    }
-
     virtual ~LBMUnitConverter() = default;
 
     double getRefRhoLb() { return refRhoLb; }
@@ -124,10 +116,7 @@ public:
     double getFactorDensityLbToW() { return this->factorMassLbToW / std::pow(factorLengthLbToW, 3.0); }
     double getFactorDensityWToLb() { return 1.0 / this->getFactorDensityLbToW(); }
 
-    double getFactorPressureLbToW()
-    {
-        return this->factorMassLbToW / (std::pow(factorTimeLbToW, 2.0) * factorLengthLbToW);
-    }
+    double getFactorPressureLbToW(){ return this->factorMassLbToW / (factorLengthLbToW * factorTimeLbToW * factorTimeLbToW); }
     double getFactorPressureWToLb() { return 1.0 / this->getFactorPressureLbToW(); }
 
     double getFactorMassLbToW() { return this->factorMassLbToW; }
@@ -136,14 +125,14 @@ public:
     double getFactorForceLbToW() { return factorMassLbToW * factorLengthLbToW / (factorTimeLbToW * factorTimeLbToW); }
     double getFactorForceWToLb() { return 1.0 / this->getFactorForceLbToW(); }
 
+    double getFactorTorqueLbToW() { return factorMassLbToW * factorLengthLbToW * factorLengthLbToW / (factorTimeLbToW * factorTimeLbToW);}
+    double getFactorTorqueWToLb() { return 1.0 / this->getFactorTorqueLbToW(); }
+
     double getFactorAccLbToW() { return factorLengthLbToW / (factorTimeLbToW * factorTimeLbToW); }
     double getFactorAccWToLb() { return 1.0 / this->getFactorAccLbToW(); }
 
     double getFactorTimeLbToW(double deltaX) const { return factorTimeWithoutDx * deltaX; }
-    //////////////////////////////////////////////////////////////////////////
-    double getFactorVelocityLbToW2() { return factorVelocityLbToW; }
-    double getFactorDensityLbToW2() { return factorDensityLbToW; }
-    double getFactorPressureLbToW2() { return factorPressureLbToW; }
+
 
     /*==========================================================*/
     friend inline std::ostream &operator<<(std::ostream &os, LBMUnitConverter c)
@@ -212,11 +201,6 @@ protected:
     double factorMassLbToW{ 1.0 };
     double refRhoLb{ 1.0 };
     double factorTimeWithoutDx{ 0.0 };
-
-    double factorVelocityLbToW{ 1.0 };
-    double factorViscosityLbToW{ 1.0 };
-    double factorDensityLbToW{ 1.0 };
-    double factorPressureLbToW{ 1.0 };
 };
 
 #endif // LBMUNITCONVERTER_H
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp
index e092301175713d16e9397cb1a5890967f83cb1c2..ad80b372251a11161de68c6935097da8eec3edc5 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp
@@ -235,19 +235,25 @@ void MultiphaseCumulantLBMKernel::calculate(int step)
                         LBMReal dX3_phi = gradX3_phi();
 
                         LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9;
-                        collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[REST] - phiH) / (phiH - phiL);
+                        collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL);
 
 
-                        LBMReal mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi();
+                        LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi();
 
                         //----------- Calculating Macroscopic Values -------------
-                        LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH);
+                        LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH);
 
                         if (withForcing) {
                             // muX1 = static_cast<double>(x1-1+ix1*maxX1);
                             // muX2 = static_cast<double>(x2-1+ix2*maxX2);
                             // muX3 = static_cast<double>(x3-1+ix3*maxX3);
 
+                            muForcingX1.DefineVar("rho",&muRho); 
+				            muForcingX2.DefineVar("rho",&muRho); 
+				            muForcingX3.DefineVar("rho",&muRho); 
+
+				            muRho = rho;
+
                             forcingX1 = muForcingX1.Eval();
                             forcingX2 = muForcingX2.Eval();
                             forcingX3 = muForcingX3.Eval();
@@ -287,7 +293,7 @@ void MultiphaseCumulantLBMKernel::calculate(int step)
                         LBMReal uz2 = uz * uz;
 
                         //----------- Calculating Forcing Terms * -------------
-                        for (int dir = STARTF; dir <= (FENDDIR); dir++) {
+                        for (int dir = FSTARTDIR; dir <= FENDDIR; dir++) {
                             LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz;
                             LBMReal velSq1  = velProd * velProd;
                             LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2));
@@ -302,41 +308,41 @@ void MultiphaseCumulantLBMKernel::calculate(int step)
                                                (DX3[dir]) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3));
                         }
 
-                        LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
-                        LBMReal fac1      = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi;
-                        forcingTerm[REST] = (-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) +
+                        LBMReal gamma = WEIGTH[DIR_000] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+                        LBMReal fac1      = (gamma - WEIGTH[DIR_000]) * c1o3 * rhoToPhi;
+                        forcingTerm[DIR_000] = (-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) +
                                             (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) +
                                             (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3));
 
                         //--------------------------------------------------------
 
-                        mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[E]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
-                        mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
-                        mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
-                        mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
-                        mfacb = 3.0 * (mfacb + 0.5 * forcingTerm[NW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
-                        mfcbc = 3.0 * (mfcbc + 0.5 * forcingTerm[TE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
-                        mfabc = 3.0 * (mfabc + 0.5 * forcingTerm[TW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
-                        mfbcc = 3.0 * (mfbcc + 0.5 * forcingTerm[TN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
-                        mfbac = 3.0 * (mfbac + 0.5 * forcingTerm[TS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
-                        mfccc = 3.0 * (mfccc + 0.5 * forcingTerm[TNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
-                        mfacc = 3.0 * (mfacc + 0.5 * forcingTerm[TNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
-                        mfcac = 3.0 * (mfcac + 0.5 * forcingTerm[TSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
-                        mfaac = 3.0 * (mfaac + 0.5 * forcingTerm[TSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
-                        mfabb = 3.0 * (mfabb + 0.5 * forcingTerm[W]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
-                        mfbab = 3.0 * (mfbab + 0.5 * forcingTerm[S]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
-                        mfbba = 3.0 * (mfbba + 0.5 * forcingTerm[B]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
-                        mfaab = 3.0 * (mfaab + 0.5 * forcingTerm[SW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
-                        mfcab = 3.0 * (mfcab + 0.5 * forcingTerm[SE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
-                        mfaba = 3.0 * (mfaba + 0.5 * forcingTerm[BW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
-                        mfcba = 3.0 * (mfcba + 0.5 * forcingTerm[BE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
-                        mfbaa = 3.0 * (mfbaa + 0.5 * forcingTerm[BS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
-                        mfbca = 3.0 * (mfbca + 0.5 * forcingTerm[BN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
-                        mfaaa = 3.0 * (mfaaa + 0.5 * forcingTerm[BSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
-                        mfcaa = 3.0 * (mfcaa + 0.5 * forcingTerm[BSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
-                        mfaca = 3.0 * (mfaca + 0.5 * forcingTerm[BNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
-                        mfcca = 3.0 * (mfcca + 0.5 * forcingTerm[BNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
-                        mfbbb = 3.0 * (mfbbb + 0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST];
+                        mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+                        mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[DIR_0P0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+                        mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[DIR_00P]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+                        mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[DIR_PP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+                        mfacb = 3.0 * (mfacb + 0.5 * forcingTerm[DIR_MP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+                        mfcbc = 3.0 * (mfcbc + 0.5 * forcingTerm[DIR_P0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+                        mfabc = 3.0 * (mfabc + 0.5 * forcingTerm[DIR_M0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+                        mfbcc = 3.0 * (mfbcc + 0.5 * forcingTerm[DIR_0PP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+                        mfbac = 3.0 * (mfbac + 0.5 * forcingTerm[DIR_0MP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+                        mfccc = 3.0 * (mfccc + 0.5 * forcingTerm[DIR_PPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+                        mfacc = 3.0 * (mfacc + 0.5 * forcingTerm[DIR_MPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+                        mfcac = 3.0 * (mfcac + 0.5 * forcingTerm[DIR_PMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+                        mfaac = 3.0 * (mfaac + 0.5 * forcingTerm[DIR_MMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+                        mfabb = 3.0 * (mfabb + 0.5 * forcingTerm[DIR_M00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+                        mfbab = 3.0 * (mfbab + 0.5 * forcingTerm[DIR_0M0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+                        mfbba = 3.0 * (mfbba + 0.5 * forcingTerm[DIR_00M]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+                        mfaab = 3.0 * (mfaab + 0.5 * forcingTerm[DIR_MM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+                        mfcab = 3.0 * (mfcab + 0.5 * forcingTerm[DIR_PM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+                        mfaba = 3.0 * (mfaba + 0.5 * forcingTerm[DIR_M0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+                        mfcba = 3.0 * (mfcba + 0.5 * forcingTerm[DIR_P0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+                        mfbaa = 3.0 * (mfbaa + 0.5 * forcingTerm[DIR_0MM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+                        mfbca = 3.0 * (mfbca + 0.5 * forcingTerm[DIR_0PM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+                        mfaaa = 3.0 * (mfaaa + 0.5 * forcingTerm[DIR_MMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+                        mfcaa = 3.0 * (mfcaa + 0.5 * forcingTerm[DIR_PMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+                        mfaca = 3.0 * (mfaca + 0.5 * forcingTerm[DIR_MPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+                        mfcca = 3.0 * (mfcca + 0.5 * forcingTerm[DIR_PPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+                        mfbbb = 3.0 * (mfbbb + 0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST];
 
                         LBMReal rho1 = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +
                                        (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) +
@@ -1018,33 +1024,33 @@ void MultiphaseCumulantLBMKernel::calculate(int step)
                         }
 #endif
 
-                        mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[E];
-                        mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N];
-                        mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T];
-                        mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE];
-                        mfacb = rho * c1o3 * (mfacb) + 0.5 * forcingTerm[NW];
-                        mfcbc = rho * c1o3 * (mfcbc) + 0.5 * forcingTerm[TE];
-                        mfabc = rho * c1o3 * (mfabc) + 0.5 * forcingTerm[TW];
-                        mfbcc = rho * c1o3 * (mfbcc) + 0.5 * forcingTerm[TN];
-                        mfbac = rho * c1o3 * (mfbac) + 0.5 * forcingTerm[TS];
-                        mfccc = rho * c1o3 * (mfccc) + 0.5 * forcingTerm[TNE];
-                        mfacc = rho * c1o3 * (mfacc) + 0.5 * forcingTerm[TNW];
-                        mfcac = rho * c1o3 * (mfcac) + 0.5 * forcingTerm[TSE];
-                        mfaac = rho * c1o3 * (mfaac) + 0.5 * forcingTerm[TSW];
-                        mfabb = rho * c1o3 * (mfabb) + 0.5 * forcingTerm[W];
-                        mfbab = rho * c1o3 * (mfbab) + 0.5 * forcingTerm[S];
-                        mfbba = rho * c1o3 * (mfbba) + 0.5 * forcingTerm[B];
-                        mfaab = rho * c1o3 * (mfaab) + 0.5 * forcingTerm[SW];
-                        mfcab = rho * c1o3 * (mfcab) + 0.5 * forcingTerm[SE];
-                        mfaba = rho * c1o3 * (mfaba) + 0.5 * forcingTerm[BW];
-                        mfcba = rho * c1o3 * (mfcba) + 0.5 * forcingTerm[BE];
-                        mfbaa = rho * c1o3 * (mfbaa) + 0.5 * forcingTerm[BS];
-                        mfbca = rho * c1o3 * (mfbca) + 0.5 * forcingTerm[BN];
-                        mfaaa = rho * c1o3 * (mfaaa) + 0.5 * forcingTerm[BSW];
-                        mfcaa = rho * c1o3 * (mfcaa) + 0.5 * forcingTerm[BSE];
-                        mfaca = rho * c1o3 * (mfaca) + 0.5 * forcingTerm[BNW];
-                        mfcca = rho * c1o3 * (mfcca) + 0.5 * forcingTerm[BNE];
-                        mfbbb = rho * c1o3 * (mfbbb) + 0.5 * forcingTerm[REST];
+                        mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00];
+                        mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[DIR_0P0];
+                        mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[DIR_00P];
+                        mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[DIR_PP0];
+                        mfacb = rho * c1o3 * (mfacb) + 0.5 * forcingTerm[DIR_MP0];
+                        mfcbc = rho * c1o3 * (mfcbc) + 0.5 * forcingTerm[DIR_P0P];
+                        mfabc = rho * c1o3 * (mfabc) + 0.5 * forcingTerm[DIR_M0P];
+                        mfbcc = rho * c1o3 * (mfbcc) + 0.5 * forcingTerm[DIR_0PP];
+                        mfbac = rho * c1o3 * (mfbac) + 0.5 * forcingTerm[DIR_0MP];
+                        mfccc = rho * c1o3 * (mfccc) + 0.5 * forcingTerm[DIR_PPP];
+                        mfacc = rho * c1o3 * (mfacc) + 0.5 * forcingTerm[DIR_MPP];
+                        mfcac = rho * c1o3 * (mfcac) + 0.5 * forcingTerm[DIR_PMP];
+                        mfaac = rho * c1o3 * (mfaac) + 0.5 * forcingTerm[DIR_MMP];
+                        mfabb = rho * c1o3 * (mfabb) + 0.5 * forcingTerm[DIR_M00];
+                        mfbab = rho * c1o3 * (mfbab) + 0.5 * forcingTerm[DIR_0M0];
+                        mfbba = rho * c1o3 * (mfbba) + 0.5 * forcingTerm[DIR_00M];
+                        mfaab = rho * c1o3 * (mfaab) + 0.5 * forcingTerm[DIR_MM0];
+                        mfcab = rho * c1o3 * (mfcab) + 0.5 * forcingTerm[DIR_PM0];
+                        mfaba = rho * c1o3 * (mfaba) + 0.5 * forcingTerm[DIR_M0M];
+                        mfcba = rho * c1o3 * (mfcba) + 0.5 * forcingTerm[DIR_P0M];
+                        mfbaa = rho * c1o3 * (mfbaa) + 0.5 * forcingTerm[DIR_0MM];
+                        mfbca = rho * c1o3 * (mfbca) + 0.5 * forcingTerm[DIR_0PM];
+                        mfaaa = rho * c1o3 * (mfaaa) + 0.5 * forcingTerm[DIR_MMM];
+                        mfcaa = rho * c1o3 * (mfcaa) + 0.5 * forcingTerm[DIR_PMM];
+                        mfaca = rho * c1o3 * (mfaca) + 0.5 * forcingTerm[DIR_MPM];
+                        mfcca = rho * c1o3 * (mfcca) + 0.5 * forcingTerm[DIR_PPM];
+                        mfbbb = rho * c1o3 * (mfbbb) + 0.5 * forcingTerm[DIR_000];
 
                         //////////////////////////////////////////////////////////////////////////
                         // write distribution for F
@@ -1085,84 +1091,84 @@ void MultiphaseCumulantLBMKernel::calculate(int step)
 
                         /////////////////////   PHASE-FIELD BGK SOLVER ///////////////////////////////
 
-                        h[E]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
-                        h[N]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
-                        h[T]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
-                        h[NE]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
-                        h[NW]  = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
-                        h[TE]  = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
-                        h[TW]  = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
-                        h[TN]  = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
-                        h[TS]  = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
-                        h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
-                        h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
-                        h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
-                        h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
-
-                        h[W]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
-                        h[S]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
-                        h[B]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
-                        h[SW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
-                        h[SE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
-                        h[BW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
-                        h[BE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
-                        h[BS]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
-                        h[BN]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
-                        h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-                        h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
-                        h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
-                        h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
-
-                        h[REST] = (*this->zeroDistributionsH)(x1, x2, x3);
+                        h[DIR_P00]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+                        h[DIR_0P0]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
+                        h[DIR_00P]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
+                        h[DIR_PP0]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
+                        h[DIR_MP0]  = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
+                        h[DIR_P0P]  = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
+                        h[DIR_M0P]  = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
+                        h[DIR_0PP]  = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
+                        h[DIR_0MP]  = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
+                        h[DIR_PPP] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
+                        h[DIR_MPP] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
+                        h[DIR_PMP] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
+                        h[DIR_MMP] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+                        h[DIR_M00]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
+                        h[DIR_0M0]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
+                        h[DIR_00M]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
+                        h[DIR_MM0]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
+                        h[DIR_PM0]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
+                        h[DIR_M0M]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
+                        h[DIR_P0M]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
+                        h[DIR_0MM]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
+                        h[DIR_0PM]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
+                        h[DIR_MMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                        h[DIR_PMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                        h[DIR_MPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                        h[DIR_PPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                        h[DIR_000] = (*this->zeroDistributionsH)(x1, x2, x3);
 
                         for (int dir = STARTF; dir < (ENDF + 1); dir++) {
                             LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz;
                             LBMReal velSq1  = velProd * velProd;
                             LBMReal hEq; //, gEq;
 
-                            if (dir != REST) {
+                            if (dir != DIR_000) {
                                 LBMReal dirGrad_phi = (phi[dir] - phi[INVDIR[dir]]) / 2.0;
-                                LBMReal hSource     = (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST]) * (dirGrad_phi) / denom; 
-                                hEq = phi[REST] * WEIGTH[dir] * (1.0 + 3.0 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)) +                                 hSource * WEIGTH[dir];
+                                LBMReal hSource     = (tauH - 0.5) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * (dirGrad_phi) / denom; 
+                                hEq = phi[DIR_000] * WEIGTH[dir] * (1.0 + 3.0 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)) +                                 hSource * WEIGTH[dir];
 
                                 // This corresponds with the collision factor of 1.0 which equals (tauH + 0.5).
                                 h[dir] = h[dir] - (h[dir] - hEq) / (tauH); 
 
                             } else {
-                                hEq = phi[REST] * WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
-                                h[REST] = h[REST] - (h[REST] - hEq) / (tauH); 
+                                hEq = phi[DIR_000] * WEIGTH[DIR_000] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+                                h[DIR_000] = h[DIR_000] - (h[DIR_000] - hEq) / (tauH); 
                             }
                         }
 
-                        (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3)     = h[D3Q27System::INV_E];
-                        (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3)     = h[D3Q27System::INV_N];
-                        (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3)     = h[D3Q27System::INV_T];
-                        (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3)    = h[D3Q27System::INV_NE];
-                        (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3)   = h[D3Q27System::INV_NW];
-                        (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3)    = h[D3Q27System::INV_TE];
-                        (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3)   = h[D3Q27System::INV_TW];
-                        (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3)    = h[D3Q27System::INV_TN];
-                        (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3)   = h[D3Q27System::INV_TS];
-                        (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3)   = h[D3Q27System::INV_TNE];
-                        (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3)  = h[D3Q27System::INV_TNW];
-                        (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3)  = h[D3Q27System::INV_TSE];
-                        (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = h[D3Q27System::INV_TSW];
-
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3)     = h[D3Q27System::INV_W];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3)     = h[D3Q27System::INV_S];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p)     = h[D3Q27System::INV_B];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3)   = h[D3Q27System::INV_SW];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3)    = h[D3Q27System::INV_SE];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p)   = h[D3Q27System::INV_BW];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p)    = h[D3Q27System::INV_BE];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p)   = h[D3Q27System::INV_BS];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p)    = h[D3Q27System::INV_BN];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = h[D3Q27System::INV_BSW];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p)  = h[D3Q27System::INV_BSE];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p)  = h[D3Q27System::INV_BNW];
-                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p)   = h[D3Q27System::INV_BNE];
-
-                        (*this->zeroDistributionsH)(x1, x2, x3) = h[D3Q27System::REST];
+                        (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3)     = h[D3Q27System::INV_P00];
+                        (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3)     = h[D3Q27System::INV_0P0];
+                        (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3)     = h[D3Q27System::INV_00P];
+                        (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3)    = h[D3Q27System::INV_PP0];
+                        (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3)   = h[D3Q27System::INV_MP0];
+                        (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3)    = h[D3Q27System::INV_P0P];
+                        (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3)   = h[D3Q27System::INV_M0P];
+                        (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3)    = h[D3Q27System::INV_0PP];
+                        (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3)   = h[D3Q27System::INV_0MP];
+                        (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3)   = h[D3Q27System::INV_PPP];
+                        (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3)  = h[D3Q27System::INV_MPP];
+                        (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3)  = h[D3Q27System::INV_PMP];
+                        (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = h[D3Q27System::INV_MMP];
+
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3)     = h[D3Q27System::INV_M00];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3)     = h[D3Q27System::INV_0M0];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p)     = h[D3Q27System::INV_00M];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3)   = h[D3Q27System::INV_MM0];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3)    = h[D3Q27System::INV_PM0];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p)   = h[D3Q27System::INV_M0M];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p)    = h[D3Q27System::INV_P0M];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p)   = h[D3Q27System::INV_0MM];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p)    = h[D3Q27System::INV_0PM];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = h[D3Q27System::INV_MMM];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p)  = h[D3Q27System::INV_PMM];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p)  = h[D3Q27System::INV_MPM];
+                        (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p)   = h[D3Q27System::INV_PPM];
+
+                        (*this->zeroDistributionsH)(x1, x2, x3) = h[D3Q27System::DIR_000];
 
                         /////////////////////   END OF OLD BGK SOLVER ///////////////////////////////
                     }
@@ -1209,7 +1215,7 @@ LBMReal MultiphaseCumulantLBMKernel::nabla2_phi()
     using namespace D3Q27System;
     LBMReal sum = 0.0;
     for (int k = FSTARTDIR; k <= FENDDIR; k++) {
-        sum += WEIGTH[k] * (phi[k] - phi[REST]);
+        sum += WEIGTH[k] * (phi[k] - phi[DIR_000]);
     }
     return 6.0 * sum;
 }
@@ -1236,35 +1242,35 @@ void MultiphaseCumulantLBMKernel::computePhasefield()
                     int x2p = x2 + 1;
                     int x3p = x3 + 1;
 
-                    h[E]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
-                    h[N]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
-                    h[T]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
-                    h[NE]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
-                    h[NW]  = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
-                    h[TE]  = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
-                    h[TW]  = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
-                    h[TN]  = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
-                    h[TS]  = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
-                    h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
-                    h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
-                    h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
-                    h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
-
-                    h[W]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
-                    h[S]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
-                    h[B]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
-                    h[SW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
-                    h[SE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
-                    h[BW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
-                    h[BE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
-                    h[BS]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
-                    h[BN]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
-                    h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-                    h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
-                    h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
-                    h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
-
-                    h[REST] = (*this->zeroDistributionsH)(x1, x2, x3);
+                    h[DIR_P00]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+                    h[DIR_0P0]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
+                    h[DIR_00P]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
+                    h[DIR_PP0]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
+                    h[DIR_MP0]  = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
+                    h[DIR_P0P]  = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
+                    h[DIR_M0P]  = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
+                    h[DIR_0PP]  = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
+                    h[DIR_0MP]  = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
+                    h[DIR_PPP] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
+                    h[DIR_MPP] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
+                    h[DIR_PMP] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
+                    h[DIR_MMP] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+                    h[DIR_M00]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
+                    h[DIR_0M0]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
+                    h[DIR_00M]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
+                    h[DIR_MM0]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
+                    h[DIR_PM0]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
+                    h[DIR_M0M]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
+                    h[DIR_P0M]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
+                    h[DIR_0MM]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
+                    h[DIR_0PM]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
+                    h[DIR_MMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                    h[DIR_PMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                    h[DIR_MPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                    h[DIR_PPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                    h[DIR_000] = (*this->zeroDistributionsH)(x1, x2, x3);
                 }
             }
         }
@@ -1278,7 +1284,7 @@ void MultiphaseCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1
 
     SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
 
-    phi[REST] = (*ph)(x1, x2, x3);
+    phi[DIR_000] = (*ph)(x1, x2, x3);
 
     for (int k = FSTARTDIR; k <= FENDDIR; k++) {
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h
index 0985242ba6b79dc03e7940498f24c542f475a64a..fdc47f340dbfaadfd40f4f62885350a82f2cc202 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h
@@ -91,6 +91,7 @@ protected:
    mu::value_type muX1,muX2,muX3;
    mu::value_type muDeltaT;
    mu::value_type muNu;
+   mu::value_type muRho;
    LBMReal forcingX1;
    LBMReal forcingX2;
    LBMReal forcingX3;
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bd4df8aea33d26b3db75af3e00df564b7ded3efe
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp
@@ -0,0 +1,1669 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphasePressureFilterCompressibleAirLBMKernel.cpp
+//! \ingroup LBMKernel
+//! \author M. Geier, K. Kutscher, Hesameddin Safari
+//=======================================================================================
+
+#include "MultiphasePressureFilterCompressibleAirLBMKernel.h"
+#include "BCArray3D.h"
+#include "Block3D.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "D3Q27System.h"
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+#include <cmath>
+
+#define PROOF_CORRECTNESS
+
+//////////////////////////////////////////////////////////////////////////
+MultiphasePressureFilterCompressibleAirLBMKernel::MultiphasePressureFilterCompressibleAirLBMKernel() { this->compressible = false; }
+//////////////////////////////////////////////////////////////////////////
+void MultiphasePressureFilterCompressibleAirLBMKernel::initDataSet()
+{
+	SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9));
+	SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field
+
+	SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D(            nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new  CbArray3D<LBMReal, IndexerX3X2X1>(    nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	dataSet->setFdistributions(f);
+	dataSet->setHdistributions(h); // For phase-field
+	dataSet->setPhaseField(divU1);
+	dataSet->setPressureField(pressure);
+
+	phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0));
+
+	divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> MultiphasePressureFilterCompressibleAirLBMKernel::clone()
+{
+	SPtr<LBMKernel> kernel(new MultiphasePressureFilterCompressibleAirLBMKernel());
+	kernel->setNX(nx);
+	dynamicPointerCast<MultiphasePressureFilterCompressibleAirLBMKernel>(kernel)->initDataSet();
+	kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG);
+	kernel->setDensityRatio(this->densityRatio);
+	kernel->setMultiphaseModelParameters(this->beta, this->kappa);
+	kernel->setContactAngle(this->contactAngle);
+	kernel->setPhiL(this->phiL);
+	kernel->setPhiH(this->phiH);
+	kernel->setPhaseFieldRelaxation(this->tauH);
+	kernel->setMobility(this->mob);
+	kernel->setInterfaceWidth(this->interfaceWidth);
+
+	kernel->setBCProcessor(bcProcessor->clone(kernel));
+	kernel->setWithForcing(withForcing);
+	kernel->setForcingX1(muForcingX1);
+	kernel->setForcingX2(muForcingX2);
+	kernel->setForcingX3(muForcingX3);
+	kernel->setIndex(ix1, ix2, ix3);
+	kernel->setDeltaT(deltaT);
+	kernel->setGhostLayerWidth(2);
+	dynamicPointerCast<MultiphasePressureFilterCompressibleAirLBMKernel>(kernel)->initForcing();
+
+	return kernel;
+}
+//////////////////////////////////////////////////////////////////////////
+void  MultiphasePressureFilterCompressibleAirLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+	LBMReal m2 = mfa + mfc;
+	LBMReal m1 = mfc - mfa;
+	LBMReal m0 = m2 + mfb;
+	mfa = m0;
+	m0 *= Kinverse;
+	m0 += oneMinusRho;
+	mfb = (m1 * Kinverse - m0 * vv) * K;
+	mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void  MultiphasePressureFilterCompressibleAirLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+	LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K;
+	LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K;
+	mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K;
+	mfa = m0;
+	mfb = m1;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+void  MultiphasePressureFilterCompressibleAirLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+	LBMReal m1 = (mfa + mfc) + mfb;
+	LBMReal m2 = mfc - mfa;
+	mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2);
+	mfb = m2 - vv * m1;
+	mfa = m1;
+}
+
+
+void  MultiphasePressureFilterCompressibleAirLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+	LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2);
+	LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv;
+	mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2);
+	mfb = mb;
+	mfa = ma;
+}
+
+
+void MultiphasePressureFilterCompressibleAirLBMKernel::calculate(int step)
+{
+	using namespace D3Q27System;
+	using namespace UbMath;
+
+	forcingX1 = 0.0;
+	forcingX2 = 0.0;
+	forcingX3 = 0.0;
+
+	LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5;
+														 /////////////////////////////////////
+
+	localDistributionsF    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+	zeroDistributionsF     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+
+	localDistributionsH1    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions();
+	nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
+	zeroDistributionsH1     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
+
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	const int bcArrayMaxX1 = (int)bcArray->getNX1();
+	const int bcArrayMaxX2 = (int)bcArray->getNX2();
+	const int bcArrayMaxX3 = (int)bcArray->getNX3();
+
+	int minX1 = ghostLayerWidth;
+	int minX2 = ghostLayerWidth;
+	int minX3 = ghostLayerWidth;
+	int maxX1 = bcArrayMaxX1 - ghostLayerWidth;
+	int maxX2 = bcArrayMaxX2 - ghostLayerWidth;
+	int maxX3 = bcArrayMaxX3 - ghostLayerWidth;
+
+	for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) {
+		for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) {
+			for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) {
+				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+					int x1p = x1 + 1;
+					int x2p = x2 + 1;
+					int x3p = x3 + 1;
+
+					LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+					LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+					LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+					LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+					LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+					LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+					LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+					LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+					LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+					LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+					LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+					LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+					LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+					LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+					LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+					LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+					LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+					LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+					LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+					LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+					LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+					LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+					(*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca)  + (mfcaa + mfacc))  ) +
+						(((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) +
+							((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) +
+								(mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb;
+
+					////// read F-distributions for velocity formalism
+
+					mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+					mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+					mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+					mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+					mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+					mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+					mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+					mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+					mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+					mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+					mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+					mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+					mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+					mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+					mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+					mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+					mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+					mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+					mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+					mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+					mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+					mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+					LBMReal rhoH = 1.0;
+					LBMReal rhoL = 1.0 / densityRatio;
+
+					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+					LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+						+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+						+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+					
+					LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); //Incompressible
+					//LBMReal rho = rhoH + rhoToPhi * ((*pressure)(x1, x2, x3) - phiH); //wrong?
+					//! variable density -> TRANSFER!
+					//LBMReal rho = rhoH * ((*phaseField)(x1, x2, x3)) + rhoL * ((*phaseField2)(x1, x2, x3));
+
+					(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + rho * c1o3 * drho;
+
+					//(*pressure)(x1, x2, x3) = (((*phaseField)(x1, x2, x3)) + ((*phaseField2)(x1, x2, x3)) - c1) * c1o3;
+					////!!!!!! relplace by pointer swap!
+					//(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3);
+				}
+			}
+		}
+	}
+
+	LBMReal collFactorM;
+
+	////Periodic Filter
+	for (int x3 = minX3-1; x3 <= maxX3; x3++) {
+		for (int x2 = minX2-1; x2 <= maxX2; x2++) {
+			for (int x1 = minX1-1; x1 <= maxX1; x1++) {
+				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+
+					LBMReal sum = 0.;
+
+					///Version for boundaries
+					for (int xx = -1; xx <= 1; xx++) {
+						//int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0;
+						int xxx = xx + x1;
+
+						for (int yy = -1; yy <= 1; yy++) {
+							//int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0;
+							int yyy = yy + x2;
+
+							for (int zz = -1; zz <= 1; zz++) {
+								//int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0;
+								int zzz = zz + x3;
+
+								if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) {
+									sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz);
+								}
+								else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3);
+								}
+
+
+							}
+						}
+					}
+					(*pressure)(x1, x2, x3) = sum;
+				}
+			}
+		}
+	}
+
+	////!filter
+
+	for (int x3 = minX3; x3 < maxX3; x3++) {
+		for (int x2 = minX2; x2 < maxX2; x2++) {
+			for (int x1 = minX1; x1 < maxX1; x1++) {
+				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+					int x1p = x1 + 1;
+					int x2p = x2 + 1;
+					int x3p = x3 + 1;
+
+					//////////////////////////////////////////////////////////////////////////
+					// Read distributions and phase field
+					////////////////////////////////////////////////////////////////////////////
+					//////////////////////////////////////////////////////////////////////////
+
+					// E   N  T
+					// c   c  c
+					//////////
+					// W   S  B
+					// a   a  a
+
+					// Rest ist b
+
+					// mfxyz
+					// a - negative
+					// b - null
+					// c - positive
+
+					// a b c
+					//-1 0 1
+
+					findNeighbors(phaseField, x1, x2, x3);
+
+					LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+					LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+					LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+					LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+					LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+					LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+					LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+					LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+					LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+					LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+					LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+					LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+					LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+					LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+					LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+					LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+					LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+					LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+					LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+					LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+					LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+					LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+					LBMReal rhoH = 1.0;
+					LBMReal rhoL = 1.0 / densityRatio;
+
+					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+					LBMReal dX1_phi = gradX1_phi();
+					LBMReal dX2_phi = gradX2_phi();
+					LBMReal dX3_phi = gradX3_phi();
+
+					LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9;
+					LBMReal normX1 = dX1_phi / denom;
+					LBMReal normX2 = dX2_phi / denom;
+					LBMReal normX3 = dX3_phi / denom;
+
+
+
+					collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL);
+
+
+					LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi();
+
+					//----------- Calculating Macroscopic Values -------------
+					LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); //Incompressible
+					//LBMReal rho = rhoL + (rhoH - rhoL) * phi[REST] + (one - phi[REST]) * (*pressure)(x1, x2, x3) * three; //compressible
+
+					LBMReal m0, m1, m2;
+					LBMReal rhoRef=c1;
+
+					LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+						(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+						(mfcbb - mfabb))/rhoRef;
+					LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+						(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+						(mfbcb - mfbab))/rhoRef;
+					LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+						(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+						(mfbbc - mfbba))/rhoRef;
+
+					LBMReal gradPx = 0.0;
+					LBMReal gradPy = 0.0;
+					LBMReal gradPz = 0.0;
+					for (int dir1 = -1; dir1 <= 1; dir1++) {
+						for (int dir2 = -1; dir2 <= 1; dir2++) {
+							int yyy = x2 + dir1;
+							int zzz = x3 + dir2;
+							if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) {
+								gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) {
+								gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+
+							int xxx = x1 + dir1;
+							if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) {
+								gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) {
+								gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+
+							yyy = x2 + dir2;
+							if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) {
+								gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) {
+								gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+
+						}
+					}
+
+					//Viscosity increase by pressure gradient
+					LBMReal errPhi = (((1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale)- denom);
+					//LBMReal limVis = 0.0000001*10;//0.01;
+					// collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM);
+					// collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM;
+					errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi;
+					//collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis);
+
+					//3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW])))
+					//+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) +
+					//+WEIGTH[N] * (phi2[T] - phi2[B]));
+
+					muRho = rho;
+
+					forcingX1 = muForcingX1.Eval()/rho - gradPx/rho;
+					forcingX2 = muForcingX2.Eval()/rho - gradPy/rho;
+					forcingX3 = muForcingX3.Eval()/rho - gradPz/rho;
+
+					vvx += forcingX1 * deltaT * 0.5; // X
+					vvy += forcingX2 * deltaT * 0.5; // Y
+					vvz += forcingX3 * deltaT * 0.5; // Z
+
+                    ///surface tension force
+					vvx += mu * dX1_phi * c1o2 / rho;
+					vvy += mu * dX2_phi * c1o2 / rho ;
+					vvz += mu * dX3_phi * c1o2 / rho;
+
+					LBMReal vx2;
+					LBMReal vy2;
+					LBMReal vz2;
+					vx2 = vvx * vvx;
+					vy2 = vvy * vvy;
+					vz2 = vvz * vvz;
+					///////////////////////////////////////////////////////////////////////////////////////////               
+					LBMReal oMdrho;
+
+
+					oMdrho = mfccc + mfaaa;
+					m0 = mfaca + mfcac;
+					m1 = mfacc + mfcaa;
+					m2 = mfaac + mfcca;
+					oMdrho += m0;
+					m1 += m2;
+					oMdrho += m1;
+					m0 = mfbac + mfbca;
+					m1 = mfbaa + mfbcc;
+					m0 += m1;
+					m1 = mfabc + mfcba;
+					m2 = mfaba + mfcbc;
+					m1 += m2;
+					m0 += m1;
+					m1 = mfacb + mfcab;
+					m2 = mfaab + mfccb;
+					m1 += m2;
+					m0 += m1;
+					oMdrho += m0;
+					m0 = mfabb + mfcbb;
+					m1 = mfbab + mfbcb;
+					m2 = mfbba + mfbbc;
+					m0 += m1 + m2;
+					m0 += mfbbb; //hat gefehlt
+					oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!!
+
+															 ////////////////////////////////////////////////////////////////////////////////////
+					LBMReal wadjust;
+					LBMReal qudricLimit = 0.01;
+					////////////////////////////////////////////////////////////////////////////////////
+					//Hin
+					////////////////////////////////////////////////////////////////////////////////////
+					// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Z - Dir
+					m2 = mfaaa + mfaac;
+					m1 = mfaac - mfaaa;
+					m0 = m2 + mfaab;
+					mfaaa = m0;
+					m0 += c1o36 * oMdrho;
+					mfaab = m1 - m0 * vvz;
+					mfaac = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaba + mfabc;
+					m1 = mfabc - mfaba;
+					m0 = m2 + mfabb;
+					mfaba = m0;
+					m0 += c1o9 * oMdrho;
+					mfabb = m1 - m0 * vvz;
+					mfabc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaca + mfacc;
+					m1 = mfacc - mfaca;
+					m0 = m2 + mfacb;
+					mfaca = m0;
+					m0 += c1o36 * oMdrho;
+					mfacb = m1 - m0 * vvz;
+					mfacc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbaa + mfbac;
+					m1 = mfbac - mfbaa;
+					m0 = m2 + mfbab;
+					mfbaa = m0;
+					m0 += c1o9 * oMdrho;
+					mfbab = m1 - m0 * vvz;
+					mfbac = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbba + mfbbc;
+					m1 = mfbbc - mfbba;
+					m0 = m2 + mfbbb;
+					mfbba = m0;
+					m0 += c4o9 * oMdrho;
+					mfbbb = m1 - m0 * vvz;
+					mfbbc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbca + mfbcc;
+					m1 = mfbcc - mfbca;
+					m0 = m2 + mfbcb;
+					mfbca = m0;
+					m0 += c1o9 * oMdrho;
+					mfbcb = m1 - m0 * vvz;
+					mfbcc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcaa + mfcac;
+					m1 = mfcac - mfcaa;
+					m0 = m2 + mfcab;
+					mfcaa = m0;
+					m0 += c1o36 * oMdrho;
+					mfcab = m1 - m0 * vvz;
+					mfcac = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcba + mfcbc;
+					m1 = mfcbc - mfcba;
+					m0 = m2 + mfcbb;
+					mfcba = m0;
+					m0 += c1o9 * oMdrho;
+					mfcbb = m1 - m0 * vvz;
+					mfcbc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcca + mfccc;
+					m1 = mfccc - mfcca;
+					m0 = m2 + mfccb;
+					mfcca = m0;
+					m0 += c1o36 * oMdrho;
+					mfccb = m1 - m0 * vvz;
+					mfccc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Y - Dir
+					m2 = mfaaa + mfaca;
+					m1 = mfaca - mfaaa;
+					m0 = m2 + mfaba;
+					mfaaa = m0;
+					m0 += c1o6 * oMdrho;
+					mfaba = m1 - m0 * vvy;
+					mfaca = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaab + mfacb;
+					m1 = mfacb - mfaab;
+					m0 = m2 + mfabb;
+					mfaab = m0;
+					mfabb = m1 - m0 * vvy;
+					mfacb = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaac + mfacc;
+					m1 = mfacc - mfaac;
+					m0 = m2 + mfabc;
+					mfaac = m0;
+					m0 += c1o18 * oMdrho;
+					mfabc = m1 - m0 * vvy;
+					mfacc = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbaa + mfbca;
+					m1 = mfbca - mfbaa;
+					m0 = m2 + mfbba;
+					mfbaa = m0;
+					m0 += c2o3 * oMdrho;
+					mfbba = m1 - m0 * vvy;
+					mfbca = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbab + mfbcb;
+					m1 = mfbcb - mfbab;
+					m0 = m2 + mfbbb;
+					mfbab = m0;
+					mfbbb = m1 - m0 * vvy;
+					mfbcb = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbac + mfbcc;
+					m1 = mfbcc - mfbac;
+					m0 = m2 + mfbbc;
+					mfbac = m0;
+					m0 += c2o9 * oMdrho;
+					mfbbc = m1 - m0 * vvy;
+					mfbcc = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcaa + mfcca;
+					m1 = mfcca - mfcaa;
+					m0 = m2 + mfcba;
+					mfcaa = m0;
+					m0 += c1o6 * oMdrho;
+					mfcba = m1 - m0 * vvy;
+					mfcca = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcab + mfccb;
+					m1 = mfccb - mfcab;
+					m0 = m2 + mfcbb;
+					mfcab = m0;
+					mfcbb = m1 - m0 * vvy;
+					mfccb = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcac + mfccc;
+					m1 = mfccc - mfcac;
+					m0 = m2 + mfcbc;
+					mfcac = m0;
+					m0 += c1o18 * oMdrho;
+					mfcbc = m1 - m0 * vvy;
+					mfccc = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// X - Dir
+					m2 = mfaaa + mfcaa;
+					m1 = mfcaa - mfaaa;
+					m0 = m2 + mfbaa;
+					mfaaa = m0;
+					m0 += 1. * oMdrho;
+					mfbaa = m1 - m0 * vvx;
+					mfcaa = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaba + mfcba;
+					m1 = mfcba - mfaba;
+					m0 = m2 + mfbba;
+					mfaba = m0;
+					mfbba = m1 - m0 * vvx;
+					mfcba = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaca + mfcca;
+					m1 = mfcca - mfaca;
+					m0 = m2 + mfbca;
+					mfaca = m0;
+					m0 += c1o3 * oMdrho;
+					mfbca = m1 - m0 * vvx;
+					mfcca = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaab + mfcab;
+					m1 = mfcab - mfaab;
+					m0 = m2 + mfbab;
+					mfaab = m0;
+					mfbab = m1 - m0 * vvx;
+					mfcab = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfabb + mfcbb;
+					m1 = mfcbb - mfabb;
+					m0 = m2 + mfbbb;
+					mfabb = m0;
+					mfbbb = m1 - m0 * vvx;
+					mfcbb = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfacb + mfccb;
+					m1 = mfccb - mfacb;
+					m0 = m2 + mfbcb;
+					mfacb = m0;
+					mfbcb = m1 - m0 * vvx;
+					mfccb = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaac + mfcac;
+					m1 = mfcac - mfaac;
+					m0 = m2 + mfbac;
+					mfaac = m0;
+					m0 += c1o3 * oMdrho;
+					mfbac = m1 - m0 * vvx;
+					mfcac = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfabc + mfcbc;
+					m1 = mfcbc - mfabc;
+					m0 = m2 + mfbbc;
+					mfabc = m0;
+					mfbbc = m1 - m0 * vvx;
+					mfcbc = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfacc + mfccc;
+					m1 = mfccc - mfacc;
+					m0 = m2 + mfbcc;
+					mfacc = m0;
+					m0 += c1o9 * oMdrho;
+					mfbcc = m1 - m0 * vvx;
+					mfccc = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					// Cumulants
+					////////////////////////////////////////////////////////////////////////////////////
+
+					// mfaaa = 0.0;
+					LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity
+											//  LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+											//  LBMReal OxyyMxzz  = 1.;//2+s9;//
+					LBMReal O4 = 1.;
+					LBMReal O5 = 1.;
+					LBMReal O6 = 1.;
+
+					/////fourth order parameters; here only for test. Move out of loop!
+
+					LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0)));
+					LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
+					//    LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
+					LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+					//FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' )
+					LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+
+
+					//Cum 4.
+					//LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+					//LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+					//LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+					LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+					LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+					LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+					LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+					LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+					LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+
+					//Cum 5.
+					LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+					LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+					LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+
+					//Cum 6.
+					LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb
+						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+						- 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+							+ 2. * (mfcaa * mfaca * mfaac)
+							+ 16. * mfbba * mfbab * mfabb)
+						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho;
+
+					//2.
+					// linear combinations
+					LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+
+					//  LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho));
+					mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa
+										//mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa
+					LBMReal mxxMyy = mfcaa - mfaca;
+					LBMReal mxxMzz = mfcaa - mfaac;
+
+					LBMReal dxux =  -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
+					LBMReal dyuy =  dxux + collFactorM * c3o2 * mxxMyy;
+					LBMReal dzuz =  dxux + collFactorM * c3o2 * mxxMzz;
+
+					LBMReal Dxy = -three * collFactorM * mfbba;
+					LBMReal Dxz = -three * collFactorM * mfbab;
+					LBMReal Dyz = -three * collFactorM * mfabb;
+
+					//relax
+					mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+					mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy);
+					mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz);
+
+					mfabb += collFactorM * (-mfabb);
+					mfbab += collFactorM * (-mfbab);
+					mfbba += collFactorM * (-mfbba);
+
+					////updated pressure
+					//mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
+					mfaaa = 0.0; // Pressure elimination as in standard velocity model
+								 //  mfaaa += (rho - c1) * (dxux + dyuy + dzuz);
+
+					mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa
+
+										// mxxPyyPzz += (mfaaa + mfaaaS) * c1o2;
+										//mfaaa = mfaaaS;
+										// linear combinations back
+					mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+					mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+					mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+
+					//3.
+					// linear combinations
+					LBMReal mxxyPyzz = mfcba + mfabc;
+					LBMReal mxxyMyzz = mfcba - mfabc;
+
+					LBMReal mxxzPyyz = mfcab + mfacb;
+					LBMReal mxxzMyyz = mfcab - mfacb;
+
+					LBMReal mxyyPxzz = mfbca + mfbac;
+					LBMReal mxyyMxzz = mfbca - mfbac;
+
+					//relax
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+					mfbbb += wadjust * (-mfbbb);
+					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+					mxxyPyzz += wadjust * (-mxxyPyzz);
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+					mxxyMyzz += wadjust * (-mxxyMyzz);
+					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+					mxxzPyyz += wadjust * (-mxxzPyyz);
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+					mxxzMyyz += wadjust * (-mxxzMyyz);
+					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+					mxyyPxzz += wadjust * (-mxyyPxzz);
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+					mxyyMxzz += wadjust * (-mxyyMxzz);
+
+					// linear combinations back
+					mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+					mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+					mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+					mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+					mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+					mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+					//4.
+					CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc);
+					CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac);
+					CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca);
+					CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc);
+					CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb);
+					CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb);
+
+					//5.
+					CUMbcc += O5 * (-CUMbcc);
+					CUMcbc += O5 * (-CUMcbc);
+					CUMccb += O5 * (-CUMccb);
+
+					//6.
+					CUMccc += O6 * (-CUMccc);
+
+					//back cumulants to central moments
+					//4.
+					//mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+					//mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+					//mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+					mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+					mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+					mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+					mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+					mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+					mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+
+					//5.
+					mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+					mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+					mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+
+					//6.
+					mfccc = CUMccc - ((-4. * mfbbb * mfbbb
+						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+						- 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+							+ 2. * (mfcaa * mfaca * mfaac)
+							+ 16. * mfbba * mfbab * mfabb)
+						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho;
+
+
+					////////
+
+
+					////////////////////////////////////////////////////////////////////////////////////
+					//forcing
+					mfbaa = -mfbaa;
+					mfaba = -mfaba;
+					mfaab = -mfaab;
+					//////////////////////////////////////////////////////////////////////////////////////
+					mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho);
+					mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho);
+					mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho);
+					////////////////////////////////////////////////////////////////////////////////////
+					//back
+					////////////////////////////////////////////////////////////////////////////////////
+					//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Z - Dir
+					m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2;
+					m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+					mfaaa = m0;
+					mfaab = m1;
+					mfaac = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+					m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2);
+					m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+					mfaba = m0;
+					mfabb = m1;
+					mfabc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2;
+					m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+					mfaca = m0;
+					mfacb = m1;
+					mfacc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+					m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2);
+					m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+					mfbaa = m0;
+					mfbab = m1;
+					mfbac = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+					m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2);
+					m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+					mfbba = m0;
+					mfbbb = m1;
+					mfbbc = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+					m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2);
+					m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+					mfbca = m0;
+					mfbcb = m1;
+					mfbcc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2;
+					m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+					mfcaa = m0;
+					mfcab = m1;
+					mfcac = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+					m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2);
+					m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+					mfcba = m0;
+					mfcbb = m1;
+					mfcbc = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2;
+					m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+					mfcca = m0;
+					mfccb = m1;
+					mfccc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Y - Dir
+					m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2;
+					m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfaaa = m0;
+					mfaba = m1;
+					mfaca = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2;
+					m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfaab = m0;
+					mfabb = m1;
+					mfacb = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2;
+					m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfaac = m0;
+					mfabc = m1;
+					mfacc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+					m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2);
+					m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+					mfbaa = m0;
+					mfbba = m1;
+					mfbca = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+					m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2);
+					m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+					mfbab = m0;
+					mfbbb = m1;
+					mfbcb = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+					m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2);
+					m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+					mfbac = m0;
+					mfbbc = m1;
+					mfbcc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2;
+					m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfcaa = m0;
+					mfcba = m1;
+					mfcca = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2;
+					m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfcab = m0;
+					mfcbb = m1;
+					mfccb = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2;
+					m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfcac = m0;
+					mfcbc = m1;
+					mfccc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// X - Dir
+					m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaaa = m0;
+					mfbaa = m1;
+					mfcaa = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaba = m0;
+					mfbba = m1;
+					mfcba = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaca = m0;
+					mfbca = m1;
+					mfcca = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaab = m0;
+					mfbab = m1;
+					mfcab = m2;
+					///////////b////////////////////////////////////////////////////////////////////////
+					m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2;
+					m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfabb = m0;
+					mfbbb = m1;
+					mfcbb = m2;
+					///////////b////////////////////////////////////////////////////////////////////////
+					m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfacb = m0;
+					mfbcb = m1;
+					mfccb = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaac = m0;
+					mfbac = m1;
+					mfcac = m2;
+					///////////c////////////////////////////////////////////////////////////////////////
+					m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfabc = m0;
+					mfbbc = m1;
+					mfcbc = m2;
+					///////////c////////////////////////////////////////////////////////////////////////
+					m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfacc = m0;
+					mfbcc = m1;
+					mfccc = m2;
+
+					//////////////////////////////////////////////////////////////////////////
+					//proof correctness
+					//////////////////////////////////////////////////////////////////////////
+					//#ifdef  PROOF_CORRECTNESS
+					LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+						+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+						+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+					//			   //LBMReal dif = fabs(drho - rho_post);
+					//               LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post;
+					//#ifdef SINGLEPRECISION
+					//			   if (dif > 10.0E-7 || dif < -10.0E-7)
+					//#else
+					//			   if (dif > 10.0E-15 || dif < -10.0E-15)
+					//#endif
+					//			   {
+					//				   UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post)
+					//					   + " dif=" + UbSystem::toString(dif)
+					//					   + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+					//				   //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+					//				   //exit(EXIT_FAILURE);
+					//			   }
+					//#endif
+
+					if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post))
+						UB_THROW(UbException(
+							UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," +
+							UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+
+					//////////////////////////////////////////////////////////////////////////
+					//write distribution
+					//////////////////////////////////////////////////////////////////////////
+					(*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb         ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab         ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba         ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab        ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba        ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa        ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa      ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca      ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb   ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb    ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc   ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc    ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc   ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac    ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc  ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac  ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac   ;//* rho * c1o3;
+
+					(*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3;
+																																		// !Old Kernel
+/////////////////////  P H A S E - F I E L D   S O L V E R
+////////////////////////////////////////////
+/////CUMULANT PHASE-FIELD
+					LBMReal omegaD =1.0/( 3.0 * mob + 0.5);
+					{
+						mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+						mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+						mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+						mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+						mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+						mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+						mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+						mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+						mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+						mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+						mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+						mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+						mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+						mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+						mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+						mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+						mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+						mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+						mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+						mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+						mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+						mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+						mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+						mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
+						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+						//!
+						////////////////////////////////////////////////////////////////////////////////////
+						// second component
+						LBMReal concentration =
+							((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+								(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+								((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal oneMinusRho = c1- concentration;
+
+						LBMReal cx =
+							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+								(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+								(mfcbb - mfabb));
+						LBMReal cy =
+							((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+								(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+								(mfbcb - mfbab));
+						LBMReal cz =
+							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+								(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+								(mfbbc - mfbba));
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// calculate the square of velocities for this lattice node
+						LBMReal cx2 = cx * cx;
+						LBMReal cy2 = cy * cy;
+						LBMReal cz2 = cz * cz;
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
+						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+						//! see also Eq. (6)-(14) in \ref
+						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+						//!
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+						forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+						forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+						forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+						forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+						forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+						forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+						forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+						forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+						forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+						forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+						forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+						forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+						forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+						forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - experimental Cumulant ... to be published ... hopefully
+						//!
+
+						// linearized orthogonalization of 3rd order central moments
+						LBMReal Mabc = mfabc - mfaba * c1o3;
+						LBMReal Mbca = mfbca - mfbaa * c1o3;
+						LBMReal Macb = mfacb - mfaab * c1o3;
+						LBMReal Mcba = mfcba - mfaba * c1o3;
+						LBMReal Mcab = mfcab - mfaab * c1o3;
+						LBMReal Mbac = mfbac - mfbaa * c1o3;
+						// linearized orthogonalization of 5th order central moments
+						LBMReal Mcbc = mfcbc - mfaba * c1o9;
+						LBMReal Mbcc = mfbcc - mfbaa * c1o9;
+						LBMReal Mccb = mfccb - mfaab * c1o9;
+
+						// collision of 1st order moments
+						cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+							normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+						cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+							normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+						cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+							normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+
+						cx2 = cx * cx;
+						cy2 = cy * cy;
+						cz2 = cz * cz;
+
+						// equilibration of 2nd order moments
+						mfbba = zeroReal;
+						mfbab = zeroReal;
+						mfabb = zeroReal;
+
+						mfcaa = c1o3 * concentration;
+						mfaca = c1o3 * concentration;
+						mfaac = c1o3 * concentration;
+
+						// equilibration of 3rd order moments
+						Mabc = zeroReal;
+						Mbca = zeroReal;
+						Macb = zeroReal;
+						Mcba = zeroReal;
+						Mcab = zeroReal;
+						Mbac = zeroReal;
+						mfbbb = zeroReal;
+
+						// from linearized orthogonalization 3rd order central moments to central moments
+						mfabc = Mabc + mfaba * c1o3;
+						mfbca = Mbca + mfbaa * c1o3;
+						mfacb = Macb + mfaab * c1o3;
+						mfcba = Mcba + mfaba * c1o3;
+						mfcab = Mcab + mfaab * c1o3;
+						mfbac = Mbac + mfbaa * c1o3;
+
+						// equilibration of 4th order moments
+						mfacc = c1o9 * concentration;
+						mfcac = c1o9 * concentration;
+						mfcca = c1o9 * concentration;
+
+						mfcbb = zeroReal;
+						mfbcb = zeroReal;
+						mfbbc = zeroReal;
+
+						// equilibration of 5th order moments
+						Mcbc = zeroReal;
+						Mbcc = zeroReal;
+						Mccb = zeroReal;
+
+						// from linearized orthogonalization 5th order central moments to central moments
+						mfcbc = Mcbc + mfaba * c1o9;
+						mfbcc = Mbcc + mfbaa * c1o9;
+						mfccb = Mccb + mfaab * c1o9;
+
+						// equilibration of 6th order moment
+						mfccc = c1o27 * concentration;
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
+						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+						//! see also Eq. (88)-(96) in
+						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+						//!
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+						backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+						backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+						backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+						backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+						backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+						backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+						backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+						backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+						backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+						backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+						backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+						backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+						backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+						backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+
+
+						(*this->localDistributionsH1)(D3Q27System::ET_E,   x1,  x2,  x3) = mfabb;
+						(*this->localDistributionsH1)(D3Q27System::ET_N,   x1,  x2,  x3) = mfbab;
+						(*this->localDistributionsH1)(D3Q27System::ET_T,   x1,  x2,  x3) = mfbba;
+						(*this->localDistributionsH1)(D3Q27System::ET_NE,  x1,  x2,  x3) = mfaab;
+						(*this->localDistributionsH1)(D3Q27System::ET_NW,  x1p, x2,  x3) = mfcab;
+						(*this->localDistributionsH1)(D3Q27System::ET_TE,  x1,  x2,  x3) = mfaba;
+						(*this->localDistributionsH1)(D3Q27System::ET_TW,  x1p, x2,  x3) = mfcba;
+						(*this->localDistributionsH1)(D3Q27System::ET_TN,  x1,  x2,  x3) = mfbaa;
+						(*this->localDistributionsH1)(D3Q27System::ET_TS,  x1,  x2p, x3) = mfbca;
+						(*this->localDistributionsH1)(D3Q27System::ET_TNE, x1,  x2,  x3) = mfaaa;
+						(*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2,  x3) = mfcaa;
+						(*this->localDistributionsH1)(D3Q27System::ET_TSE, x1,  x2p, x3) = mfaca;
+						(*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_W,   x1p, x2,  x3 ) = mfcbb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_S,   x1,  x2p, x3 ) = mfbcb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_B,   x1,  x2,  x3p) = mfbbc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SW,  x1p, x2p, x3 ) = mfccb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SE,  x1,  x2p, x3 ) = mfacb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BW,  x1p, x2,  x3p) = mfcbc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BE,  x1,  x2,  x3p) = mfabc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BS,  x1,  x2p, x3p) = mfbcc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BN,  x1,  x2,  x3p) = mfbac;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1,  x2p, x3p) = mfacc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2,  x3p) = mfcac;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1,  x2,  x3p) = mfaac;
+
+						(*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb;
+					}
+				}
+			}
+		}
+	}
+}
+//////////////////////////////////////////////////////////////////////////
+
+LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX1_phi()
+{
+	using namespace D3Q27System;
+	return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00]));
+}
+
+LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX2_phi()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0]));
+}
+
+LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX3_phi()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M]));
+}
+
+LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX1_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00]));
+}
+
+LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX2_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0]));
+}
+
+LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX3_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M]));
+}
+
+LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::nabla2_phi()
+{
+	using namespace D3Q27System;
+	LBMReal sum = 0.0;
+	sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000])))
+		+ (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000]))));
+	sum += WEIGTH[DIR_0PP] * (
+		(((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000])))
+		+	(((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000])))
+		+	(((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000])))
+		);
+	sum += WEIGTH[DIR_00P] * (
+		((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000]))
+		+	((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000]))
+		+	((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000]))
+		);
+
+	return 6.0 * sum;
+}
+
+void MultiphasePressureFilterCompressibleAirLBMKernel::computePhasefield()
+{
+	using namespace D3Q27System;
+	SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions();
+
+	int minX1 = ghostLayerWidth;
+	int minX2 = ghostLayerWidth;
+	int minX3 = ghostLayerWidth;
+	int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth;
+	int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth;
+	int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth;
+
+	//------------- Computing the phase-field ------------------
+	for (int x3 = minX3; x3 < maxX3; x3++) {
+		for (int x2 = minX2; x2 < maxX2; x2++) {
+			for (int x1 = minX1; x1 < maxX1; x1++) {
+				// if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3))
+				{
+					int x1p = x1 + 1;
+					int x2p = x2 + 1;
+					int x3p = x3 + 1;
+
+					h[DIR_P00]   = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+					h[DIR_0P0]   = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+					h[DIR_00P]   = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+					h[DIR_PP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+					h[DIR_MP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+					h[DIR_P0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+					h[DIR_M0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+					h[DIR_0PP]  = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+					h[DIR_0MP]  = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+					h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+					h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+					h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+					h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+					h[DIR_M00]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+					h[DIR_0M0]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+					h[DIR_00M]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+					h[DIR_MM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+					h[DIR_PM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+					h[DIR_M0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+					h[DIR_P0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+					h[DIR_0MM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+					h[DIR_0PM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+					h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3);
+				}
+			}
+		}
+	}
+}
+
+void MultiphasePressureFilterCompressibleAirLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+	int x3)
+{
+	using namespace D3Q27System;
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	phi[DIR_000] = (*ph)(x1, x2, x3);
+
+
+	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+			phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+		} else {
+			phi[k] = 0.0;
+		}
+	}
+}
+
+void MultiphasePressureFilterCompressibleAirLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+	int x3)
+{
+	using namespace D3Q27System;
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	phi2[DIR_000] = (*ph)(x1, x2, x3);
+
+
+	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+			phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+		}
+		else {
+			phi2[k] = 0.0;
+		}
+	}
+}
+
+void MultiphasePressureFilterCompressibleAirLBMKernel::swapDistributions()
+{
+	LBMKernel::swapDistributions();
+	dataSet->getHdistributions()->swap();
+}
+
+void MultiphasePressureFilterCompressibleAirLBMKernel::initForcing()
+{
+	muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3);
+	muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3);
+	muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3);
+
+	muDeltaT = deltaT;
+
+	muForcingX1.DefineVar("dt", &muDeltaT);
+	muForcingX2.DefineVar("dt", &muDeltaT);
+	muForcingX3.DefineVar("dt", &muDeltaT);
+
+	muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
+
+	muForcingX1.DefineVar("nu", &muNu);
+	muForcingX2.DefineVar("nu", &muNu);
+	muForcingX3.DefineVar("nu", &muNu);
+
+	muForcingX1.DefineVar("rho",&muRho); 
+	muForcingX2.DefineVar("rho",&muRho); 
+	muForcingX3.DefineVar("rho",&muRho); 
+
+}
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..e15f29e0434c0d5f59977226cab91455f2a39f70
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h
@@ -0,0 +1,116 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphasePressureFilterCompressibleAirLBMKernel.h
+//! \ingroup LBMKernel
+//! \author M. Geier, K. Kutscher, Hesameddin Safari
+//=======================================================================================
+
+#ifndef MultiphasePressureFilterCompressibleAirLBMKernel_H
+#define MultiphasePressureFilterCompressibleAirLBMKernel_H
+
+#include "LBMKernel.h"
+#include "BCProcessor.h"
+#include "D3Q27System.h"
+#include "basics/utilities/UbTiming.h"
+#include "basics/container/CbArray4D.h"
+#include "basics/container/CbArray3D.h"
+
+//! \brief  Multiphase Cascaded Cumulant LBM kernel. 
+//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model
+//! \author  M. Geier, K. Kutscher, Hesameddin Safari
+class MultiphasePressureFilterCompressibleAirLBMKernel : public LBMKernel
+{
+public:
+    MultiphasePressureFilterCompressibleAirLBMKernel();
+    virtual ~MultiphasePressureFilterCompressibleAirLBMKernel(void) = default;
+    void calculate(int step) override;
+    SPtr<LBMKernel> clone() override;
+
+
+    ///refactor
+    //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure;
+
+
+    double getCalculationTime() override { return .0; }
+protected:
+    virtual void initDataSet();
+    void swapDistributions() override;
+
+    void initForcing();
+
+    void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+    void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+    void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+    void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+
+    LBMReal f1[D3Q27System::ENDF+1];
+
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF;
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF;
+    CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsF;
+
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1;
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1;
+    CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsH1;
+
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld;
+
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField;
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU; 
+
+    LBMReal h  [D3Q27System::ENDF+1];
+    LBMReal h2[D3Q27System::ENDF + 1];
+    LBMReal g  [D3Q27System::ENDF+1];
+    LBMReal phi[D3Q27System::ENDF+1];
+    LBMReal phi2[D3Q27System::ENDF + 1];
+    LBMReal pr1[D3Q27System::ENDF+1];
+    LBMReal phi_cutoff[D3Q27System::ENDF+1];
+
+    LBMReal gradX1_phi();
+    LBMReal gradX2_phi();
+    LBMReal gradX3_phi();
+    LBMReal gradX1_phi2();
+    LBMReal gradX2_phi2();
+    LBMReal gradX3_phi2();
+    void computePhasefield();
+    void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3);
+    void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3);
+
+    LBMReal nabla2_phi();
+
+    mu::value_type muX1,muX2,muX3;
+    mu::value_type muDeltaT;
+    mu::value_type muNu;
+    mu::value_type muRho;
+    LBMReal forcingX1;
+    LBMReal forcingX2;
+    LBMReal forcingX3;
+};
+
+#endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e1d24a2272f0846a29045bd9438db6b0dc729d36
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.cpp
@@ -0,0 +1,1773 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphasePressureFilterLBMKernel.cpp
+//! \ingroup LBMKernel
+//! \author M. Geier, K. Kutscher, Hesameddin Safari
+//=======================================================================================
+
+#include "MultiphasePressureFilterLBMKernel.h"
+#include "BCArray3D.h"
+#include "Block3D.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "D3Q27System.h"
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+#include <cmath>
+
+#define PROOF_CORRECTNESS
+
+//////////////////////////////////////////////////////////////////////////
+MultiphasePressureFilterLBMKernel::MultiphasePressureFilterLBMKernel() { this->compressible = false; }
+//////////////////////////////////////////////////////////////////////////
+void MultiphasePressureFilterLBMKernel::initDataSet()
+{
+	SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); // For phase-field
+
+	//SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D(            nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new  CbArray3D<LBMReal, IndexerX3X2X1>(    nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	dataSet->setFdistributions(f);
+	dataSet->setHdistributions(h); // For phase-field
+	//dataSet->setPhaseField(divU1);
+	dataSet->setPressureField(pressure);
+
+	phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+
+	divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> MultiphasePressureFilterLBMKernel::clone()
+{
+	SPtr<LBMKernel> kernel(new MultiphasePressureFilterLBMKernel());
+	kernel->setNX(nx);
+	dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->initDataSet();
+	kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG);
+	kernel->setDensityRatio(this->densityRatio);
+	kernel->setMultiphaseModelParameters(this->beta, this->kappa);
+	kernel->setContactAngle(this->contactAngle);
+	kernel->setPhiL(this->phiL);
+	kernel->setPhiH(this->phiH);
+	kernel->setPhaseFieldRelaxation(this->tauH);
+	kernel->setMobility(this->mob);
+	kernel->setInterfaceWidth(this->interfaceWidth);
+
+	kernel->setBCProcessor(bcProcessor->clone(kernel));
+	kernel->setWithForcing(withForcing);
+	kernel->setForcingX1(muForcingX1);
+	kernel->setForcingX2(muForcingX2);
+	kernel->setForcingX3(muForcingX3);
+	kernel->setIndex(ix1, ix2, ix3);
+	kernel->setDeltaT(deltaT);
+	kernel->setGhostLayerWidth(2);
+	dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->initForcing();
+    dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(this->phaseFieldBC);
+
+	return kernel;
+}
+//////////////////////////////////////////////////////////////////////////
+void  MultiphasePressureFilterLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+	LBMReal m2 = mfa + mfc;
+	LBMReal m1 = mfc - mfa;
+	LBMReal m0 = m2 + mfb;
+	mfa = m0;
+	m0 *= Kinverse;
+	m0 += oneMinusRho;
+	mfb = (m1 * Kinverse - m0 * vv) * K;
+	mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void  MultiphasePressureFilterLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+	LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K;
+	LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K;
+	mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K;
+	mfa = m0;
+	mfb = m1;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+void  MultiphasePressureFilterLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+	LBMReal m1 = (mfa + mfc) + mfb;
+	LBMReal m2 = mfc - mfa;
+	mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2);
+	mfb = m2 - vv * m1;
+	mfa = m1;
+}
+
+
+void  MultiphasePressureFilterLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+	LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2);
+	LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv;
+	mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2);
+	mfb = mb;
+	mfa = ma;
+}
+
+
+void MultiphasePressureFilterLBMKernel::calculate(int step)
+{
+	using namespace D3Q27System;
+	using namespace UbMath;
+
+	forcingX1 = 0.0;
+	forcingX2 = 0.0;
+	forcingX3 = 0.0;
+
+	LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5;
+														 /////////////////////////////////////
+
+	localDistributionsF    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+	zeroDistributionsF     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+
+	localDistributionsH1    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions();
+	nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
+	zeroDistributionsH1     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
+
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	const int bcArrayMaxX1 = (int)bcArray->getNX1();
+	const int bcArrayMaxX2 = (int)bcArray->getNX2();
+	const int bcArrayMaxX3 = (int)bcArray->getNX3();
+
+	int minX1 = ghostLayerWidth;
+	int minX2 = ghostLayerWidth;
+	int minX3 = ghostLayerWidth;
+	int maxX1 = bcArrayMaxX1 - ghostLayerWidth;
+	int maxX2 = bcArrayMaxX2 - ghostLayerWidth;
+	int maxX3 = bcArrayMaxX3 - ghostLayerWidth;
+
+	for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) {
+		for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) {
+			for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) {
+				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+					int x1p = x1 + 1;
+					int x2p = x2 + 1;
+					int x3p = x3 + 1;
+
+					LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+					LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+					LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+					LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+					LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+					LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+					LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+					LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+					LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+					LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+					LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+					LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+					LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+					LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+					LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+					LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+					LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+					LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+					LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+					LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+					LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+					LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+					(*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca)  + (mfcaa + mfacc))  ) +
+						(((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) +
+							((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) +
+								(mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb;
+
+					////// read F-distributions for velocity formalism
+
+					mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+					mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+					mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+					mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+					mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+					mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+					mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+					mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+					mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+					mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+					mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+					mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+					mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+					mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+					mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+					mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+					mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+					mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+					mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+					mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+					mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+					mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+					LBMReal rhoH = 1.0;
+					LBMReal rhoL = 1.0 / densityRatio;
+
+					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+					LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+						+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+						+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+					LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH);
+
+					(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + rho * c1o3 * drho;
+				}
+			}
+		}
+	}
+
+	LBMReal collFactorM;
+
+	////Periodic Filter
+	for (int x3 = minX3-1; x3 <= maxX3; x3++) {
+		for (int x2 = minX2-1; x2 <= maxX2; x2++) {
+			for (int x1 = minX1-1; x1 <= maxX1; x1++) {
+				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+
+					LBMReal sum = 0.;
+
+					///Version for boundaries
+					for (int xx = -1; xx <= 1; xx++) {
+						//int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0;
+						int xxx = xx + x1;
+
+						for (int yy = -1; yy <= 1; yy++) {
+							//int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0;
+							int yyy = yy + x2;
+
+							for (int zz = -1; zz <= 1; zz++) {
+								//int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0;
+								int zzz = zz + x3;
+
+								if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) {
+									sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz);
+								}
+								else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3);
+								}
+
+
+							}
+						}
+					}
+					(*pressure)(x1, x2, x3) = sum;
+				}
+			}
+		}
+	}
+
+	////!filter
+
+	for (int x3 = minX3; x3 < maxX3; x3++) {
+		for (int x2 = minX2; x2 < maxX2; x2++) {
+			for (int x1 = minX1; x1 < maxX1; x1++) {
+				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+					int x1p = x1 + 1;
+					int x2p = x2 + 1;
+					int x3p = x3 + 1;
+
+					//////////////////////////////////////////////////////////////////////////
+					// Read distributions and phase field
+					////////////////////////////////////////////////////////////////////////////
+					//////////////////////////////////////////////////////////////////////////
+
+					// E   N  T
+					// c   c  c
+					//////////
+					// W   S  B
+					// a   a  a
+
+					// Rest ist b
+
+					// mfxyz
+					// a - negative
+					// b - null
+					// c - positive
+
+					// a b c
+					//-1 0 1
+
+					findNeighbors(phaseField, x1, x2, x3);
+
+					LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+					LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+					LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+					LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+					LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+					LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+					LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+					LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+					LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+					LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+					LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+					LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+					LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+					LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+					LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+					LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+					LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+					LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+					LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+					LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+					LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+					LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+					LBMReal rhoH = 1.0;
+					LBMReal rhoL = 1.0 / densityRatio;
+
+					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+					LBMReal dX1_phi = gradX1_phi();
+					LBMReal dX2_phi = gradX2_phi();
+					LBMReal dX3_phi = gradX3_phi();
+
+					LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9;
+					LBMReal normX1 = dX1_phi / denom;
+					LBMReal normX2 = dX2_phi / denom;
+					LBMReal normX3 = dX3_phi / denom;
+
+					dX1_phi = normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale;
+                    dX2_phi = normX2 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale;
+                    dX3_phi = normX3 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale;
+
+					collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL);
+
+
+					LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi();
+
+					//----------- Calculating Macroscopic Values -------------
+					LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH);
+
+					LBMReal m0, m1, m2;
+					LBMReal rhoRef=c1;
+
+					LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+						(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+						(mfcbb - mfabb))/rhoRef;
+					LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+						(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+						(mfbcb - mfbab))/rhoRef;
+					LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+						(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+						(mfbbc - mfbba))/rhoRef;
+
+					LBMReal gradPx = 0.0;
+					LBMReal gradPy = 0.0;
+					LBMReal gradPz = 0.0;
+					for (int dir1 = -1; dir1 <= 1; dir1++) {
+						for (int dir2 = -1; dir2 <= 1; dir2++) {
+							int yyy = x2 + dir1;
+							int zzz = x3 + dir2;
+							if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) {
+								gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) {
+								gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+
+							int xxx = x1 + dir1;
+							if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) {
+								gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) {
+								gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+
+							yyy = x2 + dir2;
+							if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) {
+								gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) {
+								gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+							else {
+								gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+							}
+
+						}
+					}
+
+					//Viscosity increase by pressure gradient
+					LBMReal errPhi = (((1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale)- denom);
+					//LBMReal limVis = 0.0000001*10;//0.01;
+					// collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM);
+					// collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM;
+					errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi;
+					//collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis);
+
+					//3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW])))
+					//+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) +
+					//+WEIGTH[N] * (phi2[T] - phi2[B]));
+
+					muRho = rho;
+
+					forcingX1 = muForcingX1.Eval()/rho - gradPx/rho;
+					forcingX2 = muForcingX2.Eval()/rho - gradPy/rho;
+					forcingX3 = muForcingX3.Eval()/rho - gradPz/rho;
+
+					forcingX1 += mu * dX1_phi / rho;
+                    forcingX2 += mu * dX2_phi / rho;
+                    forcingX3 += mu * dX3_phi / rho;
+
+					vvx += forcingX1 * deltaT * 0.5; // X
+					vvy += forcingX2 * deltaT * 0.5; // Y
+					vvz += forcingX3 * deltaT * 0.5; // Z
+
+                    ///surface tension force
+					//vvx += mu * dX1_phi * c1o2 / rho;
+					//vvy += mu * dX2_phi * c1o2 / rho ;
+					//vvz += mu * dX3_phi * c1o2 / rho;
+
+					//Abbas
+					LBMReal pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
+
+					LBMReal M200 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba))))
+						+ ((mfabb + mfcbb))));
+					LBMReal M020 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+						+ ((mfbab + mfbcb))));
+					LBMReal M002 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+						+ (+((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+						+ ((mfbba + mfbbc))));
+
+					LBMReal M110 = ((((((mfaaa + mfccc) + (-mfcac - mfaca)) + ((mfaac + mfcca) + (-mfcaa - mfacc)))
+						+ (((mfaab + mfccb) + (-mfacb - mfcab))))
+						));
+					LBMReal M101 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ((mfcac + mfaca) - (mfcaa + mfacc)))
+						+ (((mfaba + mfcbc) + (-mfabc - mfcba))))
+						));
+					LBMReal M011 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ((mfcaa + mfacc) - (mfcac + mfaca)))
+						+ (((mfbaa + mfbcc) + (-mfbac - mfbca))))
+						));
+					LBMReal vvxI = vvx;
+					LBMReal vvyI = vvy;
+					LBMReal vvzI = vvz;
+
+					//LBMReal collFactorStore = collFactorM;
+					//LBMReal stress;
+					for (int iter = 0; iter < 1; iter++) {
+						LBMReal OxxPyyPzz = 1.0;
+						LBMReal mxxPyyPzz = (M200 - vvxI * vvxI) + (M020 - vvyI * vvyI) + (M002 - vvzI * vvzI);
+						mxxPyyPzz -= c3 * pStar;
+
+						LBMReal mxxMyy = (M200 - vvxI * vvxI) - (M020 - vvyI * vvyI);
+						LBMReal mxxMzz = (M200 - vvxI * vvxI) - (M002 - vvzI * vvzI);
+						LBMReal mxy = M110 - vvxI * vvyI;
+						LBMReal mxz = M101 - vvxI * vvzI;
+						LBMReal myz = M011 - vvyI * vvzI;
+
+						///////Bingham
+						//LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
+						//LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy;
+						//LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz;
+						//LBMReal Dxy = -three * collFactorM * mxy;
+						//LBMReal Dxz = -three * collFactorM * mxz;
+						//LBMReal Dyz = -three * collFactorM * myz;
+
+						//LBMReal tau0 = phi[REST] * 1.0e-7;//(phi[REST]>0.01)?1.0e-6: 0;
+						//LBMReal shearRate =fabs(pStar)*0.0e-2+ sqrt(c2 * (dxux * dxux + dyuy * dyuy + dzuz * dzuz) + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho);
+						//collFactorM = collFactorM * (UbMath::one - (collFactorM * tau0) / (shearRate * c1o3 /* *rho*/ + 1.0e-15));
+						//collFactorM = (collFactorM < -1000000) ? -1000000 : collFactorM;
+						////if(collFactorM < 0.1) {
+						////	int test = 1;
+						////}
+						//////!Bingham
+
+
+						mxxMyy *= c1 - collFactorM * c1o2;
+						mxxMzz *= c1 - collFactorM * c1o2;
+						mxy *= c1 - collFactorM * c1o2;
+						mxz *= c1 - collFactorM * c1o2;
+						myz *= c1 - collFactorM * c1o2;
+						mxxPyyPzz *= c1 - OxxPyyPzz * c1o2;
+						//mxxPyyPzz += c3o2 * pStar;
+						LBMReal mxx = (mxxMyy + mxxMzz + mxxPyyPzz) * c1o3;
+						LBMReal myy = (-c2 * mxxMyy + mxxMzz + mxxPyyPzz) * c1o3;
+						LBMReal mzz = (mxxMyy - c2 * mxxMzz + mxxPyyPzz) * c1o3;
+						vvxI = vvx - (mxx * dX1_phi + mxy * dX2_phi + mxz * dX3_phi) * rhoToPhi / (rho);
+						vvyI = vvy - (mxy * dX1_phi + myy * dX2_phi + myz * dX3_phi) * rhoToPhi / (rho);
+						vvzI = vvz - (mxz * dX1_phi + myz * dX2_phi + mzz * dX3_phi) * rhoToPhi / (rho);
+
+
+
+					}
+
+
+					forcingX1 += c2 * (vvxI - vvx);
+					forcingX2 += c2 * (vvyI - vvy);
+					forcingX3 += c2 * (vvzI - vvz);
+
+					mfabb += c1o2 * (-forcingX1) * c2o9;
+					mfbab += c1o2 * (-forcingX2) * c2o9;
+					mfbba += c1o2 * (-forcingX3) * c2o9;
+					mfaab += c1o2 * (-forcingX1 - forcingX2) * c1o18;
+					mfcab += c1o2 * (forcingX1 - forcingX2) * c1o18;
+					mfaba += c1o2 * (-forcingX1 - forcingX3) * c1o18;
+					mfcba += c1o2 * (forcingX1 - forcingX3) * c1o18;
+					mfbaa += c1o2 * (-forcingX2 - forcingX3) * c1o18;
+					mfbca += c1o2 * (forcingX2 - forcingX3) * c1o18;
+					mfaaa += c1o2 * (-forcingX1 - forcingX2 - forcingX3) * c1o72;
+					mfcaa += c1o2 * (forcingX1 - forcingX2 - forcingX3) * c1o72;
+					mfaca += c1o2 * (-forcingX1 + forcingX2 - forcingX3) * c1o72;
+					mfcca += c1o2 * (forcingX1 + forcingX2 - forcingX3) * c1o72;
+					mfcbb += c1o2 * (forcingX1)*c2o9;
+					mfbcb += c1o2 * (forcingX2)*c2o9;
+					mfbbc += c1o2 * (forcingX3)*c2o9;
+					mfccb += c1o2 * (forcingX1 + forcingX2) * c1o18;
+					mfacb += c1o2 * (-forcingX1 + forcingX2) * c1o18;
+					mfcbc += c1o2 * (forcingX1 + forcingX3) * c1o18;
+					mfabc += c1o2 * (-forcingX1 + forcingX3) * c1o18;
+					mfbcc += c1o2 * (forcingX2 + forcingX3) * c1o18;
+					mfbac += c1o2 * (-forcingX2 + forcingX3) * c1o18;
+					mfccc += c1o2 * (forcingX1 + forcingX2 + forcingX3) * c1o72;
+					mfacc += c1o2 * (-forcingX1 + forcingX2 + forcingX3) * c1o72;
+					mfcac += c1o2 * (forcingX1 - forcingX2 + forcingX3) * c1o72;
+					mfaac += c1o2 * (-forcingX1 - forcingX2 + forcingX3) * c1o72;
+
+
+
+					vvx = vvxI;
+					vvy = vvyI;
+					vvz = vvzI;
+
+					//!Abbas
+
+
+					LBMReal vx2;
+					LBMReal vy2;
+					LBMReal vz2;
+					vx2 = vvx * vvx;
+					vy2 = vvy * vvy;
+					vz2 = vvz * vvz;
+					///////////////////////////////////////////////////////////////////////////////////////////               
+					LBMReal oMdrho;
+
+
+					oMdrho = mfccc + mfaaa;
+					m0 = mfaca + mfcac;
+					m1 = mfacc + mfcaa;
+					m2 = mfaac + mfcca;
+					oMdrho += m0;
+					m1 += m2;
+					oMdrho += m1;
+					m0 = mfbac + mfbca;
+					m1 = mfbaa + mfbcc;
+					m0 += m1;
+					m1 = mfabc + mfcba;
+					m2 = mfaba + mfcbc;
+					m1 += m2;
+					m0 += m1;
+					m1 = mfacb + mfcab;
+					m2 = mfaab + mfccb;
+					m1 += m2;
+					m0 += m1;
+					oMdrho += m0;
+					m0 = mfabb + mfcbb;
+					m1 = mfbab + mfbcb;
+					m2 = mfbba + mfbbc;
+					m0 += m1 + m2;
+					m0 += mfbbb; //hat gefehlt
+					oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!!
+
+															 ////////////////////////////////////////////////////////////////////////////////////
+					LBMReal wadjust;
+					LBMReal qudricLimit = 0.01;
+					////////////////////////////////////////////////////////////////////////////////////
+					//Hin
+					////////////////////////////////////////////////////////////////////////////////////
+					// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Z - Dir
+					m2 = mfaaa + mfaac;
+					m1 = mfaac - mfaaa;
+					m0 = m2 + mfaab;
+					mfaaa = m0;
+					m0 += c1o36 * oMdrho;
+					mfaab = m1 - m0 * vvz;
+					mfaac = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaba + mfabc;
+					m1 = mfabc - mfaba;
+					m0 = m2 + mfabb;
+					mfaba = m0;
+					m0 += c1o9 * oMdrho;
+					mfabb = m1 - m0 * vvz;
+					mfabc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaca + mfacc;
+					m1 = mfacc - mfaca;
+					m0 = m2 + mfacb;
+					mfaca = m0;
+					m0 += c1o36 * oMdrho;
+					mfacb = m1 - m0 * vvz;
+					mfacc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbaa + mfbac;
+					m1 = mfbac - mfbaa;
+					m0 = m2 + mfbab;
+					mfbaa = m0;
+					m0 += c1o9 * oMdrho;
+					mfbab = m1 - m0 * vvz;
+					mfbac = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbba + mfbbc;
+					m1 = mfbbc - mfbba;
+					m0 = m2 + mfbbb;
+					mfbba = m0;
+					m0 += c4o9 * oMdrho;
+					mfbbb = m1 - m0 * vvz;
+					mfbbc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbca + mfbcc;
+					m1 = mfbcc - mfbca;
+					m0 = m2 + mfbcb;
+					mfbca = m0;
+					m0 += c1o9 * oMdrho;
+					mfbcb = m1 - m0 * vvz;
+					mfbcc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcaa + mfcac;
+					m1 = mfcac - mfcaa;
+					m0 = m2 + mfcab;
+					mfcaa = m0;
+					m0 += c1o36 * oMdrho;
+					mfcab = m1 - m0 * vvz;
+					mfcac = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcba + mfcbc;
+					m1 = mfcbc - mfcba;
+					m0 = m2 + mfcbb;
+					mfcba = m0;
+					m0 += c1o9 * oMdrho;
+					mfcbb = m1 - m0 * vvz;
+					mfcbc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcca + mfccc;
+					m1 = mfccc - mfcca;
+					m0 = m2 + mfccb;
+					mfcca = m0;
+					m0 += c1o36 * oMdrho;
+					mfccb = m1 - m0 * vvz;
+					mfccc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Y - Dir
+					m2 = mfaaa + mfaca;
+					m1 = mfaca - mfaaa;
+					m0 = m2 + mfaba;
+					mfaaa = m0;
+					m0 += c1o6 * oMdrho;
+					mfaba = m1 - m0 * vvy;
+					mfaca = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaab + mfacb;
+					m1 = mfacb - mfaab;
+					m0 = m2 + mfabb;
+					mfaab = m0;
+					mfabb = m1 - m0 * vvy;
+					mfacb = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaac + mfacc;
+					m1 = mfacc - mfaac;
+					m0 = m2 + mfabc;
+					mfaac = m0;
+					m0 += c1o18 * oMdrho;
+					mfabc = m1 - m0 * vvy;
+					mfacc = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbaa + mfbca;
+					m1 = mfbca - mfbaa;
+					m0 = m2 + mfbba;
+					mfbaa = m0;
+					m0 += c2o3 * oMdrho;
+					mfbba = m1 - m0 * vvy;
+					mfbca = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbab + mfbcb;
+					m1 = mfbcb - mfbab;
+					m0 = m2 + mfbbb;
+					mfbab = m0;
+					mfbbb = m1 - m0 * vvy;
+					mfbcb = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbac + mfbcc;
+					m1 = mfbcc - mfbac;
+					m0 = m2 + mfbbc;
+					mfbac = m0;
+					m0 += c2o9 * oMdrho;
+					mfbbc = m1 - m0 * vvy;
+					mfbcc = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcaa + mfcca;
+					m1 = mfcca - mfcaa;
+					m0 = m2 + mfcba;
+					mfcaa = m0;
+					m0 += c1o6 * oMdrho;
+					mfcba = m1 - m0 * vvy;
+					mfcca = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcab + mfccb;
+					m1 = mfccb - mfcab;
+					m0 = m2 + mfcbb;
+					mfcab = m0;
+					mfcbb = m1 - m0 * vvy;
+					mfccb = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcac + mfccc;
+					m1 = mfccc - mfcac;
+					m0 = m2 + mfcbc;
+					mfcac = m0;
+					m0 += c1o18 * oMdrho;
+					mfcbc = m1 - m0 * vvy;
+					mfccc = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// X - Dir
+					m2 = mfaaa + mfcaa;
+					m1 = mfcaa - mfaaa;
+					m0 = m2 + mfbaa;
+					mfaaa = m0;
+					m0 += 1. * oMdrho;
+					mfbaa = m1 - m0 * vvx;
+					mfcaa = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaba + mfcba;
+					m1 = mfcba - mfaba;
+					m0 = m2 + mfbba;
+					mfaba = m0;
+					mfbba = m1 - m0 * vvx;
+					mfcba = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaca + mfcca;
+					m1 = mfcca - mfaca;
+					m0 = m2 + mfbca;
+					mfaca = m0;
+					m0 += c1o3 * oMdrho;
+					mfbca = m1 - m0 * vvx;
+					mfcca = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaab + mfcab;
+					m1 = mfcab - mfaab;
+					m0 = m2 + mfbab;
+					mfaab = m0;
+					mfbab = m1 - m0 * vvx;
+					mfcab = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfabb + mfcbb;
+					m1 = mfcbb - mfabb;
+					m0 = m2 + mfbbb;
+					mfabb = m0;
+					mfbbb = m1 - m0 * vvx;
+					mfcbb = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfacb + mfccb;
+					m1 = mfccb - mfacb;
+					m0 = m2 + mfbcb;
+					mfacb = m0;
+					mfbcb = m1 - m0 * vvx;
+					mfccb = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaac + mfcac;
+					m1 = mfcac - mfaac;
+					m0 = m2 + mfbac;
+					mfaac = m0;
+					m0 += c1o3 * oMdrho;
+					mfbac = m1 - m0 * vvx;
+					mfcac = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfabc + mfcbc;
+					m1 = mfcbc - mfabc;
+					m0 = m2 + mfbbc;
+					mfabc = m0;
+					mfbbc = m1 - m0 * vvx;
+					mfcbc = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfacc + mfccc;
+					m1 = mfccc - mfacc;
+					m0 = m2 + mfbcc;
+					mfacc = m0;
+					m0 += c1o9 * oMdrho;
+					mfbcc = m1 - m0 * vvx;
+					mfccc = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					// Cumulants
+					////////////////////////////////////////////////////////////////////////////////////
+
+					// mfaaa = 0.0;
+					LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity
+											//  LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+											//  LBMReal OxyyMxzz  = 1.;//2+s9;//
+					LBMReal O4 = 1.;
+					LBMReal O5 = 1.;
+					LBMReal O6 = 1.;
+
+					/////fourth order parameters; here only for test. Move out of loop!
+
+					LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0)));
+					LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
+					LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
+					LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+					//FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' )
+					LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+
+
+					//Cum 4.
+					//LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+					//LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+					//LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+					LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+					LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+					LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+					LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+					LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+					LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+
+					//Cum 5.
+					LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+					LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+					LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+
+					//Cum 6.
+					LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb
+						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+						- 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+							+ 2. * (mfcaa * mfaca * mfaac)
+							+ 16. * mfbba * mfbab * mfabb)
+						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho;
+
+					//2.
+					// linear combinations
+					LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+
+					//  LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho));
+					mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa
+										//mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa
+					LBMReal mxxMyy = mfcaa - mfaca;
+					LBMReal mxxMzz = mfcaa - mfaac;
+
+					LBMReal dxux =  -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
+					LBMReal dyuy =  dxux + collFactorM * c3o2 * mxxMyy;
+					LBMReal dzuz =  dxux + collFactorM * c3o2 * mxxMzz;
+
+					LBMReal Dxy = -three * collFactorM * mfbba;
+					LBMReal Dxz = -three * collFactorM * mfbab;
+					LBMReal Dyz = -three * collFactorM * mfabb;
+
+					//relax
+					mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+					mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy);
+					mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz);
+
+					mfabb += collFactorM * (-mfabb);
+					mfbab += collFactorM * (-mfbab);
+					mfbba += collFactorM * (-mfbba);
+
+					////updated pressure
+					//mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
+					mfaaa = 0.0; // Pressure elimination as in standard velocity model
+								 //  mfaaa += (rho - c1) * (dxux + dyuy + dzuz);
+
+					mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa
+
+										// mxxPyyPzz += (mfaaa + mfaaaS) * c1o2;
+										//mfaaa = mfaaaS;
+										// linear combinations back
+					mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+					mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+					mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+
+					//3.
+					// linear combinations
+					LBMReal mxxyPyzz = mfcba + mfabc;
+					LBMReal mxxyMyzz = mfcba - mfabc;
+
+					LBMReal mxxzPyyz = mfcab + mfacb;
+					LBMReal mxxzMyyz = mfcab - mfacb;
+
+					LBMReal mxyyPxzz = mfbca + mfbac;
+					LBMReal mxyyMxzz = mfbca - mfbac;
+
+					//relax
+					wadjust = Oxyz + (1. - Oxyz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+					mfbbb += wadjust * (-mfbbb);
+					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+					mxxyPyzz += wadjust * (-mxxyPyzz);
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+					mxxyMyzz += wadjust * (-mxxyMyzz);
+					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+					mxxzPyyz += wadjust * (-mxxzPyyz);
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+					mxxzMyyz += wadjust * (-mxxzMyyz);
+					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+					mxyyPxzz += wadjust * (-mxyyPxzz);
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+					mxyyMxzz += wadjust * (-mxyyMxzz);
+
+					// linear combinations back
+					mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+					mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+					mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+					mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+					mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+					mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+					//4.
+					CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc);
+					CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac);
+					CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca);
+					CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc);
+					CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb);
+					CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb);
+
+					//5.
+					CUMbcc += O5 * (-CUMbcc);
+					CUMcbc += O5 * (-CUMcbc);
+					CUMccb += O5 * (-CUMccb);
+
+					//6.
+					CUMccc += O6 * (-CUMccc);
+
+					//back cumulants to central moments
+					//4.
+					//mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+					//mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+					//mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+					mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+					mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+					mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+					mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+					mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+					mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+
+					//5.
+					mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+					mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+					mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+
+					//6.
+					mfccc = CUMccc - ((-4. * mfbbb * mfbbb
+						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+						- 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+							+ 2. * (mfcaa * mfaca * mfaac)
+							+ 16. * mfbba * mfbab * mfabb)
+						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho;
+
+
+					////////
+
+
+					////////////////////////////////////////////////////////////////////////////////////
+					//forcing
+					//mfbaa = -mfbaa;
+					//mfaba = -mfaba;
+					//mfaab = -mfaab;
+					//////////////////////////////////////////////////////////////////////////////////////
+					//mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho);
+					//mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho);
+					//mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho);
+					////////////////////////////////////////////////////////////////////////////////////
+					//back
+					////////////////////////////////////////////////////////////////////////////////////
+					//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Z - Dir
+					m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2;
+					m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+					mfaaa = m0;
+					mfaab = m1;
+					mfaac = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+					m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2);
+					m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+					mfaba = m0;
+					mfabb = m1;
+					mfabc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2;
+					m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+					mfaca = m0;
+					mfacb = m1;
+					mfacc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+					m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2);
+					m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+					mfbaa = m0;
+					mfbab = m1;
+					mfbac = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+					m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2);
+					m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+					mfbba = m0;
+					mfbbb = m1;
+					mfbbc = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+					m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2);
+					m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+					mfbca = m0;
+					mfbcb = m1;
+					mfbcc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2;
+					m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+					mfcaa = m0;
+					mfcab = m1;
+					mfcac = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+					m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2);
+					m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+					mfcba = m0;
+					mfcbb = m1;
+					mfcbc = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2;
+					m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+					mfcca = m0;
+					mfccb = m1;
+					mfccc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Y - Dir
+					m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2;
+					m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfaaa = m0;
+					mfaba = m1;
+					mfaca = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2;
+					m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfaab = m0;
+					mfabb = m1;
+					mfacb = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2;
+					m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfaac = m0;
+					mfabc = m1;
+					mfacc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+					m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2);
+					m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+					mfbaa = m0;
+					mfbba = m1;
+					mfbca = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+					m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2);
+					m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+					mfbab = m0;
+					mfbbb = m1;
+					mfbcb = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+					m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2);
+					m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+					mfbac = m0;
+					mfbbc = m1;
+					mfbcc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2;
+					m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfcaa = m0;
+					mfcba = m1;
+					mfcca = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2;
+					m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfcab = m0;
+					mfcbb = m1;
+					mfccb = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2;
+					m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfcac = m0;
+					mfcbc = m1;
+					mfccc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// X - Dir
+					m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaaa = m0;
+					mfbaa = m1;
+					mfcaa = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaba = m0;
+					mfbba = m1;
+					mfcba = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaca = m0;
+					mfbca = m1;
+					mfcca = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaab = m0;
+					mfbab = m1;
+					mfcab = m2;
+					///////////b////////////////////////////////////////////////////////////////////////
+					m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2;
+					m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfabb = m0;
+					mfbbb = m1;
+					mfcbb = m2;
+					///////////b////////////////////////////////////////////////////////////////////////
+					m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfacb = m0;
+					mfbcb = m1;
+					mfccb = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaac = m0;
+					mfbac = m1;
+					mfcac = m2;
+					///////////c////////////////////////////////////////////////////////////////////////
+					m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfabc = m0;
+					mfbbc = m1;
+					mfcbc = m2;
+					///////////c////////////////////////////////////////////////////////////////////////
+					m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfacc = m0;
+					mfbcc = m1;
+					mfccc = m2;
+
+					////forcing
+
+					mfabb += c1o2 * (-forcingX1) * c2o9;
+					mfbab += c1o2 * (-forcingX2) * c2o9;
+					mfbba += c1o2 * (-forcingX3) * c2o9;
+					mfaab += c1o2 * (-forcingX1 - forcingX2) * c1o18;
+					mfcab += c1o2 * (forcingX1 - forcingX2) * c1o18;
+					mfaba += c1o2 * (-forcingX1 - forcingX3) * c1o18;
+					mfcba += c1o2 * (forcingX1 - forcingX3) * c1o18;
+					mfbaa += c1o2 * (-forcingX2 - forcingX3) * c1o18;
+					mfbca += c1o2 * (forcingX2 - forcingX3) * c1o18;
+					mfaaa += c1o2 * (-forcingX1 - forcingX2 - forcingX3) * c1o72;
+					mfcaa += c1o2 * (forcingX1 - forcingX2 - forcingX3) * c1o72;
+					mfaca += c1o2 * (-forcingX1 + forcingX2 - forcingX3) * c1o72;
+					mfcca += c1o2 * (forcingX1 + forcingX2 - forcingX3) * c1o72;
+					mfcbb += c1o2 * (forcingX1)*c2o9;
+					mfbcb += c1o2 * (forcingX2)*c2o9;
+					mfbbc += c1o2 * (forcingX3)*c2o9;
+					mfccb += c1o2 * (forcingX1 + forcingX2) * c1o18;
+					mfacb += c1o2 * (-forcingX1 + forcingX2) * c1o18;
+					mfcbc += c1o2 * (forcingX1 + forcingX3) * c1o18;
+					mfabc += c1o2 * (-forcingX1 + forcingX3) * c1o18;
+					mfbcc += c1o2 * (forcingX2 + forcingX3) * c1o18;
+					mfbac += c1o2 * (-forcingX2 + forcingX3) * c1o18;
+					mfccc += c1o2 * (forcingX1 + forcingX2 + forcingX3) * c1o72;
+					mfacc += c1o2 * (-forcingX1 + forcingX2 + forcingX3) * c1o72;
+					mfcac += c1o2 * (forcingX1 - forcingX2 + forcingX3) * c1o72;
+					mfaac += c1o2 * (-forcingX1 - forcingX2 + forcingX3) * c1o72;
+
+
+
+
+					//////////////////////////////////////////////////////////////////////////
+					//proof correctness
+					//////////////////////////////////////////////////////////////////////////
+					//#ifdef  PROOF_CORRECTNESS
+					LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+						+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+						+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+					//			   //LBMReal dif = fabs(drho - rho_post);
+					//               LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post;
+					//#ifdef SINGLEPRECISION
+					//			   if (dif > 10.0E-7 || dif < -10.0E-7)
+					//#else
+					//			   if (dif > 10.0E-15 || dif < -10.0E-15)
+					//#endif
+					//			   {
+					//				   UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post)
+					//					   + " dif=" + UbSystem::toString(dif)
+					//					   + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+					//				   //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+					//				   //exit(EXIT_FAILURE);
+					//			   }
+					//#endif
+
+					if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post))
+						UB_THROW(UbException(
+							UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," +
+							UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+
+					//////////////////////////////////////////////////////////////////////////
+					//write distribution
+					//////////////////////////////////////////////////////////////////////////
+					(*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb         ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab         ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba         ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab        ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba        ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa        ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa      ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca      ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb   ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb    ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc   ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc    ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc   ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac    ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc  ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac  ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac   ;//* rho * c1o3;
+
+					(*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3;
+																																		// !Old Kernel
+/////////////////////  P H A S E - F I E L D   S O L V E R
+////////////////////////////////////////////
+/////CUMULANT PHASE-FIELD
+					LBMReal omegaD =1.0/( 3.0 * mob + 0.5);
+					{
+						mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+						mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+						mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+						mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+						mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+						mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+						mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+						mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+						mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+						mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+						mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+						mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+						mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+						mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+						mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+						mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+						mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+						mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+						mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+						mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+						mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+						mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+						mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+						mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
+						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+						//!
+						////////////////////////////////////////////////////////////////////////////////////
+						// second component
+						LBMReal concentration =
+							((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+								(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+								((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal oneMinusRho = c1- concentration;
+
+						LBMReal cx =
+							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+								(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+								(mfcbb - mfabb));
+						LBMReal cy =
+							((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+								(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+								(mfbcb - mfbab));
+						LBMReal cz =
+							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+								(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+								(mfbbc - mfbba));
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// calculate the square of velocities for this lattice node
+						LBMReal cx2 = cx * cx;
+						LBMReal cy2 = cy * cy;
+						LBMReal cz2 = cz * cz;
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
+						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+						//! see also Eq. (6)-(14) in \ref
+						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+						//!
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+						forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+						forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+						forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+						forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+						forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+						forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+						forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+						forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+						forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+						forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+						forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+						forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+						forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+						forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - experimental Cumulant ... to be published ... hopefully
+						//!
+
+						// linearized orthogonalization of 3rd order central moments
+						LBMReal Mabc = mfabc - mfaba * c1o3;
+						LBMReal Mbca = mfbca - mfbaa * c1o3;
+						LBMReal Macb = mfacb - mfaab * c1o3;
+						LBMReal Mcba = mfcba - mfaba * c1o3;
+						LBMReal Mcab = mfcab - mfaab * c1o3;
+						LBMReal Mbac = mfbac - mfbaa * c1o3;
+						// linearized orthogonalization of 5th order central moments
+						LBMReal Mcbc = mfcbc - mfaba * c1o9;
+						LBMReal Mbcc = mfbcc - mfbaa * c1o9;
+						LBMReal Mccb = mfccb - mfaab * c1o9;
+
+						// collision of 1st order moments
+						cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+							normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+						cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+							normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+						cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+							normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+
+						cx2 = cx * cx;
+						cy2 = cy * cy;
+						cz2 = cz * cz;
+
+						// equilibration of 2nd order moments
+						mfbba = zeroReal;
+						mfbab = zeroReal;
+						mfabb = zeroReal;
+
+						mfcaa = c1o3 * concentration;
+						mfaca = c1o3 * concentration;
+						mfaac = c1o3 * concentration;
+
+						// equilibration of 3rd order moments
+						Mabc = zeroReal;
+						Mbca = zeroReal;
+						Macb = zeroReal;
+						Mcba = zeroReal;
+						Mcab = zeroReal;
+						Mbac = zeroReal;
+						mfbbb = zeroReal;
+
+						// from linearized orthogonalization 3rd order central moments to central moments
+						mfabc = Mabc + mfaba * c1o3;
+						mfbca = Mbca + mfbaa * c1o3;
+						mfacb = Macb + mfaab * c1o3;
+						mfcba = Mcba + mfaba * c1o3;
+						mfcab = Mcab + mfaab * c1o3;
+						mfbac = Mbac + mfbaa * c1o3;
+
+						// equilibration of 4th order moments
+						mfacc = c1o9 * concentration;
+						mfcac = c1o9 * concentration;
+						mfcca = c1o9 * concentration;
+
+						mfcbb = zeroReal;
+						mfbcb = zeroReal;
+						mfbbc = zeroReal;
+
+						// equilibration of 5th order moments
+						Mcbc = zeroReal;
+						Mbcc = zeroReal;
+						Mccb = zeroReal;
+
+						// from linearized orthogonalization 5th order central moments to central moments
+						mfcbc = Mcbc + mfaba * c1o9;
+						mfbcc = Mbcc + mfbaa * c1o9;
+						mfccb = Mccb + mfaab * c1o9;
+
+						// equilibration of 6th order moment
+						mfccc = c1o27 * concentration;
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
+						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+						//! see also Eq. (88)-(96) in
+						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+						//!
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+						backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+						backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+						backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+						backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+						backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+						backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+						backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+						backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+						backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+						backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+						backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+						backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+						backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+						backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+
+
+						(*this->localDistributionsH1)(D3Q27System::ET_E,   x1,  x2,  x3) = mfabb;
+						(*this->localDistributionsH1)(D3Q27System::ET_N,   x1,  x2,  x3) = mfbab;
+						(*this->localDistributionsH1)(D3Q27System::ET_T,   x1,  x2,  x3) = mfbba;
+						(*this->localDistributionsH1)(D3Q27System::ET_NE,  x1,  x2,  x3) = mfaab;
+						(*this->localDistributionsH1)(D3Q27System::ET_NW,  x1p, x2,  x3) = mfcab;
+						(*this->localDistributionsH1)(D3Q27System::ET_TE,  x1,  x2,  x3) = mfaba;
+						(*this->localDistributionsH1)(D3Q27System::ET_TW,  x1p, x2,  x3) = mfcba;
+						(*this->localDistributionsH1)(D3Q27System::ET_TN,  x1,  x2,  x3) = mfbaa;
+						(*this->localDistributionsH1)(D3Q27System::ET_TS,  x1,  x2p, x3) = mfbca;
+						(*this->localDistributionsH1)(D3Q27System::ET_TNE, x1,  x2,  x3) = mfaaa;
+						(*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2,  x3) = mfcaa;
+						(*this->localDistributionsH1)(D3Q27System::ET_TSE, x1,  x2p, x3) = mfaca;
+						(*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_W,   x1p, x2,  x3 ) = mfcbb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_S,   x1,  x2p, x3 ) = mfbcb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_B,   x1,  x2,  x3p) = mfbbc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SW,  x1p, x2p, x3 ) = mfccb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SE,  x1,  x2p, x3 ) = mfacb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BW,  x1p, x2,  x3p) = mfcbc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BE,  x1,  x2,  x3p) = mfabc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BS,  x1,  x2p, x3p) = mfbcc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BN,  x1,  x2,  x3p) = mfbac;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1,  x2p, x3p) = mfacc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2,  x3p) = mfcac;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1,  x2,  x3p) = mfaac;
+
+						(*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb;
+					}
+				}
+			}
+		}
+	}
+}
+//////////////////////////////////////////////////////////////////////////
+
+LBMReal MultiphasePressureFilterLBMKernel::gradX1_phi()
+{
+	using namespace D3Q27System;
+	return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00]));
+}
+
+LBMReal MultiphasePressureFilterLBMKernel::gradX2_phi()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0]));
+}
+
+LBMReal MultiphasePressureFilterLBMKernel::gradX3_phi()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M]));
+}
+
+LBMReal MultiphasePressureFilterLBMKernel::nabla2_phi()
+{
+	using namespace D3Q27System;
+	LBMReal sum = 0.0;
+	sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000])))
+		+ (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000]))));
+	sum += WEIGTH[DIR_0PP] * (
+		(((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000])))
+		+	(((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000])))
+		+	(((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000])))
+		);
+	sum += WEIGTH[DIR_00P] * (
+		((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000]))
+		+	((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000]))
+		+	((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000]))
+		);
+
+	return 6.0 * sum;
+}
+
+void MultiphasePressureFilterLBMKernel::computePhasefield()
+{
+	using namespace D3Q27System;
+	SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions();
+
+	int minX1 = ghostLayerWidth;
+	int minX2 = ghostLayerWidth;
+	int minX3 = ghostLayerWidth;
+	int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth;
+	int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth;
+	int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth;
+
+	//------------- Computing the phase-field ------------------
+	for (int x3 = minX3; x3 < maxX3; x3++) {
+		for (int x2 = minX2; x2 < maxX2; x2++) {
+			for (int x1 = minX1; x1 < maxX1; x1++) {
+				// if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3))
+				{
+					int x1p = x1 + 1;
+					int x2p = x2 + 1;
+					int x3p = x3 + 1;
+
+					h[DIR_P00]   = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+					h[DIR_0P0]   = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+					h[DIR_00P]   = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+					h[DIR_PP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+					h[DIR_MP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+					h[DIR_P0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+					h[DIR_M0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+					h[DIR_0PP]  = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+					h[DIR_0MP]  = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+					h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+					h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+					h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+					h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+					h[DIR_M00]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+					h[DIR_0M0]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+					h[DIR_00M]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+					h[DIR_MM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+					h[DIR_PM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+					h[DIR_M0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+					h[DIR_P0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+					h[DIR_0MM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+					h[DIR_0PM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+					h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3);
+				}
+			}
+		}
+	}
+}
+
+void MultiphasePressureFilterLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+	int x3)
+{
+	using namespace D3Q27System;
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	phi[DIR_000] = (*ph)(x1, x2, x3);
+
+
+	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+			phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+		} else {
+            phi[k] = phaseFieldBC;
+		}
+	}
+}
+
+void MultiphasePressureFilterLBMKernel::swapDistributions()
+{
+	LBMKernel::swapDistributions();
+	dataSet->getHdistributions()->swap();
+}
+
+void MultiphasePressureFilterLBMKernel::initForcing()
+{
+	muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3);
+	muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3);
+	muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3);
+
+	muDeltaT = deltaT;
+
+	muForcingX1.DefineVar("dt", &muDeltaT);
+	muForcingX2.DefineVar("dt", &muDeltaT);
+	muForcingX3.DefineVar("dt", &muDeltaT);
+
+	muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
+
+	muForcingX1.DefineVar("nu", &muNu);
+	muForcingX2.DefineVar("nu", &muNu);
+	muForcingX3.DefineVar("nu", &muNu);
+
+	muForcingX1.DefineVar("rho",&muRho); 
+	muForcingX2.DefineVar("rho",&muRho); 
+	muForcingX3.DefineVar("rho",&muRho); 
+
+}
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..9b2b568b2854b3351361d8e9687fbbc6a0d7f284
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.h
@@ -0,0 +1,111 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphasePressureFilterLBMKernel.h
+//! \ingroup LBMKernel
+//! \author M. Geier, K. Kutscher, Hesameddin Safari
+//=======================================================================================
+
+#ifndef MultiphasePressureFilterLBMKernel_H
+#define MultiphasePressureFilterLBMKernel_H
+
+#include "LBMKernel.h"
+#include "BCProcessor.h"
+#include "D3Q27System.h"
+#include "basics/utilities/UbTiming.h"
+#include "basics/container/CbArray4D.h"
+#include "basics/container/CbArray3D.h"
+
+//! \brief  Multiphase Cascaded Cumulant LBM kernel. 
+//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model
+//! \author  M. Geier, K. Kutscher, Hesameddin Safari
+class MultiphasePressureFilterLBMKernel : public LBMKernel
+{
+public:
+    MultiphasePressureFilterLBMKernel();
+    virtual ~MultiphasePressureFilterLBMKernel(void) = default;
+    void calculate(int step) override;
+    SPtr<LBMKernel> clone() override;
+    double getCalculationTime() override { return .0; }
+
+    void setPhaseFieldBC(LBMReal bc)
+    {
+        phaseFieldBC = bc;
+    }
+    LBMReal getPhaseFieldBC()
+    {
+        return phaseFieldBC;
+    }
+
+protected:
+    virtual void initDataSet();
+    void swapDistributions() override;
+
+    void initForcing();
+
+    void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+    void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+    void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+    void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF;
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF;
+    CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsF;
+
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1;
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1;
+    CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsH1;
+
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld;
+
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField;
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU; 
+
+    LBMReal h  [D3Q27System::ENDF+1];
+    LBMReal phi[D3Q27System::ENDF+1];
+
+    LBMReal gradX1_phi();
+    LBMReal gradX2_phi();
+    LBMReal gradX3_phi();
+    void computePhasefield();
+    void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3);
+
+    LBMReal nabla2_phi();
+
+    mu::value_type muX1,muX2,muX3;
+    mu::value_type muDeltaT;
+    mu::value_type muNu;
+    mu::value_type muRho;
+    LBMReal forcingX1;
+    LBMReal forcingX2;
+    LBMReal forcingX3;
+
+    LBMReal phaseFieldBC { 0.0 }; // if 0.0 then light fluid on the wall, else if 1.0 havy fluid
+};
+
+#endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp
index 505007e0cc2c7ef8238956568224125e046aafa1..7424fdcbe8a36b7020e53fd78e154577fdc9ab47 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp
@@ -39,6 +39,7 @@
 #include "DataSet3D.h"
 #include "LBMKernel.h"
 #include <cmath>
+#include <iostream>
 
 #define PROOF_CORRECTNESS
 
@@ -163,6 +164,16 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
             new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0));
 
 
+		/////For velocity filter
+
+		//CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr velocityX(
+		//	new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0));
+		//CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr velocityY(
+		//	new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0));
+		//CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr velocityZ(
+		//	new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0));
+
+
         for (int x3 = 0; x3 <= maxX3; x3++) {
             for (int x2 = 0; x2 <= maxX2; x2++) {
                 for (int x1 = 0; x1 <= maxX1; x1++) {
@@ -207,7 +218,63 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 						//	(mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) +
 						//	(mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) +
 						//	(mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+						///Velocity filter
+
+
+						LBMReal rhoH = 1.0;
+						LBMReal rhoL = 1.0 / densityRatio;
+
+						LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+
+						LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH);
+
+						mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) / rho * c3;
+						mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) / rho * c3;
+						mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) / rho * c3;
+						mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) / rho * c3;
+						mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) / rho * c3;
+						mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) / rho * c3;
+						mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) / rho * c3;
+						mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) / rho * c3;
+						mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) / rho * c3;
+						mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) / rho * c3;
+						mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) / rho * c3;
+						mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) / rho * c3;
+						mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) / rho * c3;
+
+						mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) / rho * c3;
+						mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) / rho * c3;
+						mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) / rho * c3;
+						mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) / rho * c3;
+						mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) / rho * c3;
+						mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) / rho * c3;
+						mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) / rho * c3;
+						mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) / rho * c3;
+						mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) / rho * c3;
+						mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) / rho * c3;
+						mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) / rho * c3;
+						mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) / rho * c3;
+						mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) / rho * c3;
+
+						mfbbb = (*this->zeroDistributionsF)(x1, x2, x3) / rho * c3;
+
+						//(*velocityX)(x1, x2, x3) = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+						//	(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+						//	(mfcbb - mfabb)) ;
+						//(*velocityY)(x1, x2, x3) = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+						//	(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+						//	(mfbcb - mfbab)) ;
+						//(*velocityZ)(x1, x2, x3) = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+						//	(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+						//	(mfbbc - mfbba)) ;
+
+
+
+
                     }
+					else { (*phaseField)(x1, x2, x3) = 0; }
                 }
             }
         }
@@ -218,6 +285,10 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
         for (int x3 = minX3; x3 < maxX3; x3++) {
             for (int x2 = minX2; x2 < maxX2; x2++) {
                 for (int x1 = minX1; x1 < maxX1; x1++) {
+
+					//for (int x3 = minX3+1; x3 < maxX3-1; x3++) {
+					//	for (int x2 = minX2+1; x2 < maxX2-1; x2++) {
+					//		for (int x1 = minX1+1; x1 < maxX1-1; x1++) {
                     if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
                         int x1p = x1 + 1;
                         int x2p = x2 + 1;
@@ -245,7 +316,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
                         //-1 0 1
 
                         findNeighbors(phaseField, x1, x2, x3);
-
+						//// reading distributions here appears to be unnecessary!
                         LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
                         LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
                         LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
@@ -284,6 +355,62 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
                         LBMReal dX2_phi = gradX2_phi();
                         LBMReal dX3_phi = gradX3_phi();
 
+						//LBMReal dX1_phi = 3.0*((
+						//	WEIGTH[TNE]*((((*phaseField)(x1 + 1, x2+1, x3+1)- (*phaseField)(x1 - 1, x2 - 1, x3 - 1))+ ((*phaseField)(x1 + 1, x2 - 1, x3 + 1) - (*phaseField)(x1 - 1, x2 + 1, x3 - 1)))
+						//	+ (((*phaseField)(x1 + 1, x2 - 1, x3 - 1) - (*phaseField)(x1 - 1, x2 + 1, x3 + 1)) + ((*phaseField)(x1 + 1, x2 + 1, x3 - 1) - (*phaseField)(x1 - 1, x2 - 1, x3 + 1))))
+						//	+WEIGTH[NE]* ((((*phaseField)(x1 + 1, x2 + 1, x3) - (*phaseField)(x1 - 1, x2 - 1, x3)) + ((*phaseField)(x1 + 1, x2 - 1, x3) - (*phaseField)(x1 - 1, x2 + 1, x3 )))
+						//	+ (((*phaseField)(x1 + 1, x2, x3 - 1) - (*phaseField)(x1 - 1, x2, x3 + 1)) + ((*phaseField)(x1 + 1, x2, x3 + 1) - (*phaseField)(x1 - 1, x2, x3 - 1)))))
+						//	+WEIGTH[N]*((*phaseField)(x1 + 1, x2, x3 ) - (*phaseField)(x1 - 1, x2, x3))
+						//	); 
+						////if (dX1_phi != NdX1_phi) {std::cout<<dX1_phi<<" "<< NdX1_phi<<std::endl;}
+
+						//LBMReal dX2_phi = 3.0 * ((
+						//	WEIGTH[TNE] * ((((*phaseField)(x1 + 1, x2 + 1, x3 + 1) - (*phaseField)(x1 - 1, x2 - 1, x3 - 1)) + ((*phaseField)(x1 -1, x2 + 1, x3 + 1) - (*phaseField)(x1 + 1, x2 - 1, x3 - 1)))
+						//	+ (((*phaseField)(x1 - 1, x2 + 1, x3 - 1) - (*phaseField)(x1 + 1, x2 - 1, x3 + 1)) + ((*phaseField)(x1 + 1, x2 + 1, x3 - 1) - (*phaseField)(x1 - 1, x2 - 1, x3 + 1))))
+						//	+ WEIGTH[NE] * ((((*phaseField)(x1 + 1, x2 + 1, x3) - (*phaseField)(x1 - 1, x2 - 1, x3)) + ((*phaseField)(x1 - 1, x2 + 1, x3) - (*phaseField)(x1 + 1, x2 - 1, x3)))
+						//		+ (((*phaseField)(x1, x2+1, x3 - 1) - (*phaseField)(x1 , x2-1, x3 + 1)) + ((*phaseField)(x1 , x2+1, x3 + 1) - (*phaseField)(x1 , x2-1, x3 - 1)))))
+						//	+ WEIGTH[N] * ((*phaseField)(x1 , x2+1, x3) - (*phaseField)(x1 , x2-1, x3))
+						//	);
+
+						//LBMReal dX3_phi = 3.0 * ((
+						//	WEIGTH[TNE] * ((((*phaseField)(x1 + 1, x2 + 1, x3 + 1) - (*phaseField)(x1 - 1, x2 - 1, x3 - 1)) + ((*phaseField)(x1 - 1, x2 + 1, x3 + 1) - (*phaseField)(x1 + 1, x2 - 1, x3 - 1)))
+						//	+ (((*phaseField)(x1 - 1, x2 - 1, x3 + 1) - (*phaseField)(x1 + 1, x2 + 1, x3 - 1)) + ((*phaseField)(x1 + 1, x2 - 1, x3 + 1) - (*phaseField)(x1 - 1, x2 + 1, x3 - 1))))
+						//	+ WEIGTH[NE] * ((((*phaseField)(x1 + 1, x2, x3+1) - (*phaseField)(x1 - 1, x2, x3-1)) + ((*phaseField)(x1 - 1, x2, x3+1) - (*phaseField)(x1 + 1, x2, x3-1)))
+						//		+ (((*phaseField)(x1, x2 - 1, x3 + 1) - (*phaseField)(x1, x2 + 1, x3 - 1)) + ((*phaseField)(x1, x2 + 1, x3 + 1) - (*phaseField)(x1, x2 - 1, x3 - 1)))))
+						//	+ WEIGTH[N] * ((*phaseField)(x1, x2, x3+1) - (*phaseField)(x1, x2, x3-1))
+						//	);
+
+						///////////////////////////////////////
+
+						//LBMReal dX1_phi2 = 1.5 * ((
+						//	WEIGTH[TNE] * ((((*phaseField)(x1 + 2, x2 + 2, x3 + 2) - (*phaseField)(x1 - 2, x2 - 2, x3 - 2)) + ((*phaseField)(x1 + 2, x2 - 2, x3 + 2) - (*phaseField)(x1 - 2, x2 + 2, x3 - 2)))
+						//		+ (((*phaseField)(x1 + 2, x2 - 2, x3 - 2) - (*phaseField)(x1 - 2, x2 + 2, x3 + 2)) + ((*phaseField)(x1 + 2, x2 + 2, x3 - 2) - (*phaseField)(x1 - 2, x2 - 2, x3 + 2))))
+						//	+ WEIGTH[NE] * ((((*phaseField)(x1 + 2, x2 + 2, x3) - (*phaseField)(x1 - 2, x2 - 2, x3)) + ((*phaseField)(x1 + 2, x2 - 2, x3) - (*phaseField)(x1 - 2, x2 + 2, x3)))
+						//		+ (((*phaseField)(x1 + 2, x2, x3 - 2) - (*phaseField)(x1 - 2, x2, x3 + 2)) + ((*phaseField)(x1 + 2, x2, x3 + 2) - (*phaseField)(x1 - 2, x2, x3 - 2)))))
+						//	+ WEIGTH[N] * ((*phaseField)(x1 + 2, x2, x3) - (*phaseField)(x1 - 2, x2, x3))
+						//	);
+						////if (dX1_phi != NdX1_phi) {std::cout<<dX1_phi<<" "<< NdX1_phi<<std::endl;}
+
+						//LBMReal dX2_phi2 = 1.5 * ((
+						//	WEIGTH[TNE] * ((((*phaseField)(x1 + 2, x2 + 2, x3 + 2) - (*phaseField)(x1 - 2, x2 - 2, x3 - 2)) + ((*phaseField)(x1 - 2, x2 + 2, x3 + 2) - (*phaseField)(x1 + 2, x2 - 2, x3 - 2)))
+						//		+ (((*phaseField)(x1 - 2, x2 + 2, x3 - 2) - (*phaseField)(x1 + 2, x2 - 2, x3 + 2)) + ((*phaseField)(x1 + 2, x2 + 2, x3 - 2) - (*phaseField)(x1 - 2, x2 - 2, x3 + 2))))
+						//	+ WEIGTH[NE] * ((((*phaseField)(x1 + 2, x2 + 2, x3) - (*phaseField)(x1 - 2, x2 - 2, x3)) + ((*phaseField)(x1 - 2, x2 + 2, x3) - (*phaseField)(x1 + 2, x2 - 2, x3)))
+						//		+ (((*phaseField)(x1, x2 + 2, x3 - 2) - (*phaseField)(x1, x2 - 2, x3 + 2)) + ((*phaseField)(x1, x2 + 2, x3 + 2) - (*phaseField)(x1, x2 - 2, x3 - 2)))))
+						//	+ WEIGTH[N] * ((*phaseField)(x1, x2 + 2, x3) - (*phaseField)(x1, x2 - 2, x3))
+						//	);
+
+						//LBMReal dX3_phi2 = 1.5 * ((
+						//	WEIGTH[TNE] * ((((*phaseField)(x1 + 2, x2 + 2, x3 + 2) - (*phaseField)(x1 - 2, x2 - 2, x3 - 2)) + ((*phaseField)(x1 - 2, x2 + 2, x3 + 2) - (*phaseField)(x1 + 2, x2 - 2, x3 - 2)))
+						//		+ (((*phaseField)(x1 - 2, x2 - 2, x3 + 2) - (*phaseField)(x1 + 2, x2 + 2, x3 - 2)) + ((*phaseField)(x1 + 2, x2 - 2, x3 + 2) - (*phaseField)(x1 - 2, x2 + 2, x3 - 2))))
+						//	+ WEIGTH[NE] * ((((*phaseField)(x1 + 2, x2, x3 + 2) - (*phaseField)(x1 - 2, x2, x3 - 2)) + ((*phaseField)(x1 - 2, x2, x3 + 2) - (*phaseField)(x1 + 2, x2, x3 - 2)))
+						//		+ (((*phaseField)(x1, x2 - 2, x3 + 2) - (*phaseField)(x1, x2 + 2, x3 - 2)) + ((*phaseField)(x1, x2 + 2, x3 + 2) - (*phaseField)(x1, x2 - 2, x3 - 2)))))
+						//	+ WEIGTH[N] * ((*phaseField)(x1, x2, x3 + 2) - (*phaseField)(x1, x2, x3 - 2))
+						//	);
+
+						//dX1_phi = (2*dX1_phi -1*dX1_phi2);// 2 * dX1_phi - dX1_phi2;
+						//dX2_phi = (2*dX2_phi -1*dX2_phi2);// 2 * dX2_phi - dX2_phi2;
+						//dX3_phi = (2*dX3_phi -1*dX3_phi2);// 2 * dX3_phi - dX3_phi2;
+
 
                         LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9;
                         LBMReal normX1 = dX1_phi/denom;
@@ -304,28 +431,28 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 
 						///!test
 
-						collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[REST] - phiH) / (phiH - phiL);
+						collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL);
 						//collFactorM = phi[REST] - phiL < (phiH - phiL) * 0.05 ? collFactorG : collFactorL;
 
-                        LBMReal mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi();
+                        LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi();
 
                         //----------- Calculating Macroscopic Values -------------
-                        LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH);
-
-                        if (withForcing) {
-                            // muX1 = static_cast<double>(x1-1+ix1*maxX1);
-                            // muX2 = static_cast<double>(x2-1+ix2*maxX2);
-                            // muX3 = static_cast<double>(x3-1+ix3*maxX3);
-
-                            forcingX1 = muForcingX1.Eval();
-                            forcingX2 = muForcingX2.Eval();
-                            forcingX3 = muForcingX3.Eval();
-
-                            LBMReal rho_m = 1.0 / densityRatio;
-                            forcingX1     = forcingX1 * (rho - rho_m);
-                            forcingX2     = forcingX2 * (rho - rho_m);
-                            forcingX3     = forcingX3 * (rho - rho_m);
-
+                        LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH);
+
+						if (withForcing) {
+							// muX1 = static_cast<double>(x1-1+ix1*maxX1);
+							// muX2 = static_cast<double>(x2-1+ix2*maxX2);
+							// muX3 = static_cast<double>(x3-1+ix3*maxX3);
+
+							forcingX1 = muForcingX1.Eval();
+							forcingX2 = muForcingX2.Eval();
+							forcingX3 = muForcingX3.Eval();
+
+							LBMReal rho_m = 1.0 / densityRatio;
+							forcingX1 = forcingX1 * (rho - rho_m);
+							forcingX2 = forcingX2 * (rho - rho_m);
+							forcingX3 = forcingX3 * (rho - rho_m);
+						}
                             			   ////Incompressible Kernal
 
 			    mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)/rho*c3;
@@ -387,69 +514,272 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 			   vvz += mu * dX3_phi * c1o2;
 			  
 
+
+			   ////Velocity filter 14.04.2021
+			  // LBMReal lap_vx, lap_vy,lap_vz;
+			  // {
+				 //  LBMReal sum = 0.0;
+				 //  sum += WEIGTH[TNE] * (((((*velocityX)(x1+1, x2+1, x3+1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 - 1, x3 - 1) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1 + 1, x2 + 1, x3 - 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 + 1, x2 - 1, x3 + 1) - (*velocityX)(x1, x2, x3))))
+					//   + ((((*velocityX)(x1 + 1, x2 - 1, x3 + 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 + 1, x3 - 1) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1 - 1, x2 + 1, x3 + 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 + 1, x2 - 1, x3 - 1) - (*velocityX)(x1, x2, x3)))));
+				 //  sum += WEIGTH[TN] * (
+					//   ((((*velocityX)(x1 + 1, x2 + 1, x3 ) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 - 1, x3) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1 + 1, x2 - 1, x3) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 + 1, x3) - (*velocityX)(x1, x2, x3))))
+					//   + ((((*velocityX)(x1 + 1, x2 , x3+1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 , x3-1) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1 +1 , x2 , x3-1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2, x3 + 1) - (*velocityX)(x1, x2, x3))))
+					//   + ((((*velocityX)(x1 , x2+1, x3 + 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1, x2 - 1, x3 - 1) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1, x2 + 1, x3 - 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1, x2 - 1, x3 + 1) - (*velocityX)(x1, x2, x3))))
+					//   );
+				 //  sum += WEIGTH[T] * (
+					//   (((*velocityX)(x1-1, x2 , x3 ) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 + 1, x2, x3) - (*velocityX)(x1, x2, x3)))
+					//   + (((*velocityX)(x1 , x2-1, x3) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1, x2 + 1, x3) - (*velocityX)(x1, x2, x3)))
+					//   + (((*velocityX)(x1, x2, x3-1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1, x2, x3+1) - (*velocityX)(x1, x2, x3)))
+					//   );
+				 //  //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+				 //  //    sum += WEIGTH[k] * (phi[k] - phi[REST]);
+				 //  //}
+				 //   lap_vx=6.0 * sum;
+
+					//sum = 0.0;
+					//sum += WEIGTH[TNE] * (((((*velocityY)(x1 + 1, x2 + 1, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2 - 1, x3 - 1) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1 + 1, x2 + 1, x3 - 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 + 1, x2 - 1, x3 + 1) - (*velocityY)(x1, x2, x3))))
+					//	+ ((((*velocityY)(x1 + 1, x2 - 1, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2 + 1, x3 - 1) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1 - 1, x2 + 1, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 + 1, x2 - 1, x3 - 1) - (*velocityY)(x1, x2, x3)))));
+					//sum += WEIGTH[TN] * (
+					//	((((*velocityY)(x1 + 1, x2 + 1, x3) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2 - 1, x3) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1 + 1, x2 - 1, x3) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2 + 1, x3) - (*velocityY)(x1, x2, x3))))
+					//	+ ((((*velocityY)(x1 + 1, x2, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2, x3 - 1) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1 + 1, x2, x3 - 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2, x3 + 1) - (*velocityY)(x1, x2, x3))))
+					//	+ ((((*velocityY)(x1, x2 + 1, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1, x2 - 1, x3 - 1) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1, x2 + 1, x3 - 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1, x2 - 1, x3 + 1) - (*velocityY)(x1, x2, x3))))
+					//	);
+					//sum += WEIGTH[T] * (
+					//	(((*velocityY)(x1 - 1, x2, x3) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 + 1, x2, x3) - (*velocityY)(x1, x2, x3)))
+					//	+ (((*velocityY)(x1, x2 - 1, x3) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1, x2 + 1, x3) - (*velocityY)(x1, x2, x3)))
+					//	+ (((*velocityY)(x1, x2, x3 - 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1, x2, x3 + 1) - (*velocityY)(x1, x2, x3)))
+					//	);
+
+					//lap_vy = 6.0 * sum;
+
+					//sum = 0.0;
+					//sum += WEIGTH[TNE] * (((((*velocityZ)(x1 + 1, x2 + 1, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2 - 1, x3 - 1) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1 + 1, x2 + 1, x3 - 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 + 1, x2 - 1, x3 + 1) - (*velocityZ)(x1, x2, x3))))
+					//	+ ((((*velocityZ)(x1 + 1, x2 - 1, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2 + 1, x3 - 1) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1 - 1, x2 + 1, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 + 1, x2 - 1, x3 - 1) - (*velocityZ)(x1, x2, x3)))));
+					//sum += WEIGTH[TN] * (
+					//	((((*velocityZ)(x1 + 1, x2 + 1, x3) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2 - 1, x3) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1 + 1, x2 - 1, x3) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2 + 1, x3) - (*velocityZ)(x1, x2, x3))))
+					//	+ ((((*velocityZ)(x1 + 1, x2, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2, x3 - 1) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1 + 1, x2, x3 - 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2, x3 + 1) - (*velocityZ)(x1, x2, x3))))
+					//	+ ((((*velocityZ)(x1, x2 + 1, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1, x2 - 1, x3 - 1) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1, x2 + 1, x3 - 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1, x2 - 1, x3 + 1) - (*velocityZ)(x1, x2, x3))))
+					//	);
+					//sum += WEIGTH[T] * (
+					//	(((*velocityZ)(x1 - 1, x2, x3) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 + 1, x2, x3) - (*velocityZ)(x1, x2, x3)))
+					//	+ (((*velocityZ)(x1, x2 - 1, x3) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1, x2 + 1, x3) - (*velocityZ)(x1, x2, x3)))
+					//	+ (((*velocityZ)(x1, x2, x3 - 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1, x2, x3 + 1) - (*velocityZ)(x1, x2, x3)))
+					//	);
+
+					//lap_vz = 6.0 * sum;
+
+			  // }
+
+			  // if (lap_vx != 0.0) {
+				 //  lap_vx = lap_vx;
+			  // }
+
 			   ///----Classic source term 8.4.2021
 
+			   LBMReal vvxF, vvyF, vvzF;
+			   vvxF = vvx;//-2*c1o24 * lap_vx;// 
+			   vvyF = vvy;//-2*c1o24 * lap_vy;// 
+			   vvzF = vvz;//-2*c1o24 * lap_vz;// 
+
+//			   vvxF = 1.2* vvx- 0.2*0.5 * ((*velocityX)(x1 - 1, x2, x3) + (*velocityX)(x1 + 1, x2, x3));
+//			   vvyF = 1.2 *vvy- 0.2*0.5* ((*velocityY)(x1 , x2-1, x3) + (*velocityY)(x1 , x2+1, x3));
+//			   vvzF = 1.2 *vvz-0.2*0.5* ((*velocityZ)(x1 , x2, x3-1) + (*velocityZ)(x1 , x2, x3+1));
+			   //if (vvxF != vvx) {
+				  // vvxF = vvxF;
+			   //}
+			   LBMReal weightGrad =  1.0-denom*denom/(denom*denom+0.0001*0.001);
+			   LBMReal dX1_phiF = dX1_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX1;
+			   LBMReal dX2_phiF = dX2_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX2;
+			   LBMReal dX3_phiF = dX3_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX3;
+
+			   //dX1_phiF *= 1.2;
+			   //dX2_phiF *= 1.2;
+			   //dX3_phiF *= 1.2;
+
+			   //LBMReal gradFD = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi);
+			   //LBMReal gradPhi = (1.0 - phi[REST]) * (phi[REST]);
+			   //gradPhi = (gradPhi > gradFD) ? gradPhi : gradFD;
+			   //dX1_phiF = gradPhi * normX1;
+				  // dX2_phiF = gradPhi * normX2;
+				  // dX3_phiF = gradPhi * normX3;
+
 			   LBMReal ux2;
 			   LBMReal uy2;
 			   LBMReal uz2;
-			   ux2 = vvx * vvx;
-			   uy2 = vvy * vvy;
-			   uz2 = vvz * vvz;
+			   ux2 = vvxF * vvxF;
+			   uy2 = vvyF * vvyF;
+			   uz2 = vvzF * vvzF;
 			   LBMReal forcingTerm[D3Q27System::ENDF + 1];
-			   for (int dir = STARTF; dir <= (FENDDIR); dir++) {
-				   LBMReal velProd = DX1[dir] * vvx + DX2[dir] * vvy + DX3[dir] * vvz;
+			   for (int dir = FSTARTDIR; dir <= FENDDIR; dir++) {
+				   LBMReal velProd = DX1[dir] * vvxF + DX2[dir] * vvyF + DX3[dir] * vvzF;
 				   LBMReal velSq1 = velProd * velProd;
-				   LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2));
+				   LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + (4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)));
 
 				   LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi;
 
 				   forcingTerm[dir] = 
-					   (-vvx) * (fac1 * dX1_phi ) +
-					   (-vvy) * (fac1 * dX2_phi ) +
-					   (-vvz) * (fac1 * dX3_phi ) +
-					   (DX1[dir]) * (fac1 * dX1_phi ) +
-					   (DX2[dir]) * (fac1 * dX2_phi ) +
-					   (DX3[dir]) * (fac1 * dX3_phi );
+					   (-vvxF) * (fac1 * dX1_phiF ) +
+					   (-vvyF) * (fac1 * dX2_phiF ) +
+					   (-vvzF) * (fac1 * dX3_phiF ) +
+					   (DX1[dir]) * (fac1 * dX1_phiF ) +
+					   (DX2[dir]) * (fac1 * dX2_phiF ) +
+					   (DX3[dir]) * (fac1 * dX3_phiF );
+
+				   //LBMReal biDif= (-((*phaseField)(x1 + 2 * DX1[dir], x2 + 2 * DX2[dir], x3 + 2 * DX3[dir])) + 4 * ((*phaseField)(x1 + DX1[dir], x2 + DX2[dir], x3 + DX3[dir]))
+					  // - 3*((*phaseField)(x1 , x2 , x3 )) )*0.5;
+				   //LBMReal ceDif = (((*phaseField)(x1 + DX1[dir], x2 + DX2[dir], x3 + DX3[dir])) - ((*phaseField)(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir]))) * 0.5;
+
+				   ////ceDif = ((((*phaseField)(x1 + 2*DX1[dir], x2 + 2*DX2[dir], x3 + 2*DX3[dir])) - ((*phaseField)(x1 , x2 , x3 ))) * biDif < 0) ?
+					  //// (!bcArray->isSolid(x1+2*DX1[dir], x2+2*DX2[dir], x3+2*DX3[dir]) && !bcArray->isUndefined(x1 + 2 * DX1[dir], x2 + 2 * DX2[dir], x3 + 2 * DX3[dir]) && !bcArray->isSolid(x1 + DX1[dir], x2 +  DX2[dir], x3 +  DX3[dir]) && !bcArray->isUndefined(x1 +  DX1[dir], x2 + DX2[dir], x3 + DX3[dir]) && !bcArray->isSolid(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir]) && !bcArray->isUndefined(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir])) ?
+					  //// (biDif+ceDif)*0.5 : ceDif: ceDif;
+
+				   //ceDif = ((((*phaseField)(x1 + 2 * DX1[dir], x2 + 2 * DX2[dir], x3 + 2 * DX3[dir])) - ((*phaseField)(x1, x2, x3))) * biDif < 0) ? biDif : ceDif;
+
+				   //forcingTerm[dir] =
+					  // (-vvxF) * (fac1 * dX1_phiF) +
+					  // (-vvyF) * (fac1 * dX2_phiF) +
+					  // (-vvzF) * (fac1 * dX3_phiF) +
+					  // fac1 * ceDif;//(((*phaseField)(x1 + DX1[dir], x2 + DX2[dir], x3 + DX3[dir])) -  ((*phaseField)(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir]))) * 0.5;
+					  // //( -((*phaseField)(x1 +2* DX1[dir], x2 + 2 * DX2[dir], x3 + 2 * DX3[dir])) + 5*((*phaseField)(x1 + DX1[dir], x2 +  DX2[dir], x3 +  DX3[dir])) 
+						 //  //- 3*((*phaseField)(x1 , x2 , x3 )) - ((*phaseField)(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir])) )*0.25;
+
+
 			   }
 
-			   LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
-			   LBMReal fac1 = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi;
-			   forcingTerm[REST] = (-vvx) * (fac1 * dX1_phi ) +
-				   (-vvy) * (fac1 * dX2_phi ) +
-				   (-vvz) * (fac1 * dX3_phi );
-
-			   mfcbb += 3.0 * ( 0.5 * forcingTerm[E]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
-			   mfbcb += 3.0 * ( 0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
-			   mfbbc += 3.0 * ( 0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
-			   mfccb += 3.0 * ( 0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
-			   mfacb += 3.0 * ( 0.5 * forcingTerm[NW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
-			   mfcbc += 3.0 * ( 0.5 * forcingTerm[TE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
-			   mfabc += 3.0 * ( 0.5 * forcingTerm[TW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
-			   mfbcc += 3.0 * ( 0.5 * forcingTerm[TN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
-			   mfbac += 3.0 * ( 0.5 * forcingTerm[TS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
-			   mfccc += 3.0 * ( 0.5 * forcingTerm[TNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
-			   mfacc += 3.0 * ( 0.5 * forcingTerm[TNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
-			   mfcac += 3.0 * ( 0.5 * forcingTerm[TSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
-			   mfaac += 3.0 * ( 0.5 * forcingTerm[TSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
-			   mfabb += 3.0 * ( 0.5 * forcingTerm[W]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
-			   mfbab += 3.0 * ( 0.5 * forcingTerm[S]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
-			   mfbba += 3.0 * ( 0.5 * forcingTerm[B]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
-			   mfaab += 3.0 * ( 0.5 * forcingTerm[SW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
-			   mfcab += 3.0 * ( 0.5 * forcingTerm[SE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
-			   mfaba += 3.0 * ( 0.5 * forcingTerm[BW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
-			   mfcba += 3.0 * ( 0.5 * forcingTerm[BE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
-			   mfbaa += 3.0 * ( 0.5 * forcingTerm[BS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
-			   mfbca += 3.0 * ( 0.5 * forcingTerm[BN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
-			   mfaaa += 3.0 * ( 0.5 * forcingTerm[BSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
-			   mfcaa += 3.0 * ( 0.5 * forcingTerm[BSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
-			   mfaca += 3.0 * ( 0.5 * forcingTerm[BNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
-			   mfcca += 3.0 * ( 0.5 * forcingTerm[BNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
-			   mfbbb += 3.0 * ( 0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
+			   LBMReal gamma = WEIGTH[DIR_000] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+			   LBMReal fac1 = (gamma - WEIGTH[DIR_000]) * c1o3 * rhoToPhi;
+			   forcingTerm[DIR_000] = (-vvxF) * (fac1 * dX1_phiF ) +
+				   (-vvyF) * (fac1 * dX2_phiF ) +
+				   (-vvzF) * (fac1 * dX3_phiF );
+
+			   ////////
+			  // LBMReal divAfterSource=
+			  //( mfcbb + 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF)  *(vvzF)-1)+
+			  //( mfbcb + 3.0 * (0.5 * forcingTerm[N]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfbbc + 3.0 * (0.5 * forcingTerm[T]) / rho	) *((vvxF)  *(vvxF)  +(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfccb + 3.0 * (0.5 * forcingTerm[NE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfacb + 3.0 * (0.5 * forcingTerm[NW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfcbc + 3.0 * (0.5 * forcingTerm[TE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfabc + 3.0 * (0.5 * forcingTerm[TW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfbcc + 3.0 * (0.5 * forcingTerm[TN]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfbac + 3.0 * (0.5 * forcingTerm[TS]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfccc + 3.0 * (0.5 * forcingTerm[TNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfacc + 3.0 * (0.5 * forcingTerm[TNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfcac + 3.0 * (0.5 * forcingTerm[TSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfaac + 3.0 * (0.5 * forcingTerm[TSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfabb + 3.0 * (0.5 * forcingTerm[W]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF)  *(vvzF)-1)+
+			  //( mfbab + 3.0 * (0.5 * forcingTerm[S]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfbba + 3.0 * (0.5 * forcingTerm[B]) / rho	) *((vvxF)  *(vvxF)  +(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaab + 3.0 * (0.5 * forcingTerm[SW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfcab + 3.0 * (0.5 * forcingTerm[SE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfaba + 3.0 * (0.5 * forcingTerm[BW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcba + 3.0 * (0.5 * forcingTerm[BE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbaa + 3.0 * (0.5 * forcingTerm[BS]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbca + 3.0 * (0.5 * forcingTerm[BN]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaaa + 3.0 * (0.5 * forcingTerm[BSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcaa + 3.0 * (0.5 * forcingTerm[BSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaca + 3.0 * (0.5 * forcingTerm[BNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcca + 3.0 * (0.5 * forcingTerm[BNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbbb + 3.0 * (0.5 * forcingTerm[REST]) / rho)*((vvxF)*(vvxF)+(vvyF)*(vvyF)+(vvzF)*(vvzF)-1);
+
+			  // LBMReal divBeforeSource =
+				 //  (mfcbb)    * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) +
+				 //  (mfbcb)    * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfbbc)    * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfccb)   * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfacb)   * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfcbc)   * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfabc)   * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfbcc)   * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfbac)   * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfccc)  * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfacc)  * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfcac)  * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfaac)  * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfabb)    * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) +
+				 //  (mfbab)    * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfbba)    * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaab)   * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfcab)   * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfaba)   * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcba)   * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbaa)   * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbca)   * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaaa)  * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcaa)  * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaca)  * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcca)  * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbbb) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF) * (vvzF)-1);
+			   //if (divAfterSource - divBeforeSource != 0 && phi[REST]>0.0001 && phi[REST]<0.999) {
+				  // std::cout << phi[REST]<<" "<< divAfterSource << " " << divBeforeSource <<" "<< divAfterSource/ divBeforeSource << std::endl;
+			   //}
+
+			   //if (fabs(divAfterSource - divBeforeSource)/(fabs(divAfterSource) + fabs(divBeforeSource)+1e-10) > 1e-5) {
+				  // LBMReal scaleDiv =0.95+(1-0.95)* (divBeforeSource) / (divBeforeSource - divAfterSource);
+
+				  // forcingTerm[DIR_P00]	 *=scaleDiv;
+				  // forcingTerm[N]	 *=scaleDiv;
+				  // forcingTerm[T]	 *=scaleDiv;
+				  // forcingTerm[NE]	 *=scaleDiv;
+				  // forcingTerm[NW]	 *=scaleDiv;
+				  // forcingTerm[TE]	 *=scaleDiv;
+				  // forcingTerm[TW]	 *=scaleDiv;
+				  // forcingTerm[TN]	 *=scaleDiv;
+				  // forcingTerm[TS]	 *=scaleDiv;
+				  // forcingTerm[TNE]	 *=scaleDiv;
+				  // forcingTerm[TNW]	 *=scaleDiv;
+				  // forcingTerm[TSE]	 *=scaleDiv;
+				  // forcingTerm[TSW]	 *=scaleDiv;
+				  // forcingTerm[W]	 *=scaleDiv;
+				  // forcingTerm[S]	 *=scaleDiv;
+				  // forcingTerm[B]	 *=scaleDiv;
+				  // forcingTerm[SW]	 *=scaleDiv;
+				  // forcingTerm[SE]	 *=scaleDiv;
+				  // forcingTerm[BW]	 *=scaleDiv;
+				  // forcingTerm[BE]	 *=scaleDiv;
+				  // forcingTerm[BS]	 *=scaleDiv;
+				  // forcingTerm[BN]	 *=scaleDiv;
+				  // forcingTerm[BSW]	 *=scaleDiv;
+				  // forcingTerm[BSE]	 *=scaleDiv;
+				  // forcingTerm[BNW]	 *=scaleDiv;
+				  // forcingTerm[BNE]	 *=scaleDiv;
+				  // forcingTerm[REST] *=scaleDiv;
+			   //}
+			   ////////
 
-			   //--------------------------------------------------------
 
+			   mfcbb +=3.0 * ( 0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+			   mfbcb +=3.0 * ( 0.5 * forcingTerm[DIR_0P0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+			   mfbbc +=3.0 * ( 0.5 * forcingTerm[DIR_00P]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+			   mfccb +=3.0 * ( 0.5 * forcingTerm[DIR_PP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+			   mfacb +=3.0 * ( 0.5 * forcingTerm[DIR_MP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+			   mfcbc +=3.0 * ( 0.5 * forcingTerm[DIR_P0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+			   mfabc +=3.0 * ( 0.5 * forcingTerm[DIR_M0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+			   mfbcc +=3.0 * ( 0.5 * forcingTerm[DIR_0PP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+			   mfbac +=3.0 * ( 0.5 * forcingTerm[DIR_0MP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+			   mfccc +=3.0 * ( 0.5 * forcingTerm[DIR_PPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+			   mfacc +=3.0 * ( 0.5 * forcingTerm[DIR_MPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+			   mfcac +=3.0 * ( 0.5 * forcingTerm[DIR_PMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+			   mfaac +=3.0 * ( 0.5 * forcingTerm[DIR_MMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+			   mfabb +=3.0 * ( 0.5 * forcingTerm[DIR_M00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+			   mfbab +=3.0 * ( 0.5 * forcingTerm[DIR_0M0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+			   mfbba +=3.0 * ( 0.5 * forcingTerm[DIR_00M]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+			   mfaab +=3.0 * ( 0.5 * forcingTerm[DIR_MM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+			   mfcab +=3.0 * ( 0.5 * forcingTerm[DIR_PM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+			   mfaba +=3.0 * ( 0.5 * forcingTerm[DIR_M0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+			   mfcba +=3.0 * ( 0.5 * forcingTerm[DIR_P0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+			   mfbaa +=3.0 * ( 0.5 * forcingTerm[DIR_0MM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+			   mfbca +=3.0 * ( 0.5 * forcingTerm[DIR_0PM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+			   mfaaa +=3.0 * ( 0.5 * forcingTerm[DIR_MMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+			   mfcaa +=3.0 * ( 0.5 * forcingTerm[DIR_PMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+			   mfaca +=3.0 * ( 0.5 * forcingTerm[DIR_MPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+			   mfcca +=3.0 * ( 0.5 * forcingTerm[DIR_PPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+			   mfbbb +=3.0 * ( 0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
+
+			   //--------------------------------------------------------
 
 
+			   //////////End classic source term
 			   //forcing 
 			   ///////////////////////////////////////////////////////////////////////////////////////////
 			   if (withForcing)
@@ -753,11 +1083,11 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 			   /////fourth order parameters; here only for test. Move out of loop!
 
 			   LBMReal OxyyPxzz =  8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0)));
-			   LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
-			   LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
-			   LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
-			   //FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::B' )
-			   LBMReal BB =  (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+			   LBMReal OxyyMxzz =  8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
+			   LBMReal Oxyz =  24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
+			   LBMReal A =  (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+			   //FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' )
+			   LBMReal BB =   (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
 
 
 			   //Cum 4.
@@ -802,13 +1132,25 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 			  // mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz);
 
 			   //17.03.2021 attempt for statililization by assymptotically vanishing bias
-			   LBMReal correctionScaling =0.0* rhoToPhi /rho;// +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000;
-			   mxxPyyPzz += (1.0/3.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz)* correctionScaling; // As in Hesam's code
-			   mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy)* correctionScaling;
-			   mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
-			   mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
-			   mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
-			   mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+			   //LBMReal correctionScaling = rhoToPhi /rho;// +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000;
+			   //mxxPyyPzz += (1.0/3.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz)* correctionScaling; // As in Hesam's code
+			   //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy)* correctionScaling;
+			   //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
+			   //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
+			   //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
+			   //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+
+
+			   //14.04.2021 filtered velocity
+
+			   //LBMReal correctionScaling =  rhoToPhi / rho;// +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000;
+			   //mxxPyyPzz += (1.0 / 3.0) * (dX1_phi * vvxF + dX2_phi * vvyF + dX3_phi * vvzF) * correctionScaling; // As in Hesam's code
+			   //mxxMyy += c1o3 * (dX1_phi * vvxF - dX2_phi * vvyF) * correctionScaling;
+			   //mxxMzz += c1o3 * (dX1_phi * vvxF - dX3_phi * vvzF) * correctionScaling;
+			   //mfabb += c1o6 * (dX2_phi * vvzF + dX3_phi * vvyF) * correctionScaling;
+			   //mfbab += c1o6 * (dX1_phi * vvzF + dX3_phi * vvxF) * correctionScaling;
+			   //mfbba += c1o6 * (dX1_phi * vvyF + dX2_phi * vvxF) * correctionScaling;
+
 
 			   LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
 			   LBMReal dyuy =  dxux + collFactorM * c3o2 * mxxMyy;
@@ -819,6 +1161,20 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 			   LBMReal Dyz = -three * collFactorM * mfabb;
 
 			   ////relax unfiltered
+			   //! divergenceFilter 10.05.2021
+			   LBMReal divMag= (1.0 - phi[DIR_000]) * (phi[DIR_000])*10*5*sqrt(fabs((OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz))));
+			  // LBMReal divMag = 500 *500* 50*(fabs((OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz))))* (fabs((OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz))));
+			   //LBMReal divMag = (dX1_phi * dxux) > 0 ? (dX1_phi * dxux) : 0;
+			   //divMag += (dX2_phi * dyuy) > 0 ? (dX2_phi * dyuy) : 0;
+			   //divMag += (dX3_phi * dzuz) > 0 ? (dX3_phi * dzuz) : 0;
+			   //divMag *= 5000;
+			   //divMag+= denom * 10 * 5 * sqrt(fabs((OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz))));
+			   //LBMReal divMag = 5000 * (fabs(dX1_phi * dxux)+fabs(dX2_phi * dyuy)+fabs(dX3_phi * dzuz));
+			   collFactorM = collFactorM / (1.0 + 3.0 * divMag);
+
+			   collFactorM = (collFactorM > 1.0) ? collFactorM : 1.0;
+
+
 			   mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
 			   mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy);
 			   mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz);
@@ -848,15 +1204,29 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 
 			   //applying phase field gradients second part:
 			   //mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz);
-			   mxxPyyPzz += (1.0 / 3.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; // As in Hesam's code
-			   mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
-			   mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
-			   mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
-			   mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
-			   mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+			   //mxxPyyPzz += (1.0 / 3.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; // As in Hesam's code
+			   //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
+			   //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
+			   //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
+			   //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
+			   //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+
+
+			   //////updated pressure
+			   //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
+
+
+			   //mxxPyyPzz += (1.0 / 3.0) * (dX1_phi * vvxF + dX2_phi * vvyF + dX3_phi * vvzF) * correctionScaling; // As in Hesam's code
+			   //mxxMyy += c1o3 * (dX1_phi * vvxF - dX2_phi * vvyF) * correctionScaling;
+			   //mxxMzz += c1o3 * (dX1_phi * vvxF - dX3_phi * vvzF) * correctionScaling;
+			   //mfabb += c1o6 * (dX2_phi * vvzF + dX3_phi * vvyF) * correctionScaling;
+			   //mfbab += c1o6 * (dX1_phi * vvzF + dX3_phi * vvxF) * correctionScaling;
+			   //mfbba += c1o6 * (dX1_phi * vvyF + dX2_phi * vvxF) * correctionScaling;
+
+
+			   //////updated pressure
+			   //mfaaa += (dX1_phi * vvxF + dX2_phi * vvyF + dX3_phi * vvzF) * correctionScaling;
 
-			   ////updated pressure
-			   mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
 
 			   mxxPyyPzz += mfaaa;//12.03.21 shifted by mfaaa
 			 //  mxxPyyPzz = mfaaa; //12.03.21 reguarized pressure !?
@@ -1249,33 +1619,33 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 
 			   /////classical source term 8.4.2021
 
-			   mfcbb += 3.0 * (0.5 * forcingTerm[E]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
-			   mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
-			   mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
-			   mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
-			   mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
-			   mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
-			   mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
-			   mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
-			   mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
-			   mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
-			   mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
-			   mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
-			   mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
-			   mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
-			   mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
-			   mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
-			   mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
-			   mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
-			   mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
-			   mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
-			   mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
-			   mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
-			   mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
-			   mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
-			   mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
-			   mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
-			   mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
+			   mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+			   mfbcb += 3.0 * (0.5 * forcingTerm[DIR_0P0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+			   mfbbc += 3.0 * (0.5 * forcingTerm[DIR_00P]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+			   mfccb += 3.0 * (0.5 * forcingTerm[DIR_PP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+			   mfacb += 3.0 * (0.5 * forcingTerm[DIR_MP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+			   mfcbc += 3.0 * (0.5 * forcingTerm[DIR_P0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+			   mfabc += 3.0 * (0.5 * forcingTerm[DIR_M0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+			   mfbcc += 3.0 * (0.5 * forcingTerm[DIR_0PP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+			   mfbac += 3.0 * (0.5 * forcingTerm[DIR_0MP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+			   mfccc += 3.0 * (0.5 * forcingTerm[DIR_PPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+			   mfacc += 3.0 * (0.5 * forcingTerm[DIR_MPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+			   mfcac += 3.0 * (0.5 * forcingTerm[DIR_PMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+			   mfaac += 3.0 * (0.5 * forcingTerm[DIR_MMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+			   mfabb += 3.0 * (0.5 * forcingTerm[DIR_M00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+			   mfbab += 3.0 * (0.5 * forcingTerm[DIR_0M0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+			   mfbba += 3.0 * (0.5 * forcingTerm[DIR_00M]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+			   mfaab += 3.0 * (0.5 * forcingTerm[DIR_MM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+			   mfcab += 3.0 * (0.5 * forcingTerm[DIR_PM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+			   mfaba += 3.0 * (0.5 * forcingTerm[DIR_M0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+			   mfcba += 3.0 * (0.5 * forcingTerm[DIR_P0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+			   mfbaa += 3.0 * (0.5 * forcingTerm[DIR_0MM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+			   mfbca += 3.0 * (0.5 * forcingTerm[DIR_0PM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+			   mfaaa += 3.0 * (0.5 * forcingTerm[DIR_MMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+			   mfcaa += 3.0 * (0.5 * forcingTerm[DIR_PMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+			   mfaca += 3.0 * (0.5 * forcingTerm[DIR_MPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+			   mfcca += 3.0 * (0.5 * forcingTerm[DIR_PPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+			   mfbbb += 3.0 * (0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
 
 
 
@@ -1370,7 +1740,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 //
 //                        //--------------------------------------------------------
 //
-//                        mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[E]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+//                        mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
 //                        mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
 //                        mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
 //                        mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
@@ -2078,7 +2448,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 //                        }
 //#endif
 //
-//                        mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[E];
+//                        mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00];
 //                        mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N];
 //                        mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T];
 //                        mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE];
@@ -2301,9 +2671,9 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 			   LBMReal Mccb = mfccb - mfaab * c1o9;
 
 			   // collision of 1st order moments
-			   cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale;
-			   cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale;
-			   cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale;
+			   cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+			   cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+			   cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
 
 			   //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx;
 			   //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy;
@@ -2453,7 +2823,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
                         ///////////////////   PHASE-FIELD BGK SOLVER ///////////////////////////////
 //using namespace D3Q27System;
 
-      //                  h[E]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+      //                  h[DIR_P00]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
       //                  h[N]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
       //                  h[T]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
       //                  h[NE]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
@@ -2542,7 +2912,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
                     }
                 }
             }
-        }
+        
         dataSet->setPhaseField(divU);
 		}
 }
@@ -2551,9 +2921,9 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step)
 LBMReal MultiphaseScratchCumulantLBMKernel::gradX1_phi()
 {
     using namespace D3Q27System;
-	return 3.0* ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) + (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) + (phi[BNE] - phi[TSW])))
-		+ WEIGTH[NE] * (((phi[TE] - phi[BW]) + (phi[BE] - phi[TW])) + ((phi[SE] - phi[NW]) + (phi[NE] - phi[SW])))) +
-		+WEIGTH[N] * (phi[E] - phi[W]));
+	return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00]));
     //LBMReal sum = 0.0;
     //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
     //    sum += WEIGTH[k] * DX1[k] * phi[k];
@@ -2564,9 +2934,9 @@ LBMReal MultiphaseScratchCumulantLBMKernel::gradX1_phi()
 LBMReal MultiphaseScratchCumulantLBMKernel::gradX2_phi()
 {
     using namespace D3Q27System;
-	return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[BNE] - phi[TSW])- (phi[TSE] - phi[BNW])))
-		+ WEIGTH[NE] * (((phi[TN] - phi[BS]) + (phi[BN] - phi[TS])) + ((phi[NE] - phi[SW])- (phi[SE] - phi[NW])))) +
-		+WEIGTH[N] * (phi[N] - phi[S]));
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0]));
     //LBMReal sum = 0.0;
     //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
     //    sum += WEIGTH[k] * DX2[k] * phi[k];
@@ -2577,9 +2947,9 @@ LBMReal MultiphaseScratchCumulantLBMKernel::gradX2_phi()
 LBMReal MultiphaseScratchCumulantLBMKernel::gradX3_phi()
 {
     using namespace D3Q27System;
-	return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) - (phi[BNE] - phi[TSW])))
-		+ WEIGTH[NE] * (((phi[TE] - phi[BW]) - (phi[BE] - phi[TW])) + ((phi[TS] - phi[BN]) + (phi[TN] - phi[BS])))) +
-		+WEIGTH[N] * (phi[T] - phi[B]));
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M]));
     //LBMReal sum = 0.0;
     //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
     //    sum += WEIGTH[k] * DX3[k] * phi[k];
@@ -2591,17 +2961,17 @@ LBMReal MultiphaseScratchCumulantLBMKernel::nabla2_phi()
 {
     using namespace D3Q27System;
     LBMReal sum = 0.0;
-	sum += WEIGTH[TNE] * ((((phi[TNE] - phi[REST]) + (phi[BSW] - phi[REST])) + ((phi[TSW] - phi[REST]) + (phi[BNE] - phi[REST])))
-		+ (((phi[TNW] - phi[REST]) + (phi[BSE] - phi[REST])) + ((phi[TSE] - phi[REST]) + (phi[BNW] - phi[REST]))));
-	sum += WEIGTH[TN] * (
-			(((phi[TN] - phi[REST]) + (phi[BS] - phi[REST])) + ((phi[TS] - phi[REST]) + (phi[BN] - phi[REST])))
-		+	(((phi[TE] - phi[REST]) + (phi[BW] - phi[REST])) + ((phi[TW] - phi[REST]) + (phi[BE] - phi[REST])))
-		+	(((phi[NE] - phi[REST]) + (phi[SW] - phi[REST])) + ((phi[NW] - phi[REST]) + (phi[SE] - phi[REST])))
+	sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000])))
+		+ (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000]))));
+	sum += WEIGTH[DIR_0PP] * (
+			(((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000])))
+		+	(((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000])))
+		+	(((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000])))
 		);
-	sum += WEIGTH[T] * (
-			((phi[T] - phi[REST]) + (phi[B] - phi[REST]))
-		+	((phi[N] - phi[REST]) + (phi[S] - phi[REST]))
-		+	((phi[E] - phi[REST]) + (phi[W] - phi[REST]))
+	sum += WEIGTH[DIR_00P] * (
+			((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000]))
+		+	((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000]))
+		+	((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000]))
 		);
     //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
     //    sum += WEIGTH[k] * (phi[k] - phi[REST]);
@@ -2631,35 +3001,35 @@ void MultiphaseScratchCumulantLBMKernel::computePhasefield()
                     int x2p = x2 + 1;
                     int x3p = x3 + 1;
 
-                    h[E]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
-                    h[N]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
-                    h[T]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
-                    h[NE]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
-                    h[NW]  = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
-                    h[TE]  = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
-                    h[TW]  = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
-                    h[TN]  = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
-                    h[TS]  = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
-                    h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
-                    h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
-                    h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
-                    h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
-
-                    h[W]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
-                    h[S]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
-                    h[B]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
-                    h[SW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
-                    h[SE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
-                    h[BW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
-                    h[BE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
-                    h[BS]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
-                    h[BN]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
-                    h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-                    h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
-                    h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
-                    h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
-
-                    h[REST] = (*this->zeroDistributionsH)(x1, x2, x3);
+                    h[DIR_P00]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+                    h[DIR_0P0]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
+                    h[DIR_00P]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
+                    h[DIR_PP0]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
+                    h[DIR_MP0]  = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
+                    h[DIR_P0P]  = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
+                    h[DIR_M0P]  = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
+                    h[DIR_0PP]  = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
+                    h[DIR_0MP]  = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
+                    h[DIR_PPP] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
+                    h[DIR_MPP] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
+                    h[DIR_PMP] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
+                    h[DIR_MMP] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+                    h[DIR_M00]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
+                    h[DIR_0M0]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
+                    h[DIR_00M]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
+                    h[DIR_MM0]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
+                    h[DIR_PM0]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
+                    h[DIR_M0M]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
+                    h[DIR_P0M]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
+                    h[DIR_0MM]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
+                    h[DIR_0PM]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
+                    h[DIR_MMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                    h[DIR_PMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                    h[DIR_MPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                    h[DIR_PPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                    h[DIR_000] = (*this->zeroDistributionsH)(x1, x2, x3);
                 }
             }
         }
@@ -2673,7 +3043,7 @@ void MultiphaseScratchCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal, Indexe
 
     SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
 
-    phi[REST] = (*ph)(x1, x2, x3);
+    phi[DIR_000] = (*ph)(x1, x2, x3);
 
     for (int k = FSTARTDIR; k <= FENDDIR; k++) {
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0d84520603d6c3a149efa30f298832e97fa623eb
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
@@ -0,0 +1,3024 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
+//! \ingroup LBMKernel
+//! \author M. Geier, K. Kutscher, Hesameddin Safari
+//=======================================================================================
+
+#include "MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h"
+#include "BCArray3D.h"
+#include "Block3D.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "D3Q27System.h"
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+#include <cmath>
+#include <iostream>
+#include <string>
+
+#define PROOF_CORRECTNESS
+
+//////////////////////////////////////////////////////////////////////////
+MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::MultiphaseSimpleVelocityBaseExternalPressureLBMKernel() { this->compressible = false; }
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initDataSet()
+{
+	SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9));
+	SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field
+	SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9));
+	SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D(            nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new  CbArray3D<LBMReal, IndexerX3X2X1>(    nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	p1Old = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	dataSet->setFdistributions(f);
+	dataSet->setHdistributions(h); // For phase-field
+	dataSet->setH2distributions(h2);
+	dataSet->setPhaseField(divU1);
+	dataSet->setPressureField(pressure);
+
+	phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0));
+	phaseFieldOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 999.0));
+
+	divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::clone()
+{
+	SPtr<LBMKernel> kernel(new MultiphaseSimpleVelocityBaseExternalPressureLBMKernel());
+	kernel->setNX(nx);
+	dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initDataSet();
+	kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG);
+	kernel->setDensityRatio(this->densityRatio);
+	kernel->setMultiphaseModelParameters(this->beta, this->kappa);
+	kernel->setContactAngle(this->contactAngle);
+	kernel->setPhiL(this->phiL);
+	kernel->setPhiH(this->phiH);
+	kernel->setPhaseFieldRelaxation(this->tauH);
+	kernel->setMobility(this->mob);
+	kernel->setInterfaceWidth(this->interfaceWidth);
+
+	kernel->setBCProcessor(bcProcessor->clone(kernel));
+	kernel->setWithForcing(withForcing);
+	kernel->setForcingX1(muForcingX1);
+	kernel->setForcingX2(muForcingX2);
+	kernel->setForcingX3(muForcingX3);
+	kernel->setIndex(ix1, ix2, ix3);
+	kernel->setDeltaT(deltaT);
+	kernel->setGhostLayerWidth(2);
+	dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initForcing();
+
+	return kernel;
+}
+//////////////////////////////////////////////////////////////////////////
+void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+	LBMReal m2 = mfa + mfc;
+	LBMReal m1 = mfc - mfa;
+	LBMReal m0 = m2 + mfb;
+	mfa = m0;
+	m0 *= Kinverse;
+	m0 += oneMinusRho;
+	mfb = (m1 * Kinverse - m0 * vv) * K;
+	mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+	LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K;
+	LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K;
+	mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K;
+	mfa = m0;
+	mfb = m1;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+	LBMReal m1 = (mfa + mfc) + mfb;
+	LBMReal m2 = mfc - mfa;
+	mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2);
+	mfb = m2 - vv * m1;
+	mfa = m1;
+}
+
+
+void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+	LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2);
+	LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv;
+	mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2);
+	mfb = mb;
+	mfa = ma;
+}
+
+
+void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::calculate(int step)
+{
+	using namespace D3Q27System;
+	using namespace UbMath;
+
+	forcingX1 = 0.0;
+	forcingX2 = 0.0;
+	forcingX3 = 0.0;
+
+	LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5;
+														 /////////////////////////////////////
+
+	localDistributionsF    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+	zeroDistributionsF     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+
+	localDistributionsH1    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions();
+	nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
+	zeroDistributionsH1     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
+
+	localDistributionsH2    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getLocalDistributions();
+	nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions();
+	zeroDistributionsH2     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions();
+
+
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	const int bcArrayMaxX1 = (int)bcArray->getNX1();
+	const int bcArrayMaxX2 = (int)bcArray->getNX2();
+	const int bcArrayMaxX3 = (int)bcArray->getNX3();
+
+	int minX1 = ghostLayerWidth;
+	int minX2 = ghostLayerWidth;
+	int minX3 = ghostLayerWidth;
+	int maxX1 = bcArrayMaxX1 - ghostLayerWidth;
+	int maxX2 = bcArrayMaxX2 - ghostLayerWidth;
+	int maxX3 = bcArrayMaxX3 - ghostLayerWidth;
+	LBMReal omegaDRho = 1.0;// 1.25;// 1.3;
+
+	for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) {
+		for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) {
+			for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) {
+				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+					int x1p = x1 + 1;
+					int x2p = x2 + 1;
+					int x3p = x3 + 1;
+
+					LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+					LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+					LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+					LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+					LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+					LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+					LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+					LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+					LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+					LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+					LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+					LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+					LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+					LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+					LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+					LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+					LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+					LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+					LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+					LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+					LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+					LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+					(*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca)  + (mfcaa + mfacc))  ) +
+						(((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) +
+							((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) +
+								(mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb;
+					if ((*phaseField)(x1, x2, x3) > 1 ) {
+						(*phaseField)(x1, x2, x3) = c1;
+					}
+
+					if ((*phaseField)(x1, x2, x3) < 0) {
+						(*phaseField)(x1, x2, x3) = 0;
+					}
+					////// read F-distributions for velocity formalism
+
+					mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+					mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+					mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+					mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+					mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+					mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+					mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+					mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+					mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+					mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+					mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+					mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+					mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+					mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+					mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+					mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+					mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+					mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+					mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+					mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+					mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+					mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+					//LBMReal rhoH = 1.0;
+					//LBMReal rhoL = 1.0 / densityRatio;
+
+					LBMReal rhoH = 1.0*densityRatio;
+					LBMReal rhoL = 1.0;
+
+					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+					LBMReal drho = (((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))   )
+						+ (((mfaab + mfccb) + (mfacb + mfcab) ) + ((mfaba + mfcbc) + (mfabc + mfcba) ) + ((mfbaa + mfbcc) + (mfbac + mfbca) )))
+						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+				
+					omegaDRho = 2.0;// 1.5;
+					drho *= omegaDRho;
+					LBMReal keepDrho = drho;
+					drho = ((*p1Old)(x1, x2, x3) + drho) * c1o2;
+				//	drho = ((*p1Old)(x1, x2, x3)*c2o3 + drho*c1o3) ;
+					(*p1Old)(x1, x2, x3) = keepDrho;
+					
+					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); //Incompressible
+///Density correction
+					//LBMReal dX1_phi = gradX1_phi();
+					//LBMReal dX2_phi = gradX2_phi();
+					//LBMReal dX3_phi = gradX3_phi();
+					//LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+					//	(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+					//	(mfcbb - mfabb)) ;
+					//LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+					//	(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+					//	(mfbcb - mfbab)) ;
+					//LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+					//	(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+					//	(mfbbc - mfbba)) ;
+					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressure)(x1, x2, x3); //explicit Compressible
+					//(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho-(rhoH-rhoL)*(vvx*dX1_phi+vvy*dX2_phi+vvz*dX3_phi)*c1o3)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho);
+					
+					//(*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) - c1o3 * drho * ((*phaseField)(x1, x2, x3) * (rhoH - rhoL) + rhoL)) / (c1 - ((*phaseField)(x1, x2, x3) - c1) * drho);
+					//LBMReal rho=rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3);
+					//LBMReal tempDrho = drho;
+					//drho = (drho*0.9 + (*pressureOld)(x1, x2, x3)*0.1) ;
+					//(*pressureOld)(x1, x2, x3) = tempDrho;
+
+					//Mathematica
+
+					//LBMReal rho = ((*pressure)(x1, x2, x3) - (*phaseField)(x1, x2, x3) * (*pressure)(x1, x2, x3) + c1o3 * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (c1o3 + c1o3 * drho * (-1 + (*phaseField)(x1, x2, x3)));
+					(*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) + c1o3 * drho * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (1 + drho * (-1 + (*phaseField)(x1, x2, x3)));
+/////Full Filter
+					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH)+(one- (*phaseField)(x1, x2, x3))*three* (*pressure)(x1, x2, x3); //explicit Compressible
+					//(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho);
+//// reduced Filter
+					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3); //explicit Compressible
+					//(*pressure)(x1, x2, x3) = (((*pressureOld)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho);
+
+					//rho = (rho)/(one- (one - (*phaseField)(x1, x2, x3)) * drho); // now implicit Compressible
+					
+					//(*pressure)(x1, x2, x3) = (((*phaseField)(x1, x2, x3)) + ((*phaseField2)(x1, x2, x3)) - c1) * c1o3;
+					////!!!!!! relplace by pointer swap!
+					//(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3);
+				}
+			}
+		}
+	}
+
+	LBMReal collFactorM;
+
+	////Periodic Filter
+	//for (int x3 = minX3-1; x3 <= maxX3; x3++) {
+	//	for (int x2 = minX2-1; x2 <= maxX2; x2++) {
+	//		for (int x1 = minX1-1; x1 <= maxX1; x1++) {
+	//			if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+
+	//				LBMReal sum = 0.;
+
+	//				///Version for boundaries
+	//				for (int xx = -1; xx <= 1; xx++) {
+	//					//int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0;
+	//					int xxx = xx + x1;
+
+	//					for (int yy = -1; yy <= 1; yy++) {
+	//						//int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0;
+	//						int yyy = yy + x2;
+
+	//						for (int zz = -1; zz <= 1; zz++) {
+	//							//int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0;
+	//							int zzz = zz + x3;
+
+	//							if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) {
+	//								sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz);
+	//							}
+	//							else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3);
+	//							}
+
+
+	//						}
+	//					}
+	//				}
+	//				(*pressure)(x1, x2, x3) = sum;
+	//			}
+	//		}
+	//	}
+	//}
+
+	////!filter
+
+	for (int x3 = minX3; x3 < maxX3; x3++) {
+		for (int x2 = minX2; x2 < maxX2; x2++) {
+			for (int x1 = minX1; x1 < maxX1; x1++) {
+				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+					int x1p = x1 + 1;
+					int x2p = x2 + 1;
+					int x3p = x3 + 1;
+
+					//////////////////////////////////////////////////////////////////////////
+					// Read distributions and phase field
+					////////////////////////////////////////////////////////////////////////////
+					//////////////////////////////////////////////////////////////////////////
+
+					// E   N  T
+					// c   c  c
+					//////////
+					// W   S  B
+					// a   a  a
+
+					// Rest ist b
+
+					// mfxyz
+					// a - negative
+					// b - null
+					// c - positive
+
+					// a b c
+					//-1 0 1
+
+					findNeighbors(phaseField, x1, x2, x3);
+
+					LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+					LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+					LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+					LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+					LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+					LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+					LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+					LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+					LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+					LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+					LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+					LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+					LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+					LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+					LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+					LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+					LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+					LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+					LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+					LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+					LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+					LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+
+					LBMReal mfhcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3);
+					LBMReal mfhbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3);
+					LBMReal mfhbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3);
+					LBMReal mfhccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3);
+					LBMReal mfhacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3);
+					LBMReal mfhcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3);
+					LBMReal mfhabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3);
+					LBMReal mfhbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3);
+					LBMReal mfhbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3);
+					LBMReal mfhccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3);
+					LBMReal mfhacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3);
+					LBMReal mfhcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3);
+					LBMReal mfhaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3);
+					LBMReal mfhabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3);
+					LBMReal mfhbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3);
+					LBMReal mfhbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p);
+					LBMReal mfhaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3);
+					LBMReal mfhcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3);
+					LBMReal mfhaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p);
+					LBMReal mfhcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p);
+					LBMReal mfhbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p);
+					LBMReal mfhbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p);
+					LBMReal mfhaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					LBMReal mfhcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					LBMReal mfhaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					LBMReal mfhcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					LBMReal mfhbbb = (*this->zeroDistributionsH2)(x1, x2, x3);
+
+					//LBMReal rhoH = 1.0;
+					//LBMReal rhoL = 1.0 / densityRatio;
+
+					LBMReal rhoH = 1.0;
+					LBMReal rhoL = 1.0/ densityRatio;
+
+					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+					LBMReal dX1_phi = gradX1_phi();
+					LBMReal dX2_phi = gradX2_phi();
+					LBMReal dX3_phi = gradX3_phi();
+
+					LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9+1e-3;
+					// 01.09.2022: unclear what value we have to add to the normal: lager values better cut of in gas phase?
+					LBMReal normX1 = dX1_phi / denom;
+					LBMReal normX2 = dX2_phi / denom;
+					LBMReal normX3 = dX3_phi / denom;
+
+
+
+					collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL);
+
+
+					LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi();
+
+					//----------- Calculating Macroscopic Values -------------
+					LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); //Incompressible
+
+																		///scaled phase field
+					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) / ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) + (c1 - (*phaseField)(x1, x2, x3)) * (c1 - (*phaseField)(x1, x2, x3))) - phiH);
+					///!scaled phase field
+					
+					//LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH)+(one-phi[DIR_000])* (*pressure)(x1, x2, x3)*three; //compressible
+					//LBMReal rho = rhoL + (rhoH - rhoL) * phi[DIR_000] + (one - phi[DIR_000]) * (*pressure)(x1, x2, x3) * three; //compressible
+
+					LBMReal m0, m1, m2;
+					LBMReal rhoRef=c1;
+
+					LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+						(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+						(mfcbb - mfabb))/rhoRef;
+					LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+						(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+						(mfbcb - mfbab))/rhoRef;
+					LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+						(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+						(mfbbc - mfbba))/rhoRef;
+					////Filter&Gradient merged
+					LBMReal pressureHere = (*pressureOld)(x1, x2, x3);
+					//LBMReal pressureHere = (*pressure)(x1, x2, x3);
+
+					LBMReal arrayP[3][3][3] = { {{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}},
+												{{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}},
+												{ {pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}} };
+					//LBMReal LaplaceP = 0.0;
+					//LaplaceP += WEIGTH[DIR_PPP] * (((((*pressureOld)(x1+1,x2+1,x3+1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 + 1) - pressureHere)))
+					//	+ ((((*pressureOld)(x1 + 1, x2 - 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 + 1) - pressureHere))));
+					//LaplaceP += WEIGTH[DIR_0PP] * (
+					//	((((*pressureOld)(x1 + 1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3) - pressureHere)))
+					//	+ ((((*pressureOld)(x1 + 1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 -1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 + 1) - pressureHere)))
+					//	+ ((((*pressureOld)(x1, x2 + 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 + 1) - pressureHere)))
+					//	);
+					//LaplaceP += WEIGTH[DIR_00P] * (
+					//	(((*pressureOld)(x1 + 1, x2, x3) - pressureHere) + ((*pressureOld)(x1, x2-1, x3) - pressureHere))
+					//	+ (((*pressureOld)(x1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3) - pressureHere))
+					//	+ (((*pressureOld)(x1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2, x3 - 1) - pressureHere))
+					//	);
+
+					//LaplaceP= 6.0 * LaplaceP;
+					
+					//LBMReal sum = 0.0;
+
+					for (int dir1 = -1; dir1 <= 1; dir1++) {
+						for (int dir2 = -1; dir2 <= 1; dir2++) {
+							for (int dir3 = -1; dir3 <= 1; dir3++){
+								int xxx = x1 + dir1;
+								int yyy = x2 + dir2;
+								int zzz = x3 + dir3;
+								if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressureOld)(xxx, yyy, zzz);
+								//if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressure)(xxx, yyy, zzz);
+							//	sum += 64.0 / (216.0 * (c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)) * (c1 + c3 * abs(dir3))) * arrayP[dir1 + 1][dir2 + 1][dir3 + 1];
+							}
+						}
+					}
+//					(*pressure)(x1, x2, x3) = sum;// *0.1 + (1.0 - 0.1) * (*pressureOld)(x1, x2, x3);
+
+
+					(*pressure)(x1, x2, x3) = (((((arrayP[0][0][0] + arrayP[2][2][2]) + (arrayP[0][2][0] + arrayP[2][0][2])) + ((arrayP[2][0][0] + arrayP[0][2][2]) + (arrayP[2][2][0] + arrayP[0][0][2]))) * c1o216
+						+ (((arrayP[0][0][1] + arrayP[2][2][1]) + (arrayP[0][1][0] + arrayP[2][1][2])) + ((arrayP[1][0][0] + arrayP[1][2][2]) + (arrayP[0][1][2] + arrayP[2][1][0])) + ((arrayP[1][0][2] + arrayP[1][2][0]) + (arrayP[0][2][1] + arrayP[2][0][1]))) * c1o54)
+						+ ((arrayP[0][1][1] + arrayP[2][1][1]) + (arrayP[1][0][1] + arrayP[1][2][1]) + (arrayP[1][1][0] + arrayP[1][1][2])) * c2o27)
+						+ arrayP[1][1][1] * c8o27;
+					//LBMReal gradPx = 0.0;
+					//LBMReal gradPy = 0.0;
+					//LBMReal gradPz = 0.0;
+					//for (int dir1 = -1; dir1 <= 1; dir1++) {
+					//	for (int dir2 = -1; dir2 <= 1; dir2++) {
+					//		gradPx -= arrayP[0][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		gradPx += arrayP[2][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+
+
+
+					//		gradPy -= arrayP[dir1+1][0][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		gradPy += arrayP[dir1+1][2][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		
+
+					//		gradPz -= arrayP[dir1+1][dir2+1][0] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		gradPz += arrayP[dir1+1][dir2+1][2] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//	}
+					//}
+
+					//LBMReal gradPx = ((((arrayP[2][0][0] - arrayP[0][2][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72
+					//	+ (((arrayP[2][1][0] - arrayP[0][1][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[2][0][1] - arrayP[0][2][1]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18)
+					//	+ (arrayP[2][1][1] - arrayP[0][1][1]) * c2o9;
+					//LBMReal gradPy = ((((arrayP[0][2][0] - arrayP[2][0][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[0][2][2] - arrayP[2][0][0]))) * c1o72
+					//	+ (((arrayP[1][2][0] - arrayP[1][0][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[0][2][1] - arrayP[2][0][1]) + (arrayP[1][2][2] - arrayP[1][0][0]))) * c1o18)
+					//	+ (arrayP[1][2][1] - arrayP[1][0][1]) * c2o9;
+					//LBMReal gradPz = ((((arrayP[0][0][2] - arrayP[2][2][0]) + (arrayP[0][2][2] - arrayP[2][0][0])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72
+					//	+ (((arrayP[0][1][2] - arrayP[2][1][0]) + (arrayP[1][2][2] - arrayP[1][0][0])) + ((arrayP[1][0][2] - arrayP[1][2][0]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18)
+					//	+ (arrayP[1][1][2] - arrayP[1][1][0]) * c2o9;
+
+					//gradPx *=c1 - (*pressure)(x1, x2, x3)+pressureHere;
+					//gradPy *=c1 - (*pressure)(x1, x2, x3) + pressureHere;
+					//gradPz *=c1 - (*pressure)(x1, x2, x3) + pressureHere;
+
+					////!Filter&Gradient merged
+					//LBMReal gradPx = 0.0;
+					//LBMReal gradPy = 0.0;
+					//LBMReal gradPz = 0.0;
+					//for (int dir1 = -1; dir1 <= 1; dir1++) {
+					//	for (int dir2 = -1; dir2 <= 1; dir2++) {
+					//		int yyy = x2 + dir1;
+					//		int zzz = x3 + dir2;
+					//		if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) {
+					//			gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+					//		else {
+					//			gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+					//		if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) {
+					//			gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+					//		else {
+					//			gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+
+					//		int xxx = x1 + dir1;
+					//		if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) {
+					//			gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+					//		else {
+					//			gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+					//		if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) {
+					//			gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+					//		else {
+					//			gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+
+					//		yyy = x2 + dir2;
+					//		if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) {
+					//			gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+					//		else {
+					//			gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+					//		if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) {
+					//			gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+					//		else {
+					//			gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					//		}
+
+					//	}
+					//}
+
+					//Viscosity increase by phase field residuum
+					//LBMReal errPhi = (((1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale)- denom);
+					//LBMReal limVis = 0.01;// 0.0000001 * 10;//0.01;
+					// collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM);
+					// collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM;
+					//errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi;
+					//collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis);
+
+					//3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP])))
+					//+WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) +
+					//+WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M]));
+
+					muRho = rho;
+
+					////external pressure
+					//forcingX1 =/* muForcingX1.Eval()/rho */- gradPx/rho;
+					//forcingX2 =/* muForcingX2.Eval()/rho */- gradPy/rho;
+					//forcingX3 =/* muForcingX3.Eval()/rho */- gradPz/rho;
+
+					///////////////////////////////////////////////
+
+					//LBMReal pBefore = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+					//	+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+					//	+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
+					//pBefore = -c1o3 * (-1.0e-10)/((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) );
+					////if (vvx * vvx + vvy * vvy + vvz * vvz > 1.0e-100) {
+					//	mfabb -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_P00] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfbab -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0P0] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfbba -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_00P] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfaab -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PP0] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfcab -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MP0] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfaba -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_P0P] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfcba -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_M0P] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfbaa -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0PP] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfbca -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0MP] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfaaa -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PPP] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfcaa -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MPP] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfaca -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PMP] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfcca -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MMP] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfcbb -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_M00] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfbcb -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0M0] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfbbc -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_00M] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfccb -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MM0] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfacb -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PM0] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfcbc -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_M0M] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfabc -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_P0M] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfbcc -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0MM] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfbac -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0PM] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfccc -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MMM] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfacc -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PMM] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfcac -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MPM] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfaac -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PPM] * (rhoH - rhoL) / (phiH - phiL)));
+					//	mfbbb -= pBefore * 8.0 / 9.0;
+					//}
+
+					///////////////////////////////////////////////
+
+					LBMReal pStarStart = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
+
+					/////////////////////
+					//LBMReal vvxh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) +
+					//	(((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) +
+					//	(mfhcbb - mfhabb)) / rhoRef;
+					//LBMReal vvyh = ((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) +
+					//	(((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) +
+					//	(mfhbcb - mfhbab)) / rhoRef;
+					//LBMReal vvzh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) +
+					//	(((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) +
+					//	(mfhbbc - mfhbba)) / rhoRef;
+
+					//LBMReal deltaPP = 0*(vvxh * dX1_phi + vvyh * dX2_phi + vvzh * dX3_phi) * rhoToPhi / (rho);
+					//mfhbcb += c1o6* c2o9  * deltaPP;
+					//mfhbbc += c1o6* c2o9  * deltaPP;
+					//mfhcbb += c1o6* c2o9  * deltaPP;
+					//mfhccb += c1o6* c1o18 * deltaPP;
+					//mfhacb += c1o6* c1o18 * deltaPP;
+					//mfhcbc += c1o6* c1o18 * deltaPP;
+					//mfhabc += c1o6* c1o18 * deltaPP;
+					//mfhbcc += c1o6* c1o18 * deltaPP;
+					//mfhbac += c1o6* c1o18 * deltaPP;
+					//mfhccc += c1o6* c1o72 * deltaPP;
+					//mfhacc += c1o6* c1o72 * deltaPP;
+					//mfhcac += c1o6* c1o72 * deltaPP;
+					//mfhaac += c1o6* c1o72 * deltaPP;
+					//mfhabb += c1o6* c2o9  * deltaPP;
+					//mfhbab += c1o6* c2o9  * deltaPP;
+					//mfhbba += c1o6* c2o9  * deltaPP;
+					//mfhaab += c1o6* c1o18 * deltaPP;
+					//mfhcab += c1o6* c1o18 * deltaPP;
+					//mfhaba += c1o6* c1o18 * deltaPP;
+					//mfhcba += c1o6* c1o18 * deltaPP;
+					//mfhbaa += c1o6* c1o18 * deltaPP;
+					//mfhbca += c1o6* c1o18 * deltaPP;
+					//mfhaaa += c1o6* c1o72 * deltaPP;
+					//mfhcaa += c1o6* c1o72 * deltaPP;
+					//mfhaca += c1o6* c1o72 * deltaPP;
+					//mfhcca += c1o6* c1o72 * deltaPP;
+					//mfhbbb += c1o6* c4 * c2o9 * deltaPP;
+
+					//////////////////////
+
+					/////Recovering the origin distributions
+					//LBMReal mfStartcbb = mfcbb ;
+					//LBMReal mfStartbcb = mfbcb ;
+					//LBMReal mfStartbbc = mfbbc ;
+					//LBMReal mfStartccb = mfccb ;
+					//LBMReal mfStartacb = mfacb ;
+					//LBMReal mfStartcbc = mfcbc ;
+					//LBMReal mfStartabc = mfabc ;
+					//LBMReal mfStartbcc = mfbcc ;
+					//LBMReal mfStartbac = mfbac ;
+					//LBMReal mfStartccc = mfccc ;
+					//LBMReal mfStartacc = mfacc ;
+					//LBMReal mfStartcac = mfcac ;
+					//LBMReal mfStartaac = mfaac ;
+					//LBMReal mfStartabb = mfabb ;
+					//LBMReal mfStartbab = mfbab ;
+					//LBMReal mfStartbba = mfbba ;
+					//LBMReal mfStartaab = mfaab ;
+					//LBMReal mfStartcab = mfcab ;
+					//LBMReal mfStartaba = mfaba ;
+					//LBMReal mfStartcba = mfcba ;
+					//LBMReal mfStartbaa = mfbaa ;
+					//LBMReal mfStartbca = mfbca ;
+					//LBMReal mfStartaaa = mfaaa ;
+					//LBMReal mfStartcaa = mfcaa ;
+					//LBMReal mfStartaca = mfaca ;
+					//LBMReal mfStartcca = mfcca ;
+					//LBMReal mfStartbbb = mfbbb ;
+
+
+						mfcbb += mfhcbb /rho;
+						mfbcb += mfhbcb /rho;
+						mfbbc += mfhbbc /rho;
+						mfccb += mfhccb /rho;
+						mfacb += mfhacb /rho;
+						mfcbc += mfhcbc /rho;
+						mfabc += mfhabc /rho;
+						mfbcc += mfhbcc /rho;
+						mfbac += mfhbac /rho;
+						mfccc += mfhccc /rho;
+						mfacc += mfhacc /rho;
+						mfcac += mfhcac /rho;
+						mfaac += mfhaac /rho;
+						mfabb += mfhabb /rho;
+						mfbab += mfhbab /rho;
+						mfbba += mfhbba /rho;
+						mfaab += mfhaab /rho;
+						mfcab += mfhcab /rho;
+						mfaba += mfhaba /rho;
+						mfcba += mfhcba /rho;
+						mfbaa += mfhbaa /rho;
+						mfbca += mfhbca /rho;
+						mfaaa += mfhaaa /rho;
+						mfcaa += mfhcaa /rho;
+						mfaca += mfhaca /rho;
+						mfcca += mfhcca /rho;
+						mfbbb += mfhbbb /rho;
+
+
+
+					//Abbas
+					LBMReal pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
+					//22.09.22 not yet in balance, repaire here
+					//LBMReal ppStar = ((((((mfhaaa + mfhccc) + (mfhaac + mfhcca)) + ((mfhcac + mfhaca) + (mfhcaa + mfhacc)))*c3
+					//	+ (((mfhaab + mfhccb) + (mfhacb + mfhcab)) + ((mfhaba + mfhcbc) + (mfhabc + mfhcba)) + ((mfhbaa + mfhbcc) + (mfhbac + mfhbca))))*c2
+					//	+ ((mfhabb + mfhcbb) + (mfhbab + mfhbcb) + (mfhbba + mfhbbc))) ) * c1o3/rho;
+	
+					//ppStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) * c3
+					//	+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) * c2
+					//	+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc)))) * c1o3 ;
+
+					//(*phaseFieldOld)(x1, x2, x3) = ((*phaseFieldOld)(x1, x2, x3) > 99.0) ? phi[DIR_000] : (*phaseFieldOld)(x1, x2, x3);
+					//LBMReal dtPhi = phi[DIR_000] - (*phaseFieldOld)(x1, x2, x3);
+					//LBMReal deltaP = -pStar * (c1 - rho / (rho + c1o2 * rhoToPhi * dtPhi));// -pStar * pStar * pStar * 1.0e-4 * rho * rho * rho;
+					//LBMReal deltaP = pStar * (c1 - mfhbbb*rho) * c1o2;//Explicit
+					//LBMReal deltaP = pStar * (c1 - mfhbbb * rho) / (c1 + mfhbbb * rho);//Semi-Implicit
+					//(*phaseFieldOld)(x1, x2, x3) = phi[DIR_000];
+
+					//mfabb += c2o9 *deltaP;
+					//mfbab += c2o9 *deltaP;
+					//mfbba += c2o9 *deltaP;
+					//mfaab += c1o18*deltaP;
+					//mfcab += c1o18*deltaP;
+					//mfaba += c1o18*deltaP;
+					//mfcba += c1o18*deltaP;
+					//mfbaa += c1o18*deltaP;
+					//mfbca += c1o18*deltaP;
+					//mfaaa += c1o72*deltaP;
+					//mfcaa += c1o72*deltaP;
+					//mfaca += c1o72*deltaP;
+					//mfcca += c1o72*deltaP;
+					//mfcbb += c2o9 *deltaP;
+					//mfbcb += c2o9 *deltaP;
+					//mfbbc += c2o9 *deltaP;
+					//mfccb += c1o18*deltaP;
+					//mfacb += c1o18*deltaP;
+					//mfcbc += c1o18*deltaP;
+					//mfabc += c1o18*deltaP;
+					//mfbcc += c1o18*deltaP;
+					//mfbac += c1o18*deltaP;
+					//mfccc += c1o72*deltaP;
+					//mfacc += c1o72*deltaP;
+					//mfcac += c1o72*deltaP;
+					//mfaac += c1o72*deltaP;
+
+					//pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+					//	+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+					//	+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
+
+
+
+
+					//mfabb -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_P00])*rhoToPhi/rho;
+					//mfbab -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_0P0])*rhoToPhi/rho;
+					//mfbba -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_00P])*rhoToPhi/rho;
+					//mfaab -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_PP0])*rhoToPhi/rho;
+					//mfcab -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_MP0])*rhoToPhi/rho;
+					//mfaba -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_P0P])*rhoToPhi/rho;
+					//mfcba -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_M0P])*rhoToPhi/rho;
+					//mfbaa -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_0PP])*rhoToPhi/rho;
+					//mfbca -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_0MP])*rhoToPhi/rho;
+					//mfaaa -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_PPP])*rhoToPhi/rho;
+					//mfcaa -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_MPP])*rhoToPhi/rho;
+					//mfaca -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_PMP])*rhoToPhi/rho;
+					//mfcca -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_MMP])*rhoToPhi/rho;
+					//mfcbb -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_M00])*rhoToPhi/rho;
+					//mfbcb -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_0M0])*rhoToPhi/rho;
+					//mfbbc -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_00M])*rhoToPhi/rho;
+					//mfccb -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_MM0])*rhoToPhi/rho;
+					//mfacb -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_PM0])*rhoToPhi/rho;
+					//mfcbc -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_M0M])*rhoToPhi/rho;
+					//mfabc -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_P0M])*rhoToPhi/rho;
+					//mfbcc -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_0MM])*rhoToPhi/rho;
+					//mfbac -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_0PM])*rhoToPhi/rho;
+					//mfccc -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_MMM])*rhoToPhi/rho;
+					//mfacc -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_PMM])*rhoToPhi/rho;
+					//mfcac -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_MPM])*rhoToPhi/rho;
+					//mfaac -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_PPM])*rhoToPhi/rho;
+
+
+					//forcingX1 =/* muForcingX1.Eval() / rho*/ - pStar * dX1_phi * rhoToPhi / rho;
+					//forcingX2 =/* muForcingX2.Eval() / rho*/ - pStar * dX2_phi * rhoToPhi / rho;
+					//forcingX3 =/* muForcingX3.Eval() / rho*/ - pStar * dX3_phi * rhoToPhi / rho;
+
+
+					//mfabb += (-forcingX1) * c2o9;
+					//mfbab += (-forcingX2) * c2o9;
+					//mfbba += (-forcingX3) * c2o9;
+					//mfaab += (-forcingX1 - forcingX2) * c1o16;
+					//mfcab += (forcingX1 - forcingX2) * c1o16;
+					//mfaba += (-forcingX1 - forcingX3) * c1o16;
+					//mfcba += (forcingX1 - forcingX3) * c1o16;
+					//mfbaa += (-forcingX2 - forcingX3) * c1o16;
+					//mfbca += (forcingX2 - forcingX3) * c1o16;
+					//mfaaa += (-forcingX1 - forcingX2 - forcingX3) * c1o72;
+					//mfcaa += (forcingX1 - forcingX2 - forcingX3) * c1o72;
+					//mfaca += (-forcingX1 + forcingX2 - forcingX3) * c1o72;
+					//mfcca += (forcingX1 + forcingX2 - forcingX3) * c1o72;
+					//mfcbb += (forcingX1)*c2o9;
+					//mfbcb += (forcingX2)*c2o9;
+					//mfbbc += (forcingX3)*c2o9;
+					//mfccb += (forcingX1 + forcingX2) * c1o16;
+					//mfacb += (-forcingX1 + forcingX2) * c1o16;
+					//mfcbc += (forcingX1 + forcingX3) * c1o16;
+					//mfabc += (-forcingX1 + forcingX3) * c1o16;
+					//mfbcc += (forcingX2 + forcingX3) * c1o16;
+					//mfbac += (-forcingX2 + forcingX3) * c1o16;
+					//mfccc += (forcingX1 + forcingX2 + forcingX3) * c1o72;
+					//mfacc += (-forcingX1 + forcingX2 + forcingX3) * c1o72;
+					//mfcac += (forcingX1 - forcingX2 + forcingX3) * c1o72;
+					//mfaac += (-forcingX1 - forcingX2 + forcingX3) * c1o72;
+
+					//LBMReal saveForceX1 = forcingX1;
+					//LBMReal saveForceX2 = forcingX2;
+					//LBMReal saveForceX3 = forcingX3;
+
+					 vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+						(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+						(mfcbb - mfabb)) / rhoRef;
+					 vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+						(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+						(mfbcb - mfbab)) / rhoRef;
+					 vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+						(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+						(mfbbc - mfbba)) / rhoRef;
+
+
+					 //LBMReal dRhoInvX = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) +
+						// (((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) +
+						// (mfhcbb - mfhabb)));
+					 //LBMReal dRhoInvY = -(((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) +
+						// (((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) +
+						// (mfhbcb - mfhbab)));
+					 //LBMReal dRhoInvZ = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) +
+						// (((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) +
+						// (mfhbbc - mfhbba)));
+
+
+					 forcingX1 = 0.0;
+					 forcingX2 = 0.0;
+					 forcingX3 = 0.0;
+					//!Abbas
+					//LBMReal dX1_rhoInv = gradX1_rhoInv(rhoL, rhoH - rhoL);
+					//LBMReal dX2_rhoInv = gradX2_rhoInv(rhoL, rhoH - rhoL);
+					//LBMReal dX3_rhoInv = gradX3_rhoInv(rhoL, rhoH - rhoL);
+					//forcingX1 =/* muForcingX1.Eval() / rho*/ +pStar * dX1_rhoInv * rho;
+					//forcingX2 =/* muForcingX2.Eval() / rho*/ +pStar * dX2_rhoInv * rho;
+					//forcingX3 =/* muForcingX3.Eval() / rho*/ +pStar * dX3_rhoInv * rho;
+
+					//forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho + pStar * dX1_rhoInv * rho) *c1o2;
+					//forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho + pStar * dX2_rhoInv * rho) *c1o2;
+					//forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho + pStar * dX3_rhoInv * rho) *c1o2;
+					 //LBMReal FdX1_phi = normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale;
+					 //LBMReal FdX2_phi = normX2 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale;
+					 //LBMReal FdX3_phi = normX3 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale;
+
+
+					//forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho ) ;
+					//forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho ) ;
+					//forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho ) ;
+
+					//forcingX1 = (pStar * dRhoInvX* rho *c3) ;
+					//forcingX2 = (pStar * dRhoInvY* rho *c3) ;
+					//forcingX3 = (pStar * dRhoInvZ* rho *c3) ;
+					//if (phi[DIR_000] > 0.1 && phi[DIR_000] < 0.9) std::cout << phi[DIR_000] << " " << dX1_phi * rhoToPhi / rho << " " << dRhoInvX * rho *3<< std::endl;
+					//LBMReal forcingX1ALTERNAT = ( pStar * dX1_rhoInv * rho) ;
+					//LBMReal forcingX2ALTERNAT = ( pStar * dX2_rhoInv * rho) ;
+					//LBMReal forcingX3ALTERNAT = ( pStar * dX3_rhoInv * rho) ;
+
+					//forcingX1 = (fabs(vvx + c1o2 * forcingX1) < fabs(vvx + c1o2 * forcingX1ALTERNAT)) ? forcingX1 : forcingX1ALTERNAT;
+					//forcingX2 = (fabs(vvy + c1o2 * forcingX2) < fabs(vvy + c1o2 * forcingX2ALTERNAT)) ? forcingX2 : forcingX2ALTERNAT;
+					//forcingX3 = (fabs(vvz + c1o2 * forcingX3) < fabs(vvz + c1o2 * forcingX3ALTERNAT)) ? forcingX3 : forcingX3ALTERNAT;
+
+					//	 forcingX1 = -pStar * rhoToPhi / rho * normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale;
+					//	 forcingX2 = -pStar * rhoToPhi / rho * normX2 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale;
+					//	 forcingX3 = -pStar * rhoToPhi / rho * normX3 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale;
+
+					//forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho *(c1- phi[DIR_000]) + pStar * dX1_rhoInv * rho*(phi[DIR_000]));
+					//forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho *(c1- phi[DIR_000]) + pStar * dX2_rhoInv * rho*(phi[DIR_000]));
+					//forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho *(c1- phi[DIR_000]) + pStar * dX3_rhoInv * rho*(phi[DIR_000]));
+						 //if (phi[DIR_000] > 0.3 && phi[DIR_000] < 0.7)
+						 //{
+							// int test = 1;
+							// std::cout << phi[DIR_000] <<" "<< dX1_phi <<" "<< normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale<<" "<< normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale/ dX1_phi<< std::endl;
+						 //}
+
+
+
+					 //LBMReal scaleGrad = c2 * phi[DIR_000] * (1.0 - phi[DIR_000]) / ((phi[DIR_000] * phi[DIR_000] + (1.0 - phi[DIR_000]) * (1.0 - phi[DIR_000])) * (phi[DIR_000] * phi[DIR_000] + (1.0 - phi[DIR_000]) * (1.0 - phi[DIR_000])));
+					 //dX1_phi *= scaleGrad;
+					 //dX2_phi *= scaleGrad;
+					 //dX3_phi *= scaleGrad;
+
+					 ///Experimental interface sharpening force 20.06.2022
+
+					 //LBMReal scaleSharpener = 1.0;
+					 //forcingX1 += scaleSharpener * (FdX1_phi - dX1_phi) * fabsf(FdX1_phi - dX1_phi)  / rho;
+					 //forcingX2 += scaleSharpener * (FdX2_phi - dX2_phi) * fabsf(FdX2_phi - dX2_phi)  / rho;
+					 //forcingX3 += scaleSharpener * (FdX3_phi - dX3_phi) * fabsf(FdX3_phi - dX3_phi)  / rho;
+					///surface tension force
+					forcingX1 += mu * dX1_phi/rho;
+					forcingX2 += mu * dX2_phi/rho;
+					forcingX3 += mu * dX3_phi/rho;
+
+					//LBMReal forcingBIAS = 0.5;
+					forcingX1 += muForcingX1.Eval() / rho;//*phi[DIR_000];
+					forcingX2 += muForcingX2.Eval() / rho;// * phi[DIR_000];
+					forcingX3 += muForcingX3.Eval() / rho;// * phi[DIR_000];
+
+				//	//19.08.2022
+					//vvx += vvxh / rho * c1o2;
+					//vvy += vvyh / rho * c1o2;
+					//vvz += vvzh / rho * c1o2;
+				//	//
+
+
+					vvx += (forcingX1) * deltaT * c1o2;
+					vvy += (forcingX2) * deltaT * c1o2;
+					vvz += (forcingX3) * deltaT * c1o2;
+
+					//vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT *  c1o2; // X
+					//vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT *  c1o2; // Y
+					//vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT *  c1o2; // Z
+
+
+
+				//	vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT * forcingBIAS; // X
+				//	vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT * forcingBIAS; // Y
+				//	vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT * forcingBIAS; // Z
+
+
+
+					//Abbas
+					//LBMReal M200 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+					//	+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) ))
+					//	+ ((mfabb + mfcbb))) );
+					//LBMReal M020 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+					//	+ (((mfaab + mfccb) + (mfacb + mfcab))  + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+					//	+ ( (mfbab + mfbcb) )) );
+					//LBMReal M002 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+					//	+ ( + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+					//	+ ( (mfbba + mfbbc))));
+
+					//LBMReal M110 = ((((((mfaaa + mfccc) + (-mfcac - mfaca)) + ((mfaac + mfcca) + (-mfcaa -mfacc)))
+					//	+ (((mfaab + mfccb) + (-mfacb - mfcab))   ))
+					//	) );
+					//LBMReal M101 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ((mfcac + mfaca) - (mfcaa + mfacc)))
+					//	+ (((mfaba + mfcbc) + (-mfabc - mfcba))))
+					//	));
+					//LBMReal M011 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ( (mfcaa + mfacc)- (mfcac + mfaca)))
+					//	+ (((mfbaa + mfbcc) + (-mfbac - mfbca))))
+					//	));
+					LBMReal vvxI = vvx;
+					LBMReal vvyI = vvy;
+					LBMReal vvzI = vvz;
+
+					//LBMReal collFactorStore=collFactorM;
+					//LBMReal stress;
+					//for(int iter=0;iter<5;iter++)
+				 //{
+					//	LBMReal OxxPyyPzz = 1.0;
+					//	LBMReal mxxPyyPzz = (M200-vvxI*vvxI) + (M020-vvyI*vvyI) + (M002-vvzI*vvzI);
+					//	//pStar = mxxPyyPzz * c1o3;
+					//mxxPyyPzz -= c3 *pStar;
+
+					//LBMReal mxxMyy = (M200-vvxI*vvxI) - (M020-vvyI*vvyI);
+					//LBMReal mxxMzz = (M200-vvxI*vvxI) - (M002-vvzI*vvzI);
+					//LBMReal mxy = M110 - vvxI * vvyI;
+					//LBMReal mxz = M101 - vvxI * vvzI;
+					//LBMReal myz = M011 - vvyI * vvzI;
+
+
+					//mxxMyy *= c1 - collFactorM * c1o2;
+					//mxxMzz *= c1 - collFactorM * c1o2;
+					//mxy *= c1 - collFactorM * c1o2;
+					//mxz *= c1 - collFactorM * c1o2;
+					//myz *= c1 - collFactorM * c1o2;
+					//mxxPyyPzz *= c1 - OxxPyyPzz * c1o2;
+					////mxxPyyPzz = mxxPyyPzz*fabs(mxxPyyPzz)/(1.0e-6+fabs(mxxPyyPzz));
+					////mxxPyyPzz += c3 * pStar;
+					//LBMReal mxx = (mxxMyy + mxxMzz + mxxPyyPzz)*c1o3;
+					//LBMReal myy = (-c2*mxxMyy + mxxMzz + mxxPyyPzz)*c1o3;
+					//LBMReal mzz = (mxxMyy -c2* mxxMzz + mxxPyyPzz) * c1o3;
+					//vvxI = vvx - (mxx * dX1_phi + mxy * dX2_phi + mxz * dX3_phi) * rhoToPhi / (rho);
+					//vvyI = vvy - (mxy * dX1_phi + myy * dX2_phi + myz * dX3_phi) * rhoToPhi / (rho);
+					//vvzI = vvz - (mxz * dX1_phi + myz * dX2_phi + mzz * dX3_phi) * rhoToPhi / (rho);
+
+
+				////	vvzI = vvz + (mxz * dRhoInvX + myz * dRhoInvY + mzz * dRhoInvZ) *  (rho)*c3;
+				////	vvxI = vvx + (mxx * dRhoInvX + mxy * dRhoInvY + mxz * dRhoInvZ) *  (rho)*c3;
+				////	vvyI = vvy + (mxy * dRhoInvX + myy * dRhoInvY + myz * dRhoInvZ) *  (rho)*c3;
+
+
+				//	//LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
+				//	//
+				//	//LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy;
+				//	//LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz;
+				//	//LBMReal Dxy = -three * collFactorM * mxy;
+				//	//LBMReal Dxz = -three * collFactorM * mxz;
+				//	//LBMReal Dyz = -three * collFactorM * myz;
+				//	////LBMReal stress = sqrt(sqrt((dyuy+dxux+dzuz)* (dyuy + dxux + dzuz))) * sqrt(forcingX1 * forcingX1 + forcingX2 * forcingX2 + forcingX3 * forcingX3);
+				//	// stress = sqrt(dyuy * dyuy + dxux * dxux + dzuz*dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz)*sqrt(forcingX1*forcingX1+forcingX2*forcingX2+forcingX3*forcingX3);
+				//	////collFactorM = collFactorStore + (1.75 - collFactorStore) * stress / (stress + 1.0e-8);
+				//	//
+				//	//LBMReal dX2_rho = (rhoToPhi)*dX2_phi;
+				//	//LBMReal dX1_rho = (rhoToPhi)*dX1_phi;
+				//	//LBMReal dX3_rho = (rhoToPhi)*dX3_phi;
+				//	////vvxI= vvx+ c1o6 * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
+				//	////vvyI= vvy+ c1o6 * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
+				//	////vvzI= vvz+ c1o6 * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
+
+				//	//vvxI = vvx + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
+				//	//vvyI = vvy + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
+				//	//vvzI = vvz + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
+
+				//	////vvxI = vvx - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rhoInv + Dxy * dX2_rhoInv + Dxz * dX3_rhoInv);
+				//	////vvyI = vvy - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rhoInv + 2 * dyuy * dX2_rhoInv + Dyz * dX3_rhoInv);
+				//	////vvzI = vvz - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rhoInv + Dyz * dX2_rhoInv + 2 * dyuy * dX3_rhoInv);
+
+
+					//}
+				//	//forcingX1+=(vvxI-vvx)/(deltaT* forcingBIAS) + muForcingX1.Eval() / rho;
+				//	//forcingX2 += (vvyI - vvy) / (deltaT * forcingBIAS) + muForcingX2.Eval() / rho;
+				//	//forcingX3 += (vvzI - vvz) / (deltaT * forcingBIAS) + muForcingX3.Eval() / rho;
+
+
+				////	forcingX1 += c2 * (vvxI - vvx);
+				////	forcingX2 += c2 * (vvyI - vvy);
+				////	forcingX3 += c2 * (vvzI - vvz);
+
+
+					//mfabb += c1o2*(-forcingX1) * c2o9;
+					//mfbab += c1o2*(-forcingX2) * c2o9;
+					//mfbba += c1o2*(-forcingX3) * c2o9;
+					//mfaab += c1o2*(-forcingX1 - forcingX2) * c1o18;
+					//mfcab += c1o2*( forcingX1 - forcingX2) * c1o18;
+					//mfaba += c1o2*(-forcingX1 - forcingX3) * c1o18;
+					//mfcba += c1o2*( forcingX1 - forcingX3) * c1o18;
+					//mfbaa += c1o2*(-forcingX2 - forcingX3) * c1o18;
+					//mfbca += c1o2*( forcingX2 - forcingX3) * c1o18;
+					//mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72;
+					//mfcaa += c1o2*(forcingX1 - forcingX2 - forcingX3) * c1o72;
+					//mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72;
+					//mfcca += c1o2*(forcingX1 + forcingX2 - forcingX3) * c1o72;
+					//mfcbb += c1o2*(forcingX1)*c2o9;
+					//mfbcb += c1o2*(forcingX2)*c2o9;
+					//mfbbc += c1o2*(forcingX3)*c2o9;
+					//mfccb += c1o2*( forcingX1 + forcingX2) * c1o18;
+					//mfacb += c1o2*(-forcingX1 + forcingX2) * c1o18;
+					//mfcbc += c1o2*( forcingX1 + forcingX3) * c1o18;
+					//mfabc += c1o2*(-forcingX1 + forcingX3) * c1o18;
+					//mfbcc += c1o2*( forcingX2 + forcingX3) * c1o18;
+					//mfbac += c1o2*(-forcingX2 + forcingX3) * c1o18;
+					//mfccc += c1o2*(forcingX1 + forcingX2 + forcingX3) * c1o72;
+					//mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72;
+					//mfcac += c1o2*(forcingX1 - forcingX2 + forcingX3) * c1o72;
+					//mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72;
+
+
+					//forcingX1 = saveForceX1;
+					//forcingX2 = saveForceX2;
+					//forcingX3 = saveForceX3;
+					vvx = vvxI;
+					vvy = vvyI;
+					vvz = vvzI;
+
+
+
+					//!Abbas
+
+					LBMReal vx2;
+					LBMReal vy2;
+					LBMReal vz2;
+					vx2 = vvx * vvx;
+					vy2 = vvy * vvy;
+					vz2 = vvz * vvz;
+					//pStar =ppStar- (vx2 + vy2 + vz2)*pStar;
+				//	pStar = (pStar + ppStar)*c1o2;
+					///////////////////////////////////////////////////////////////////////////////////////////               
+					LBMReal oMdrho;
+					///////////////
+						//mfabb -= pStar * c2o9;
+						//mfbab -= pStar * c2o9;
+						//mfbba -= pStar * c2o9;
+						//mfaab -= pStar * c1o16;
+						//mfcab -= pStar * c1o16;
+						//mfaba -= pStar * c1o16;
+						//mfcba -= pStar * c1o16;
+						//mfbaa -= pStar * c1o16;
+						//mfbca -= pStar * c1o16;
+						//mfaaa -= pStar * c1o72;
+						//mfcaa -= pStar * c1o72;
+						//mfaca -= pStar * c1o72;
+						//mfcca -= pStar * c1o72;
+						//mfcbb -= pStar * c2o9;
+						//mfbcb -= pStar * c2o9;
+						//mfbbc -= pStar * c2o9;
+						//mfccb -= pStar * c1o16;
+						//mfacb -= pStar * c1o16;
+						//mfcbc -= pStar * c1o16;
+						//mfabc -= pStar * c1o16;
+						//mfbcc -= pStar * c1o16;
+						//mfbac -= pStar * c1o16;
+						//mfccc -= pStar * c1o72;
+						//mfacc -= pStar * c1o72;
+						//mfcac -= pStar * c1o72;
+						//mfaac -= pStar * c1o72;
+						//mfbbb -= pStar * 8.0/9.0;
+					///////////////////
+
+					oMdrho = mfccc + mfaaa;
+					m0 = mfaca + mfcac;
+					m1 = mfacc + mfcaa;
+					m2 = mfaac + mfcca;
+					oMdrho += m0;
+					m1 += m2;
+					oMdrho += m1;
+					m0 = mfbac + mfbca;
+					m1 = mfbaa + mfbcc;
+					m0 += m1;
+					m1 = mfabc + mfcba;
+					m2 = mfaba + mfcbc;
+					m1 += m2;
+					m0 += m1;
+					m1 = mfacb + mfcab;
+					m2 = mfaab + mfccb;
+					m1 += m2;
+					m0 += m1;
+					oMdrho += m0;
+					m0 = mfabb + mfcbb;
+					m1 = mfbab + mfbcb;
+					m2 = mfbba + mfbbc;
+					m0 += m1 + m2;
+					m0 += mfbbb; //hat gefehlt
+					oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!!
+
+															 ////////////////////////////////////////////////////////////////////////////////////
+					LBMReal wadjust;
+					LBMReal qudricLimit = 0.01 / (c1 + 1.0e4 * phi[DIR_000] * (c1 - phi[DIR_000])); //LBMReal qudricLimit = 0.01;
+					////////////////////////////////////////////////////////////////////////////////////
+					//Hin
+					////////////////////////////////////////////////////////////////////////////////////
+					// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Z - Dir
+					m2 = mfaaa + mfaac;
+					m1 = mfaac - mfaaa;
+					m0 = m2 + mfaab;
+					mfaaa = m0;
+					m0 += c1o36 * oMdrho;
+					mfaab = m1 - m0 * vvz;
+					mfaac = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaba + mfabc;
+					m1 = mfabc - mfaba;
+					m0 = m2 + mfabb;
+					mfaba = m0;
+					m0 += c1o9 * oMdrho;
+					mfabb = m1 - m0 * vvz;
+					mfabc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaca + mfacc;
+					m1 = mfacc - mfaca;
+					m0 = m2 + mfacb;
+					mfaca = m0;
+					m0 += c1o36 * oMdrho;
+					mfacb = m1 - m0 * vvz;
+					mfacc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbaa + mfbac;
+					m1 = mfbac - mfbaa;
+					m0 = m2 + mfbab;
+					mfbaa = m0;
+					m0 += c1o9 * oMdrho;
+					mfbab = m1 - m0 * vvz;
+					mfbac = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbba + mfbbc;
+					m1 = mfbbc - mfbba;
+					m0 = m2 + mfbbb;
+					mfbba = m0;
+					m0 += c4o9 * oMdrho;
+					mfbbb = m1 - m0 * vvz;
+					mfbbc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbca + mfbcc;
+					m1 = mfbcc - mfbca;
+					m0 = m2 + mfbcb;
+					mfbca = m0;
+					m0 += c1o9 * oMdrho;
+					mfbcb = m1 - m0 * vvz;
+					mfbcc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcaa + mfcac;
+					m1 = mfcac - mfcaa;
+					m0 = m2 + mfcab;
+					mfcaa = m0;
+					m0 += c1o36 * oMdrho;
+					mfcab = m1 - m0 * vvz;
+					mfcac = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcba + mfcbc;
+					m1 = mfcbc - mfcba;
+					m0 = m2 + mfcbb;
+					mfcba = m0;
+					m0 += c1o9 * oMdrho;
+					mfcbb = m1 - m0 * vvz;
+					mfcbc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcca + mfccc;
+					m1 = mfccc - mfcca;
+					m0 = m2 + mfccb;
+					mfcca = m0;
+					m0 += c1o36 * oMdrho;
+					mfccb = m1 - m0 * vvz;
+					mfccc = m2 - 2. * m1 * vvz + vz2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Y - Dir
+					m2 = mfaaa + mfaca;
+					m1 = mfaca - mfaaa;
+					m0 = m2 + mfaba;
+					mfaaa = m0;
+					m0 += c1o6 * oMdrho;
+					mfaba = m1 - m0 * vvy;
+					mfaca = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaab + mfacb;
+					m1 = mfacb - mfaab;
+					m0 = m2 + mfabb;
+					mfaab = m0;
+					mfabb = m1 - m0 * vvy;
+					mfacb = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaac + mfacc;
+					m1 = mfacc - mfaac;
+					m0 = m2 + mfabc;
+					mfaac = m0;
+					m0 += c1o18 * oMdrho;
+					mfabc = m1 - m0 * vvy;
+					mfacc = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbaa + mfbca;
+					m1 = mfbca - mfbaa;
+					m0 = m2 + mfbba;
+					mfbaa = m0;
+					m0 += c2o3 * oMdrho;
+					mfbba = m1 - m0 * vvy;
+					mfbca = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbab + mfbcb;
+					m1 = mfbcb - mfbab;
+					m0 = m2 + mfbbb;
+					mfbab = m0;
+					mfbbb = m1 - m0 * vvy;
+					mfbcb = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfbac + mfbcc;
+					m1 = mfbcc - mfbac;
+					m0 = m2 + mfbbc;
+					mfbac = m0;
+					m0 += c2o9 * oMdrho;
+					mfbbc = m1 - m0 * vvy;
+					mfbcc = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcaa + mfcca;
+					m1 = mfcca - mfcaa;
+					m0 = m2 + mfcba;
+					mfcaa = m0;
+					m0 += c1o6 * oMdrho;
+					mfcba = m1 - m0 * vvy;
+					mfcca = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcab + mfccb;
+					m1 = mfccb - mfcab;
+					m0 = m2 + mfcbb;
+					mfcab = m0;
+					mfcbb = m1 - m0 * vvy;
+					mfccb = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfcac + mfccc;
+					m1 = mfccc - mfcac;
+					m0 = m2 + mfcbc;
+					mfcac = m0;
+					m0 += c1o18 * oMdrho;
+					mfcbc = m1 - m0 * vvy;
+					mfccc = m2 - 2. * m1 * vvy + vy2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// X - Dir
+					m2 = mfaaa + mfcaa;
+					m1 = mfcaa - mfaaa;
+					m0 = m2 + mfbaa;
+					mfaaa = m0;
+					m0 += 1. * oMdrho;
+					mfbaa = m1 - m0 * vvx;
+					mfcaa = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaba + mfcba;
+					m1 = mfcba - mfaba;
+					m0 = m2 + mfbba;
+					mfaba = m0;
+					mfbba = m1 - m0 * vvx;
+					mfcba = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaca + mfcca;
+					m1 = mfcca - mfaca;
+					m0 = m2 + mfbca;
+					mfaca = m0;
+					m0 += c1o3 * oMdrho;
+					mfbca = m1 - m0 * vvx;
+					mfcca = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaab + mfcab;
+					m1 = mfcab - mfaab;
+					m0 = m2 + mfbab;
+					mfaab = m0;
+					mfbab = m1 - m0 * vvx;
+					mfcab = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfabb + mfcbb;
+					m1 = mfcbb - mfabb;
+					m0 = m2 + mfbbb;
+					mfabb = m0;
+					mfbbb = m1 - m0 * vvx;
+					mfcbb = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfacb + mfccb;
+					m1 = mfccb - mfacb;
+					m0 = m2 + mfbcb;
+					mfacb = m0;
+					mfbcb = m1 - m0 * vvx;
+					mfccb = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfaac + mfcac;
+					m1 = mfcac - mfaac;
+					m0 = m2 + mfbac;
+					mfaac = m0;
+					m0 += c1o3 * oMdrho;
+					mfbac = m1 - m0 * vvx;
+					mfcac = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfabc + mfcbc;
+					m1 = mfcbc - mfabc;
+					m0 = m2 + mfbbc;
+					mfabc = m0;
+					mfbbc = m1 - m0 * vvx;
+					mfcbc = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					m2 = mfacc + mfccc;
+					m1 = mfccc - mfacc;
+					m0 = m2 + mfbcc;
+					mfacc = m0;
+					m0 += c1o9 * oMdrho;
+					mfbcc = m1 - m0 * vvx;
+					mfccc = m2 - 2. * m1 * vvx + vx2 * m0;
+					////////////////////////////////////////////////////////////////////////////////////
+					// Cumulants
+					////////////////////////////////////////////////////////////////////////////////////
+
+					// mfaaa = 0.0;
+					LBMReal OxxPyyPzz = 1.0; //omega2 or bulk viscosity
+											//  LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+											//  LBMReal OxyyMxzz  = 1.;//2+s9;//
+					LBMReal O4 = 1.;
+					LBMReal O5 = 1.;
+					LBMReal O6 = 1.;
+
+					//collFactorM+= (1.7 - collFactorM) * fabs(mfaaa) / (fabs(mfaaa) + 0.001f);
+
+
+					/////fourth order parameters; here only for test. Move out of loop!
+
+					LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0)));
+					LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
+				    LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
+					LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+					//FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::B' )
+					LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+					//LBMReal stress = 1.0;// stress / (stress + 1.0e-10);
+					//stress = 1.0;
+					//OxyyPxzz += stress*(1.0-OxyyPxzz);
+					//OxyyPxzz = c3 * (collFactorM - c2) / (collFactorM - c3);
+					//OxyyMxzz += stress*(1.0-OxyyMxzz);
+					//Oxyz +=  stress*(1.0-Oxyz);
+					//A *= 1.0-stress;
+					//BB *= 1.0-stress;
+
+					//Cum 4.
+					//LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+					//LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+					//LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+					LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+					LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+					LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+					LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+					LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+					LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+
+					//Cum 5.
+					LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+					LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+					LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+
+					//Cum 6.
+					LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb
+						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+						- 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+							+ 2. * (mfcaa * mfaca * mfaac)
+							+ 16. * mfbba * mfbab * mfabb)
+						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho;
+
+					//2.
+					// linear combinations
+					LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+					//pStar = (mxxPyyPzz+vx2+vy2+vz2) * c1o3;//does not work
+					//pStar = (mxxPyyPzz) * c1o3;
+					//pStar = pStar + 1.5 * (mxxPyyPzz * c1o3 - pStar);
+					//mfaaa = mxxPyyPzz;
+					//  LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho));
+					mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa
+										//mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa
+					LBMReal mxxMyy = mfcaa - mfaca;
+					LBMReal mxxMzz = mfcaa - mfaac;
+
+					///
+					LBMReal mmfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+					LBMReal mmfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+					LBMReal mmfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+					LBMReal mmfabb = mfabb;
+					LBMReal mmfbab = mfbab;
+					LBMReal mmfbba = mfbba;
+					///
+
+					LBMReal dxux =  -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz)*0;
+					//LBMReal dxux = -c1o2 * (mxxMyy + mxxMzz) * collFactorM - mfaaa * c1o3* omegaDRho;
+					LBMReal dyuy =  dxux + collFactorM * c3o2 * mxxMyy;
+					LBMReal dzuz =  dxux + collFactorM * c3o2 * mxxMzz;
+					LBMReal Dxy = -three * collFactorM * mfbba;
+					LBMReal Dxz = -three * collFactorM * mfbab;
+					LBMReal Dyz = -three * collFactorM * mfabb;
+//					// attempt to improve implicit  stress computation by fixed iteration
+//					LBMReal dX2_rho = (rhoToPhi)*dX2_phi;
+//					LBMReal dX1_rho = (rhoToPhi)*dX1_phi;
+//					LBMReal dX3_rho = (rhoToPhi)*dX3_phi;
+//
+//						LBMReal dfx= c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
+//						LBMReal dfy = c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
+//						LBMReal dfz = c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
+//
+//						for (int iteration = 0; iteration < 5; iteration++) {
+//							mxxMyy = (mfcaa - dfx * dfx * c1o2) - (mfaca - dfy * dfy * c1o2);
+//							mxxMzz = (mfcaa - dfx * dfx * c1o2) - (mfaac - dfz * dfz * c1o2);
+//						}
+/////end fixed iteration
+//
+
+
+					//relax
+					mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+					mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy);
+					mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz);
+
+					mfabb += collFactorM * (-mfabb);
+					mfbab += collFactorM * (-mfbab);
+					mfbba += collFactorM * (-mfbba);
+
+					//if (fabsf(mfaaa + (dxux + dyuy + dzuz) > 1e-9)){
+					//	std::cout << mfaaa <<" "<< (dxux + dyuy + dzuz)<< std::endl;
+					//}
+
+
+					////updated pressure
+					//mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
+					//mfaaa *= (one-omegaDRho);// (mfaaa + (dxux + dyuy + dzuz)) * .5; // Pressure elimination as in standard velocity model
+								 //  mfaaa += (rho - c1) * (dxux + dyuy + dzuz);
+				
+					mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa
+
+										// mxxPyyPzz += (mfaaa + mfaaaS) * c1o2;
+										//mfaaa = mfaaaS;
+										// linear combinations back
+					mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+					mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+					mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+
+					//3.
+					// linear combinations
+					LBMReal mxxyPyzz = mfcba + mfabc;
+					LBMReal mxxyMyzz = mfcba - mfabc;
+
+					LBMReal mxxzPyyz = mfcab + mfacb;
+					LBMReal mxxzMyyz = mfcab - mfacb;
+
+					LBMReal mxyyPxzz = mfbca + mfbac;
+					LBMReal mxyyMxzz = mfbca - mfbac;
+
+					 mmfcaa += c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz- mfaaa);
+					 mmfaca += c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz- mfaaa);
+					 mmfaac += c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz- mfaaa);
+					 mmfabb += mfabb;
+					 mmfbab += mfbab;
+					 mmfbba += mfbba;
+
+					//relax
+					wadjust = Oxyz + (1. - Oxyz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+					mfbbb += wadjust * (-mfbbb);
+					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+					mxxyPyzz += wadjust * (-mxxyPyzz);
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+					mxxyMyzz += wadjust * (-mxxyMyzz);
+					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+					mxxzPyyz += wadjust * (-mxxzPyyz);
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+					mxxzMyyz += wadjust * (-mxxzMyyz);
+					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+					mxyyPxzz += wadjust * (-mxyyPxzz);
+					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+					mxyyMxzz += wadjust * (-mxyyMxzz);
+
+					// linear combinations back
+					mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+					mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+					mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+					mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+					mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+					mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+					//4.
+					CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc);
+					CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac);
+					CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca);
+					CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc);
+					CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb);
+					CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb);
+
+					//5.
+					CUMbcc += O5 * (-CUMbcc);
+					CUMcbc += O5 * (-CUMcbc);
+					CUMccb += O5 * (-CUMccb);
+
+					//6.
+					CUMccc += O6 * (-CUMccc);
+
+					//back cumulants to central moments
+					//4.
+					//mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+					//mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+					//mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+					mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+					mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+					mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+					mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+					mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+					mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+
+					//5.
+					mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+					mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+					mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+
+					//6.
+					mfccc = CUMccc - ((-4. * mfbbb * mfbbb
+						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+						- 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+							+ 2. * (mfcaa * mfaca * mfaac)
+							+ 16. * mfbba * mfbab * mfabb)
+						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho;
+
+
+					////////
+
+
+					////////////////////////////////////////////////////////////////////////////////////
+					//forcing
+					mfbaa = -mfbaa;// *(c1 - forcingBIAS) / forcingBIAS;
+					mfaba = -mfaba;// *(c1 - forcingBIAS) / forcingBIAS;
+					mfaab = -mfaab;// *(c1 - forcingBIAS) / forcingBIAS;
+
+					//mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho);
+					//mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho);
+					//mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho);
+
+					mfbaa -= c1o2 * rhoToPhi * (mmfcaa* dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho);
+					mfaba -= c1o2 * rhoToPhi * (mmfbba* dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho);
+					mfaab -= c1o2 * rhoToPhi * (mmfbab* dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho);
+					
+					vvx -= c1o4 * rhoToPhi * (mmfcaa * dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho);
+					vvy -= c1o4 * rhoToPhi * (mmfbba * dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho);
+					vvz -= c1o4 * rhoToPhi * (mmfbab * dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho);
+
+					vx2 = vvx * vvx;
+					vy2 = vvy * vvy;
+					vz2 = vvz * vvz;
+
+					//mmfcaa =0;// c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz - mfaaa);
+					//mmfaca =0;// c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz - mfaaa);
+					//mmfaac =0;// c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz - mfaaa);
+					//mmfabb =0;// mfabb;
+					//mmfbab =0;// mfbab;
+					//mmfbba =0;// mfbba;
+
+
+					//////////////////////////////////////////////////////////////////////////////////////
+					//grad Rho
+					//LBMReal dX1_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX1_phi - phi[DIR_000] * three * gradPx;
+					//LBMReal dX2_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX2_phi - phi[DIR_000] * three * gradPy;
+					//LBMReal dX3_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX3_phi - phi[DIR_000] * three * gradPz;
+
+					//LBMReal dX2_rho = (rhoToPhi ) * dX2_phi ;
+					//LBMReal dX1_rho = (rhoToPhi ) * dX1_phi ;
+					//LBMReal dX3_rho = (rhoToPhi ) * dX3_phi ;
+					///////////////////////////////////////////////////////////////////////////////////////
+					//mfbaa += c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
+					//mfaba += c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
+					//mfaab += c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
+					
+					///////Fakhari pressure correction
+					//mfbaa -= mfaaa / rho * dX1_rho*c1o3;
+					//mfaba -= mfaaa / rho * dX2_rho*c1o3;
+					//mfaab -= mfaaa / rho * dX3_rho*c1o3;
+					////////////////////////////////////////////////////////////////////////////////////
+					//back
+					////////////////////////////////////////////////////////////////////////////////////
+					//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Z - Dir
+					m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2;
+					m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+					mfaaa = m0;
+					mfaab = m1;
+					mfaac = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+					m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2);
+					m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+					mfaba = m0;
+					mfabb = m1;
+					mfabc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2;
+					m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+					mfaca = m0;
+					mfacb = m1;
+					mfacc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+					m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2);
+					m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+					mfbaa = m0;
+					mfbab = m1;
+					mfbac = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+					m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2);
+					m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+					mfbba = m0;
+					mfbbb = m1;
+					mfbbc = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+					m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2);
+					m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+					mfbca = m0;
+					mfbcb = m1;
+					mfbcc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2;
+					m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+					mfcaa = m0;
+					mfcab = m1;
+					mfcac = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+					m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2);
+					m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+					mfcba = m0;
+					mfcbb = m1;
+					mfcbc = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+					m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2;
+					m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+					mfcca = m0;
+					mfccb = m1;
+					mfccc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// Y - Dir
+					m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2;
+					m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfaaa = m0;
+					mfaba = m1;
+					mfaca = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2;
+					m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfaab = m0;
+					mfabb = m1;
+					mfacb = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2;
+					m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfaac = m0;
+					mfabc = m1;
+					mfacc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+					m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2);
+					m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+					mfbaa = m0;
+					mfbba = m1;
+					mfbca = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+					m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2);
+					m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+					mfbab = m0;
+					mfbbb = m1;
+					mfbcb = m2;
+					/////////b//////////////////////////////////////////////////////////////////////////
+					m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+					m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2);
+					m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+					mfbac = m0;
+					mfbbc = m1;
+					mfbcc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2;
+					m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfcaa = m0;
+					mfcba = m1;
+					mfcca = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2;
+					m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfcab = m0;
+					mfcbb = m1;
+					mfccb = m2;
+					/////////c//////////////////////////////////////////////////////////////////////////
+					m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+					m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2;
+					m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+					mfcac = m0;
+					mfcbc = m1;
+					mfccc = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+					////////////////////////////////////////////////////////////////////////////////////
+					// X - Dir
+					m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaaa = m0;
+					mfbaa = m1;
+					mfcaa = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaba = m0;
+					mfbba = m1;
+					mfcba = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaca = m0;
+					mfbca = m1;
+					mfcca = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaab = m0;
+					mfbab = m1;
+					mfcab = m2;
+					///////////b////////////////////////////////////////////////////////////////////////
+					m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2;
+					m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfabb = m0;
+					mfbbb = m1;
+					mfcbb = m2;
+					///////////b////////////////////////////////////////////////////////////////////////
+					m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfacb = m0;
+					mfbcb = m1;
+					mfccb = m2;
+					////////////////////////////////////////////////////////////////////////////////////
+					////////////////////////////////////////////////////////////////////////////////////
+					m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfaac = m0;
+					mfbac = m1;
+					mfcac = m2;
+					///////////c////////////////////////////////////////////////////////////////////////
+					m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2;
+					m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfabc = m0;
+					mfbbc = m1;
+					mfcbc = m2;
+					///////////c////////////////////////////////////////////////////////////////////////
+					m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+					m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2;
+					m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+					mfacc = m0;
+					mfbcc = m1;
+					mfccc = m2;
+					/////SimpleForce
+
+					//mfabb += c2o9 * deltaP;
+					//mfbab += c2o9 * deltaP;
+					//mfbba += c2o9 * deltaP;
+					//mfaab += c1o18 * deltaP;
+					//mfcab += c1o18 * deltaP;
+					//mfaba += c1o18 * deltaP;
+					//mfcba += c1o18 * deltaP;
+					//mfbaa += c1o18 * deltaP;
+					//mfbca += c1o18 * deltaP;
+					//mfaaa += c1o72 * deltaP;
+					//mfcaa += c1o72 * deltaP;
+					//mfaca += c1o72 * deltaP;
+					//mfcca += c1o72 * deltaP;
+					//mfcbb += c2o9 * deltaP;
+					//mfbcb += c2o9 * deltaP;
+					//mfbbc += c2o9 * deltaP;
+					//mfccb += c1o18 * deltaP;
+					//mfacb += c1o18 * deltaP;
+					//mfcbc += c1o18 * deltaP;
+					//mfabc += c1o18 * deltaP;
+					//mfbcc += c1o18 * deltaP;
+					//mfbac += c1o18 * deltaP;
+					//mfccc += c1o72 * deltaP;
+					//mfacc += c1o72 * deltaP;
+					//mfcac += c1o72 * deltaP;
+					//mfaac += c1o72 * deltaP;
+
+					//mfabb += c1o2*(-forcingX1                        ) * c2o9;
+					//mfbab += c1o2*(           - forcingX2            ) * c2o9;
+					//mfbba += c1o2*(                       - forcingX3) * c2o9;
+					//mfaab += c1o2*(-forcingX1 - forcingX2            ) * c1o18;
+					//mfcab += c1o2*( forcingX1 - forcingX2            ) * c1o18;
+					//mfaba += c1o2*(-forcingX1             - forcingX3) * c1o18;
+					//mfcba += c1o2*( forcingX1             - forcingX3) * c1o18;
+					//mfbaa += c1o2*(           - forcingX2 - forcingX3) * c1o18;
+					//mfbca += c1o2*(             forcingX2 - forcingX3) * c1o18;
+					//mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72;
+					//mfcaa += c1o2*( forcingX1 - forcingX2 - forcingX3) * c1o72;
+					//mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72;
+					//mfcca += c1o2*( forcingX1 + forcingX2 - forcingX3) * c1o72;
+					//mfcbb += c1o2*( forcingX1                        ) * c2o9;
+					//mfbcb += c1o2*(             forcingX2            ) * c2o9;
+					//mfbbc += c1o2*(                         forcingX3) * c2o9;
+					//mfccb += c1o2*( forcingX1 + forcingX2            ) * c1o18;
+					//mfacb += c1o2*(-forcingX1 + forcingX2            ) * c1o18;
+					//mfcbc += c1o2*( forcingX1             + forcingX3) * c1o18;
+					//mfabc += c1o2*(-forcingX1             + forcingX3) * c1o18;
+					//mfbcc += c1o2*(             forcingX2 + forcingX3) * c1o18;
+					//mfbac += c1o2*(           - forcingX2 + forcingX3) * c1o18;
+					//mfccc += c1o2*( forcingX1 + forcingX2 + forcingX3) * c1o72;
+					//mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72;
+					//mfcac += c1o2*( forcingX1 - forcingX2 + forcingX3) * c1o72;
+					//mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72;
+					//pStarStart -= (vx2 + vy2 + vz2) * c1o3;
+
+					///Take the diffusion part with out
+
+					//mfStartcbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::E  , zeroReal, vvx, vvy, vvz);
+					//mfStartbcb -= D3Q27System::getIncompFeqForDirection(D3Q27System::N  , zeroReal, vvx, vvy, vvz);
+					//mfStartbbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::T  , zeroReal, vvx, vvy, vvz);
+					//mfStartccb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NE , zeroReal, vvx, vvy, vvz);
+					//mfStartacb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NW , zeroReal, vvx, vvy, vvz);
+					//mfStartcbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TE , zeroReal, vvx, vvy, vvz);
+					//mfStartabc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TW , zeroReal, vvx, vvy, vvz);
+					//mfStartbcc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TN , zeroReal, vvx, vvy, vvz);
+					//mfStartbac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TS , zeroReal, vvx, vvy, vvz);
+					//mfStartccc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNE, zeroReal, vvx, vvy, vvz);
+					//mfStartacc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNW, zeroReal, vvx, vvy, vvz);
+					//mfStartcac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSE, zeroReal, vvx, vvy, vvz);
+					//mfStartaac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSW, zeroReal, vvx, vvy, vvz);
+					//mfStartabb -= D3Q27System::getIncompFeqForDirection(D3Q27System::W  , zeroReal, vvx, vvy, vvz);
+					//mfStartbab -= D3Q27System::getIncompFeqForDirection(D3Q27System::S  , zeroReal, vvx, vvy, vvz);
+					//mfStartbba -= D3Q27System::getIncompFeqForDirection(D3Q27System::B  , zeroReal, vvx, vvy, vvz);
+					//mfStartaab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SW , zeroReal, vvx, vvy, vvz);
+					//mfStartcab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SE , zeroReal, vvx, vvy, vvz);
+					//mfStartaba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BW , zeroReal, vvx, vvy, vvz);
+					//mfStartcba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BE , zeroReal, vvx, vvy, vvz);
+					//mfStartbaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BS , zeroReal, vvx, vvy, vvz);
+					//mfStartbca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BN , zeroReal, vvx, vvy, vvz);
+					//mfStartaaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSW, zeroReal, vvx, vvy, vvz);
+					//mfStartcaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSE, zeroReal, vvx, vvy, vvz);
+					//mfStartaca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNW, zeroReal, vvx, vvy, vvz);
+					//mfStartcca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNE, zeroReal, vvx, vvy, vvz);
+					//mfStartbbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::REST, zeroReal, vvx, vvy, vvz);
+					//
+					//pStar += pStarStart*(omegaDRho-c1);
+
+					//mfStartcbb = c2o9 * pStar;
+					//	mfStartbcb= c2o9 * pStar;
+					//	mfStartbbc= c2o9 * pStar;
+					//	mfStartccb= c1o18 * pStar;
+					//	mfStartacb= c1o18 * pStar;
+					//	mfStartcbc= c1o18 * pStar;
+					//	mfStartabc= c1o18 * pStar;
+					//	mfStartbcc= c1o18 * pStar;
+					//	mfStartbac= c1o18 * pStar;
+					//	mfStartccc= c1o72 * pStar;
+					//	mfStartacc= c1o72 * pStar;
+					//	mfStartcac= c1o72 * pStar;
+					//	mfStartaac= c1o72 * pStar;
+					//	mfStartabb= c2o9 * pStar;
+					//	mfStartbab= c2o9 * pStar;
+					//	mfStartbba= c2o9 * pStar;
+					//	mfStartaab= c1o18 * pStar;
+					//	mfStartcab= c1o18 * pStar;
+					//	mfStartaba= c1o18 * pStar;
+					//	mfStartcba= c1o18 * pStar;
+					//	mfStartbaa= c1o18 * pStar;
+					//	mfStartbca= c1o18 * pStar;
+					//	mfStartaaa= c1o72 * pStar;
+					//	mfStartcaa= c1o72 * pStar;
+					//	mfStartaca= c1o72 * pStar;
+					//	mfStartcca= c1o72 * pStar;
+					//	mfStartbbb= c4 * c2o9 * pStar;
+
+					//mfaaa -= c1o2 * (mfStartaaa + mfStartccc)+ c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa);
+					//mfaab -= c1o2 * (mfStartaab + mfStartccb)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa));
+					//mfaac -= c1o2 * (mfStartaac + mfStartcca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa);
+					//mfaba -= c1o2 * (mfStartaba + mfStartcbc)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa);
+					//mfabb -= c1o2 * (mfStartabb + mfStartcbb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa);
+					//mfabc -= c1o2 * (mfStartabc + mfStartcba)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa);
+					//mfaca -= c1o2 * (mfStartaca + mfStartcac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa);
+					//mfacb -= c1o2 * (mfStartacb + mfStartcab)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa));
+					//mfacc -= c1o2 * (mfStartacc + mfStartcaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa);
+					//mfbaa -= c1o2 * (mfStartbaa + mfStartbcc)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa);
+					//mfbab -= c1o2 * (mfStartbab + mfStartbcb)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa);
+					//mfbac -= c1o2 * (mfStartbac + mfStartbca)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa);
+					//mfbba -= c1o2 * (mfStartbba + mfStartbbc)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa);
+					//mfbbb -=  (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa));
+					//mfbbc -= c1o2 * (mfStartbbc + mfStartbba)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa);
+					//mfbca -= c1o2 * (mfStartbca + mfStartbac)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa);
+					//mfbcb -= c1o2 * (mfStartbcb + mfStartbab)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa);
+					//mfbcc -= c1o2 * (mfStartbcc + mfStartbaa)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa);
+					//mfcaa -= c1o2 * (mfStartcaa + mfStartacc)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa);
+					//mfcab -= c1o2 * (mfStartcab + mfStartacb)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa));
+					//mfcac -= c1o2 * (mfStartcac + mfStartaca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa);
+					//mfcba -= c1o2 * (mfStartcba + mfStartabc)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa);
+					//mfcbb -= c1o2 * (mfStartcbb + mfStartabb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa);
+					//mfcbc -= c1o2 * (mfStartcbc + mfStartaba)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa);
+					//mfcca -= c1o2 * (mfStartcca + mfStartaac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa);
+					//mfccb -= c1o2 * (mfStartccb + mfStartaab)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa));
+					//mfccc -= c1o2 * (mfStartccc + mfStartaaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa);
+
+					//mfhaaa =rho*( c1o2 * (mfStartaaa + mfStartccc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa));
+					//mfhaab =rho*( c1o2 * (mfStartaab + mfStartccb) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)));
+					//mfhaac =rho*( c1o2 * (mfStartaac + mfStartcca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa));
+					//mfhaba =rho*( c1o2 * (mfStartaba + mfStartcbc) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa));
+					//mfhabb =rho*( c1o2 * (mfStartabb + mfStartcbb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa));
+					//mfhabc =rho*( c1o2 * (mfStartabc + mfStartcba) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa));
+					//mfhaca =rho*( c1o2 * (mfStartaca + mfStartcac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa));
+					//mfhacb =rho*( c1o2 * (mfStartacb + mfStartcab) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)));
+					//mfhacc =rho*( c1o2 * (mfStartacc + mfStartcaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa));
+					//mfhbaa =rho*( c1o2 * (mfStartbaa + mfStartbcc) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa));
+					//mfhbab =rho*( c1o2 * (mfStartbab + mfStartbcb) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa));
+					//mfhbac =rho*( c1o2 * (mfStartbac + mfStartbca) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa));
+					//mfhbba =rho*( c1o2 * (mfStartbba + mfStartbbc) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa));
+					//mfhbbb =rho*( (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa)));
+					//mfhbbc =rho*( c1o2 * (mfStartbbc + mfStartbba) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa));
+					//mfhbca =rho*( c1o2 * (mfStartbca + mfStartbac) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa));
+					//mfhbcb =rho*( c1o2 * (mfStartbcb + mfStartbab) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa));
+					//mfhbcc =rho*( c1o2 * (mfStartbcc + mfStartbaa) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa));
+					//mfhcaa =rho*( c1o2 * (mfStartcaa + mfStartacc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa));
+					//mfhcab =rho*( c1o2 * (mfStartcab + mfStartacb) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)));
+					//mfhcac =rho*( c1o2 * (mfStartcac + mfStartaca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa));
+					//mfhcba =rho*( c1o2 * (mfStartcba + mfStartabc) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa));
+					//mfhcbb =rho*( c1o2 * (mfStartcbb + mfStartabb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa));
+					//mfhcbc =rho*( c1o2 * (mfStartcbc + mfStartaba) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa));
+					//mfhcca =rho*( c1o2 * (mfStartcca + mfStartaac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa));
+					//mfhccb =rho*( c1o2 * (mfStartccb + mfStartaab) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)));
+					//mfhccc =rho*( c1o2 * (mfStartccc + mfStartaaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa));
+
+
+
+
+					pStar += pStarStart*(omegaDRho-c1);
+
+					mfcbb -= c2o9*pStar;
+					mfbcb -= c2o9*pStar;
+					mfbbc -= c2o9*pStar;
+					mfccb -= c1o18*pStar;
+					mfacb -= c1o18*pStar;
+					mfcbc -= c1o18*pStar;
+					mfabc -= c1o18*pStar;
+					mfbcc -= c1o18*pStar;
+					mfbac -= c1o18*pStar;
+					mfccc -= c1o72*pStar;
+					mfacc -= c1o72*pStar;
+					mfcac -= c1o72*pStar;
+					mfaac -= c1o72*pStar;
+					mfabb -= c2o9*pStar;
+					mfbab -= c2o9*pStar;
+					mfbba -= c2o9*pStar;
+					mfaab -= c1o18*pStar;
+					mfcab -= c1o18*pStar;
+					mfaba -= c1o18*pStar;
+					mfcba -= c1o18*pStar;
+					mfbaa -= c1o18*pStar;
+					mfbca -= c1o18*pStar;
+					mfaaa -= c1o72*pStar;
+					mfcaa -= c1o72*pStar;
+					mfaca -= c1o72*pStar;
+					mfcca -= c1o72*pStar;
+					mfbbb -= c4*c2o9*pStar;
+
+					mfhbcb = rho*c2o9 * pStar;
+					mfhbbc = rho*c2o9 * pStar;
+					mfhcbb = rho*c2o9 * pStar;
+					mfhccb = rho*c1o18 * pStar;
+					mfhacb = rho*c1o18 * pStar;
+					mfhcbc = rho*c1o18 * pStar;
+					mfhabc = rho*c1o18 * pStar;
+					mfhbcc = rho*c1o18 * pStar;
+					mfhbac = rho*c1o18 * pStar;
+					mfhccc = rho*c1o72 * pStar;
+					mfhacc = rho*c1o72 * pStar;
+					mfhcac = rho*c1o72 * pStar;
+					mfhaac = rho*c1o72 * pStar;
+					mfhabb = rho*c2o9 * pStar;
+					mfhbab = rho*c2o9 * pStar;
+					mfhbba = rho*c2o9 * pStar;
+					mfhaab = rho*c1o18 * pStar;
+					mfhcab = rho*c1o18 * pStar;
+					mfhaba = rho*c1o18 * pStar;
+					mfhcba = rho*c1o18 * pStar;
+					mfhbaa = rho*c1o18 * pStar;
+					mfhbca = rho*c1o18 * pStar;
+					mfhaaa = rho*c1o72 * pStar;
+					mfhcaa = rho*c1o72 * pStar;
+					mfhaca = rho*c1o72 * pStar;
+					mfhcca = rho*c1o72 * pStar;
+					mfhbbb = rho*c4 * c2o9 * pStar;
+
+					//mfStartbcb =  c2o9  * pStarStart;
+					//mfStartbbc =  c2o9  * pStarStart;
+					//mfStartcbb =  c2o9  * pStarStart;
+					//mfStartccb =  c1o18 * pStarStart;
+					//mfStartacb =  c1o18 * pStarStart;
+					//mfStartcbc =  c1o18 * pStarStart;
+					//mfStartabc =  c1o18 * pStarStart;
+					//mfStartbcc =  c1o18 * pStarStart;
+					//mfStartbac =  c1o18 * pStarStart;
+					//mfStartccc =  c1o72 * pStarStart;
+					//mfStartacc =  c1o72 * pStarStart;
+					//mfStartcac =  c1o72 * pStarStart;
+					//mfStartaac =  c1o72 * pStarStart;
+					//mfStartabb =  c2o9  * pStarStart;
+					//mfStartbab =  c2o9  * pStarStart;
+					//mfStartbba =  c2o9  * pStarStart;
+					//mfStartaab =  c1o18 * pStarStart;
+					//mfStartcab =  c1o18 * pStarStart;
+					//mfStartaba =  c1o18 * pStarStart;
+					//mfStartcba =  c1o18 * pStarStart;
+					//mfStartbaa =  c1o18 * pStarStart;
+					//mfStartbca =  c1o18 * pStarStart;
+					//mfStartaaa =  c1o72 * pStarStart;
+					//mfStartcaa =  c1o72 * pStarStart;
+					//mfStartaca =  c1o72 * pStarStart;
+					//mfStartcca =  c1o72 * pStarStart;
+					//mfStartbbb =  c4 * c2o9 * pStarStart;
+
+					//LBMReal scaleSplit = 0.5;
+					//mfStartbcb = mfStartbcb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+					//mfStartbbc = mfStartbbc*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+					//mfStartcbb = mfStartcbb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+					//mfStartccb = mfStartccb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartacb = mfStartacb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartcbc = mfStartcbc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartabc = mfStartabc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartbcc = mfStartbcc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartbac = mfStartbac*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartccc = mfStartccc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+					//mfStartacc = mfStartacc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+					//mfStartcac = mfStartcac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+					//mfStartaac = mfStartaac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+					//mfStartabb = mfStartabb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+					//mfStartbab = mfStartbab*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+					//mfStartbba = mfStartbba*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+					//mfStartaab = mfStartaab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartcab = mfStartcab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartaba = mfStartaba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartcba = mfStartcba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartbaa = mfStartbaa*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartbca = mfStartbca*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+					//mfStartaaa = mfStartaaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+					//mfStartcaa = mfStartcaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+					//mfStartaca = mfStartaca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+					//mfStartcca = mfStartcca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+					//mfStartbbb = mfStartbbb*scaleSplit+(c1-scaleSplit)* c4 * c2o9 * pStarStart;
+
+
+					//mfaaa -= c1o2 * (mfStartaaa + mfStartccc);
+     //               mfaab -= c1o2 * (mfStartaab + mfStartccb);
+     //               mfaac -= c1o2 * (mfStartaac + mfStartcca);
+     //               mfaba -= c1o2 * (mfStartaba + mfStartcbc);
+     //               mfabb -= c1o2 * (mfStartabb + mfStartcbb);
+     //               mfabc -= c1o2 * (mfStartabc + mfStartcba);
+     //               mfaca -= c1o2 * (mfStartaca + mfStartcac);
+     //               mfacb -= c1o2 * (mfStartacb + mfStartcab);
+     //               mfacc -= c1o2 * (mfStartacc + mfStartcaa);
+     //               mfbaa -= c1o2 * (mfStartbaa + mfStartbcc);
+     //               mfbab -= c1o2 * (mfStartbab + mfStartbcb);
+     //               mfbac -= c1o2 * (mfStartbac + mfStartbca);
+     //               mfbba -= c1o2 * (mfStartbba + mfStartbbc);
+					//mfbbb -= (mfStartbbb);
+     //               mfbbc -= c1o2 * (mfStartbbc + mfStartbba);
+     //               mfbca -= c1o2 * (mfStartbca + mfStartbac);
+     //               mfbcb -= c1o2 * (mfStartbcb + mfStartbab);
+     //               mfbcc -= c1o2 * (mfStartbcc + mfStartbaa);
+     //               mfcaa -= c1o2 * (mfStartcaa + mfStartacc);
+     //               mfcab -= c1o2 * (mfStartcab + mfStartacb);
+     //               mfcac -= c1o2 * (mfStartcac + mfStartaca);
+     //               mfcba -= c1o2 * (mfStartcba + mfStartabc);
+     //               mfcbb -= c1o2 * (mfStartcbb + mfStartabb);
+     //               mfcbc -= c1o2 * (mfStartcbc + mfStartaba);
+     //               mfcca -= c1o2 * (mfStartcca + mfStartaac);
+     //               mfccb -= c1o2 * (mfStartccb + mfStartaab);
+     //               mfccc -= c1o2 * (mfStartccc + mfStartaaa);
+					//												
+					//mfhaaa += rho*c1o2 * (mfStartaaa + mfStartccc);
+					//mfhaab += rho*c1o2 * (mfStartaab + mfStartccb);
+					//mfhaac += rho*c1o2 * (mfStartaac + mfStartcca);
+					//mfhaba += rho*c1o2 * (mfStartaba + mfStartcbc);
+					//mfhabb += rho*c1o2 * (mfStartabb + mfStartcbb);
+					//mfhabc += rho*c1o2 * (mfStartabc + mfStartcba);
+					//mfhaca += rho*c1o2 * (mfStartaca + mfStartcac);
+					//mfhacb += rho*c1o2 * (mfStartacb + mfStartcab);
+					//mfhacc += rho*c1o2 * (mfStartacc + mfStartcaa);
+					//mfhbaa += rho*c1o2 * (mfStartbaa + mfStartbcc);
+					//mfhbab += rho*c1o2 * (mfStartbab + mfStartbcb);
+					//mfhbac += rho*c1o2 * (mfStartbac + mfStartbca);
+					//mfhbba += rho*c1o2 * (mfStartbba + mfStartbbc);
+					//mfhbbb += rho*(mfStartbbb);
+					//mfhbbc += rho*c1o2 * (mfStartbbc + mfStartbba);
+					//mfhbca += rho*c1o2 * (mfStartbca + mfStartbac);
+					//mfhbcb += rho*c1o2 * (mfStartbcb + mfStartbab);
+					//mfhbcc += rho*c1o2 * (mfStartbcc + mfStartbaa);
+					//mfhcaa += rho*c1o2 * (mfStartcaa + mfStartacc);
+					//mfhcab += rho*c1o2 * (mfStartcab + mfStartacb);
+					//mfhcac += rho*c1o2 * (mfStartcac + mfStartaca);
+					//mfhcba += rho*c1o2 * (mfStartcba + mfStartabc);
+					//mfhcbb += rho*c1o2 * (mfStartcbb + mfStartabb);
+					//mfhcbc += rho*c1o2 * (mfStartcbc + mfStartaba);
+					//mfhcca += rho*c1o2 * (mfStartcca + mfStartaac);
+					//mfhccb += rho*c1o2 * (mfStartccb + mfStartaab);
+					//mfhccc += rho*c1o2 * (mfStartccc + mfStartaaa);
+					//mfhbcb += c1o6 * c2o9 * deltaPP;
+					//mfhbbc += c1o6 * c2o9 * deltaPP;
+					//mfhcbb += c1o6 * c2o9 * deltaPP;
+					//mfhccb += c1o6 * c1o18 * deltaPP;
+					//mfhacb += c1o6 * c1o18 * deltaPP;
+					//mfhcbc += c1o6 * c1o18 * deltaPP;
+					//mfhabc += c1o6 * c1o18 * deltaPP;
+					//mfhbcc += c1o6 * c1o18 * deltaPP;
+					//mfhbac += c1o6 * c1o18 * deltaPP;
+					//mfhccc += c1o6 * c1o72 * deltaPP;
+					//mfhacc += c1o6 * c1o72 * deltaPP;
+					//mfhcac += c1o6 * c1o72 * deltaPP;
+					//mfhaac += c1o6 * c1o72 * deltaPP;
+					//mfhabb += c1o6 * c2o9 * deltaPP;
+					//mfhbab += c1o6 * c2o9 * deltaPP;
+					//mfhbba += c1o6 * c2o9 * deltaPP;
+					//mfhaab += c1o6 * c1o18 * deltaPP;
+					//mfhcab += c1o6 * c1o18 * deltaPP;
+					//mfhaba += c1o6 * c1o18 * deltaPP;
+					//mfhcba += c1o6 * c1o18 * deltaPP;
+					//mfhbaa += c1o6 * c1o18 * deltaPP;
+					//mfhbca += c1o6 * c1o18 * deltaPP;
+					//mfhaaa += c1o6 * c1o72 * deltaPP;
+					//mfhcaa += c1o6 * c1o72 * deltaPP;
+					//mfhaca += c1o6 * c1o72 * deltaPP;
+					//mfhcca += c1o6 * c1o72 * deltaPP;
+					//mfhbbb += c1o6 * c4 * c2o9 * deltaPP;
+
+
+					//mfhbcb = c1o3/rho * c2o9 ;
+					//mfhbbc = c1o3/rho * c2o9 ;
+					//mfhcbb = c1o3/rho * c2o9 ;
+					//mfhccb = c1o3/rho * c1o18 ;
+					//mfhacb = c1o3/rho * c1o18 ;
+					//mfhcbc = c1o3/rho * c1o18 ;
+					//mfhabc = c1o3/rho * c1o18 ;
+					//mfhbcc = c1o3/rho * c1o18 ;
+					//mfhbac = c1o3/rho * c1o18 ;
+					//mfhccc = c1o3/rho * c1o72 ;
+					//mfhacc = c1o3/rho * c1o72 ;
+					//mfhcac = c1o3/rho * c1o72 ;
+					//mfhaac = c1o3/rho * c1o72 ;
+					//mfhabb = c1o3/rho * c2o9 ;
+					//mfhbab = c1o3/rho * c2o9 ;
+					//mfhbba = c1o3/rho * c2o9 ;
+					//mfhaab = c1o3/rho * c1o18 ;
+					//mfhcab = c1o3/rho * c1o18 ;
+					//mfhaba = c1o3/rho * c1o18 ;
+					//mfhcba = c1o3/rho * c1o18 ;
+					//mfhbaa = c1o3/rho * c1o18 ;
+					//mfhbca = c1o3/rho * c1o18 ;
+					//mfhaaa = c1o3/rho * c1o72 ;
+					//mfhcaa = c1o3/rho * c1o72 ;
+					//mfhaca = c1o3/rho * c1o72 ;
+					//mfhcca = c1o3/rho * c1o72 ;
+					//mfhbbb = c1/rho;//c1o3/rho * c4 * c2o9 ;
+
+
+					
+					//mfabb += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_M00]) * rhoToPhi / rho;
+					//mfbab += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_0M0]) * rhoToPhi / rho;
+					//mfbba += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_00M]) * rhoToPhi / rho;
+					//mfaab += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_MM0]) * rhoToPhi / rho;
+					//mfcab += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_PM0]) * rhoToPhi / rho;
+					//mfaba += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_M0M]) * rhoToPhi / rho;
+					//mfcba += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_P0M]) * rhoToPhi / rho;
+					//mfbaa += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_0MM]) * rhoToPhi / rho;
+					//mfbca += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_0PM]) * rhoToPhi / rho;
+					//mfaaa += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_MMM]) * rhoToPhi / rho;
+					//mfcaa += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_PMM]) * rhoToPhi / rho;
+					//mfaca += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_MPM]) * rhoToPhi / rho;
+					//mfcca += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_PPM]) * rhoToPhi / rho;
+					//mfcbb += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_P00]) * rhoToPhi / rho;
+					//mfbcb += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_0P0]) * rhoToPhi / rho;
+					//mfbbc += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_00P]) * rhoToPhi / rho;
+					//mfccb += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_PP0]) * rhoToPhi / rho;
+					//mfacb += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_MP0]) * rhoToPhi / rho;
+					//mfcbc += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_P0P]) * rhoToPhi / rho;
+					//mfabc += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_M0P]) * rhoToPhi / rho;
+					//mfbcc += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_0PP]) * rhoToPhi / rho;
+					//mfbac += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_0MP]) * rhoToPhi / rho;
+					//mfccc += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_PPP]) * rhoToPhi / rho;
+					//mfacc += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_MPP]) * rhoToPhi / rho;
+					//mfcac += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_PMP]) * rhoToPhi / rho;
+					//mfaac += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_MMP]) * rhoToPhi / rho;
+					
+					///////////////
+					//mfabb += (pBefore-pStar) * c2o9  ;
+					//mfbab += (pBefore-pStar) * c2o9  ;
+					//mfbba += (pBefore-pStar) * c2o9  ;
+					//mfaab += (pBefore-pStar) * c1o18 ;
+					//mfcab += (pBefore-pStar) * c1o18 ;
+					//mfaba += (pBefore-pStar) * c1o18 ;
+					//mfcba += (pBefore-pStar) * c1o18 ;
+					//mfbaa += (pBefore-pStar) * c1o18 ;
+					//mfbca += (pBefore-pStar) * c1o18 ;
+					//mfaaa += (pBefore-pStar) * c1o72 ;
+					//mfcaa += (pBefore-pStar) * c1o72 ;
+					//mfaca += (pBefore-pStar) * c1o72 ;
+					//mfcca += (pBefore-pStar) * c1o72 ;
+					//mfcbb += (pBefore-pStar) * c2o9  ;
+					//mfbcb += (pBefore-pStar) * c2o9  ;
+					//mfbbc += (pBefore-pStar) * c2o9  ;
+					//mfccb += (pBefore-pStar) * c1o18 ;
+					//mfacb += (pBefore-pStar) * c1o18 ;
+					//mfcbc += (pBefore-pStar) * c1o18 ;
+					//mfabc += (pBefore-pStar) * c1o18 ;
+					//mfbcc += (pBefore-pStar) * c1o18 ;
+					//mfbac += (pBefore-pStar) * c1o18 ;
+					//mfccc += (pBefore-pStar) * c1o72 ;
+					//mfacc += (pBefore-pStar) * c1o72 ;
+					//mfcac += (pBefore-pStar) * c1o72 ;
+					//mfaac += (pBefore-pStar) * c1o72 ;
+					//mfbbb += (pBefore-pStar) * 8.0 / 9.0;
+
+					//mfabb = (pBefore ) * c2o9;
+					//mfbab = (pBefore ) * c2o9;
+					//mfbba = (pBefore ) * c2o9;
+					//mfaab = (pBefore ) * c1o16;
+					//mfcab = (pBefore ) * c1o16;
+					//mfaba = (pBefore ) * c1o16;
+					//mfcba = (pBefore ) * c1o16;
+					//mfbaa = (pBefore ) * c1o16;
+					//mfbca = (pBefore ) * c1o16;
+					//mfaaa = (pBefore ) * c1o72;
+					//mfcaa = (pBefore ) * c1o72;
+					//mfaca = (pBefore ) * c1o72;
+					//mfcca = (pBefore ) * c1o72;
+					//mfcbb = (pBefore ) * c2o9;
+					//mfbcb = (pBefore ) * c2o9;
+					//mfbbc = (pBefore ) * c2o9;
+					//mfccb = (pBefore ) * c1o16;
+					//mfacb = (pBefore ) * c1o16;
+					//mfcbc = (pBefore ) * c1o16;
+					//mfabc = (pBefore ) * c1o16;
+					//mfbcc = (pBefore ) * c1o16;
+					//mfbac = (pBefore ) * c1o16;
+					//mfccc = (pBefore ) * c1o72;
+					//mfacc = (pBefore ) * c1o72;
+					//mfcac = (pBefore ) * c1o72;
+					//mfaac = (pBefore ) * c1o72;
+					//mfbbb = (pBefore ) * 8.0 / 9.0;
+					///////////////////
+
+					//////////////////////////////////////////////////////////////////////////
+					//proof correctness
+					//////////////////////////////////////////////////////////////////////////
+					//#ifdef  PROOF_CORRECTNESS
+					LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+						+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+						+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+					//			   //LBMReal dif = fabs(drho - rho_post);
+					//               LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post;
+					//#ifdef SINGLEPRECISION
+					//			   if (dif > 10.0E-7 || dif < -10.0E-7)
+					//#else
+					//			   if (dif > 10.0E-15 || dif < -10.0E-15)
+					//#endif
+					//			   {
+					//				   UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post)
+					//					   + " dif=" + UbSystem::toString(dif)
+					//					   + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+					//				   //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+					//				   //exit(EXIT_FAILURE);
+					//			   }
+					//#endif
+
+					if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post))
+						UB_THROW(UbException(
+							UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," +
+							UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+
+					//////////////////////////////////////////////////////////////////////////
+					//write distribution
+					//////////////////////////////////////////////////////////////////////////
+					(*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3)         = mfabb         ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3)         = mfbab         ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)         = mfbba         ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3)        = mfaab        ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3)       = mfcab       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3)        = mfaba        ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3)       = mfcba       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3)        = mfbaa        ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3)       = mfbca       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3)       = mfaaa       ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3)      = mfcaa      ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3)      = mfaca      ;//* rho * c1o3;
+					(*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3)     = mfcca     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3)     = mfcbb     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3)     = mfbcb     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p)     = mfbbc     ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3)   = mfccb   ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3)    = mfacb    ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p)   = mfcbc   ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p)    = mfabc    ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p)   = mfbcc   ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p)    = mfbac    ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p)  = mfacc  ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p)  = mfcac  ;//* rho * c1o3;
+					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p)   = mfaac   ;//* rho * c1o3;
+
+					(*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3;
+
+			
+					(*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3)         = mfhabb;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3)         = mfhbab;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3)         = mfhbba;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3)        = mfhaab;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3)       = mfhcab;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3)        = mfhaba;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3)       = mfhcba;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3)        = mfhbaa;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3)       = mfhbca;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3)       = mfhaaa;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3)      = mfhcaa;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3)      = mfhaca;//* rho * c1o3;
+					(*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3)     = mfhcca;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3)     = mfhcbb;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3)     = mfhbcb;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p)     = mfhbbc;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3)   = mfhccb;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3)    = mfhacb;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p)   = mfhcbc;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p)    = mfhabc;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p)   = mfhbcc;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p)    = mfhbac;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfhccc;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p)  = mfhacc;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p)  = mfhcac;//* rho * c1o3;
+					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p)   = mfhaac;//* rho * c1o3;
+
+					(*this->zeroDistributionsH2)(x1, x2, x3) = mfhbbb;// *rho* c1o3;
+
+																	// !Old Kernel
+/////////////////////  P H A S E - F I E L D   S O L V E R
+////////////////////////////////////////////
+/////CUMULANT PHASE-FIELD
+					LBMReal omegaD =1.0/( 3.0 * mob + 0.5);
+					{
+						mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+						mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+						mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+						mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+						mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+						mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+						mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+						mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+						mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+						mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+						mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+						mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+						mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+						mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+						mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+						mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+						mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+						mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+						mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+						mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+						mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+						mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+						mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+						mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
+						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+						//!
+						////////////////////////////////////////////////////////////////////////////////////
+						// second component
+						LBMReal concentration =
+							((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+								(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+								((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal oneMinusRho = c1- concentration;
+
+						LBMReal cx =
+							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+								(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+								(mfcbb - mfabb));
+						LBMReal cy =
+							((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+								(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+								(mfbcb - mfbab));
+						LBMReal cz =
+							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+								(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+								(mfbbc - mfbba));
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// calculate the square of velocities for this lattice node
+						LBMReal cx2 = cx * cx;
+						LBMReal cy2 = cy * cy;
+						LBMReal cz2 = cz * cz;
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
+						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+						//! see also Eq. (6)-(14) in \ref
+						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+						//!
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+						forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+						forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+						forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+						forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+						forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+						forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+						forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+						forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+						forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+						forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+						forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+						forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+						forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+						forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+						forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - experimental Cumulant ... to be published ... hopefully
+						//!
+
+						// linearized orthogonalization of 3rd order central moments
+						LBMReal Mabc = mfabc - mfaba * c1o3;
+						LBMReal Mbca = mfbca - mfbaa * c1o3;
+						LBMReal Macb = mfacb - mfaab * c1o3;
+						LBMReal Mcba = mfcba - mfaba * c1o3;
+						LBMReal Mcab = mfcab - mfaab * c1o3;
+						LBMReal Mbac = mfbac - mfbaa * c1o3;
+						// linearized orthogonalization of 5th order central moments
+						LBMReal Mcbc = mfcbc - mfaba * c1o9;
+						LBMReal Mbcc = mfbcc - mfbaa * c1o9;
+						LBMReal Mccb = mfccb - mfaab * c1o9;
+
+						//31.05.2022 addaptive mobility
+						//omegaD = c1 + (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) / (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration)) + fabs((1.0 - concentration) * (concentration)) * c1o6 * oneOverInterfaceScale+1.0e-200);
+						//omegaD = c2 * (concentration * (concentration - c1)) / (-c6 * (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) + (concentration * (concentration - c1))+1.0e-200);
+						// collision of 1st order moments
+						cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+							normX1 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale;
+						cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+							normX2 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale;
+						cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+							normX3 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale;
+
+						cx2 = cx * cx;
+						cy2 = cy * cy;
+						cz2 = cz * cz;
+
+						// equilibration of 2nd order moments
+						mfbba = zeroReal;
+						mfbab = zeroReal;
+						mfabb = zeroReal;
+
+						mfcaa = c1o3 * concentration;
+						mfaca = c1o3 * concentration;
+						mfaac = c1o3 * concentration;
+
+						// equilibration of 3rd order moments
+						Mabc = zeroReal;
+						Mbca = zeroReal;
+						Macb = zeroReal;
+						Mcba = zeroReal;
+						Mcab = zeroReal;
+						Mbac = zeroReal;
+						mfbbb = zeroReal;
+
+						// from linearized orthogonalization 3rd order central moments to central moments
+						mfabc = Mabc + mfaba * c1o3;
+						mfbca = Mbca + mfbaa * c1o3;
+						mfacb = Macb + mfaab * c1o3;
+						mfcba = Mcba + mfaba * c1o3;
+						mfcab = Mcab + mfaab * c1o3;
+						mfbac = Mbac + mfbaa * c1o3;
+
+						// equilibration of 4th order moments
+						mfacc = c1o9 * concentration;
+						mfcac = c1o9 * concentration;
+						mfcca = c1o9 * concentration;
+
+						mfcbb = zeroReal;
+						mfbcb = zeroReal;
+						mfbbc = zeroReal;
+
+						// equilibration of 5th order moments
+						Mcbc = zeroReal;
+						Mbcc = zeroReal;
+						Mccb = zeroReal;
+
+						// from linearized orthogonalization 5th order central moments to central moments
+						mfcbc = Mcbc + mfaba * c1o9;
+						mfbcc = Mbcc + mfbaa * c1o9;
+						mfccb = Mccb + mfaab * c1o9;
+
+						// equilibration of 6th order moment
+						mfccc = c1o27 * concentration;
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
+						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+						//! see also Eq. (88)-(96) in
+						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+						//!
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+						backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+						backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+						backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+						backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+						backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+						backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+						backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+						backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+						backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+						backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+						backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+						backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+						backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+						backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+						backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+
+
+						(*this->localDistributionsH1)(D3Q27System::ET_E,   x1,  x2,  x3) = mfabb;
+						(*this->localDistributionsH1)(D3Q27System::ET_N,   x1,  x2,  x3) = mfbab;
+						(*this->localDistributionsH1)(D3Q27System::ET_T,   x1,  x2,  x3) = mfbba;
+						(*this->localDistributionsH1)(D3Q27System::ET_NE,  x1,  x2,  x3) = mfaab;
+						(*this->localDistributionsH1)(D3Q27System::ET_NW,  x1p, x2,  x3) = mfcab;
+						(*this->localDistributionsH1)(D3Q27System::ET_TE,  x1,  x2,  x3) = mfaba;
+						(*this->localDistributionsH1)(D3Q27System::ET_TW,  x1p, x2,  x3) = mfcba;
+						(*this->localDistributionsH1)(D3Q27System::ET_TN,  x1,  x2,  x3) = mfbaa;
+						(*this->localDistributionsH1)(D3Q27System::ET_TS,  x1,  x2p, x3) = mfbca;
+						(*this->localDistributionsH1)(D3Q27System::ET_TNE, x1,  x2,  x3) = mfaaa;
+						(*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2,  x3) = mfcaa;
+						(*this->localDistributionsH1)(D3Q27System::ET_TSE, x1,  x2p, x3) = mfaca;
+						(*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_W,   x1p, x2,  x3 ) = mfcbb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_S,   x1,  x2p, x3 ) = mfbcb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_B,   x1,  x2,  x3p) = mfbbc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SW,  x1p, x2p, x3 ) = mfccb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SE,  x1,  x2p, x3 ) = mfacb;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BW,  x1p, x2,  x3p) = mfcbc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BE,  x1,  x2,  x3p) = mfabc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BS,  x1,  x2p, x3p) = mfbcc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BN,  x1,  x2,  x3p) = mfbac;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1,  x2p, x3p) = mfacc;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2,  x3p) = mfcac;
+						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1,  x2,  x3p) = mfaac;
+
+						(*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb;
+
+
+
+
+					}
+				}
+			}
+		}
+	}
+}
+//////////////////////////////////////////////////////////////////////////
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi()
+{
+	using namespace D3Q27System;
+	return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00]));
+}
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0]));
+}
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M]));
+}
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_rhoInv(LBMReal rhoL,LBMReal rhoDIV)
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((1.0/(rhoL+rhoDIV*phi[DIR_PPP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMM])) + (1.0 / (rhoL + rhoDIV * phi[DIR_PMM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPP]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PMP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPM])) + (1.0 / (rhoL + rhoDIV * phi[DIR_PPM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMP]))))
+		+ WEIGTH[DIR_PP0] * (((1.0 / (rhoL + rhoDIV * phi[DIR_P0P]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M0M])) + (1.0 / (rhoL + rhoDIV * phi[DIR_P0M]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M0P]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PM0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MP0])) + (1.0 / (rhoL + rhoDIV * phi[DIR_PP0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MM0]))))) +
+		+WEIGTH[DIR_0P0] * (1.0 / (rhoL + rhoDIV * phi[DIR_P00]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M00])));
+}
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_rhoInv(LBMReal rhoL,LBMReal rhoDIV)
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((1.0 / (rhoL + rhoDIV * phi[DIR_PPP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMM])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PMM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPP]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PPM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMP])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PMP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPM]))))
+		+ WEIGTH[DIR_PP0] * (((1.0 / (rhoL + rhoDIV * phi[DIR_0PP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0MM])) + (1.0 / (rhoL + rhoDIV * phi[DIR_0PM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0MP]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PP0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MM0])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PM0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MP0]))))) +
+		+WEIGTH[DIR_0P0] * (1.0 / (rhoL + rhoDIV * phi[DIR_0P0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0M0])));
+}
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_rhoInv(LBMReal rhoL, LBMReal rhoDIV)
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((1.0 / (rhoL + rhoDIV * phi[DIR_PPP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMM])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PMM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPP]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PMP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPM])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PPM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMP]))))
+		+ WEIGTH[DIR_PP0] * (((1.0 / (rhoL + rhoDIV * phi[DIR_P0P]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M0M])) - (1.0 / (rhoL + rhoDIV * phi[DIR_P0M]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M0P]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_0MP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0PM])) + (1.0 / (rhoL + rhoDIV * phi[DIR_0PP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0MM]))))) +
+		+WEIGTH[DIR_0P0] * (1.0 / (rhoL + rhoDIV * phi[DIR_00P]) - 1.0 / (rhoL + rhoDIV * phi[DIR_00M])));
+}
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00]));
+}
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0]));
+}
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M]));
+}
+
+LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::nabla2_phi()
+{
+	using namespace D3Q27System;
+	LBMReal sum = 0.0;
+	sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000])))
+		+ (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000]))));
+	sum += WEIGTH[DIR_0PP] * (
+			(((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000])))
+		+	(((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000])))
+		+	(((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000])))
+		);
+	sum += WEIGTH[DIR_00P] * (
+			((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000]))
+		+	((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000]))
+		+	((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000]))
+		);
+
+
+	return 6.0 * sum;
+}
+
+void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::computePhasefield()
+{
+	using namespace D3Q27System;
+	SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions();
+
+	int minX1 = ghostLayerWidth;
+	int minX2 = ghostLayerWidth;
+	int minX3 = ghostLayerWidth;
+	int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth;
+	int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth;
+	int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth;
+
+	//------------- Computing the phase-field ------------------
+	for (int x3 = minX3; x3 < maxX3; x3++) {
+		for (int x2 = minX2; x2 < maxX2; x2++) {
+			for (int x1 = minX1; x1 < maxX1; x1++) {
+				// if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3))
+				{
+					int x1p = x1 + 1;
+					int x2p = x2 + 1;
+					int x3p = x3 + 1;
+
+					h[DIR_P00]   = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+					h[DIR_0P0]   = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+					h[DIR_00P]   = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+					h[DIR_PP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+					h[DIR_MP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+					h[DIR_P0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+					h[DIR_M0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+					h[DIR_0PP]  = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+					h[DIR_0MP]  = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+					h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+					h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+					h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+					h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+					h[DIR_M00]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+					h[DIR_0M0]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+					h[DIR_00M]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+					h[DIR_MM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+					h[DIR_PM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+					h[DIR_M0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+					h[DIR_P0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+					h[DIR_0MM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+					h[DIR_0PM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+					h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+					h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+					h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+					h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+					h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3);
+				}
+			}
+		}
+	}
+}
+
+void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+	int x3)
+{
+	using namespace D3Q27System;
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	phi[DIR_000] = (*ph)(x1, x2, x3);
+
+
+	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+			phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+		} else {
+			//phi[k] = (*ph)(x1 , x2, x3 );// neutral wetting
+			phi[k] = 0.0;//unwetting
+		}
+	}
+}
+
+void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+	int x3)
+{
+	using namespace D3Q27System;
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	phi2[DIR_000] = (*ph)(x1, x2, x3);
+
+
+	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+			phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+		}
+		else {
+			phi2[k] = 0.05;
+		}
+	}
+}
+
+void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::swapDistributions()
+{
+	LBMKernel::swapDistributions();
+	dataSet->getHdistributions()->swap();
+	dataSet->getH2distributions()->swap();
+}
+
+void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initForcing()
+{
+	muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3);
+	muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3);
+	muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3);
+
+	muDeltaT = deltaT;
+
+	muForcingX1.DefineVar("dt", &muDeltaT);
+	muForcingX2.DefineVar("dt", &muDeltaT);
+	muForcingX3.DefineVar("dt", &muDeltaT);
+
+	muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
+
+	muForcingX1.DefineVar("nu", &muNu);
+	muForcingX2.DefineVar("nu", &muNu);
+	muForcingX3.DefineVar("nu", &muNu);
+
+	muForcingX1.DefineVar("rho",&muRho); 
+	muForcingX2.DefineVar("rho",&muRho); 
+	muForcingX3.DefineVar("rho",&muRho); 
+
+}
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp.old b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp.old
new file mode 100644
index 0000000000000000000000000000000000000000..2ab0e9df73c83b4de2b8824667452414f42dfa1d
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp.old
@@ -0,0 +1,3024 @@
+////=======================================================================================
+//// ____          ____    __    ______     __________   __      __       __        __
+//// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+////  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+////   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+////    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+////     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+////      \    \  |    |   ________________________________________________________________
+////       \    \ |    |  |  ______________________________________________________________|
+////        \    \|    |  |  |         __          __     __     __     ______      _______
+////         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+////          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+////           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+////            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+////
+////  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 MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp
+////! \ingroup LBMKernel
+////! \author M. Geier, K. Kutscher, Hesameddin Safari
+////=======================================================================================
+//
+//#include "MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h"
+//#include "BCArray3D.h"
+//#include "Block3D.h"
+//#include "D3Q27EsoTwist3DSplittedVector.h"
+//#include "D3Q27System.h"
+//#include "DataSet3D.h"
+//#include "LBMKernel.h"
+//#include <cmath>
+//#include <iostream>
+//#include <string>
+//
+//#define PROOF_CORRECTNESS
+//
+////////////////////////////////////////////////////////////////////////////
+//MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::MultiphaseSimpleVelocityBaseExternalPressureLBMKernel() { this->compressible = false; }
+////////////////////////////////////////////////////////////////////////////
+//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initDataSet()
+//{
+//	SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9));
+//	SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field
+//	SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9));
+//	SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D(            nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+//	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new  CbArray3D<LBMReal, IndexerX3X2X1>(    nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+//	pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+//	p1Old = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+//	dataSet->setFdistributions(f);
+//	dataSet->setHdistributions(h); // For phase-field
+//	dataSet->setH2distributions(h2);
+//	dataSet->setPhaseField(divU1);
+//	dataSet->setPressureField(pressure);
+//
+//	phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0));
+//	phaseFieldOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 999.0));
+//
+//	divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+//}
+////////////////////////////////////////////////////////////////////////////
+//SPtr<LBMKernel> MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::clone()
+//{
+//	SPtr<LBMKernel> kernel(new MultiphaseSimpleVelocityBaseExternalPressureLBMKernel());
+//	kernel->setNX(nx);
+//	dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initDataSet();
+//	kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG);
+//	kernel->setDensityRatio(this->densityRatio);
+//	kernel->setMultiphaseModelParameters(this->beta, this->kappa);
+//	kernel->setContactAngle(this->contactAngle);
+//	kernel->setPhiL(this->phiL);
+//	kernel->setPhiH(this->phiH);
+//	kernel->setPhaseFieldRelaxation(this->tauH);
+//	kernel->setMobility(this->mob);
+//	kernel->setInterfaceWidth(this->interfaceWidth);
+//
+//	kernel->setBCProcessor(bcProcessor->clone(kernel));
+//	kernel->setWithForcing(withForcing);
+//	kernel->setForcingX1(muForcingX1);
+//	kernel->setForcingX2(muForcingX2);
+//	kernel->setForcingX3(muForcingX3);
+//	kernel->setIndex(ix1, ix2, ix3);
+//	kernel->setDeltaT(deltaT);
+//	kernel->setGhostLayerWidth(2);
+//	dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initForcing();
+//
+//	return kernel;
+//}
+////////////////////////////////////////////////////////////////////////////
+//void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+//	using namespace UbMath;
+//	LBMReal m2 = mfa + mfc;
+//	LBMReal m1 = mfc - mfa;
+//	LBMReal m0 = m2 + mfb;
+//	mfa = m0;
+//	m0 *= Kinverse;
+//	m0 += oneMinusRho;
+//	mfb = (m1 * Kinverse - m0 * vv) * K;
+//	mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K;
+//}
+//
+//////////////////////////////////////////////////////////////////////////////////
+//void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+//	using namespace UbMath;
+//	LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K;
+//	LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K;
+//	mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K;
+//	mfa = m0;
+//	mfb = m1;
+//}
+//
+//
+//////////////////////////////////////////////////////////////////////////////////
+//void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+//	using namespace UbMath;
+//	LBMReal m1 = (mfa + mfc) + mfb;
+//	LBMReal m2 = mfc - mfa;
+//	mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2);
+//	mfb = m2 - vv * m1;
+//	mfa = m1;
+//}
+//
+//
+//void  MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+//	using namespace UbMath;
+//	LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2);
+//	LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv;
+//	mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2);
+//	mfb = mb;
+//	mfa = ma;
+//}
+//
+//
+//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::calculate(int step)
+//{
+//	using namespace D3Q27System;
+//	using namespace UbMath;
+//
+//	forcingX1 = 0.0;
+//	forcingX2 = 0.0;
+//	forcingX3 = 0.0;
+//
+//	LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5;
+//														 /////////////////////////////////////
+//
+//	localDistributionsF    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+//	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+//	zeroDistributionsF     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+//
+//	localDistributionsH1    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions();
+//	nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
+//	zeroDistributionsH1     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
+//
+//	localDistributionsH2    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getLocalDistributions();
+//	nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions();
+//	zeroDistributionsH2     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions();
+//
+//
+//	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
+//
+//	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+//
+//	const int bcArrayMaxX1 = (int)bcArray->getNX1();
+//	const int bcArrayMaxX2 = (int)bcArray->getNX2();
+//	const int bcArrayMaxX3 = (int)bcArray->getNX3();
+//
+//	int minX1 = ghostLayerWidth;
+//	int minX2 = ghostLayerWidth;
+//	int minX3 = ghostLayerWidth;
+//	int maxX1 = bcArrayMaxX1 - ghostLayerWidth;
+//	int maxX2 = bcArrayMaxX2 - ghostLayerWidth;
+//	int maxX3 = bcArrayMaxX3 - ghostLayerWidth;
+//	LBMReal omegaDRho = 1.0;// 1.25;// 1.3;
+//
+//	for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) {
+//		for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) {
+//			for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) {
+//				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+//					int x1p = x1 + 1;
+//					int x2p = x2 + 1;
+//					int x3p = x3 + 1;
+//
+//					LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+//					LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+//					LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+//					LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+//					LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+//					LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+//					LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+//					LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+//					LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+//					LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+//					LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+//					LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+//					LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+//					LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+//					LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+//					LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+//					LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+//					LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+//					LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+//					LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+//					LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+//					LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+//					LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+//					LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+//					LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+//					LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+//
+//					LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+//					(*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca)  + (mfcaa + mfacc))  ) +
+//						(((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) +
+//							((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) +
+//								(mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb;
+//					if ((*phaseField)(x1, x2, x3) > 1 ) {
+//						(*phaseField)(x1, x2, x3) = c1;
+//					}
+//
+//					if ((*phaseField)(x1, x2, x3) < 0) {
+//						(*phaseField)(x1, x2, x3) = 0;
+//					}
+//					////// read F-distributions for velocity formalism
+//
+//					mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+//					mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+//					mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+//					mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+//					mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+//					mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+//					mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+//					mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+//					mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+//					mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+//					mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+//					mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+//					mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+//					mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+//					mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+//					mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+//					mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+//					mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+//					mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+//					mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+//					mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+//					mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+//					mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+//					mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+//					mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+//					mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+//
+//					mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+//
+//					//LBMReal rhoH = 1.0;
+//					//LBMReal rhoL = 1.0 / densityRatio;
+//
+//					LBMReal rhoH = 1.0*densityRatio;
+//					LBMReal rhoL = 1.0;
+//
+//					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+//
+//					LBMReal drho = (((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))   )
+//						+ (((mfaab + mfccb) + (mfacb + mfcab) ) + ((mfaba + mfcbc) + (mfabc + mfcba) ) + ((mfbaa + mfbcc) + (mfbac + mfbca) )))
+//						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+//				
+//					omegaDRho = 2.0;// 1.5;
+//					drho *= omegaDRho;
+//					LBMReal keepDrho = drho;
+//					drho = ((*p1Old)(x1, x2, x3) + drho) * c1o2;
+//				//	drho = ((*p1Old)(x1, x2, x3)*c2o3 + drho*c1o3) ;
+//					(*p1Old)(x1, x2, x3) = keepDrho;
+//					
+//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); //Incompressible
+/////Density correction
+//					//LBMReal dX1_phi = gradX1_phi();
+//					//LBMReal dX2_phi = gradX2_phi();
+//					//LBMReal dX3_phi = gradX3_phi();
+//					//LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+//					//	(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+//					//	(mfcbb - mfabb)) ;
+//					//LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+//					//	(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+//					//	(mfbcb - mfbab)) ;
+//					//LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+//					//	(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+//					//	(mfbbc - mfbba)) ;
+//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressure)(x1, x2, x3); //explicit Compressible
+//					//(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho-(rhoH-rhoL)*(vvx*dX1_phi+vvy*dX2_phi+vvz*dX3_phi)*c1o3)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho);
+//					
+//					//(*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) - c1o3 * drho * ((*phaseField)(x1, x2, x3) * (rhoH - rhoL) + rhoL)) / (c1 - ((*phaseField)(x1, x2, x3) - c1) * drho);
+//					//LBMReal rho=rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3);
+//					//LBMReal tempDrho = drho;
+//					//drho = (drho*0.9 + (*pressureOld)(x1, x2, x3)*0.1) ;
+//					//(*pressureOld)(x1, x2, x3) = tempDrho;
+//
+//					//Mathematica
+//
+//					LBMReal rho = ((*pressure)(x1, x2, x3) - (*phaseField)(x1, x2, x3) * (*pressure)(x1, x2, x3) + c1o3 * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (c1o3 + c1o3 * drho * (-1 + (*phaseField)(x1, x2, x3)));
+//					(*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) + c1o3 * drho * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (1 + drho * (-1 + (*phaseField)(x1, x2, x3)));
+///////Full Filter
+//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH)+(one- (*phaseField)(x1, x2, x3))*three* (*pressure)(x1, x2, x3); //explicit Compressible
+//					//(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho);
+////// reduced Filter
+//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3); //explicit Compressible
+//					//(*pressure)(x1, x2, x3) = (((*pressureOld)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho);
+//
+//					//rho = (rho)/(one- (one - (*phaseField)(x1, x2, x3)) * drho); // now implicit Compressible
+//					
+//					//(*pressure)(x1, x2, x3) = (((*phaseField)(x1, x2, x3)) + ((*phaseField2)(x1, x2, x3)) - c1) * c1o3;
+//					////!!!!!! relplace by pointer swap!
+//					//(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3);
+//				}
+//			}
+//		}
+//	}
+//
+//	LBMReal collFactorM;
+//
+//	////Periodic Filter
+//	//for (int x3 = minX3-1; x3 <= maxX3; x3++) {
+//	//	for (int x2 = minX2-1; x2 <= maxX2; x2++) {
+//	//		for (int x1 = minX1-1; x1 <= maxX1; x1++) {
+//	//			if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+//
+//	//				LBMReal sum = 0.;
+//
+//	//				///Version for boundaries
+//	//				for (int xx = -1; xx <= 1; xx++) {
+//	//					//int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0;
+//	//					int xxx = xx + x1;
+//
+//	//					for (int yy = -1; yy <= 1; yy++) {
+//	//						//int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0;
+//	//						int yyy = yy + x2;
+//
+//	//						for (int zz = -1; zz <= 1; zz++) {
+//	//							//int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0;
+//	//							int zzz = zz + x3;
+//
+//	//							if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) {
+//	//								sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz);
+//	//							}
+//	//							else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3);
+//	//							}
+//
+//
+//	//						}
+//	//					}
+//	//				}
+//	//				(*pressure)(x1, x2, x3) = sum;
+//	//			}
+//	//		}
+//	//	}
+//	//}
+//
+//	////!filter
+//
+//	for (int x3 = minX3; x3 < maxX3; x3++) {
+//		for (int x2 = minX2; x2 < maxX2; x2++) {
+//			for (int x1 = minX1; x1 < maxX1; x1++) {
+//				if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+//					int x1p = x1 + 1;
+//					int x2p = x2 + 1;
+//					int x3p = x3 + 1;
+//
+//					//////////////////////////////////////////////////////////////////////////
+//					// Read distributions and phase field
+//					////////////////////////////////////////////////////////////////////////////
+//					//////////////////////////////////////////////////////////////////////////
+//
+//					// E   N  T
+//					// c   c  c
+//					//////////
+//					// W   S  B
+//					// a   a  a
+//
+//					// Rest ist b
+//
+//					// mfxyz
+//					// a - negative
+//					// b - null
+//					// c - positive
+//
+//					// a b c
+//					//-1 0 1
+//
+//					findNeighbors(phaseField, x1, x2, x3);
+//
+//					LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+//					LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+//					LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+//					LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+//					LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+//					LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+//					LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+//					LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+//					LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+//					LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+//					LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+//					LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+//					LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+//					LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+//					LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+//					LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+//					LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+//					LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+//					LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+//					LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+//					LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+//					LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+//					LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+//					LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+//					LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+//					LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+//
+//					LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+//
+//
+//					LBMReal mfhcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3);
+//					LBMReal mfhbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3);
+//					LBMReal mfhbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3);
+//					LBMReal mfhccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3);
+//					LBMReal mfhacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3);
+//					LBMReal mfhcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3);
+//					LBMReal mfhabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3);
+//					LBMReal mfhbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3);
+//					LBMReal mfhbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3);
+//					LBMReal mfhccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3);
+//					LBMReal mfhacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3);
+//					LBMReal mfhcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3);
+//					LBMReal mfhaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3);
+//					LBMReal mfhabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3);
+//					LBMReal mfhbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3);
+//					LBMReal mfhbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p);
+//					LBMReal mfhaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3);
+//					LBMReal mfhcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3);
+//					LBMReal mfhaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p);
+//					LBMReal mfhcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p);
+//					LBMReal mfhbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p);
+//					LBMReal mfhbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p);
+//					LBMReal mfhaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+//					LBMReal mfhcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p);
+//					LBMReal mfhaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p);
+//					LBMReal mfhcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p);
+//
+//					LBMReal mfhbbb = (*this->zeroDistributionsH2)(x1, x2, x3);
+//
+//					//LBMReal rhoH = 1.0;
+//					//LBMReal rhoL = 1.0 / densityRatio;
+//
+//					LBMReal rhoH = 1.0;
+//					LBMReal rhoL = 1.0/ densityRatio;
+//
+//					LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+//
+//					LBMReal dX1_phi = gradX1_phi();
+//					LBMReal dX2_phi = gradX2_phi();
+//					LBMReal dX3_phi = gradX3_phi();
+//
+//					LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9+1e-3;
+//					// 01.09.2022: unclear what value we have to add to the normal: lager values better cut of in gas phase?
+//					LBMReal normX1 = dX1_phi / denom;
+//					LBMReal normX2 = dX2_phi / denom;
+//					LBMReal normX3 = dX3_phi / denom;
+//
+//
+//
+//					collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[REST] - phiH) / (phiH - phiL);
+//
+//
+//					LBMReal mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi();
+//
+//					//----------- Calculating Macroscopic Values -------------
+//					LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH); //Incompressible
+//
+//																		///scaled phase field
+//					//LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) / ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) + (c1 - (*phaseField)(x1, x2, x3)) * (c1 - (*phaseField)(x1, x2, x3))) - phiH);
+//					///!scaled phase field
+//					
+//					//LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH)+(one-phi[REST])* (*pressure)(x1, x2, x3)*three; //compressible
+//					//LBMReal rho = rhoL + (rhoH - rhoL) * phi[REST] + (one - phi[REST]) * (*pressure)(x1, x2, x3) * three; //compressible
+//
+//					LBMReal m0, m1, m2;
+//					LBMReal rhoRef=c1;
+//
+//					LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+//						(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+//						(mfcbb - mfabb))/rhoRef;
+//					LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+//						(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+//						(mfbcb - mfbab))/rhoRef;
+//					LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+//						(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+//						(mfbbc - mfbba))/rhoRef;
+//					////Filter&Gradient merged
+//					LBMReal pressureHere = (*pressureOld)(x1, x2, x3);
+//					//LBMReal pressureHere = (*pressure)(x1, x2, x3);
+//
+//					LBMReal arrayP[3][3][3] = { {{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}},
+//												{{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}},
+//												{ {pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}} };
+//					//LBMReal LaplaceP = 0.0;
+//					//LaplaceP += WEIGTH[TNE] * (((((*pressureOld)(x1+1,x2+1,x3+1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 + 1) - pressureHere)))
+//					//	+ ((((*pressureOld)(x1 + 1, x2 - 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 + 1) - pressureHere))));
+//					//LaplaceP += WEIGTH[TN] * (
+//					//	((((*pressureOld)(x1 + 1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3) - pressureHere)))
+//					//	+ ((((*pressureOld)(x1 + 1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 -1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 + 1) - pressureHere)))
+//					//	+ ((((*pressureOld)(x1, x2 + 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 + 1) - pressureHere)))
+//					//	);
+//					//LaplaceP += WEIGTH[T] * (
+//					//	(((*pressureOld)(x1 + 1, x2, x3) - pressureHere) + ((*pressureOld)(x1, x2-1, x3) - pressureHere))
+//					//	+ (((*pressureOld)(x1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3) - pressureHere))
+//					//	+ (((*pressureOld)(x1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2, x3 - 1) - pressureHere))
+//					//	);
+//
+//					//LaplaceP= 6.0 * LaplaceP;
+//					
+//					//LBMReal sum = 0.0;
+//
+//					for (int dir1 = -1; dir1 <= 1; dir1++) {
+//						for (int dir2 = -1; dir2 <= 1; dir2++) {
+//							for (int dir3 = -1; dir3 <= 1; dir3++){
+//								int xxx = x1 + dir1;
+//								int yyy = x2 + dir2;
+//								int zzz = x3 + dir3;
+//								if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressureOld)(xxx, yyy, zzz);
+//								//if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressure)(xxx, yyy, zzz);
+//							//	sum += 64.0 / (216.0 * (c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)) * (c1 + c3 * abs(dir3))) * arrayP[dir1 + 1][dir2 + 1][dir3 + 1];
+//							}
+//						}
+//					}
+////					(*pressure)(x1, x2, x3) = sum;// *0.1 + (1.0 - 0.1) * (*pressureOld)(x1, x2, x3);
+//
+//
+//					(*pressure)(x1, x2, x3) = (((((arrayP[0][0][0] + arrayP[2][2][2]) + (arrayP[0][2][0] + arrayP[2][0][2])) + ((arrayP[2][0][0] + arrayP[0][2][2]) + (arrayP[2][2][0] + arrayP[0][0][2]))) * c1o216
+//						+ (((arrayP[0][0][1] + arrayP[2][2][1]) + (arrayP[0][1][0] + arrayP[2][1][2])) + ((arrayP[1][0][0] + arrayP[1][2][2]) + (arrayP[0][1][2] + arrayP[2][1][0])) + ((arrayP[1][0][2] + arrayP[1][2][0]) + (arrayP[0][2][1] + arrayP[2][0][1]))) * c1o54)
+//						+ ((arrayP[0][1][1] + arrayP[2][1][1]) + (arrayP[1][0][1] + arrayP[1][2][1]) + (arrayP[1][1][0] + arrayP[1][1][2])) * c2o27)
+//						+ arrayP[1][1][1] * c8o27;
+//					//LBMReal gradPx = 0.0;
+//					//LBMReal gradPy = 0.0;
+//					//LBMReal gradPz = 0.0;
+//					//for (int dir1 = -1; dir1 <= 1; dir1++) {
+//					//	for (int dir2 = -1; dir2 <= 1; dir2++) {
+//					//		gradPx -= arrayP[0][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		gradPx += arrayP[2][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//
+//
+//
+//					//		gradPy -= arrayP[dir1+1][0][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		gradPy += arrayP[dir1+1][2][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		
+//
+//					//		gradPz -= arrayP[dir1+1][dir2+1][0] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		gradPz += arrayP[dir1+1][dir2+1][2] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//	}
+//					//}
+//
+//					LBMReal gradPx = ((((arrayP[2][0][0] - arrayP[0][2][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72
+//						+ (((arrayP[2][1][0] - arrayP[0][1][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[2][0][1] - arrayP[0][2][1]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18)
+//						+ (arrayP[2][1][1] - arrayP[0][1][1]) * c2o9;
+//					LBMReal gradPy = ((((arrayP[0][2][0] - arrayP[2][0][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[0][2][2] - arrayP[2][0][0]))) * c1o72
+//						+ (((arrayP[1][2][0] - arrayP[1][0][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[0][2][1] - arrayP[2][0][1]) + (arrayP[1][2][2] - arrayP[1][0][0]))) * c1o18)
+//						+ (arrayP[1][2][1] - arrayP[1][0][1]) * c2o9;
+//					LBMReal gradPz = ((((arrayP[0][0][2] - arrayP[2][2][0]) + (arrayP[0][2][2] - arrayP[2][0][0])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72
+//						+ (((arrayP[0][1][2] - arrayP[2][1][0]) + (arrayP[1][2][2] - arrayP[1][0][0])) + ((arrayP[1][0][2] - arrayP[1][2][0]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18)
+//						+ (arrayP[1][1][2] - arrayP[1][1][0]) * c2o9;
+//
+//					//gradPx *=c1 - (*pressure)(x1, x2, x3)+pressureHere;
+//					//gradPy *=c1 - (*pressure)(x1, x2, x3) + pressureHere;
+//					//gradPz *=c1 - (*pressure)(x1, x2, x3) + pressureHere;
+//
+//					////!Filter&Gradient merged
+//					//LBMReal gradPx = 0.0;
+//					//LBMReal gradPy = 0.0;
+//					//LBMReal gradPz = 0.0;
+//					//for (int dir1 = -1; dir1 <= 1; dir1++) {
+//					//	for (int dir2 = -1; dir2 <= 1; dir2++) {
+//					//		int yyy = x2 + dir1;
+//					//		int zzz = x3 + dir2;
+//					//		if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) {
+//					//			gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//					//		else {
+//					//			gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//					//		if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) {
+//					//			gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//					//		else {
+//					//			gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//
+//					//		int xxx = x1 + dir1;
+//					//		if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) {
+//					//			gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//					//		else {
+//					//			gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//					//		if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) {
+//					//			gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//					//		else {
+//					//			gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//
+//					//		yyy = x2 + dir2;
+//					//		if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) {
+//					//			gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//					//		else {
+//					//			gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//					//		if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) {
+//					//			gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//					//		else {
+//					//			gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+//					//		}
+//
+//					//	}
+//					//}
+//
+//					//Viscosity increase by phase field residuum
+//					//LBMReal errPhi = (((1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale)- denom);
+//					//LBMReal limVis = 0.01;// 0.0000001 * 10;//0.01;
+//					// collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM);
+//					// collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM;
+//					//errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi;
+//					//collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis);
+//
+//					//3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW])))
+//					//+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) +
+//					//+WEIGTH[N] * (phi2[T] - phi2[B]));
+//
+//					muRho = rho;
+//
+//					////external pressure
+//					//forcingX1 =/* muForcingX1.Eval()/rho */- gradPx/rho;
+//					//forcingX2 =/* muForcingX2.Eval()/rho */- gradPy/rho;
+//					//forcingX3 =/* muForcingX3.Eval()/rho */- gradPz/rho;
+//
+//					///////////////////////////////////////////////
+//
+//					//LBMReal pBefore = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+//					//	+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+//					//	+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
+//					//pBefore = -c1o3 * (-1.0e-10)/((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) );
+//					////if (vvx * vvx + vvy * vvy + vvz * vvz > 1.0e-100) {
+//					//	mfabb -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[E] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfbab -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[N] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfbba -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[T] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfaab -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[NE] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfcab -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[NW] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfaba -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TE] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfcba -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TW] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfbaa -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TN] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfbca -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TS] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfaaa -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TNE] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfcaa -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TNW] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfaca -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TSE] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfcca -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TSW] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfcbb -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[W] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfbcb -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[S] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfbbc -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[B] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfccb -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[SW] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfacb -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[SE] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfcbc -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BW] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfabc -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BE] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfbcc -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BS] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfbac -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BN] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfccc -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BSW] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfacc -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BSE] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfcac -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BNW] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfaac -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BNE] * (rhoH - rhoL) / (phiH - phiL)));
+//					//	mfbbb -= pBefore * 8.0 / 9.0;
+//					//}
+//
+//					///////////////////////////////////////////////
+//
+//					LBMReal pStarStart = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+//						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+//						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
+//
+//					/////////////////////
+//					//LBMReal vvxh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) +
+//					//	(((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) +
+//					//	(mfhcbb - mfhabb)) / rhoRef;
+//					//LBMReal vvyh = ((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) +
+//					//	(((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) +
+//					//	(mfhbcb - mfhbab)) / rhoRef;
+//					//LBMReal vvzh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) +
+//					//	(((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) +
+//					//	(mfhbbc - mfhbba)) / rhoRef;
+//
+//					//LBMReal deltaPP = 0*(vvxh * dX1_phi + vvyh * dX2_phi + vvzh * dX3_phi) * rhoToPhi / (rho);
+//					//mfhbcb += c1o6* c2o9  * deltaPP;
+//					//mfhbbc += c1o6* c2o9  * deltaPP;
+//					//mfhcbb += c1o6* c2o9  * deltaPP;
+//					//mfhccb += c1o6* c1o18 * deltaPP;
+//					//mfhacb += c1o6* c1o18 * deltaPP;
+//					//mfhcbc += c1o6* c1o18 * deltaPP;
+//					//mfhabc += c1o6* c1o18 * deltaPP;
+//					//mfhbcc += c1o6* c1o18 * deltaPP;
+//					//mfhbac += c1o6* c1o18 * deltaPP;
+//					//mfhccc += c1o6* c1o72 * deltaPP;
+//					//mfhacc += c1o6* c1o72 * deltaPP;
+//					//mfhcac += c1o6* c1o72 * deltaPP;
+//					//mfhaac += c1o6* c1o72 * deltaPP;
+//					//mfhabb += c1o6* c2o9  * deltaPP;
+//					//mfhbab += c1o6* c2o9  * deltaPP;
+//					//mfhbba += c1o6* c2o9  * deltaPP;
+//					//mfhaab += c1o6* c1o18 * deltaPP;
+//					//mfhcab += c1o6* c1o18 * deltaPP;
+//					//mfhaba += c1o6* c1o18 * deltaPP;
+//					//mfhcba += c1o6* c1o18 * deltaPP;
+//					//mfhbaa += c1o6* c1o18 * deltaPP;
+//					//mfhbca += c1o6* c1o18 * deltaPP;
+//					//mfhaaa += c1o6* c1o72 * deltaPP;
+//					//mfhcaa += c1o6* c1o72 * deltaPP;
+//					//mfhaca += c1o6* c1o72 * deltaPP;
+//					//mfhcca += c1o6* c1o72 * deltaPP;
+//					//mfhbbb += c1o6* c4 * c2o9 * deltaPP;
+//
+//					//////////////////////
+//
+//					/////Recovering the origin distributions
+//					//LBMReal mfStartcbb = mfcbb ;
+//					//LBMReal mfStartbcb = mfbcb ;
+//					//LBMReal mfStartbbc = mfbbc ;
+//					//LBMReal mfStartccb = mfccb ;
+//					//LBMReal mfStartacb = mfacb ;
+//					//LBMReal mfStartcbc = mfcbc ;
+//					//LBMReal mfStartabc = mfabc ;
+//					//LBMReal mfStartbcc = mfbcc ;
+//					//LBMReal mfStartbac = mfbac ;
+//					//LBMReal mfStartccc = mfccc ;
+//					//LBMReal mfStartacc = mfacc ;
+//					//LBMReal mfStartcac = mfcac ;
+//					//LBMReal mfStartaac = mfaac ;
+//					//LBMReal mfStartabb = mfabb ;
+//					//LBMReal mfStartbab = mfbab ;
+//					//LBMReal mfStartbba = mfbba ;
+//					//LBMReal mfStartaab = mfaab ;
+//					//LBMReal mfStartcab = mfcab ;
+//					//LBMReal mfStartaba = mfaba ;
+//					//LBMReal mfStartcba = mfcba ;
+//					//LBMReal mfStartbaa = mfbaa ;
+//					//LBMReal mfStartbca = mfbca ;
+//					//LBMReal mfStartaaa = mfaaa ;
+//					//LBMReal mfStartcaa = mfcaa ;
+//					//LBMReal mfStartaca = mfaca ;
+//					//LBMReal mfStartcca = mfcca ;
+//					//LBMReal mfStartbbb = mfbbb ;
+//
+//
+//						mfcbb += mfhcbb /rho;
+//						mfbcb += mfhbcb /rho;
+//						mfbbc += mfhbbc /rho;
+//						mfccb += mfhccb /rho;
+//						mfacb += mfhacb /rho;
+//						mfcbc += mfhcbc /rho;
+//						mfabc += mfhabc /rho;
+//						mfbcc += mfhbcc /rho;
+//						mfbac += mfhbac /rho;
+//						mfccc += mfhccc /rho;
+//						mfacc += mfhacc /rho;
+//						mfcac += mfhcac /rho;
+//						mfaac += mfhaac /rho;
+//						mfabb += mfhabb /rho;
+//						mfbab += mfhbab /rho;
+//						mfbba += mfhbba /rho;
+//						mfaab += mfhaab /rho;
+//						mfcab += mfhcab /rho;
+//						mfaba += mfhaba /rho;
+//						mfcba += mfhcba /rho;
+//						mfbaa += mfhbaa /rho;
+//						mfbca += mfhbca /rho;
+//						mfaaa += mfhaaa /rho;
+//						mfcaa += mfhcaa /rho;
+//						mfaca += mfhaca /rho;
+//						mfcca += mfhcca /rho;
+//						mfbbb += mfhbbb /rho;
+//
+//
+//
+//					//Abbas
+//					LBMReal pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+//						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+//						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
+//					//22.09.22 not yet in balance, repaire here
+//					LBMReal ppStar = ((((((mfhaaa + mfhccc) + (mfhaac + mfhcca)) + ((mfhcac + mfhaca) + (mfhcaa + mfhacc)))*c3
+//						+ (((mfhaab + mfhccb) + (mfhacb + mfhcab)) + ((mfhaba + mfhcbc) + (mfhabc + mfhcba)) + ((mfhbaa + mfhbcc) + (mfhbac + mfhbca))))*c2
+//						+ ((mfhabb + mfhcbb) + (mfhbab + mfhbcb) + (mfhbba + mfhbbc))) ) * c1o3/rho;
+//	
+//					ppStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) * c3
+//						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) * c2
+//						+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc)))) * c1o3 ;
+//
+//					//(*phaseFieldOld)(x1, x2, x3) = ((*phaseFieldOld)(x1, x2, x3) > 99.0) ? phi[REST] : (*phaseFieldOld)(x1, x2, x3);
+//					//LBMReal dtPhi = phi[REST] - (*phaseFieldOld)(x1, x2, x3);
+//					//LBMReal deltaP = -pStar * (c1 - rho / (rho + c1o2 * rhoToPhi * dtPhi));// -pStar * pStar * pStar * 1.0e-4 * rho * rho * rho;
+//					//LBMReal deltaP = pStar * (c1 - mfhbbb*rho) * c1o2;//Explicit
+//					//LBMReal deltaP = pStar * (c1 - mfhbbb * rho) / (c1 + mfhbbb * rho);//Semi-Implicit
+//					//(*phaseFieldOld)(x1, x2, x3) = phi[REST];
+//
+//					//mfabb += c2o9 *deltaP;
+//					//mfbab += c2o9 *deltaP;
+//					//mfbba += c2o9 *deltaP;
+//					//mfaab += c1o18*deltaP;
+//					//mfcab += c1o18*deltaP;
+//					//mfaba += c1o18*deltaP;
+//					//mfcba += c1o18*deltaP;
+//					//mfbaa += c1o18*deltaP;
+//					//mfbca += c1o18*deltaP;
+//					//mfaaa += c1o72*deltaP;
+//					//mfcaa += c1o72*deltaP;
+//					//mfaca += c1o72*deltaP;
+//					//mfcca += c1o72*deltaP;
+//					//mfcbb += c2o9 *deltaP;
+//					//mfbcb += c2o9 *deltaP;
+//					//mfbbc += c2o9 *deltaP;
+//					//mfccb += c1o18*deltaP;
+//					//mfacb += c1o18*deltaP;
+//					//mfcbc += c1o18*deltaP;
+//					//mfabc += c1o18*deltaP;
+//					//mfbcc += c1o18*deltaP;
+//					//mfbac += c1o18*deltaP;
+//					//mfccc += c1o72*deltaP;
+//					//mfacc += c1o72*deltaP;
+//					//mfcac += c1o72*deltaP;
+//					//mfaac += c1o72*deltaP;
+//
+//					//pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+//					//	+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+//					//	+ ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3;
+//
+//
+//
+//
+//					//mfabb -= c1o2 * c2o9 *pStar*(phi[REST]-phi[E  ])*rhoToPhi/rho;
+//					//mfbab -= c1o2 * c2o9 *pStar*(phi[REST]-phi[N  ])*rhoToPhi/rho;
+//					//mfbba -= c1o2 * c2o9 *pStar*(phi[REST]-phi[T  ])*rhoToPhi/rho;
+//					//mfaab -= c1o2 * c1o18*pStar*(phi[REST]-phi[NE ])*rhoToPhi/rho;
+//					//mfcab -= c1o2 * c1o18*pStar*(phi[REST]-phi[NW ])*rhoToPhi/rho;
+//					//mfaba -= c1o2 * c1o18*pStar*(phi[REST]-phi[TE ])*rhoToPhi/rho;
+//					//mfcba -= c1o2 * c1o18*pStar*(phi[REST]-phi[TW ])*rhoToPhi/rho;
+//					//mfbaa -= c1o2 * c1o18*pStar*(phi[REST]-phi[TN ])*rhoToPhi/rho;
+//					//mfbca -= c1o2 * c1o18*pStar*(phi[REST]-phi[TS ])*rhoToPhi/rho;
+//					//mfaaa -= c1o2 * c1o72*pStar*(phi[REST]-phi[TNE])*rhoToPhi/rho;
+//					//mfcaa -= c1o2 * c1o72*pStar*(phi[REST]-phi[TNW])*rhoToPhi/rho;
+//					//mfaca -= c1o2 * c1o72*pStar*(phi[REST]-phi[TSE])*rhoToPhi/rho;
+//					//mfcca -= c1o2 * c1o72*pStar*(phi[REST]-phi[TSW])*rhoToPhi/rho;
+//					//mfcbb -= c1o2 * c2o9 *pStar*(phi[REST]-phi[W  ])*rhoToPhi/rho;
+//					//mfbcb -= c1o2 * c2o9 *pStar*(phi[REST]-phi[S  ])*rhoToPhi/rho;
+//					//mfbbc -= c1o2 * c2o9 *pStar*(phi[REST]-phi[B  ])*rhoToPhi/rho;
+//					//mfccb -= c1o2 * c1o18*pStar*(phi[REST]-phi[SW ])*rhoToPhi/rho;
+//					//mfacb -= c1o2 * c1o18*pStar*(phi[REST]-phi[SE ])*rhoToPhi/rho;
+//					//mfcbc -= c1o2 * c1o18*pStar*(phi[REST]-phi[BW ])*rhoToPhi/rho;
+//					//mfabc -= c1o2 * c1o18*pStar*(phi[REST]-phi[BE ])*rhoToPhi/rho;
+//					//mfbcc -= c1o2 * c1o18*pStar*(phi[REST]-phi[BS ])*rhoToPhi/rho;
+//					//mfbac -= c1o2 * c1o18*pStar*(phi[REST]-phi[BN ])*rhoToPhi/rho;
+//					//mfccc -= c1o2 * c1o72*pStar*(phi[REST]-phi[BSW])*rhoToPhi/rho;
+//					//mfacc -= c1o2 * c1o72*pStar*(phi[REST]-phi[BSE])*rhoToPhi/rho;
+//					//mfcac -= c1o2 * c1o72*pStar*(phi[REST]-phi[BNW])*rhoToPhi/rho;
+//					//mfaac -= c1o2 * c1o72*pStar*(phi[REST]-phi[BNE])*rhoToPhi/rho;
+//
+//
+//					//forcingX1 =/* muForcingX1.Eval() / rho*/ - pStar * dX1_phi * rhoToPhi / rho;
+//					//forcingX2 =/* muForcingX2.Eval() / rho*/ - pStar * dX2_phi * rhoToPhi / rho;
+//					//forcingX3 =/* muForcingX3.Eval() / rho*/ - pStar * dX3_phi * rhoToPhi / rho;
+//
+//
+//					//mfabb += (-forcingX1) * c2o9;
+//					//mfbab += (-forcingX2) * c2o9;
+//					//mfbba += (-forcingX3) * c2o9;
+//					//mfaab += (-forcingX1 - forcingX2) * c1o16;
+//					//mfcab += (forcingX1 - forcingX2) * c1o16;
+//					//mfaba += (-forcingX1 - forcingX3) * c1o16;
+//					//mfcba += (forcingX1 - forcingX3) * c1o16;
+//					//mfbaa += (-forcingX2 - forcingX3) * c1o16;
+//					//mfbca += (forcingX2 - forcingX3) * c1o16;
+//					//mfaaa += (-forcingX1 - forcingX2 - forcingX3) * c1o72;
+//					//mfcaa += (forcingX1 - forcingX2 - forcingX3) * c1o72;
+//					//mfaca += (-forcingX1 + forcingX2 - forcingX3) * c1o72;
+//					//mfcca += (forcingX1 + forcingX2 - forcingX3) * c1o72;
+//					//mfcbb += (forcingX1)*c2o9;
+//					//mfbcb += (forcingX2)*c2o9;
+//					//mfbbc += (forcingX3)*c2o9;
+//					//mfccb += (forcingX1 + forcingX2) * c1o16;
+//					//mfacb += (-forcingX1 + forcingX2) * c1o16;
+//					//mfcbc += (forcingX1 + forcingX3) * c1o16;
+//					//mfabc += (-forcingX1 + forcingX3) * c1o16;
+//					//mfbcc += (forcingX2 + forcingX3) * c1o16;
+//					//mfbac += (-forcingX2 + forcingX3) * c1o16;
+//					//mfccc += (forcingX1 + forcingX2 + forcingX3) * c1o72;
+//					//mfacc += (-forcingX1 + forcingX2 + forcingX3) * c1o72;
+//					//mfcac += (forcingX1 - forcingX2 + forcingX3) * c1o72;
+//					//mfaac += (-forcingX1 - forcingX2 + forcingX3) * c1o72;
+//
+//					LBMReal saveForceX1 = forcingX1;
+//					LBMReal saveForceX2 = forcingX2;
+//					LBMReal saveForceX3 = forcingX3;
+//
+//					 vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+//						(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+//						(mfcbb - mfabb)) / rhoRef;
+//					 vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+//						(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+//						(mfbcb - mfbab)) / rhoRef;
+//					 vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+//						(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+//						(mfbbc - mfbba)) / rhoRef;
+//
+//
+//					 LBMReal dRhoInvX = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) +
+//						 (((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) +
+//						 (mfhcbb - mfhabb)));
+//					 LBMReal dRhoInvY = -(((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) +
+//						 (((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) +
+//						 (mfhbcb - mfhbab)));
+//					 LBMReal dRhoInvZ = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) +
+//						 (((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) +
+//						 (mfhbbc - mfhbba)));
+//
+//
+//					 forcingX1 = 0.0;
+//					 forcingX2 = 0.0;
+//					 forcingX3 = 0.0;
+//					//!Abbas
+//					//LBMReal dX1_rhoInv = gradX1_rhoInv(rhoL, rhoH - rhoL);
+//					//LBMReal dX2_rhoInv = gradX2_rhoInv(rhoL, rhoH - rhoL);
+//					//LBMReal dX3_rhoInv = gradX3_rhoInv(rhoL, rhoH - rhoL);
+//					//forcingX1 =/* muForcingX1.Eval() / rho*/ +pStar * dX1_rhoInv * rho;
+//					//forcingX2 =/* muForcingX2.Eval() / rho*/ +pStar * dX2_rhoInv * rho;
+//					//forcingX3 =/* muForcingX3.Eval() / rho*/ +pStar * dX3_rhoInv * rho;
+//
+//					//forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho + pStar * dX1_rhoInv * rho) *c1o2;
+//					//forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho + pStar * dX2_rhoInv * rho) *c1o2;
+//					//forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho + pStar * dX3_rhoInv * rho) *c1o2;
+//					 LBMReal FdX1_phi = normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
+//					 LBMReal FdX2_phi = normX2 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
+//					 LBMReal FdX3_phi = normX3 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
+//
+//
+//					//forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho ) ;
+//					//forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho ) ;
+//					//forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho ) ;
+//
+//					//forcingX1 = (pStar * dRhoInvX* rho *c3) ;
+//					//forcingX2 = (pStar * dRhoInvY* rho *c3) ;
+//					//forcingX3 = (pStar * dRhoInvZ* rho *c3) ;
+//					//if (phi[REST] > 0.1 && phi[REST] < 0.9) std::cout << phi[REST] << " " << dX1_phi * rhoToPhi / rho << " " << dRhoInvX * rho *3<< std::endl;
+//					//LBMReal forcingX1ALTERNAT = ( pStar * dX1_rhoInv * rho) ;
+//					//LBMReal forcingX2ALTERNAT = ( pStar * dX2_rhoInv * rho) ;
+//					//LBMReal forcingX3ALTERNAT = ( pStar * dX3_rhoInv * rho) ;
+//
+//					//forcingX1 = (fabs(vvx + c1o2 * forcingX1) < fabs(vvx + c1o2 * forcingX1ALTERNAT)) ? forcingX1 : forcingX1ALTERNAT;
+//					//forcingX2 = (fabs(vvy + c1o2 * forcingX2) < fabs(vvy + c1o2 * forcingX2ALTERNAT)) ? forcingX2 : forcingX2ALTERNAT;
+//					//forcingX3 = (fabs(vvz + c1o2 * forcingX3) < fabs(vvz + c1o2 * forcingX3ALTERNAT)) ? forcingX3 : forcingX3ALTERNAT;
+//
+//					//	 forcingX1 = -pStar * rhoToPhi / rho * normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
+//					//	 forcingX2 = -pStar * rhoToPhi / rho * normX2 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
+//					//	 forcingX3 = -pStar * rhoToPhi / rho * normX3 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale;
+//
+//					//forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho *(c1- phi[REST]) + pStar * dX1_rhoInv * rho*(phi[REST]));
+//					//forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho *(c1- phi[REST]) + pStar * dX2_rhoInv * rho*(phi[REST]));
+//					//forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho *(c1- phi[REST]) + pStar * dX3_rhoInv * rho*(phi[REST]));
+//						 //if (phi[REST] > 0.3 && phi[REST] < 0.7)
+//						 //{
+//							// int test = 1;
+//							// std::cout << phi[REST] <<" "<< dX1_phi <<" "<< normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale<<" "<< normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale/ dX1_phi<< std::endl;
+//						 //}
+//
+//
+//
+//					 //LBMReal scaleGrad = c2 * phi[REST] * (1.0 - phi[REST]) / ((phi[REST] * phi[REST] + (1.0 - phi[REST]) * (1.0 - phi[REST])) * (phi[REST] * phi[REST] + (1.0 - phi[REST]) * (1.0 - phi[REST])));
+//					 //dX1_phi *= scaleGrad;
+//					 //dX2_phi *= scaleGrad;
+//					 //dX3_phi *= scaleGrad;
+//
+//					 ///Experimental interface sharpening force 20.06.2022
+//
+//					 LBMReal scaleSharpener = 1.0;
+//					 //forcingX1 += scaleSharpener * (FdX1_phi - dX1_phi) * fabsf(FdX1_phi - dX1_phi)  / rho;
+//					 //forcingX2 += scaleSharpener * (FdX2_phi - dX2_phi) * fabsf(FdX2_phi - dX2_phi)  / rho;
+//					 //forcingX3 += scaleSharpener * (FdX3_phi - dX3_phi) * fabsf(FdX3_phi - dX3_phi)  / rho;
+//					///surface tension force
+//					forcingX1 += mu * dX1_phi/rho;
+//					forcingX2 += mu * dX2_phi/rho;
+//					forcingX3 += mu * dX3_phi/rho;
+//
+//					LBMReal forcingBIAS = 0.5;
+//					forcingX1 += muForcingX1.Eval() / rho;//*phi[REST];
+//					forcingX2 += muForcingX2.Eval() / rho;// * phi[REST];
+//					forcingX3 += muForcingX3.Eval() / rho;// * phi[REST];
+//
+//				//	//19.08.2022
+//					//vvx += vvxh / rho * c1o2;
+//					//vvy += vvyh / rho * c1o2;
+//					//vvz += vvzh / rho * c1o2;
+//				//	//
+//
+//
+//					vvx += (forcingX1) * deltaT * c1o2;
+//					vvy += (forcingX2) * deltaT * c1o2;
+//					vvz += (forcingX3) * deltaT * c1o2;
+//
+//					//vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT *  c1o2; // X
+//					//vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT *  c1o2; // Y
+//					//vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT *  c1o2; // Z
+//
+//
+//
+//				//	vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT * forcingBIAS; // X
+//				//	vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT * forcingBIAS; // Y
+//				//	vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT * forcingBIAS; // Z
+//
+//
+//
+//					//Abbas
+//					LBMReal M200 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+//						+ (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) ))
+//						+ ((mfabb + mfcbb))) );
+//					LBMReal M020 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+//						+ (((mfaab + mfccb) + (mfacb + mfcab))  + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+//						+ ( (mfbab + mfbcb) )) );
+//					LBMReal M002 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)))
+//						+ ( + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca))))
+//						+ ( (mfbba + mfbbc))));
+//
+//					LBMReal M110 = ((((((mfaaa + mfccc) + (-mfcac - mfaca)) + ((mfaac + mfcca) + (-mfcaa -mfacc)))
+//						+ (((mfaab + mfccb) + (-mfacb - mfcab))   ))
+//						) );
+//					LBMReal M101 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ((mfcac + mfaca) - (mfcaa + mfacc)))
+//						+ (((mfaba + mfcbc) + (-mfabc - mfcba))))
+//						));
+//					LBMReal M011 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ( (mfcaa + mfacc)- (mfcac + mfaca)))
+//						+ (((mfbaa + mfbcc) + (-mfbac - mfbca))))
+//						));
+//					LBMReal vvxI = vvx;
+//					LBMReal vvyI = vvy;
+//					LBMReal vvzI = vvz;
+//
+//					LBMReal collFactorStore=collFactorM;
+//					LBMReal stress;
+//					//for(int iter=0;iter<5;iter++)
+//				 //{
+//					//	LBMReal OxxPyyPzz = 1.0;
+//					//	LBMReal mxxPyyPzz = (M200-vvxI*vvxI) + (M020-vvyI*vvyI) + (M002-vvzI*vvzI);
+//					//	//pStar = mxxPyyPzz * c1o3;
+//					//mxxPyyPzz -= c3 *pStar;
+//
+//					//LBMReal mxxMyy = (M200-vvxI*vvxI) - (M020-vvyI*vvyI);
+//					//LBMReal mxxMzz = (M200-vvxI*vvxI) - (M002-vvzI*vvzI);
+//					//LBMReal mxy = M110 - vvxI * vvyI;
+//					//LBMReal mxz = M101 - vvxI * vvzI;
+//					//LBMReal myz = M011 - vvyI * vvzI;
+//
+//
+//					//mxxMyy *= c1 - collFactorM * c1o2;
+//					//mxxMzz *= c1 - collFactorM * c1o2;
+//					//mxy *= c1 - collFactorM * c1o2;
+//					//mxz *= c1 - collFactorM * c1o2;
+//					//myz *= c1 - collFactorM * c1o2;
+//					//mxxPyyPzz *= c1 - OxxPyyPzz * c1o2;
+//					////mxxPyyPzz = mxxPyyPzz*fabs(mxxPyyPzz)/(1.0e-6+fabs(mxxPyyPzz));
+//					////mxxPyyPzz += c3 * pStar;
+//					//LBMReal mxx = (mxxMyy + mxxMzz + mxxPyyPzz)*c1o3;
+//					//LBMReal myy = (-c2*mxxMyy + mxxMzz + mxxPyyPzz)*c1o3;
+//					//LBMReal mzz = (mxxMyy -c2* mxxMzz + mxxPyyPzz) * c1o3;
+//					//vvxI = vvx - (mxx * dX1_phi + mxy * dX2_phi + mxz * dX3_phi) * rhoToPhi / (rho);
+//					//vvyI = vvy - (mxy * dX1_phi + myy * dX2_phi + myz * dX3_phi) * rhoToPhi / (rho);
+//					//vvzI = vvz - (mxz * dX1_phi + myz * dX2_phi + mzz * dX3_phi) * rhoToPhi / (rho);
+//
+//
+//				////	vvzI = vvz + (mxz * dRhoInvX + myz * dRhoInvY + mzz * dRhoInvZ) *  (rho)*c3;
+//				////	vvxI = vvx + (mxx * dRhoInvX + mxy * dRhoInvY + mxz * dRhoInvZ) *  (rho)*c3;
+//				////	vvyI = vvy + (mxy * dRhoInvX + myy * dRhoInvY + myz * dRhoInvZ) *  (rho)*c3;
+//
+//
+//				//	//LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
+//				//	//
+//				//	//LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy;
+//				//	//LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz;
+//				//	//LBMReal Dxy = -three * collFactorM * mxy;
+//				//	//LBMReal Dxz = -three * collFactorM * mxz;
+//				//	//LBMReal Dyz = -three * collFactorM * myz;
+//				//	////LBMReal stress = sqrt(sqrt((dyuy+dxux+dzuz)* (dyuy + dxux + dzuz))) * sqrt(forcingX1 * forcingX1 + forcingX2 * forcingX2 + forcingX3 * forcingX3);
+//				//	// stress = sqrt(dyuy * dyuy + dxux * dxux + dzuz*dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz)*sqrt(forcingX1*forcingX1+forcingX2*forcingX2+forcingX3*forcingX3);
+//				//	////collFactorM = collFactorStore + (1.75 - collFactorStore) * stress / (stress + 1.0e-8);
+//				//	//
+//				//	//LBMReal dX2_rho = (rhoToPhi)*dX2_phi;
+//				//	//LBMReal dX1_rho = (rhoToPhi)*dX1_phi;
+//				//	//LBMReal dX3_rho = (rhoToPhi)*dX3_phi;
+//				//	////vvxI= vvx+ c1o6 * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
+//				//	////vvyI= vvy+ c1o6 * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
+//				//	////vvzI= vvz+ c1o6 * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
+//
+//				//	//vvxI = vvx + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
+//				//	//vvyI = vvy + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
+//				//	//vvzI = vvz + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
+//
+//				//	////vvxI = vvx - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rhoInv + Dxy * dX2_rhoInv + Dxz * dX3_rhoInv);
+//				//	////vvyI = vvy - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rhoInv + 2 * dyuy * dX2_rhoInv + Dyz * dX3_rhoInv);
+//				//	////vvzI = vvz - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rhoInv + Dyz * dX2_rhoInv + 2 * dyuy * dX3_rhoInv);
+//
+//
+//					//}
+//				//	//forcingX1+=(vvxI-vvx)/(deltaT* forcingBIAS) + muForcingX1.Eval() / rho;
+//				//	//forcingX2 += (vvyI - vvy) / (deltaT * forcingBIAS) + muForcingX2.Eval() / rho;
+//				//	//forcingX3 += (vvzI - vvz) / (deltaT * forcingBIAS) + muForcingX3.Eval() / rho;
+//
+//
+//				////	forcingX1 += c2 * (vvxI - vvx);
+//				////	forcingX2 += c2 * (vvyI - vvy);
+//				////	forcingX3 += c2 * (vvzI - vvz);
+//
+//
+//					//mfabb += c1o2*(-forcingX1) * c2o9;
+//					//mfbab += c1o2*(-forcingX2) * c2o9;
+//					//mfbba += c1o2*(-forcingX3) * c2o9;
+//					//mfaab += c1o2*(-forcingX1 - forcingX2) * c1o18;
+//					//mfcab += c1o2*( forcingX1 - forcingX2) * c1o18;
+//					//mfaba += c1o2*(-forcingX1 - forcingX3) * c1o18;
+//					//mfcba += c1o2*( forcingX1 - forcingX3) * c1o18;
+//					//mfbaa += c1o2*(-forcingX2 - forcingX3) * c1o18;
+//					//mfbca += c1o2*( forcingX2 - forcingX3) * c1o18;
+//					//mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72;
+//					//mfcaa += c1o2*(forcingX1 - forcingX2 - forcingX3) * c1o72;
+//					//mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72;
+//					//mfcca += c1o2*(forcingX1 + forcingX2 - forcingX3) * c1o72;
+//					//mfcbb += c1o2*(forcingX1)*c2o9;
+//					//mfbcb += c1o2*(forcingX2)*c2o9;
+//					//mfbbc += c1o2*(forcingX3)*c2o9;
+//					//mfccb += c1o2*( forcingX1 + forcingX2) * c1o18;
+//					//mfacb += c1o2*(-forcingX1 + forcingX2) * c1o18;
+//					//mfcbc += c1o2*( forcingX1 + forcingX3) * c1o18;
+//					//mfabc += c1o2*(-forcingX1 + forcingX3) * c1o18;
+//					//mfbcc += c1o2*( forcingX2 + forcingX3) * c1o18;
+//					//mfbac += c1o2*(-forcingX2 + forcingX3) * c1o18;
+//					//mfccc += c1o2*(forcingX1 + forcingX2 + forcingX3) * c1o72;
+//					//mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72;
+//					//mfcac += c1o2*(forcingX1 - forcingX2 + forcingX3) * c1o72;
+//					//mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72;
+//
+//
+//					//forcingX1 = saveForceX1;
+//					//forcingX2 = saveForceX2;
+//					//forcingX3 = saveForceX3;
+//					vvx = vvxI;
+//					vvy = vvyI;
+//					vvz = vvzI;
+//
+//
+//
+//					//!Abbas
+//
+//					LBMReal vx2;
+//					LBMReal vy2;
+//					LBMReal vz2;
+//					vx2 = vvx * vvx;
+//					vy2 = vvy * vvy;
+//					vz2 = vvz * vvz;
+//					//pStar =ppStar- (vx2 + vy2 + vz2)*pStar;
+//				//	pStar = (pStar + ppStar)*c1o2;
+//					///////////////////////////////////////////////////////////////////////////////////////////               
+//					LBMReal oMdrho;
+//					///////////////
+//						//mfabb -= pStar * c2o9;
+//						//mfbab -= pStar * c2o9;
+//						//mfbba -= pStar * c2o9;
+//						//mfaab -= pStar * c1o16;
+//						//mfcab -= pStar * c1o16;
+//						//mfaba -= pStar * c1o16;
+//						//mfcba -= pStar * c1o16;
+//						//mfbaa -= pStar * c1o16;
+//						//mfbca -= pStar * c1o16;
+//						//mfaaa -= pStar * c1o72;
+//						//mfcaa -= pStar * c1o72;
+//						//mfaca -= pStar * c1o72;
+//						//mfcca -= pStar * c1o72;
+//						//mfcbb -= pStar * c2o9;
+//						//mfbcb -= pStar * c2o9;
+//						//mfbbc -= pStar * c2o9;
+//						//mfccb -= pStar * c1o16;
+//						//mfacb -= pStar * c1o16;
+//						//mfcbc -= pStar * c1o16;
+//						//mfabc -= pStar * c1o16;
+//						//mfbcc -= pStar * c1o16;
+//						//mfbac -= pStar * c1o16;
+//						//mfccc -= pStar * c1o72;
+//						//mfacc -= pStar * c1o72;
+//						//mfcac -= pStar * c1o72;
+//						//mfaac -= pStar * c1o72;
+//						//mfbbb -= pStar * 8.0/9.0;
+//					///////////////////
+//
+//					oMdrho = mfccc + mfaaa;
+//					m0 = mfaca + mfcac;
+//					m1 = mfacc + mfcaa;
+//					m2 = mfaac + mfcca;
+//					oMdrho += m0;
+//					m1 += m2;
+//					oMdrho += m1;
+//					m0 = mfbac + mfbca;
+//					m1 = mfbaa + mfbcc;
+//					m0 += m1;
+//					m1 = mfabc + mfcba;
+//					m2 = mfaba + mfcbc;
+//					m1 += m2;
+//					m0 += m1;
+//					m1 = mfacb + mfcab;
+//					m2 = mfaab + mfccb;
+//					m1 += m2;
+//					m0 += m1;
+//					oMdrho += m0;
+//					m0 = mfabb + mfcbb;
+//					m1 = mfbab + mfbcb;
+//					m2 = mfbba + mfbbc;
+//					m0 += m1 + m2;
+//					m0 += mfbbb; //hat gefehlt
+//					oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!!
+//
+//															 ////////////////////////////////////////////////////////////////////////////////////
+//					LBMReal wadjust;
+//					LBMReal qudricLimit = 0.01 / (c1 + 1.0e4 * phi[REST] * (c1 - phi[REST])); //LBMReal qudricLimit = 0.01;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					//Hin
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// Z - Dir
+//					m2 = mfaaa + mfaac;
+//					m1 = mfaac - mfaaa;
+//					m0 = m2 + mfaab;
+//					mfaaa = m0;
+//					m0 += c1o36 * oMdrho;
+//					mfaab = m1 - m0 * vvz;
+//					mfaac = m2 - 2. * m1 * vvz + vz2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfaba + mfabc;
+//					m1 = mfabc - mfaba;
+//					m0 = m2 + mfabb;
+//					mfaba = m0;
+//					m0 += c1o9 * oMdrho;
+//					mfabb = m1 - m0 * vvz;
+//					mfabc = m2 - 2. * m1 * vvz + vz2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfaca + mfacc;
+//					m1 = mfacc - mfaca;
+//					m0 = m2 + mfacb;
+//					mfaca = m0;
+//					m0 += c1o36 * oMdrho;
+//					mfacb = m1 - m0 * vvz;
+//					mfacc = m2 - 2. * m1 * vvz + vz2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfbaa + mfbac;
+//					m1 = mfbac - mfbaa;
+//					m0 = m2 + mfbab;
+//					mfbaa = m0;
+//					m0 += c1o9 * oMdrho;
+//					mfbab = m1 - m0 * vvz;
+//					mfbac = m2 - 2. * m1 * vvz + vz2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfbba + mfbbc;
+//					m1 = mfbbc - mfbba;
+//					m0 = m2 + mfbbb;
+//					mfbba = m0;
+//					m0 += c4o9 * oMdrho;
+//					mfbbb = m1 - m0 * vvz;
+//					mfbbc = m2 - 2. * m1 * vvz + vz2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfbca + mfbcc;
+//					m1 = mfbcc - mfbca;
+//					m0 = m2 + mfbcb;
+//					mfbca = m0;
+//					m0 += c1o9 * oMdrho;
+//					mfbcb = m1 - m0 * vvz;
+//					mfbcc = m2 - 2. * m1 * vvz + vz2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfcaa + mfcac;
+//					m1 = mfcac - mfcaa;
+//					m0 = m2 + mfcab;
+//					mfcaa = m0;
+//					m0 += c1o36 * oMdrho;
+//					mfcab = m1 - m0 * vvz;
+//					mfcac = m2 - 2. * m1 * vvz + vz2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfcba + mfcbc;
+//					m1 = mfcbc - mfcba;
+//					m0 = m2 + mfcbb;
+//					mfcba = m0;
+//					m0 += c1o9 * oMdrho;
+//					mfcbb = m1 - m0 * vvz;
+//					mfcbc = m2 - 2. * m1 * vvz + vz2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfcca + mfccc;
+//					m1 = mfccc - mfcca;
+//					m0 = m2 + mfccb;
+//					mfcca = m0;
+//					m0 += c1o36 * oMdrho;
+//					mfccb = m1 - m0 * vvz;
+//					mfccc = m2 - 2. * m1 * vvz + vz2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// Y - Dir
+//					m2 = mfaaa + mfaca;
+//					m1 = mfaca - mfaaa;
+//					m0 = m2 + mfaba;
+//					mfaaa = m0;
+//					m0 += c1o6 * oMdrho;
+//					mfaba = m1 - m0 * vvy;
+//					mfaca = m2 - 2. * m1 * vvy + vy2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfaab + mfacb;
+//					m1 = mfacb - mfaab;
+//					m0 = m2 + mfabb;
+//					mfaab = m0;
+//					mfabb = m1 - m0 * vvy;
+//					mfacb = m2 - 2. * m1 * vvy + vy2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfaac + mfacc;
+//					m1 = mfacc - mfaac;
+//					m0 = m2 + mfabc;
+//					mfaac = m0;
+//					m0 += c1o18 * oMdrho;
+//					mfabc = m1 - m0 * vvy;
+//					mfacc = m2 - 2. * m1 * vvy + vy2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfbaa + mfbca;
+//					m1 = mfbca - mfbaa;
+//					m0 = m2 + mfbba;
+//					mfbaa = m0;
+//					m0 += c2o3 * oMdrho;
+//					mfbba = m1 - m0 * vvy;
+//					mfbca = m2 - 2. * m1 * vvy + vy2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfbab + mfbcb;
+//					m1 = mfbcb - mfbab;
+//					m0 = m2 + mfbbb;
+//					mfbab = m0;
+//					mfbbb = m1 - m0 * vvy;
+//					mfbcb = m2 - 2. * m1 * vvy + vy2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfbac + mfbcc;
+//					m1 = mfbcc - mfbac;
+//					m0 = m2 + mfbbc;
+//					mfbac = m0;
+//					m0 += c2o9 * oMdrho;
+//					mfbbc = m1 - m0 * vvy;
+//					mfbcc = m2 - 2. * m1 * vvy + vy2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfcaa + mfcca;
+//					m1 = mfcca - mfcaa;
+//					m0 = m2 + mfcba;
+//					mfcaa = m0;
+//					m0 += c1o6 * oMdrho;
+//					mfcba = m1 - m0 * vvy;
+//					mfcca = m2 - 2. * m1 * vvy + vy2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfcab + mfccb;
+//					m1 = mfccb - mfcab;
+//					m0 = m2 + mfcbb;
+//					mfcab = m0;
+//					mfcbb = m1 - m0 * vvy;
+//					mfccb = m2 - 2. * m1 * vvy + vy2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfcac + mfccc;
+//					m1 = mfccc - mfcac;
+//					m0 = m2 + mfcbc;
+//					mfcac = m0;
+//					m0 += c1o18 * oMdrho;
+//					mfcbc = m1 - m0 * vvy;
+//					mfccc = m2 - 2. * m1 * vvy + vy2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// X - Dir
+//					m2 = mfaaa + mfcaa;
+//					m1 = mfcaa - mfaaa;
+//					m0 = m2 + mfbaa;
+//					mfaaa = m0;
+//					m0 += 1. * oMdrho;
+//					mfbaa = m1 - m0 * vvx;
+//					mfcaa = m2 - 2. * m1 * vvx + vx2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfaba + mfcba;
+//					m1 = mfcba - mfaba;
+//					m0 = m2 + mfbba;
+//					mfaba = m0;
+//					mfbba = m1 - m0 * vvx;
+//					mfcba = m2 - 2. * m1 * vvx + vx2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfaca + mfcca;
+//					m1 = mfcca - mfaca;
+//					m0 = m2 + mfbca;
+//					mfaca = m0;
+//					m0 += c1o3 * oMdrho;
+//					mfbca = m1 - m0 * vvx;
+//					mfcca = m2 - 2. * m1 * vvx + vx2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfaab + mfcab;
+//					m1 = mfcab - mfaab;
+//					m0 = m2 + mfbab;
+//					mfaab = m0;
+//					mfbab = m1 - m0 * vvx;
+//					mfcab = m2 - 2. * m1 * vvx + vx2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfabb + mfcbb;
+//					m1 = mfcbb - mfabb;
+//					m0 = m2 + mfbbb;
+//					mfabb = m0;
+//					mfbbb = m1 - m0 * vvx;
+//					mfcbb = m2 - 2. * m1 * vvx + vx2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfacb + mfccb;
+//					m1 = mfccb - mfacb;
+//					m0 = m2 + mfbcb;
+//					mfacb = m0;
+//					mfbcb = m1 - m0 * vvx;
+//					mfccb = m2 - 2. * m1 * vvx + vx2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfaac + mfcac;
+//					m1 = mfcac - mfaac;
+//					m0 = m2 + mfbac;
+//					mfaac = m0;
+//					m0 += c1o3 * oMdrho;
+//					mfbac = m1 - m0 * vvx;
+//					mfcac = m2 - 2. * m1 * vvx + vx2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfabc + mfcbc;
+//					m1 = mfcbc - mfabc;
+//					m0 = m2 + mfbbc;
+//					mfabc = m0;
+//					mfbbc = m1 - m0 * vvx;
+//					mfcbc = m2 - 2. * m1 * vvx + vx2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m2 = mfacc + mfccc;
+//					m1 = mfccc - mfacc;
+//					m0 = m2 + mfbcc;
+//					mfacc = m0;
+//					m0 += c1o9 * oMdrho;
+//					mfbcc = m1 - m0 * vvx;
+//					mfccc = m2 - 2. * m1 * vvx + vx2 * m0;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// Cumulants
+//					////////////////////////////////////////////////////////////////////////////////////
+//
+//					// mfaaa = 0.0;
+//					LBMReal OxxPyyPzz = 1.0; //omega2 or bulk viscosity
+//											//  LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+//											//  LBMReal OxyyMxzz  = 1.;//2+s9;//
+//					LBMReal O4 = 1.;
+//					LBMReal O5 = 1.;
+//					LBMReal O6 = 1.;
+//
+//					//collFactorM+= (1.7 - collFactorM) * fabs(mfaaa) / (fabs(mfaaa) + 0.001f);
+//
+//
+//					/////fourth order parameters; here only for test. Move out of loop!
+//
+//					LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0)));
+//					LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
+//				    LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
+//					LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+//					//FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::B' )
+//					LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+//					//LBMReal stress = 1.0;// stress / (stress + 1.0e-10);
+//					stress = 1.0;
+//					//OxyyPxzz += stress*(1.0-OxyyPxzz);
+//					//OxyyPxzz = c3 * (collFactorM - c2) / (collFactorM - c3);
+//					//OxyyMxzz += stress*(1.0-OxyyMxzz);
+//					//Oxyz +=  stress*(1.0-Oxyz);
+//					//A *= 1.0-stress;
+//					//BB *= 1.0-stress;
+//
+//					//Cum 4.
+//					//LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+//					//LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+//					//LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+//
+//					LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+//					LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+//					LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+//
+//					LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+//					LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+//					LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+//
+//					//Cum 5.
+//					LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+//					LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+//					LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+//
+//					//Cum 6.
+//					LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb
+//						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+//						- 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+//						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+//						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+//							+ 2. * (mfcaa * mfaca * mfaac)
+//							+ 16. * mfbba * mfbab * mfabb)
+//						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+//						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+//						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+//							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho;
+//
+//					//2.
+//					// linear combinations
+//					LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+//					//pStar = (mxxPyyPzz+vx2+vy2+vz2) * c1o3;//does not work
+//					//pStar = (mxxPyyPzz) * c1o3;
+//					//pStar = pStar + 1.5 * (mxxPyyPzz * c1o3 - pStar);
+//					//mfaaa = mxxPyyPzz;
+//					//  LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho));
+//					mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa
+//										//mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa
+//					LBMReal mxxMyy = mfcaa - mfaca;
+//					LBMReal mxxMzz = mfcaa - mfaac;
+//
+//					///
+//					LBMReal mmfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+//					LBMReal mmfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+//					LBMReal mmfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+//					LBMReal mmfabb = mfabb;
+//					LBMReal mmfbab = mfbab;
+//					LBMReal mmfbba = mfbba;
+//					///
+//
+//					LBMReal dxux =  -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz)*0;
+//					//LBMReal dxux = -c1o2 * (mxxMyy + mxxMzz) * collFactorM - mfaaa * c1o3* omegaDRho;
+//					LBMReal dyuy =  dxux + collFactorM * c3o2 * mxxMyy;
+//					LBMReal dzuz =  dxux + collFactorM * c3o2 * mxxMzz;
+//					LBMReal Dxy = -three * collFactorM * mfbba;
+//					LBMReal Dxz = -three * collFactorM * mfbab;
+//					LBMReal Dyz = -three * collFactorM * mfabb;
+////					// attempt to improve implicit  stress computation by fixed iteration
+////					LBMReal dX2_rho = (rhoToPhi)*dX2_phi;
+////					LBMReal dX1_rho = (rhoToPhi)*dX1_phi;
+////					LBMReal dX3_rho = (rhoToPhi)*dX3_phi;
+////
+////						LBMReal dfx= c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
+////						LBMReal dfy = c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
+////						LBMReal dfz = c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
+////
+////						for (int iteration = 0; iteration < 5; iteration++) {
+////							mxxMyy = (mfcaa - dfx * dfx * c1o2) - (mfaca - dfy * dfy * c1o2);
+////							mxxMzz = (mfcaa - dfx * dfx * c1o2) - (mfaac - dfz * dfz * c1o2);
+////						}
+///////end fixed iteration
+////
+//
+//
+//					//relax
+//					mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+//					mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy);
+//					mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz);
+//
+//					mfabb += collFactorM * (-mfabb);
+//					mfbab += collFactorM * (-mfbab);
+//					mfbba += collFactorM * (-mfbba);
+//
+//					//if (fabsf(mfaaa + (dxux + dyuy + dzuz) > 1e-9)){
+//					//	std::cout << mfaaa <<" "<< (dxux + dyuy + dzuz)<< std::endl;
+//					//}
+//
+//
+//					////updated pressure
+//					//mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
+//					//mfaaa *= (one-omegaDRho);// (mfaaa + (dxux + dyuy + dzuz)) * .5; // Pressure elimination as in standard velocity model
+//								 //  mfaaa += (rho - c1) * (dxux + dyuy + dzuz);
+//				
+//					mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa
+//
+//										// mxxPyyPzz += (mfaaa + mfaaaS) * c1o2;
+//										//mfaaa = mfaaaS;
+//										// linear combinations back
+//					mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+//					mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+//					mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+//
+//					//3.
+//					// linear combinations
+//					LBMReal mxxyPyzz = mfcba + mfabc;
+//					LBMReal mxxyMyzz = mfcba - mfabc;
+//
+//					LBMReal mxxzPyyz = mfcab + mfacb;
+//					LBMReal mxxzMyyz = mfcab - mfacb;
+//
+//					LBMReal mxyyPxzz = mfbca + mfbac;
+//					LBMReal mxyyMxzz = mfbca - mfbac;
+//
+//					 mmfcaa += c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz- mfaaa);
+//					 mmfaca += c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz- mfaaa);
+//					 mmfaac += c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz- mfaaa);
+//					 mmfabb += mfabb;
+//					 mmfbab += mfbab;
+//					 mmfbba += mfbba;
+//
+//					//relax
+//					wadjust = Oxyz + (1. - Oxyz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+//					mfbbb += wadjust * (-mfbbb);
+//					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+//					mxxyPyzz += wadjust * (-mxxyPyzz);
+//					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+//					mxxyMyzz += wadjust * (-mxxyMyzz);
+//					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+//					mxxzPyyz += wadjust * (-mxxzPyyz);
+//					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+//					mxxzMyyz += wadjust * (-mxxzMyyz);
+//					wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+//					mxyyPxzz += wadjust * (-mxyyPxzz);
+//					wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+//					mxyyMxzz += wadjust * (-mxyyMxzz);
+//
+//					// linear combinations back
+//					mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+//					mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+//					mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+//					mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+//					mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+//					mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+//
+//					//4.
+//					CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc);
+//					CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac);
+//					CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca);
+//					CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc);
+//					CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb);
+//					CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb);
+//
+//					//5.
+//					CUMbcc += O5 * (-CUMbcc);
+//					CUMcbc += O5 * (-CUMcbc);
+//					CUMccb += O5 * (-CUMccb);
+//
+//					//6.
+//					CUMccc += O6 * (-CUMccc);
+//
+//					//back cumulants to central moments
+//					//4.
+//					//mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+//					//mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+//					//mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+//
+//					mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+//					mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+//					mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+//
+//					mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+//					mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+//					mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+//
+//					//5.
+//					mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+//					mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+//					mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+//
+//					//6.
+//					mfccc = CUMccc - ((-4. * mfbbb * mfbbb
+//						- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+//						- 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+//						- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+//						+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+//							+ 2. * (mfcaa * mfaca * mfaac)
+//							+ 16. * mfbba * mfbab * mfabb)
+//						- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+//						- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+//						+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+//							+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho;
+//
+//
+//					////////
+//
+//
+//					////////////////////////////////////////////////////////////////////////////////////
+//					//forcing
+//					mfbaa = -mfbaa;// *(c1 - forcingBIAS) / forcingBIAS;
+//					mfaba = -mfaba;// *(c1 - forcingBIAS) / forcingBIAS;
+//					mfaab = -mfaab;// *(c1 - forcingBIAS) / forcingBIAS;
+//
+//					//mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho);
+//					//mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho);
+//					//mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho);
+//
+//					mfbaa -= c1o2 * rhoToPhi * (mmfcaa* dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho);
+//					mfaba -= c1o2 * rhoToPhi * (mmfbba* dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho);
+//					mfaab -= c1o2 * rhoToPhi * (mmfbab* dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho);
+//					
+//					vvx -= c1o4 * rhoToPhi * (mmfcaa * dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho);
+//					vvy -= c1o4 * rhoToPhi * (mmfbba * dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho);
+//					vvz -= c1o4 * rhoToPhi * (mmfbab * dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho);
+//
+//					vx2 = vvx * vvx;
+//					vy2 = vvy * vvy;
+//					vz2 = vvz * vvz;
+//
+//					//mmfcaa =0;// c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz - mfaaa);
+//					//mmfaca =0;// c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz - mfaaa);
+//					//mmfaac =0;// c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz - mfaaa);
+//					//mmfabb =0;// mfabb;
+//					//mmfbab =0;// mfbab;
+//					//mmfbba =0;// mfbba;
+//
+//
+//					//////////////////////////////////////////////////////////////////////////////////////
+//					//grad Rho
+//					//LBMReal dX1_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX1_phi - phi[REST] * three * gradPx;
+//					//LBMReal dX2_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX2_phi - phi[REST] * three * gradPy;
+//					//LBMReal dX3_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX3_phi - phi[REST] * three * gradPz;
+//
+//					//LBMReal dX2_rho = (rhoToPhi ) * dX2_phi ;
+//					//LBMReal dX1_rho = (rhoToPhi ) * dX1_phi ;
+//					//LBMReal dX3_rho = (rhoToPhi ) * dX3_phi ;
+//					///////////////////////////////////////////////////////////////////////////////////////
+//					//mfbaa += c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho);
+//					//mfaba += c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho);
+//					//mfaab += c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho);
+//					
+//					///////Fakhari pressure correction
+//					//mfbaa -= mfaaa / rho * dX1_rho*c1o3;
+//					//mfaba -= mfaaa / rho * dX2_rho*c1o3;
+//					//mfaab -= mfaaa / rho * dX3_rho*c1o3;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					//back
+//					////////////////////////////////////////////////////////////////////////////////////
+//					//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// Z - Dir
+//					m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
+//					m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2;
+//					m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+//					mfaaa = m0;
+//					mfaab = m1;
+//					mfaac = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+//					m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2);
+//					m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+//					mfaba = m0;
+//					mfabb = m1;
+//					mfabc = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+//					m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2;
+//					m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+//					mfaca = m0;
+//					mfacb = m1;
+//					mfacc = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+//					m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2);
+//					m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+//					mfbaa = m0;
+//					mfbab = m1;
+//					mfbac = m2;
+//					/////////b//////////////////////////////////////////////////////////////////////////
+//					m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+//					m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2);
+//					m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+//					mfbba = m0;
+//					mfbbb = m1;
+//					mfbbc = m2;
+//					/////////b//////////////////////////////////////////////////////////////////////////
+//					m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+//					m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2);
+//					m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+//					mfbca = m0;
+//					mfbcb = m1;
+//					mfbcc = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+//					m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2;
+//					m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+//					mfcaa = m0;
+//					mfcab = m1;
+//					mfcac = m2;
+//					/////////c//////////////////////////////////////////////////////////////////////////
+//					m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+//					m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2);
+//					m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+//					mfcba = m0;
+//					mfcbb = m1;
+//					mfcbc = m2;
+//					/////////c//////////////////////////////////////////////////////////////////////////
+//					m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+//					m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2;
+//					m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+//					mfcca = m0;
+//					mfccb = m1;
+//					mfccc = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// Y - Dir
+//					m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+//					m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2;
+//					m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+//					mfaaa = m0;
+//					mfaba = m1;
+//					mfaca = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+//					m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2;
+//					m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+//					mfaab = m0;
+//					mfabb = m1;
+//					mfacb = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+//					m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2;
+//					m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+//					mfaac = m0;
+//					mfabc = m1;
+//					mfacc = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+//					m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2);
+//					m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+//					mfbaa = m0;
+//					mfbba = m1;
+//					mfbca = m2;
+//					/////////b//////////////////////////////////////////////////////////////////////////
+//					m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+//					m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2);
+//					m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+//					mfbab = m0;
+//					mfbbb = m1;
+//					mfbcb = m2;
+//					/////////b//////////////////////////////////////////////////////////////////////////
+//					m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+//					m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2);
+//					m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+//					mfbac = m0;
+//					mfbbc = m1;
+//					mfbcc = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+//					m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2;
+//					m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+//					mfcaa = m0;
+//					mfcba = m1;
+//					mfcca = m2;
+//					/////////c//////////////////////////////////////////////////////////////////////////
+//					m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+//					m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2;
+//					m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+//					mfcab = m0;
+//					mfcbb = m1;
+//					mfccb = m2;
+//					/////////c//////////////////////////////////////////////////////////////////////////
+//					m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+//					m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2;
+//					m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+//					mfcac = m0;
+//					mfcbc = m1;
+//					mfccc = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+//					////////////////////////////////////////////////////////////////////////////////////
+//					// X - Dir
+//					m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+//					m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2;
+//					m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+//					mfaaa = m0;
+//					mfbaa = m1;
+//					mfcaa = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//					m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2;
+//					m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//					mfaba = m0;
+//					mfbba = m1;
+//					mfcba = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+//					m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2;
+//					m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+//					mfaca = m0;
+//					mfbca = m1;
+//					mfcca = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//					m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2;
+//					m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//					mfaab = m0;
+//					mfbab = m1;
+//					mfcab = m2;
+//					///////////b////////////////////////////////////////////////////////////////////////
+//					m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//					m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2;
+//					m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//					mfabb = m0;
+//					mfbbb = m1;
+//					mfcbb = m2;
+//					///////////b////////////////////////////////////////////////////////////////////////
+//					m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//					m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2;
+//					m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//					mfacb = m0;
+//					mfbcb = m1;
+//					mfccb = m2;
+//					////////////////////////////////////////////////////////////////////////////////////
+//					////////////////////////////////////////////////////////////////////////////////////
+//					m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+//					m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2;
+//					m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+//					mfaac = m0;
+//					mfbac = m1;
+//					mfcac = m2;
+//					///////////c////////////////////////////////////////////////////////////////////////
+//					m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//					m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2;
+//					m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//					mfabc = m0;
+//					mfbbc = m1;
+//					mfcbc = m2;
+//					///////////c////////////////////////////////////////////////////////////////////////
+//					m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+//					m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2;
+//					m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+//					mfacc = m0;
+//					mfbcc = m1;
+//					mfccc = m2;
+//					/////SimpleForce
+//
+//					//mfabb += c2o9 * deltaP;
+//					//mfbab += c2o9 * deltaP;
+//					//mfbba += c2o9 * deltaP;
+//					//mfaab += c1o18 * deltaP;
+//					//mfcab += c1o18 * deltaP;
+//					//mfaba += c1o18 * deltaP;
+//					//mfcba += c1o18 * deltaP;
+//					//mfbaa += c1o18 * deltaP;
+//					//mfbca += c1o18 * deltaP;
+//					//mfaaa += c1o72 * deltaP;
+//					//mfcaa += c1o72 * deltaP;
+//					//mfaca += c1o72 * deltaP;
+//					//mfcca += c1o72 * deltaP;
+//					//mfcbb += c2o9 * deltaP;
+//					//mfbcb += c2o9 * deltaP;
+//					//mfbbc += c2o9 * deltaP;
+//					//mfccb += c1o18 * deltaP;
+//					//mfacb += c1o18 * deltaP;
+//					//mfcbc += c1o18 * deltaP;
+//					//mfabc += c1o18 * deltaP;
+//					//mfbcc += c1o18 * deltaP;
+//					//mfbac += c1o18 * deltaP;
+//					//mfccc += c1o72 * deltaP;
+//					//mfacc += c1o72 * deltaP;
+//					//mfcac += c1o72 * deltaP;
+//					//mfaac += c1o72 * deltaP;
+//
+//					//mfabb += c1o2*(-forcingX1                        ) * c2o9;
+//					//mfbab += c1o2*(           - forcingX2            ) * c2o9;
+//					//mfbba += c1o2*(                       - forcingX3) * c2o9;
+//					//mfaab += c1o2*(-forcingX1 - forcingX2            ) * c1o18;
+//					//mfcab += c1o2*( forcingX1 - forcingX2            ) * c1o18;
+//					//mfaba += c1o2*(-forcingX1             - forcingX3) * c1o18;
+//					//mfcba += c1o2*( forcingX1             - forcingX3) * c1o18;
+//					//mfbaa += c1o2*(           - forcingX2 - forcingX3) * c1o18;
+//					//mfbca += c1o2*(             forcingX2 - forcingX3) * c1o18;
+//					//mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72;
+//					//mfcaa += c1o2*( forcingX1 - forcingX2 - forcingX3) * c1o72;
+//					//mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72;
+//					//mfcca += c1o2*( forcingX1 + forcingX2 - forcingX3) * c1o72;
+//					//mfcbb += c1o2*( forcingX1                        ) * c2o9;
+//					//mfbcb += c1o2*(             forcingX2            ) * c2o9;
+//					//mfbbc += c1o2*(                         forcingX3) * c2o9;
+//					//mfccb += c1o2*( forcingX1 + forcingX2            ) * c1o18;
+//					//mfacb += c1o2*(-forcingX1 + forcingX2            ) * c1o18;
+//					//mfcbc += c1o2*( forcingX1             + forcingX3) * c1o18;
+//					//mfabc += c1o2*(-forcingX1             + forcingX3) * c1o18;
+//					//mfbcc += c1o2*(             forcingX2 + forcingX3) * c1o18;
+//					//mfbac += c1o2*(           - forcingX2 + forcingX3) * c1o18;
+//					//mfccc += c1o2*( forcingX1 + forcingX2 + forcingX3) * c1o72;
+//					//mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72;
+//					//mfcac += c1o2*( forcingX1 - forcingX2 + forcingX3) * c1o72;
+//					//mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72;
+//					//pStarStart -= (vx2 + vy2 + vz2) * c1o3;
+//
+//					///Take the diffusion part with out
+//
+//					//mfStartcbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::E  , zeroReal, vvx, vvy, vvz);
+//					//mfStartbcb -= D3Q27System::getIncompFeqForDirection(D3Q27System::N  , zeroReal, vvx, vvy, vvz);
+//					//mfStartbbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::T  , zeroReal, vvx, vvy, vvz);
+//					//mfStartccb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NE , zeroReal, vvx, vvy, vvz);
+//					//mfStartacb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NW , zeroReal, vvx, vvy, vvz);
+//					//mfStartcbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TE , zeroReal, vvx, vvy, vvz);
+//					//mfStartabc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TW , zeroReal, vvx, vvy, vvz);
+//					//mfStartbcc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TN , zeroReal, vvx, vvy, vvz);
+//					//mfStartbac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TS , zeroReal, vvx, vvy, vvz);
+//					//mfStartccc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNE, zeroReal, vvx, vvy, vvz);
+//					//mfStartacc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNW, zeroReal, vvx, vvy, vvz);
+//					//mfStartcac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSE, zeroReal, vvx, vvy, vvz);
+//					//mfStartaac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSW, zeroReal, vvx, vvy, vvz);
+//					//mfStartabb -= D3Q27System::getIncompFeqForDirection(D3Q27System::W  , zeroReal, vvx, vvy, vvz);
+//					//mfStartbab -= D3Q27System::getIncompFeqForDirection(D3Q27System::S  , zeroReal, vvx, vvy, vvz);
+//					//mfStartbba -= D3Q27System::getIncompFeqForDirection(D3Q27System::B  , zeroReal, vvx, vvy, vvz);
+//					//mfStartaab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SW , zeroReal, vvx, vvy, vvz);
+//					//mfStartcab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SE , zeroReal, vvx, vvy, vvz);
+//					//mfStartaba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BW , zeroReal, vvx, vvy, vvz);
+//					//mfStartcba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BE , zeroReal, vvx, vvy, vvz);
+//					//mfStartbaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BS , zeroReal, vvx, vvy, vvz);
+//					//mfStartbca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BN , zeroReal, vvx, vvy, vvz);
+//					//mfStartaaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSW, zeroReal, vvx, vvy, vvz);
+//					//mfStartcaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSE, zeroReal, vvx, vvy, vvz);
+//					//mfStartaca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNW, zeroReal, vvx, vvy, vvz);
+//					//mfStartcca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNE, zeroReal, vvx, vvy, vvz);
+//					//mfStartbbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::REST, zeroReal, vvx, vvy, vvz);
+//					//
+//					//pStar += pStarStart*(omegaDRho-c1);
+//
+//					//mfStartcbb = c2o9 * pStar;
+//					//	mfStartbcb= c2o9 * pStar;
+//					//	mfStartbbc= c2o9 * pStar;
+//					//	mfStartccb= c1o18 * pStar;
+//					//	mfStartacb= c1o18 * pStar;
+//					//	mfStartcbc= c1o18 * pStar;
+//					//	mfStartabc= c1o18 * pStar;
+//					//	mfStartbcc= c1o18 * pStar;
+//					//	mfStartbac= c1o18 * pStar;
+//					//	mfStartccc= c1o72 * pStar;
+//					//	mfStartacc= c1o72 * pStar;
+//					//	mfStartcac= c1o72 * pStar;
+//					//	mfStartaac= c1o72 * pStar;
+//					//	mfStartabb= c2o9 * pStar;
+//					//	mfStartbab= c2o9 * pStar;
+//					//	mfStartbba= c2o9 * pStar;
+//					//	mfStartaab= c1o18 * pStar;
+//					//	mfStartcab= c1o18 * pStar;
+//					//	mfStartaba= c1o18 * pStar;
+//					//	mfStartcba= c1o18 * pStar;
+//					//	mfStartbaa= c1o18 * pStar;
+//					//	mfStartbca= c1o18 * pStar;
+//					//	mfStartaaa= c1o72 * pStar;
+//					//	mfStartcaa= c1o72 * pStar;
+//					//	mfStartaca= c1o72 * pStar;
+//					//	mfStartcca= c1o72 * pStar;
+//					//	mfStartbbb= c4 * c2o9 * pStar;
+//
+//					//mfaaa -= c1o2 * (mfStartaaa + mfStartccc)+ c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa);
+//					//mfaab -= c1o2 * (mfStartaab + mfStartccb)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa));
+//					//mfaac -= c1o2 * (mfStartaac + mfStartcca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa);
+//					//mfaba -= c1o2 * (mfStartaba + mfStartcbc)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa);
+//					//mfabb -= c1o2 * (mfStartabb + mfStartcbb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa);
+//					//mfabc -= c1o2 * (mfStartabc + mfStartcba)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa);
+//					//mfaca -= c1o2 * (mfStartaca + mfStartcac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa);
+//					//mfacb -= c1o2 * (mfStartacb + mfStartcab)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa));
+//					//mfacc -= c1o2 * (mfStartacc + mfStartcaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa);
+//					//mfbaa -= c1o2 * (mfStartbaa + mfStartbcc)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa);
+//					//mfbab -= c1o2 * (mfStartbab + mfStartbcb)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa);
+//					//mfbac -= c1o2 * (mfStartbac + mfStartbca)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa);
+//					//mfbba -= c1o2 * (mfStartbba + mfStartbbc)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa);
+//					//mfbbb -=  (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa));
+//					//mfbbc -= c1o2 * (mfStartbbc + mfStartbba)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa);
+//					//mfbca -= c1o2 * (mfStartbca + mfStartbac)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa);
+//					//mfbcb -= c1o2 * (mfStartbcb + mfStartbab)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa);
+//					//mfbcc -= c1o2 * (mfStartbcc + mfStartbaa)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa);
+//					//mfcaa -= c1o2 * (mfStartcaa + mfStartacc)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa);
+//					//mfcab -= c1o2 * (mfStartcab + mfStartacb)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa));
+//					//mfcac -= c1o2 * (mfStartcac + mfStartaca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa);
+//					//mfcba -= c1o2 * (mfStartcba + mfStartabc)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa);
+//					//mfcbb -= c1o2 * (mfStartcbb + mfStartabb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa);
+//					//mfcbc -= c1o2 * (mfStartcbc + mfStartaba)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa);
+//					//mfcca -= c1o2 * (mfStartcca + mfStartaac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa);
+//					//mfccb -= c1o2 * (mfStartccb + mfStartaab)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa));
+//					//mfccc -= c1o2 * (mfStartccc + mfStartaaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa);
+//
+//					//mfhaaa =rho*( c1o2 * (mfStartaaa + mfStartccc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa));
+//					//mfhaab =rho*( c1o2 * (mfStartaab + mfStartccb) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)));
+//					//mfhaac =rho*( c1o2 * (mfStartaac + mfStartcca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa));
+//					//mfhaba =rho*( c1o2 * (mfStartaba + mfStartcbc) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa));
+//					//mfhabb =rho*( c1o2 * (mfStartabb + mfStartcbb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa));
+//					//mfhabc =rho*( c1o2 * (mfStartabc + mfStartcba) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa));
+//					//mfhaca =rho*( c1o2 * (mfStartaca + mfStartcac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa));
+//					//mfhacb =rho*( c1o2 * (mfStartacb + mfStartcab) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)));
+//					//mfhacc =rho*( c1o2 * (mfStartacc + mfStartcaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa));
+//					//mfhbaa =rho*( c1o2 * (mfStartbaa + mfStartbcc) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa));
+//					//mfhbab =rho*( c1o2 * (mfStartbab + mfStartbcb) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa));
+//					//mfhbac =rho*( c1o2 * (mfStartbac + mfStartbca) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa));
+//					//mfhbba =rho*( c1o2 * (mfStartbba + mfStartbbc) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa));
+//					//mfhbbb =rho*( (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa)));
+//					//mfhbbc =rho*( c1o2 * (mfStartbbc + mfStartbba) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa));
+//					//mfhbca =rho*( c1o2 * (mfStartbca + mfStartbac) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa));
+//					//mfhbcb =rho*( c1o2 * (mfStartbcb + mfStartbab) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa));
+//					//mfhbcc =rho*( c1o2 * (mfStartbcc + mfStartbaa) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa));
+//					//mfhcaa =rho*( c1o2 * (mfStartcaa + mfStartacc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa));
+//					//mfhcab =rho*( c1o2 * (mfStartcab + mfStartacb) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)));
+//					//mfhcac =rho*( c1o2 * (mfStartcac + mfStartaca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa));
+//					//mfhcba =rho*( c1o2 * (mfStartcba + mfStartabc) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa));
+//					//mfhcbb =rho*( c1o2 * (mfStartcbb + mfStartabb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa));
+//					//mfhcbc =rho*( c1o2 * (mfStartcbc + mfStartaba) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa));
+//					//mfhcca =rho*( c1o2 * (mfStartcca + mfStartaac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa));
+//					//mfhccb =rho*( c1o2 * (mfStartccb + mfStartaab) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)));
+//					//mfhccc =rho*( c1o2 * (mfStartccc + mfStartaaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa));
+//
+//
+//
+//
+//					pStar += pStarStart*(omegaDRho-c1);
+//
+//					mfcbb -= c2o9*pStar;
+//					mfbcb -= c2o9*pStar;
+//					mfbbc -= c2o9*pStar;
+//					mfccb -= c1o18*pStar;
+//					mfacb -= c1o18*pStar;
+//					mfcbc -= c1o18*pStar;
+//					mfabc -= c1o18*pStar;
+//					mfbcc -= c1o18*pStar;
+//					mfbac -= c1o18*pStar;
+//					mfccc -= c1o72*pStar;
+//					mfacc -= c1o72*pStar;
+//					mfcac -= c1o72*pStar;
+//					mfaac -= c1o72*pStar;
+//					mfabb -= c2o9*pStar;
+//					mfbab -= c2o9*pStar;
+//					mfbba -= c2o9*pStar;
+//					mfaab -= c1o18*pStar;
+//					mfcab -= c1o18*pStar;
+//					mfaba -= c1o18*pStar;
+//					mfcba -= c1o18*pStar;
+//					mfbaa -= c1o18*pStar;
+//					mfbca -= c1o18*pStar;
+//					mfaaa -= c1o72*pStar;
+//					mfcaa -= c1o72*pStar;
+//					mfaca -= c1o72*pStar;
+//					mfcca -= c1o72*pStar;
+//					mfbbb -= c4*c2o9*pStar;
+//
+//					mfhbcb = rho*c2o9 * pStar;
+//					mfhbbc = rho*c2o9 * pStar;
+//					mfhcbb = rho*c2o9 * pStar;
+//					mfhccb = rho*c1o18 * pStar;
+//					mfhacb = rho*c1o18 * pStar;
+//					mfhcbc = rho*c1o18 * pStar;
+//					mfhabc = rho*c1o18 * pStar;
+//					mfhbcc = rho*c1o18 * pStar;
+//					mfhbac = rho*c1o18 * pStar;
+//					mfhccc = rho*c1o72 * pStar;
+//					mfhacc = rho*c1o72 * pStar;
+//					mfhcac = rho*c1o72 * pStar;
+//					mfhaac = rho*c1o72 * pStar;
+//					mfhabb = rho*c2o9 * pStar;
+//					mfhbab = rho*c2o9 * pStar;
+//					mfhbba = rho*c2o9 * pStar;
+//					mfhaab = rho*c1o18 * pStar;
+//					mfhcab = rho*c1o18 * pStar;
+//					mfhaba = rho*c1o18 * pStar;
+//					mfhcba = rho*c1o18 * pStar;
+//					mfhbaa = rho*c1o18 * pStar;
+//					mfhbca = rho*c1o18 * pStar;
+//					mfhaaa = rho*c1o72 * pStar;
+//					mfhcaa = rho*c1o72 * pStar;
+//					mfhaca = rho*c1o72 * pStar;
+//					mfhcca = rho*c1o72 * pStar;
+//					mfhbbb = rho*c4 * c2o9 * pStar;
+//
+//					//mfStartbcb =  c2o9  * pStarStart;
+//					//mfStartbbc =  c2o9  * pStarStart;
+//					//mfStartcbb =  c2o9  * pStarStart;
+//					//mfStartccb =  c1o18 * pStarStart;
+//					//mfStartacb =  c1o18 * pStarStart;
+//					//mfStartcbc =  c1o18 * pStarStart;
+//					//mfStartabc =  c1o18 * pStarStart;
+//					//mfStartbcc =  c1o18 * pStarStart;
+//					//mfStartbac =  c1o18 * pStarStart;
+//					//mfStartccc =  c1o72 * pStarStart;
+//					//mfStartacc =  c1o72 * pStarStart;
+//					//mfStartcac =  c1o72 * pStarStart;
+//					//mfStartaac =  c1o72 * pStarStart;
+//					//mfStartabb =  c2o9  * pStarStart;
+//					//mfStartbab =  c2o9  * pStarStart;
+//					//mfStartbba =  c2o9  * pStarStart;
+//					//mfStartaab =  c1o18 * pStarStart;
+//					//mfStartcab =  c1o18 * pStarStart;
+//					//mfStartaba =  c1o18 * pStarStart;
+//					//mfStartcba =  c1o18 * pStarStart;
+//					//mfStartbaa =  c1o18 * pStarStart;
+//					//mfStartbca =  c1o18 * pStarStart;
+//					//mfStartaaa =  c1o72 * pStarStart;
+//					//mfStartcaa =  c1o72 * pStarStart;
+//					//mfStartaca =  c1o72 * pStarStart;
+//					//mfStartcca =  c1o72 * pStarStart;
+//					//mfStartbbb =  c4 * c2o9 * pStarStart;
+//
+//					//LBMReal scaleSplit = 0.5;
+//					//mfStartbcb = mfStartbcb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+//					//mfStartbbc = mfStartbbc*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+//					//mfStartcbb = mfStartcbb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+//					//mfStartccb = mfStartccb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartacb = mfStartacb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartcbc = mfStartcbc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartabc = mfStartabc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartbcc = mfStartbcc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartbac = mfStartbac*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartccc = mfStartccc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+//					//mfStartacc = mfStartacc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+//					//mfStartcac = mfStartcac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+//					//mfStartaac = mfStartaac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+//					//mfStartabb = mfStartabb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+//					//mfStartbab = mfStartbab*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+//					//mfStartbba = mfStartbba*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart;
+//					//mfStartaab = mfStartaab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartcab = mfStartcab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartaba = mfStartaba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartcba = mfStartcba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartbaa = mfStartbaa*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartbca = mfStartbca*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart;
+//					//mfStartaaa = mfStartaaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+//					//mfStartcaa = mfStartcaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+//					//mfStartaca = mfStartaca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+//					//mfStartcca = mfStartcca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart;
+//					//mfStartbbb = mfStartbbb*scaleSplit+(c1-scaleSplit)* c4 * c2o9 * pStarStart;
+//
+//
+//					//mfaaa -= c1o2 * (mfStartaaa + mfStartccc);
+//     //               mfaab -= c1o2 * (mfStartaab + mfStartccb);
+//     //               mfaac -= c1o2 * (mfStartaac + mfStartcca);
+//     //               mfaba -= c1o2 * (mfStartaba + mfStartcbc);
+//     //               mfabb -= c1o2 * (mfStartabb + mfStartcbb);
+//     //               mfabc -= c1o2 * (mfStartabc + mfStartcba);
+//     //               mfaca -= c1o2 * (mfStartaca + mfStartcac);
+//     //               mfacb -= c1o2 * (mfStartacb + mfStartcab);
+//     //               mfacc -= c1o2 * (mfStartacc + mfStartcaa);
+//     //               mfbaa -= c1o2 * (mfStartbaa + mfStartbcc);
+//     //               mfbab -= c1o2 * (mfStartbab + mfStartbcb);
+//     //               mfbac -= c1o2 * (mfStartbac + mfStartbca);
+//     //               mfbba -= c1o2 * (mfStartbba + mfStartbbc);
+//					//mfbbb -= (mfStartbbb);
+//     //               mfbbc -= c1o2 * (mfStartbbc + mfStartbba);
+//     //               mfbca -= c1o2 * (mfStartbca + mfStartbac);
+//     //               mfbcb -= c1o2 * (mfStartbcb + mfStartbab);
+//     //               mfbcc -= c1o2 * (mfStartbcc + mfStartbaa);
+//     //               mfcaa -= c1o2 * (mfStartcaa + mfStartacc);
+//     //               mfcab -= c1o2 * (mfStartcab + mfStartacb);
+//     //               mfcac -= c1o2 * (mfStartcac + mfStartaca);
+//     //               mfcba -= c1o2 * (mfStartcba + mfStartabc);
+//     //               mfcbb -= c1o2 * (mfStartcbb + mfStartabb);
+//     //               mfcbc -= c1o2 * (mfStartcbc + mfStartaba);
+//     //               mfcca -= c1o2 * (mfStartcca + mfStartaac);
+//     //               mfccb -= c1o2 * (mfStartccb + mfStartaab);
+//     //               mfccc -= c1o2 * (mfStartccc + mfStartaaa);
+//					//												
+//					//mfhaaa += rho*c1o2 * (mfStartaaa + mfStartccc);
+//					//mfhaab += rho*c1o2 * (mfStartaab + mfStartccb);
+//					//mfhaac += rho*c1o2 * (mfStartaac + mfStartcca);
+//					//mfhaba += rho*c1o2 * (mfStartaba + mfStartcbc);
+//					//mfhabb += rho*c1o2 * (mfStartabb + mfStartcbb);
+//					//mfhabc += rho*c1o2 * (mfStartabc + mfStartcba);
+//					//mfhaca += rho*c1o2 * (mfStartaca + mfStartcac);
+//					//mfhacb += rho*c1o2 * (mfStartacb + mfStartcab);
+//					//mfhacc += rho*c1o2 * (mfStartacc + mfStartcaa);
+//					//mfhbaa += rho*c1o2 * (mfStartbaa + mfStartbcc);
+//					//mfhbab += rho*c1o2 * (mfStartbab + mfStartbcb);
+//					//mfhbac += rho*c1o2 * (mfStartbac + mfStartbca);
+//					//mfhbba += rho*c1o2 * (mfStartbba + mfStartbbc);
+//					//mfhbbb += rho*(mfStartbbb);
+//					//mfhbbc += rho*c1o2 * (mfStartbbc + mfStartbba);
+//					//mfhbca += rho*c1o2 * (mfStartbca + mfStartbac);
+//					//mfhbcb += rho*c1o2 * (mfStartbcb + mfStartbab);
+//					//mfhbcc += rho*c1o2 * (mfStartbcc + mfStartbaa);
+//					//mfhcaa += rho*c1o2 * (mfStartcaa + mfStartacc);
+//					//mfhcab += rho*c1o2 * (mfStartcab + mfStartacb);
+//					//mfhcac += rho*c1o2 * (mfStartcac + mfStartaca);
+//					//mfhcba += rho*c1o2 * (mfStartcba + mfStartabc);
+//					//mfhcbb += rho*c1o2 * (mfStartcbb + mfStartabb);
+//					//mfhcbc += rho*c1o2 * (mfStartcbc + mfStartaba);
+//					//mfhcca += rho*c1o2 * (mfStartcca + mfStartaac);
+//					//mfhccb += rho*c1o2 * (mfStartccb + mfStartaab);
+//					//mfhccc += rho*c1o2 * (mfStartccc + mfStartaaa);
+//					//mfhbcb += c1o6 * c2o9 * deltaPP;
+//					//mfhbbc += c1o6 * c2o9 * deltaPP;
+//					//mfhcbb += c1o6 * c2o9 * deltaPP;
+//					//mfhccb += c1o6 * c1o18 * deltaPP;
+//					//mfhacb += c1o6 * c1o18 * deltaPP;
+//					//mfhcbc += c1o6 * c1o18 * deltaPP;
+//					//mfhabc += c1o6 * c1o18 * deltaPP;
+//					//mfhbcc += c1o6 * c1o18 * deltaPP;
+//					//mfhbac += c1o6 * c1o18 * deltaPP;
+//					//mfhccc += c1o6 * c1o72 * deltaPP;
+//					//mfhacc += c1o6 * c1o72 * deltaPP;
+//					//mfhcac += c1o6 * c1o72 * deltaPP;
+//					//mfhaac += c1o6 * c1o72 * deltaPP;
+//					//mfhabb += c1o6 * c2o9 * deltaPP;
+//					//mfhbab += c1o6 * c2o9 * deltaPP;
+//					//mfhbba += c1o6 * c2o9 * deltaPP;
+//					//mfhaab += c1o6 * c1o18 * deltaPP;
+//					//mfhcab += c1o6 * c1o18 * deltaPP;
+//					//mfhaba += c1o6 * c1o18 * deltaPP;
+//					//mfhcba += c1o6 * c1o18 * deltaPP;
+//					//mfhbaa += c1o6 * c1o18 * deltaPP;
+//					//mfhbca += c1o6 * c1o18 * deltaPP;
+//					//mfhaaa += c1o6 * c1o72 * deltaPP;
+//					//mfhcaa += c1o6 * c1o72 * deltaPP;
+//					//mfhaca += c1o6 * c1o72 * deltaPP;
+//					//mfhcca += c1o6 * c1o72 * deltaPP;
+//					//mfhbbb += c1o6 * c4 * c2o9 * deltaPP;
+//
+//
+//					//mfhbcb = c1o3/rho * c2o9 ;
+//					//mfhbbc = c1o3/rho * c2o9 ;
+//					//mfhcbb = c1o3/rho * c2o9 ;
+//					//mfhccb = c1o3/rho * c1o18 ;
+//					//mfhacb = c1o3/rho * c1o18 ;
+//					//mfhcbc = c1o3/rho * c1o18 ;
+//					//mfhabc = c1o3/rho * c1o18 ;
+//					//mfhbcc = c1o3/rho * c1o18 ;
+//					//mfhbac = c1o3/rho * c1o18 ;
+//					//mfhccc = c1o3/rho * c1o72 ;
+//					//mfhacc = c1o3/rho * c1o72 ;
+//					//mfhcac = c1o3/rho * c1o72 ;
+//					//mfhaac = c1o3/rho * c1o72 ;
+//					//mfhabb = c1o3/rho * c2o9 ;
+//					//mfhbab = c1o3/rho * c2o9 ;
+//					//mfhbba = c1o3/rho * c2o9 ;
+//					//mfhaab = c1o3/rho * c1o18 ;
+//					//mfhcab = c1o3/rho * c1o18 ;
+//					//mfhaba = c1o3/rho * c1o18 ;
+//					//mfhcba = c1o3/rho * c1o18 ;
+//					//mfhbaa = c1o3/rho * c1o18 ;
+//					//mfhbca = c1o3/rho * c1o18 ;
+//					//mfhaaa = c1o3/rho * c1o72 ;
+//					//mfhcaa = c1o3/rho * c1o72 ;
+//					//mfhaca = c1o3/rho * c1o72 ;
+//					//mfhcca = c1o3/rho * c1o72 ;
+//					//mfhbbb = c1/rho;//c1o3/rho * c4 * c2o9 ;
+//
+//
+//					
+//					//mfabb += c1o2 * c2o9 * pStar * (phi[REST] - phi[W]) * rhoToPhi / rho;
+//					//mfbab += c1o2 * c2o9 * pStar * (phi[REST] - phi[S]) * rhoToPhi / rho;
+//					//mfbba += c1o2 * c2o9 * pStar * (phi[REST] - phi[B]) * rhoToPhi / rho;
+//					//mfaab += c1o2 * c1o18 * pStar * (phi[REST] - phi[SW]) * rhoToPhi / rho;
+//					//mfcab += c1o2 * c1o18 * pStar * (phi[REST] - phi[SE]) * rhoToPhi / rho;
+//					//mfaba += c1o2 * c1o18 * pStar * (phi[REST] - phi[BW]) * rhoToPhi / rho;
+//					//mfcba += c1o2 * c1o18 * pStar * (phi[REST] - phi[BE]) * rhoToPhi / rho;
+//					//mfbaa += c1o2 * c1o18 * pStar * (phi[REST] - phi[BS]) * rhoToPhi / rho;
+//					//mfbca += c1o2 * c1o18 * pStar * (phi[REST] - phi[BN]) * rhoToPhi / rho;
+//					//mfaaa += c1o2 * c1o72 * pStar * (phi[REST] - phi[BSW]) * rhoToPhi / rho;
+//					//mfcaa += c1o2 * c1o72 * pStar * (phi[REST] - phi[BSE]) * rhoToPhi / rho;
+//					//mfaca += c1o2 * c1o72 * pStar * (phi[REST] - phi[BNW]) * rhoToPhi / rho;
+//					//mfcca += c1o2 * c1o72 * pStar * (phi[REST] - phi[BNE]) * rhoToPhi / rho;
+//					//mfcbb += c1o2 * c2o9 * pStar * (phi[REST] - phi[E]) * rhoToPhi / rho;
+//					//mfbcb += c1o2 * c2o9 * pStar * (phi[REST] - phi[N]) * rhoToPhi / rho;
+//					//mfbbc += c1o2 * c2o9 * pStar * (phi[REST] - phi[T]) * rhoToPhi / rho;
+//					//mfccb += c1o2 * c1o18 * pStar * (phi[REST] - phi[NE]) * rhoToPhi / rho;
+//					//mfacb += c1o2 * c1o18 * pStar * (phi[REST] - phi[NW]) * rhoToPhi / rho;
+//					//mfcbc += c1o2 * c1o18 * pStar * (phi[REST] - phi[TE]) * rhoToPhi / rho;
+//					//mfabc += c1o2 * c1o18 * pStar * (phi[REST] - phi[TW]) * rhoToPhi / rho;
+//					//mfbcc += c1o2 * c1o18 * pStar * (phi[REST] - phi[TN]) * rhoToPhi / rho;
+//					//mfbac += c1o2 * c1o18 * pStar * (phi[REST] - phi[TS]) * rhoToPhi / rho;
+//					//mfccc += c1o2 * c1o72 * pStar * (phi[REST] - phi[TNE]) * rhoToPhi / rho;
+//					//mfacc += c1o2 * c1o72 * pStar * (phi[REST] - phi[TNW]) * rhoToPhi / rho;
+//					//mfcac += c1o2 * c1o72 * pStar * (phi[REST] - phi[TSE]) * rhoToPhi / rho;
+//					//mfaac += c1o2 * c1o72 * pStar * (phi[REST] - phi[TSW]) * rhoToPhi / rho;
+//					
+//					///////////////
+//					//mfabb += (pBefore-pStar) * c2o9  ;
+//					//mfbab += (pBefore-pStar) * c2o9  ;
+//					//mfbba += (pBefore-pStar) * c2o9  ;
+//					//mfaab += (pBefore-pStar) * c1o18 ;
+//					//mfcab += (pBefore-pStar) * c1o18 ;
+//					//mfaba += (pBefore-pStar) * c1o18 ;
+//					//mfcba += (pBefore-pStar) * c1o18 ;
+//					//mfbaa += (pBefore-pStar) * c1o18 ;
+//					//mfbca += (pBefore-pStar) * c1o18 ;
+//					//mfaaa += (pBefore-pStar) * c1o72 ;
+//					//mfcaa += (pBefore-pStar) * c1o72 ;
+//					//mfaca += (pBefore-pStar) * c1o72 ;
+//					//mfcca += (pBefore-pStar) * c1o72 ;
+//					//mfcbb += (pBefore-pStar) * c2o9  ;
+//					//mfbcb += (pBefore-pStar) * c2o9  ;
+//					//mfbbc += (pBefore-pStar) * c2o9  ;
+//					//mfccb += (pBefore-pStar) * c1o18 ;
+//					//mfacb += (pBefore-pStar) * c1o18 ;
+//					//mfcbc += (pBefore-pStar) * c1o18 ;
+//					//mfabc += (pBefore-pStar) * c1o18 ;
+//					//mfbcc += (pBefore-pStar) * c1o18 ;
+//					//mfbac += (pBefore-pStar) * c1o18 ;
+//					//mfccc += (pBefore-pStar) * c1o72 ;
+//					//mfacc += (pBefore-pStar) * c1o72 ;
+//					//mfcac += (pBefore-pStar) * c1o72 ;
+//					//mfaac += (pBefore-pStar) * c1o72 ;
+//					//mfbbb += (pBefore-pStar) * 8.0 / 9.0;
+//
+//					//mfabb = (pBefore ) * c2o9;
+//					//mfbab = (pBefore ) * c2o9;
+//					//mfbba = (pBefore ) * c2o9;
+//					//mfaab = (pBefore ) * c1o16;
+//					//mfcab = (pBefore ) * c1o16;
+//					//mfaba = (pBefore ) * c1o16;
+//					//mfcba = (pBefore ) * c1o16;
+//					//mfbaa = (pBefore ) * c1o16;
+//					//mfbca = (pBefore ) * c1o16;
+//					//mfaaa = (pBefore ) * c1o72;
+//					//mfcaa = (pBefore ) * c1o72;
+//					//mfaca = (pBefore ) * c1o72;
+//					//mfcca = (pBefore ) * c1o72;
+//					//mfcbb = (pBefore ) * c2o9;
+//					//mfbcb = (pBefore ) * c2o9;
+//					//mfbbc = (pBefore ) * c2o9;
+//					//mfccb = (pBefore ) * c1o16;
+//					//mfacb = (pBefore ) * c1o16;
+//					//mfcbc = (pBefore ) * c1o16;
+//					//mfabc = (pBefore ) * c1o16;
+//					//mfbcc = (pBefore ) * c1o16;
+//					//mfbac = (pBefore ) * c1o16;
+//					//mfccc = (pBefore ) * c1o72;
+//					//mfacc = (pBefore ) * c1o72;
+//					//mfcac = (pBefore ) * c1o72;
+//					//mfaac = (pBefore ) * c1o72;
+//					//mfbbb = (pBefore ) * 8.0 / 9.0;
+//					///////////////////
+//
+//					//////////////////////////////////////////////////////////////////////////
+//					//proof correctness
+//					//////////////////////////////////////////////////////////////////////////
+//					//#ifdef  PROOF_CORRECTNESS
+//					LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+//						+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+//						+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+//					//			   //LBMReal dif = fabs(drho - rho_post);
+//					//               LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post;
+//					//#ifdef SINGLEPRECISION
+//					//			   if (dif > 10.0E-7 || dif < -10.0E-7)
+//					//#else
+//					//			   if (dif > 10.0E-15 || dif < -10.0E-15)
+//					//#endif
+//					//			   {
+//					//				   UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post)
+//					//					   + " dif=" + UbSystem::toString(dif)
+//					//					   + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+//					//				   //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+//					//				   //exit(EXIT_FAILURE);
+//					//			   }
+//					//#endif
+//
+//					if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post))
+//						UB_THROW(UbException(
+//							UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," +
+//							UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+//
+//					//////////////////////////////////////////////////////////////////////////
+//					//write distribution
+//					//////////////////////////////////////////////////////////////////////////
+//					(*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3)         = mfabb         ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3)         = mfbab         ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)         = mfbba         ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3)        = mfaab        ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3)       = mfcab       ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3)        = mfaba        ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3)       = mfcba       ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3)        = mfbaa        ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3)       = mfbca       ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3)       = mfaaa       ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3)      = mfcaa      ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3)      = mfaca      ;//* rho * c1o3;
+//					(*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3)     = mfcca     ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3)     = mfcbb     ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3)     = mfbcb     ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p)     = mfbbc     ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3)   = mfccb   ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3)    = mfacb    ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p)   = mfcbc   ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p)    = mfabc    ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p)   = mfbcc   ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p)    = mfbac    ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p)  = mfacc  ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p)  = mfcac  ;//* rho * c1o3;
+//					(*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p)   = mfaac   ;//* rho * c1o3;
+//
+//					(*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3;
+//
+//			
+//					(*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3)         = mfhabb;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3)         = mfhbab;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3)         = mfhbba;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3)        = mfhaab;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3)       = mfhcab;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3)        = mfhaba;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3)       = mfhcba;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3)        = mfhbaa;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3)       = mfhbca;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3)       = mfhaaa;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3)      = mfhcaa;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3)      = mfhaca;//* rho * c1o3;
+//					(*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3)     = mfhcca;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3)     = mfhcbb;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3)     = mfhbcb;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p)     = mfhbbc;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3)   = mfhccb;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3)    = mfhacb;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p)   = mfhcbc;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p)    = mfhabc;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p)   = mfhbcc;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p)    = mfhbac;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfhccc;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p)  = mfhacc;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p)  = mfhcac;//* rho * c1o3;
+//					(*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p)   = mfhaac;//* rho * c1o3;
+//
+//					(*this->zeroDistributionsH2)(x1, x2, x3) = mfhbbb;// *rho* c1o3;
+//
+//																	// !Old Kernel
+///////////////////////  P H A S E - F I E L D   S O L V E R
+//////////////////////////////////////////////
+///////CUMULANT PHASE-FIELD
+//					LBMReal omegaD =1.0/( 3.0 * mob + 0.5);
+//					{
+//						mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+//						mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+//						mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+//						mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+//						mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+//						mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+//						mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+//						mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+//						mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+//						mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+//						mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+//						mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+//						mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+//						mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+//						mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+//						mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+//						mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+//						mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+//						mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+//						mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+//						mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+//						mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+//						mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+//						mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+//						mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+//						mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+//						mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+//
+//
+//						////////////////////////////////////////////////////////////////////////////////////
+//						//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
+//						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+//						//!
+//						////////////////////////////////////////////////////////////////////////////////////
+//						// second component
+//						LBMReal concentration =
+//							((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+//								(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+//								((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+//						////////////////////////////////////////////////////////////////////////////////////
+//						LBMReal oneMinusRho = c1- concentration;
+//
+//						LBMReal cx =
+//							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+//								(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+//								(mfcbb - mfabb));
+//						LBMReal cy =
+//							((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+//								(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+//								(mfbcb - mfbab));
+//						LBMReal cz =
+//							((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+//								(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+//								(mfbbc - mfbba));
+//
+//						////////////////////////////////////////////////////////////////////////////////////
+//						// calculate the square of velocities for this lattice node
+//						LBMReal cx2 = cx * cx;
+//						LBMReal cy2 = cy * cy;
+//						LBMReal cz2 = cz * cz;
+//						////////////////////////////////////////////////////////////////////////////////////
+//						//! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
+//						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+//						//! see also Eq. (6)-(14) in \ref
+//						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+//						//!
+//						////////////////////////////////////////////////////////////////////////////////////
+//						// Z - Dir
+//						forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+//
+//						////////////////////////////////////////////////////////////////////////////////////
+//						// Y - Dir
+//						forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+//						forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+//						forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+//						forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+//						forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+//						forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+//						forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+//						forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+//
+//						////////////////////////////////////////////////////////////////////////////////////
+//						// X - Dir
+//						forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+//						forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+//						forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+//						forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+//						forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+//						forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+//						forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+//						forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+//						forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
+//
+//						////////////////////////////////////////////////////////////////////////////////////
+//						//! - experimental Cumulant ... to be published ... hopefully
+//						//!
+//
+//						// linearized orthogonalization of 3rd order central moments
+//						LBMReal Mabc = mfabc - mfaba * c1o3;
+//						LBMReal Mbca = mfbca - mfbaa * c1o3;
+//						LBMReal Macb = mfacb - mfaab * c1o3;
+//						LBMReal Mcba = mfcba - mfaba * c1o3;
+//						LBMReal Mcab = mfcab - mfaab * c1o3;
+//						LBMReal Mbac = mfbac - mfbaa * c1o3;
+//						// linearized orthogonalization of 5th order central moments
+//						LBMReal Mcbc = mfcbc - mfaba * c1o9;
+//						LBMReal Mbcc = mfbcc - mfbaa * c1o9;
+//						LBMReal Mccb = mfccb - mfaab * c1o9;
+//
+//						//31.05.2022 addaptive mobility
+//						//omegaD = c1 + (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) / (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration)) + fabs((1.0 - concentration) * (concentration)) * c1o6 * oneOverInterfaceScale+1.0e-200);
+//						//omegaD = c2 * (concentration * (concentration - c1)) / (-c6 * (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) + (concentration * (concentration - c1))+1.0e-200);
+//						// collision of 1st order moments
+//						cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+//							normX1 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale;
+//						cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+//							normX2 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale;
+//						cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+//							normX3 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale;
+//
+//						cx2 = cx * cx;
+//						cy2 = cy * cy;
+//						cz2 = cz * cz;
+//
+//						// equilibration of 2nd order moments
+//						mfbba = zeroReal;
+//						mfbab = zeroReal;
+//						mfabb = zeroReal;
+//
+//						mfcaa = c1o3 * concentration;
+//						mfaca = c1o3 * concentration;
+//						mfaac = c1o3 * concentration;
+//
+//						// equilibration of 3rd order moments
+//						Mabc = zeroReal;
+//						Mbca = zeroReal;
+//						Macb = zeroReal;
+//						Mcba = zeroReal;
+//						Mcab = zeroReal;
+//						Mbac = zeroReal;
+//						mfbbb = zeroReal;
+//
+//						// from linearized orthogonalization 3rd order central moments to central moments
+//						mfabc = Mabc + mfaba * c1o3;
+//						mfbca = Mbca + mfbaa * c1o3;
+//						mfacb = Macb + mfaab * c1o3;
+//						mfcba = Mcba + mfaba * c1o3;
+//						mfcab = Mcab + mfaab * c1o3;
+//						mfbac = Mbac + mfbaa * c1o3;
+//
+//						// equilibration of 4th order moments
+//						mfacc = c1o9 * concentration;
+//						mfcac = c1o9 * concentration;
+//						mfcca = c1o9 * concentration;
+//
+//						mfcbb = zeroReal;
+//						mfbcb = zeroReal;
+//						mfbbc = zeroReal;
+//
+//						// equilibration of 5th order moments
+//						Mcbc = zeroReal;
+//						Mbcc = zeroReal;
+//						Mccb = zeroReal;
+//
+//						// from linearized orthogonalization 5th order central moments to central moments
+//						mfcbc = Mcbc + mfaba * c1o9;
+//						mfbcc = Mbcc + mfbaa * c1o9;
+//						mfccb = Mccb + mfaab * c1o9;
+//
+//						// equilibration of 6th order moment
+//						mfccc = c1o27 * concentration;
+//
+//						////////////////////////////////////////////////////////////////////////////////////
+//						//! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
+//						//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+//						//! see also Eq. (88)-(96) in
+//						//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+//						//!
+//						////////////////////////////////////////////////////////////////////////////////////
+//						// X - Dir
+//						backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+//						backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+//						backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+//						backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+//						backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+//						backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+//						backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+//						backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+//						backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
+//
+//						////////////////////////////////////////////////////////////////////////////////////
+//						// Y - Dir
+//						backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+//						backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+//						backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+//						backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+//						backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+//						backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+//						backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+//
+//						////////////////////////////////////////////////////////////////////////////////////
+//						// Z - Dir
+//						backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+//						backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+//
+//
+//
+//						(*this->localDistributionsH1)(D3Q27System::ET_E,   x1,  x2,  x3) = mfabb;
+//						(*this->localDistributionsH1)(D3Q27System::ET_N,   x1,  x2,  x3) = mfbab;
+//						(*this->localDistributionsH1)(D3Q27System::ET_T,   x1,  x2,  x3) = mfbba;
+//						(*this->localDistributionsH1)(D3Q27System::ET_NE,  x1,  x2,  x3) = mfaab;
+//						(*this->localDistributionsH1)(D3Q27System::ET_NW,  x1p, x2,  x3) = mfcab;
+//						(*this->localDistributionsH1)(D3Q27System::ET_TE,  x1,  x2,  x3) = mfaba;
+//						(*this->localDistributionsH1)(D3Q27System::ET_TW,  x1p, x2,  x3) = mfcba;
+//						(*this->localDistributionsH1)(D3Q27System::ET_TN,  x1,  x2,  x3) = mfbaa;
+//						(*this->localDistributionsH1)(D3Q27System::ET_TS,  x1,  x2p, x3) = mfbca;
+//						(*this->localDistributionsH1)(D3Q27System::ET_TNE, x1,  x2,  x3) = mfaaa;
+//						(*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2,  x3) = mfcaa;
+//						(*this->localDistributionsH1)(D3Q27System::ET_TSE, x1,  x2p, x3) = mfaca;
+//						(*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+//
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_W,   x1p, x2,  x3 ) = mfcbb;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_S,   x1,  x2p, x3 ) = mfbcb;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_B,   x1,  x2,  x3p) = mfbbc;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SW,  x1p, x2p, x3 ) = mfccb;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_SE,  x1,  x2p, x3 ) = mfacb;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BW,  x1p, x2,  x3p) = mfcbc;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BE,  x1,  x2,  x3p) = mfabc;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BS,  x1,  x2p, x3p) = mfbcc;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BN,  x1,  x2,  x3p) = mfbac;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1,  x2p, x3p) = mfacc;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2,  x3p) = mfcac;
+//						(*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1,  x2,  x3p) = mfaac;
+//
+//						(*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb;
+//
+//
+//
+//
+//					}
+//				}
+//			}
+//		}
+//	}
+//}
+////////////////////////////////////////////////////////////////////////////
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi()
+//{
+//	using namespace D3Q27System;
+//	return 3.0* ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) + (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) + (phi[BNE] - phi[TSW])))
+//		+ WEIGTH[NE] * (((phi[TE] - phi[BW]) + (phi[BE] - phi[TW])) + ((phi[SE] - phi[NW]) + (phi[NE] - phi[SW])))) +
+//		+WEIGTH[N] * (phi[E] - phi[W]));
+//}
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi()
+//{
+//	using namespace D3Q27System;
+//	return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[BNE] - phi[TSW])- (phi[TSE] - phi[BNW])))
+//		+ WEIGTH[NE] * (((phi[TN] - phi[BS]) + (phi[BN] - phi[TS])) + ((phi[NE] - phi[SW])- (phi[SE] - phi[NW])))) +
+//		+WEIGTH[N] * (phi[N] - phi[S]));
+//}
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi()
+//{
+//	using namespace D3Q27System;
+//	return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) - (phi[BNE] - phi[TSW])))
+//		+ WEIGTH[NE] * (((phi[TE] - phi[BW]) - (phi[BE] - phi[TW])) + ((phi[TS] - phi[BN]) + (phi[TN] - phi[BS])))) +
+//		+WEIGTH[N] * (phi[T] - phi[B]));
+//}
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_rhoInv(LBMReal rhoL,LBMReal rhoDIV)
+//{
+//	using namespace D3Q27System;
+//	return 3.0 * ((WEIGTH[TNE] * (((1.0/(rhoL+rhoDIV*phi[TNE]) - 1.0 / (rhoL + rhoDIV * phi[BSW])) + (1.0 / (rhoL + rhoDIV * phi[BSE]) - 1.0 / (rhoL + rhoDIV * phi[TNW]))) + ((1.0 / (rhoL + rhoDIV * phi[TSE]) - 1.0 / (rhoL + rhoDIV * phi[BNW])) + (1.0 / (rhoL + rhoDIV * phi[BNE]) - 1.0 / (rhoL + rhoDIV * phi[TSW]))))
+//		+ WEIGTH[NE] * (((1.0 / (rhoL + rhoDIV * phi[TE]) - 1.0 / (rhoL + rhoDIV * phi[BW])) + (1.0 / (rhoL + rhoDIV * phi[BE]) - 1.0 / (rhoL + rhoDIV * phi[TW]))) + ((1.0 / (rhoL + rhoDIV * phi[SE]) - 1.0 / (rhoL + rhoDIV * phi[NW])) + (1.0 / (rhoL + rhoDIV * phi[NE]) - 1.0 / (rhoL + rhoDIV * phi[SW]))))) +
+//		+WEIGTH[N] * (1.0 / (rhoL + rhoDIV * phi[E]) - 1.0 / (rhoL + rhoDIV * phi[W])));
+//}
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_rhoInv(LBMReal rhoL,LBMReal rhoDIV)
+//{
+//	using namespace D3Q27System;
+//	return 3.0 * ((WEIGTH[TNE] * (((1.0 / (rhoL + rhoDIV * phi[TNE]) - 1.0 / (rhoL + rhoDIV * phi[BSW])) - (1.0 / (rhoL + rhoDIV * phi[BSE]) - 1.0 / (rhoL + rhoDIV * phi[TNW]))) + ((1.0 / (rhoL + rhoDIV * phi[BNE]) - 1.0 / (rhoL + rhoDIV * phi[TSW])) - (1.0 / (rhoL + rhoDIV * phi[TSE]) - 1.0 / (rhoL + rhoDIV * phi[BNW]))))
+//		+ WEIGTH[NE] * (((1.0 / (rhoL + rhoDIV * phi[TN]) - 1.0 / (rhoL + rhoDIV * phi[BS])) + (1.0 / (rhoL + rhoDIV * phi[BN]) - 1.0 / (rhoL + rhoDIV * phi[TS]))) + ((1.0 / (rhoL + rhoDIV * phi[NE]) - 1.0 / (rhoL + rhoDIV * phi[SW])) - (1.0 / (rhoL + rhoDIV * phi[SE]) - 1.0 / (rhoL + rhoDIV * phi[NW]))))) +
+//		+WEIGTH[N] * (1.0 / (rhoL + rhoDIV * phi[N]) - 1.0 / (rhoL + rhoDIV * phi[S])));
+//}
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_rhoInv(LBMReal rhoL, LBMReal rhoDIV)
+//{
+//	using namespace D3Q27System;
+//	return 3.0 * ((WEIGTH[TNE] * (((1.0 / (rhoL + rhoDIV * phi[TNE]) - 1.0 / (rhoL + rhoDIV * phi[BSW])) - (1.0 / (rhoL + rhoDIV * phi[BSE]) - 1.0 / (rhoL + rhoDIV * phi[TNW]))) + ((1.0 / (rhoL + rhoDIV * phi[TSE]) - 1.0 / (rhoL + rhoDIV * phi[BNW])) - (1.0 / (rhoL + rhoDIV * phi[BNE]) - 1.0 / (rhoL + rhoDIV * phi[TSW]))))
+//		+ WEIGTH[NE] * (((1.0 / (rhoL + rhoDIV * phi[TE]) - 1.0 / (rhoL + rhoDIV * phi[BW])) - (1.0 / (rhoL + rhoDIV * phi[BE]) - 1.0 / (rhoL + rhoDIV * phi[TW]))) + ((1.0 / (rhoL + rhoDIV * phi[TS]) - 1.0 / (rhoL + rhoDIV * phi[BN])) + (1.0 / (rhoL + rhoDIV * phi[TN]) - 1.0 / (rhoL + rhoDIV * phi[BS]))))) +
+//		+WEIGTH[N] * (1.0 / (rhoL + rhoDIV * phi[T]) - 1.0 / (rhoL + rhoDIV * phi[B])));
+//}
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi2()
+//{
+//	using namespace D3Q27System;
+//	return 3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) + (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) + (phi2[BNE] - phi2[TSW])))
+//		+ WEIGTH[NE] * (((phi2[TE] - phi2[BW]) + (phi2[BE] - phi2[TW])) + ((phi2[SE] - phi2[NW]) + (phi2[NE] - phi2[SW])))) +
+//		+WEIGTH[N] * (phi2[E] - phi2[W]));
+//}
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi2()
+//{
+//	using namespace D3Q27System;
+//	return 3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[BNE] - phi2[TSW]) - (phi2[TSE] - phi2[BNW])))
+//		+ WEIGTH[NE] * (((phi2[TN] - phi2[BS]) + (phi2[BN] - phi2[TS])) + ((phi2[NE] - phi2[SW]) - (phi2[SE] - phi2[NW])))) +
+//		+WEIGTH[N] * (phi2[N] - phi2[S]));
+//}
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi2()
+//{
+//	using namespace D3Q27System;
+//	return 3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW])))
+//		+ WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) +
+//		+WEIGTH[N] * (phi2[T] - phi2[B]));
+//}
+//
+//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::nabla2_phi()
+//{
+//	using namespace D3Q27System;
+//	LBMReal sum = 0.0;
+//	sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000])))
+//		+ (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000]))));
+//	sum += WEIGTH[DIR_0PP] * (
+//			(((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000])))
+//		+	(((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000])))
+//		+	(((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000])))
+//		);
+//	sum += WEIGTH[DIR_00P] * (
+//			((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000]))
+//		+	((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000]))
+//		+	((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000]))
+//		);
+//
+//
+//	return 6.0 * sum;
+//}
+//
+//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::computePhasefield()
+//{
+//	using namespace D3Q27System;
+//	SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions();
+//
+//	int minX1 = ghostLayerWidth;
+//	int minX2 = ghostLayerWidth;
+//	int minX3 = ghostLayerWidth;
+//	int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth;
+//	int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth;
+//	int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth;
+//
+//	//------------- Computing the phase-field ------------------
+//	for (int x3 = minX3; x3 < maxX3; x3++) {
+//		for (int x2 = minX2; x2 < maxX2; x2++) {
+//			for (int x1 = minX1; x1 < maxX1; x1++) {
+//				// if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3))
+//				{
+//					int x1p = x1 + 1;
+//					int x2p = x2 + 1;
+//					int x3p = x3 + 1;
+//
+//					h[E]   = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+//					h[N]   = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+//					h[T]   = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+//					h[NE]  = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+//					h[NW]  = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+//					h[TE]  = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+//					h[TW]  = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+//					h[TN]  = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+//					h[TS]  = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+//					h[TNE] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+//					h[TNW] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+//					h[TSE] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+//					h[TSW] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+//
+//					h[W]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+//					h[S]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+//					h[B]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+//					h[SW]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+//					h[SE]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+//					h[BW]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+//					h[BE]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+//					h[BS]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+//					h[BN]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+//					h[BSW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+//					h[BSE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+//					h[BNW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+//					h[BNE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+//
+//					h[REST] = (*this->zeroDistributionsH1)(x1, x2, x3);
+//				}
+//			}
+//		}
+//	}
+//}
+//
+//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+//	int x3)
+//{
+//	using namespace D3Q27System;
+//
+//	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+//
+//	phi[REST] = (*ph)(x1, x2, x3);
+//
+//
+//	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+//
+//		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+//			phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+//		} else {
+//			//phi[k] = (*ph)(x1 , x2, x3 );// neutral wetting
+//			phi[k] = 0.0;//unwetting
+//		}
+//	}
+//}
+//
+//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+//	int x3)
+//{
+//	using namespace D3Q27System;
+//
+//	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+//
+//	phi2[REST] = (*ph)(x1, x2, x3);
+//
+//
+//	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+//
+//		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+//			phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+//		}
+//		else {
+//			phi2[k] = 0.05;
+//		}
+//	}
+//}
+//
+//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::swapDistributions()
+//{
+//	LBMKernel::swapDistributions();
+//	dataSet->getHdistributions()->swap();
+//	dataSet->getH2distributions()->swap();
+//}
+//
+//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initForcing()
+//{
+//	muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3);
+//	muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3);
+//	muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3);
+//
+//	muDeltaT = deltaT;
+//
+//	muForcingX1.DefineVar("dt", &muDeltaT);
+//	muForcingX2.DefineVar("dt", &muDeltaT);
+//	muForcingX3.DefineVar("dt", &muDeltaT);
+//
+//	muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
+//
+//	muForcingX1.DefineVar("nu", &muNu);
+//	muForcingX2.DefineVar("nu", &muNu);
+//	muForcingX3.DefineVar("nu", &muNu);
+//
+//	muForcingX1.DefineVar("rho",&muRho); 
+//	muForcingX2.DefineVar("rho",&muRho); 
+//	muForcingX3.DefineVar("rho",&muRho); 
+//
+//}
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..c5bc3560408698d4e83a2f45fcbeaf1b5b37317d
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h
@@ -0,0 +1,125 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h
+//! \ingroup LBMKernel
+//! \author M. Geier, K. Kutscher, Hesameddin Safari
+//=======================================================================================
+
+#ifndef MultiphaseSimpleVelocityBaseExternalPressureLBMKernel_H
+#define MultiphaseSimpleVelocityBaseExternalPressureLBMKernel_H
+
+#include "LBMKernel.h"
+#include "BCProcessor.h"
+#include "D3Q27System.h"
+#include "basics/utilities/UbTiming.h"
+#include "basics/container/CbArray4D.h"
+#include "basics/container/CbArray3D.h"
+
+//! \brief  Multiphase Cascaded Cumulant LBM kernel. 
+//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model
+//! \author  M. Geier, K. Kutscher, Hesameddin Safari
+class MultiphaseSimpleVelocityBaseExternalPressureLBMKernel : public LBMKernel
+{
+public:
+    MultiphaseSimpleVelocityBaseExternalPressureLBMKernel();
+    virtual ~MultiphaseSimpleVelocityBaseExternalPressureLBMKernel(void) = default;
+    void calculate(int step) override;
+    SPtr<LBMKernel> clone() override;
+
+
+    ///refactor
+    //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure;
+
+
+    double getCalculationTime() override { return .0; }
+protected:
+    virtual void initDataSet();
+    void swapDistributions() override;
+
+    void initForcing();
+
+    void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+    void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+    void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+    void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+
+    LBMReal f1[D3Q27System::ENDF+1];
+
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF;
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF;
+    CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsF;
+
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1;
+    CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1;
+    CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsH1;
+
+    CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH2;
+    CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH2;
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsH2;
+
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld;
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr p1Old;
+
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField;
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseFieldOld;
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU; 
+
+    LBMReal h  [D3Q27System::ENDF+1];
+    LBMReal h2[D3Q27System::ENDF + 1];
+    LBMReal g  [D3Q27System::ENDF+1];
+    LBMReal phi[D3Q27System::ENDF+1];
+    LBMReal phi2[D3Q27System::ENDF + 1];
+    LBMReal pr1[D3Q27System::ENDF+1];
+    LBMReal phi_cutoff[D3Q27System::ENDF+1];
+
+    LBMReal gradX1_phi();
+    LBMReal gradX2_phi();
+    LBMReal gradX3_phi();
+	LBMReal gradX1_rhoInv(LBMReal rhoL, LBMReal rhoDIV);
+	LBMReal gradX2_rhoInv(LBMReal rhoL, LBMReal rhoDIV);
+	LBMReal gradX3_rhoInv(LBMReal rhoL, LBMReal rhoDIV);
+    LBMReal gradX1_phi2();
+    LBMReal gradX2_phi2();
+    LBMReal gradX3_phi2();
+    void computePhasefield();
+    void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3);
+    void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3);
+
+    LBMReal nabla2_phi();
+
+    mu::value_type muX1,muX2,muX3;
+    mu::value_type muDeltaT;
+    mu::value_type muNu;
+    mu::value_type muRho;
+    LBMReal forcingX1;
+    LBMReal forcingX2;
+    LBMReal forcingX3;
+};
+
+#endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp
index 102af60353833207231451f55acda91d03efbdd4..db1397374771efd414bdeccbefe605b810cf449b 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp
@@ -289,6 +289,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
                         //-1 0 1
 
                         findNeighbors(phaseField, x1, x2, x3);
+						findNeighbors2(phaseField2, x1, x2, x3);
 
                         LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
                         LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
@@ -328,72 +329,71 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
                         LBMReal dX2_phi = gradX2_phi();
                         LBMReal dX3_phi = gradX3_phi();
 
-                        LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9;
-                        LBMReal normX1 = dX1_phi/denom;
-						LBMReal normX2 = dX2_phi/denom;
-						LBMReal normX3 = dX3_phi/denom;
+						LBMReal dX1_phi2 = gradX1_phi2();
+						LBMReal dX2_phi2 = gradX2_phi2();
+						LBMReal dX3_phi2 = gradX3_phi2();
 
-						collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[REST] - phiH) / (phiH - phiL);
 
+                        LBMReal denom2 = sqrt(dX1_phi * dX1_phi+ dX1_phi2 * dX1_phi2 + dX2_phi * dX2_phi + dX2_phi2 * dX2_phi2 + dX3_phi * dX3_phi+ dX3_phi2 * dX3_phi2) + 1e-9;
+                        LBMReal normX1 = (dX1_phi-dX1_phi2)/denom2;
+						LBMReal normX2 = (dX2_phi-dX2_phi2)/denom2;
+						LBMReal normX3 = (dX3_phi-dX3_phi2)/denom2;
 
-                        LBMReal mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi();
+						//LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9;
+						//LBMReal normX1 = dX1_phi / denom;
+						//LBMReal normX2 = dX2_phi / denom;
+						//LBMReal normX3 = dX3_phi / denom;
 
-                        //----------- Calculating Macroscopic Values -------------
-                        LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH);
 
-                        if (withForcing) {
-                            // muX1 = static_cast<double>(x1-1+ix1*maxX1);
-                            // muX2 = static_cast<double>(x2-1+ix2*maxX2);
-                            // muX3 = static_cast<double>(x3-1+ix3*maxX3);
 
-                            forcingX1 = muForcingX1.Eval();
-                            forcingX2 = muForcingX2.Eval();
-                            forcingX3 = muForcingX3.Eval();
+						collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL);
+
+
+                        LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi();
 
-                            LBMReal rho_m = 1.0 / densityRatio;
-                            forcingX1     = forcingX1 * (rho - rho_m);
-                            forcingX2     = forcingX2 * (rho - rho_m);
-                            forcingX3     = forcingX3 * (rho - rho_m);
+                        //----------- Calculating Macroscopic Values -------------
+                        LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH);
 
                             			   ////Incompressible Kernal
 
-			    mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)/rho;
-			    mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) / rho;
-			    mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) / rho;
-			    mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) / rho;
-			    mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) / rho;
-			    mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) / rho;
-			    mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) / rho;
-			    mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) / rho;
-			    mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) / rho;
-			    mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) / rho;
-			    mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) / rho;
-			    mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) / rho;
-			    mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) / rho;
-
-			    mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) / rho;
-			    mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) / rho;
-			    mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) / rho;
-			    mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) / rho;
-			    mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) / rho;
-			    mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) / rho;
-			    mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) / rho;
-			    mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) / rho;
-			    mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) / rho;
-			    mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) / rho;
-			    mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) / rho;
-			    mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) / rho;
-			    mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) / rho;
-
-			    mfbbb = (*this->zeroDistributionsF)(x1, x2, x3) / rho;
+						mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) / rho * c3;
+						mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) / rho * c3;
+						mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) / rho * c3;
+						mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) / rho * c3;
+						mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) / rho * c3;
+						mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) / rho * c3;
+						mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) / rho * c3;
+						mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) / rho * c3;
+						mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) / rho * c3;
+						mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) / rho * c3;
+						mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) / rho * c3;
+						mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) / rho * c3;
+						mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) / rho * c3;
+
+						mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) / rho * c3;
+						mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) / rho * c3;
+						mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) / rho * c3;
+						mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) / rho * c3;
+						mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) / rho * c3;
+						mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) / rho * c3;
+						mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) / rho * c3;
+						mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) / rho * c3;
+						mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) / rho * c3;
+						mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) / rho * c3;
+						mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) / rho * c3;
+						mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) / rho * c3;
+						mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) / rho * c3;
+
+						mfbbb = (*this->zeroDistributionsF)(x1, x2, x3) / rho * c3;
+
 
 			   LBMReal m0, m1, m2;
 			   LBMReal rhoRef=c1;
 
 			  //LBMReal 
-			   LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
-				   + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
-				   + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+			//    LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+			// 	   + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+			// 	   + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
 
 			   LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
 				   (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
@@ -405,11 +405,240 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 				   (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
 				   (mfbbc - mfbba))/rhoRef;
 
+
+			   if (withForcing) {
+				   // muX1 = static_cast<double>(x1-1+ix1*maxX1);
+				   // muX2 = static_cast<double>(x2-1+ix2*maxX2);
+				   // muX3 = static_cast<double>(x3-1+ix3*maxX3);
+
+				   forcingX1 = muForcingX1.Eval();
+				   forcingX2 = muForcingX2.Eval();
+				   forcingX3 = muForcingX3.Eval();
+
+				   //LBMReal rho_m = 1.0 / densityRatio;
+				   //forcingX1 = forcingX1 * (rho - rho_m);
+				   //forcingX2 = forcingX2 * (rho - rho_m);
+				   //forcingX3 = forcingX3 * (rho - rho_m);
+				   vvx += forcingX1 * deltaT * 0.5; // X
+				   vvy += forcingX2 * deltaT * 0.5; // Y
+				   vvz += forcingX3 * deltaT * 0.5; // Z
+
+			   }
+
+
 			   ///surface tension force
 			   vvx += mu * dX1_phi*c1o2;
-			   vvy += mu * dX2_phi * c1o2;
+			   vvy += mu * dX2_phi * c1o2 ;
 			   vvz += mu * dX3_phi * c1o2;
 
+			   //////classic source term
+			   ///----Classic source term 8.4.2021
+
+			   LBMReal vvxF, vvyF, vvzF;
+			   vvxF = vvx;//-2*c1o24 * lap_vx;// 
+			   vvyF = vvy;//-2*c1o24 * lap_vy;// 
+			   vvzF = vvz;//-2*c1o24 * lap_vz;// 
+
+//			   vvxF = 1.2* vvx- 0.2*0.5 * ((*velocityX)(x1 - 1, x2, x3) + (*velocityX)(x1 + 1, x2, x3));
+//			   vvyF = 1.2 *vvy- 0.2*0.5* ((*velocityY)(x1 , x2-1, x3) + (*velocityY)(x1 , x2+1, x3));
+//			   vvzF = 1.2 *vvz-0.2*0.5* ((*velocityZ)(x1 , x2, x3-1) + (*velocityZ)(x1 , x2, x3+1));
+			   //if (vvxF != vvx) {
+				  // vvxF = vvxF;
+			   //}
+			   LBMReal weightGrad = 1.0;// -denom * denom / (denom * denom + 0.0001 * 0.001);
+			   LBMReal dX1_phiF = dX1_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX1;
+			   LBMReal dX2_phiF = dX2_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX2;
+			   LBMReal dX3_phiF = dX3_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX3;
+
+			   //dX1_phiF *= 1.2;
+			   //dX2_phiF *= 1.2;
+			   //dX3_phiF *= 1.2;
+
+			   //LBMReal gradFD = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi);
+			   //LBMReal gradPhi = (1.0 - phi[REST]) * (phi[REST]);
+			   //gradPhi = (gradPhi > gradFD) ? gradPhi : gradFD;
+			   //dX1_phiF = gradPhi * normX1;
+				  // dX2_phiF = gradPhi * normX2;
+				  // dX3_phiF = gradPhi * normX3;
+
+			   LBMReal ux2;
+			   LBMReal uy2;
+			   LBMReal uz2;
+			   ux2 = vvxF * vvxF;
+			   uy2 = vvyF * vvyF;
+			   uz2 = vvzF * vvzF;
+			   LBMReal forcingTerm[D3Q27System::ENDF + 1];
+			   for (int dir = FSTARTDIR; dir <= FENDDIR; dir++) {
+				   LBMReal velProd = DX1[dir] * vvxF + DX2[dir] * vvyF + DX3[dir] * vvzF;
+				   LBMReal velSq1 = velProd * velProd;
+				   LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + (4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)));
+
+				   //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi;
+
+				   //forcingTerm[dir] =
+					  // (-vvxF) * (fac1 * dX1_phiF) +
+					  // (-vvyF) * (fac1 * dX2_phiF) +
+					  // (-vvzF) * (fac1 * dX3_phiF) +
+					  // (DX1[dir]) * (fac1 * dX1_phiF) +
+					  // (DX2[dir]) * (fac1 * dX2_phiF) +
+					  // (DX3[dir]) * (fac1 * dX3_phiF);
+
+
+				   LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 ;
+
+				   forcingTerm[dir] =
+					   (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) +
+					   (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) +
+					   (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)) +
+					   (DX1[dir]) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) +
+					   (DX2[dir]) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) +
+					   (DX3[dir]) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL));
+
+
+
+			   }
+
+			   LBMReal gamma = WEIGTH[DIR_000] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+			   LBMReal fac1 = (gamma - WEIGTH[DIR_000]) * c1o3 * rhoToPhi;
+			   forcingTerm[DIR_000] =	 (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) +
+				   (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) +
+				   (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL));
+
+			   ////////
+			  // LBMReal divAfterSource=
+			  //( mfcbb + 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF)  *(vvzF)-1)+
+			  //( mfbcb + 3.0 * (0.5 * forcingTerm[N]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfbbc + 3.0 * (0.5 * forcingTerm[T]) / rho	) *((vvxF)  *(vvxF)  +(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfccb + 3.0 * (0.5 * forcingTerm[NE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfacb + 3.0 * (0.5 * forcingTerm[NW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfcbc + 3.0 * (0.5 * forcingTerm[TE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfabc + 3.0 * (0.5 * forcingTerm[TW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfbcc + 3.0 * (0.5 * forcingTerm[TN]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfbac + 3.0 * (0.5 * forcingTerm[TS]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfccc + 3.0 * (0.5 * forcingTerm[TNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfacc + 3.0 * (0.5 * forcingTerm[TNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfcac + 3.0 * (0.5 * forcingTerm[TSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfaac + 3.0 * (0.5 * forcingTerm[TSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfabb + 3.0 * (0.5 * forcingTerm[W]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF)  *(vvzF)-1)+
+			  //( mfbab + 3.0 * (0.5 * forcingTerm[S]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfbba + 3.0 * (0.5 * forcingTerm[B]) / rho	) *((vvxF)  *(vvxF)  +(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaab + 3.0 * (0.5 * forcingTerm[SW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfcab + 3.0 * (0.5 * forcingTerm[SE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfaba + 3.0 * (0.5 * forcingTerm[BW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcba + 3.0 * (0.5 * forcingTerm[BE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbaa + 3.0 * (0.5 * forcingTerm[BS]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbca + 3.0 * (0.5 * forcingTerm[BN]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaaa + 3.0 * (0.5 * forcingTerm[BSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcaa + 3.0 * (0.5 * forcingTerm[BSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaca + 3.0 * (0.5 * forcingTerm[BNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcca + 3.0 * (0.5 * forcingTerm[BNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbbb + 3.0 * (0.5 * forcingTerm[REST]) / rho)*((vvxF)*(vvxF)+(vvyF)*(vvyF)+(vvzF)*(vvzF)-1);
+
+			  // LBMReal divBeforeSource =
+				 //  (mfcbb)    * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) +
+				 //  (mfbcb)    * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfbbc)    * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfccb)   * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfacb)   * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfcbc)   * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfabc)   * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfbcc)   * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfbac)   * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfccc)  * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfacc)  * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfcac)  * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfaac)  * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfabb)    * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) +
+				 //  (mfbab)    * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfbba)    * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaab)   * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfcab)   * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfaba)   * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcba)   * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbaa)   * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbca)   * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaaa)  * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcaa)  * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaca)  * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcca)  * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbbb) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF) * (vvzF)-1);
+			   //if (divAfterSource - divBeforeSource != 0 && phi[REST]>0.0001 && phi[REST]<0.999) {
+				  // std::cout << phi[REST]<<" "<< divAfterSource << " " << divBeforeSource <<" "<< divAfterSource/ divBeforeSource << std::endl;
+			   //}
+
+			   //if (fabs(divAfterSource - divBeforeSource)/(fabs(divAfterSource) + fabs(divBeforeSource)+1e-10) > 1e-5) {
+				  // LBMReal scaleDiv =0.95+(1-0.95)* (divBeforeSource) / (divBeforeSource - divAfterSource);
+
+				  // forcingTerm[DIR_P00]	 *=scaleDiv;
+				  // forcingTerm[N]	 *=scaleDiv;
+				  // forcingTerm[T]	 *=scaleDiv;
+				  // forcingTerm[NE]	 *=scaleDiv;
+				  // forcingTerm[NW]	 *=scaleDiv;
+				  // forcingTerm[TE]	 *=scaleDiv;
+				  // forcingTerm[TW]	 *=scaleDiv;
+				  // forcingTerm[TN]	 *=scaleDiv;
+				  // forcingTerm[TS]	 *=scaleDiv;
+				  // forcingTerm[TNE]	 *=scaleDiv;
+				  // forcingTerm[TNW]	 *=scaleDiv;
+				  // forcingTerm[TSE]	 *=scaleDiv;
+				  // forcingTerm[TSW]	 *=scaleDiv;
+				  // forcingTerm[W]	 *=scaleDiv;
+				  // forcingTerm[S]	 *=scaleDiv;
+				  // forcingTerm[B]	 *=scaleDiv;
+				  // forcingTerm[SW]	 *=scaleDiv;
+				  // forcingTerm[SE]	 *=scaleDiv;
+				  // forcingTerm[BW]	 *=scaleDiv;
+				  // forcingTerm[BE]	 *=scaleDiv;
+				  // forcingTerm[BS]	 *=scaleDiv;
+				  // forcingTerm[BN]	 *=scaleDiv;
+				  // forcingTerm[BSW]	 *=scaleDiv;
+				  // forcingTerm[BSE]	 *=scaleDiv;
+				  // forcingTerm[BNW]	 *=scaleDiv;
+				  // forcingTerm[BNE]	 *=scaleDiv;
+				  // forcingTerm[REST] *=scaleDiv;
+			   //}
+			   ////////
+
+
+			   mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+			   mfbcb += 3.0 * (0.5 * forcingTerm[DIR_0P0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+			   mfbbc += 3.0 * (0.5 * forcingTerm[DIR_00P]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+			   mfccb += 3.0 * (0.5 * forcingTerm[DIR_PP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+			   mfacb += 3.0 * (0.5 * forcingTerm[DIR_MP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+			   mfcbc += 3.0 * (0.5 * forcingTerm[DIR_P0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+			   mfabc += 3.0 * (0.5 * forcingTerm[DIR_M0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+			   mfbcc += 3.0 * (0.5 * forcingTerm[DIR_0PP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+			   mfbac += 3.0 * (0.5 * forcingTerm[DIR_0MP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+			   mfccc += 3.0 * (0.5 * forcingTerm[DIR_PPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+			   mfacc += 3.0 * (0.5 * forcingTerm[DIR_MPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+			   mfcac += 3.0 * (0.5 * forcingTerm[DIR_PMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+			   mfaac += 3.0 * (0.5 * forcingTerm[DIR_MMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+			   mfabb += 3.0 * (0.5 * forcingTerm[DIR_M00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+			   mfbab += 3.0 * (0.5 * forcingTerm[DIR_0M0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+			   mfbba += 3.0 * (0.5 * forcingTerm[DIR_00M]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+			   mfaab += 3.0 * (0.5 * forcingTerm[DIR_MM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+			   mfcab += 3.0 * (0.5 * forcingTerm[DIR_PM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+			   mfaba += 3.0 * (0.5 * forcingTerm[DIR_M0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+			   mfcba += 3.0 * (0.5 * forcingTerm[DIR_P0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+			   mfbaa += 3.0 * (0.5 * forcingTerm[DIR_0MM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+			   mfbca += 3.0 * (0.5 * forcingTerm[DIR_0PM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+			   mfaaa += 3.0 * (0.5 * forcingTerm[DIR_MMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+			   mfcaa += 3.0 * (0.5 * forcingTerm[DIR_PMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+			   mfaca += 3.0 * (0.5 * forcingTerm[DIR_MPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+			   mfcca += 3.0 * (0.5 * forcingTerm[DIR_PPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+			   mfbbb += 3.0 * (0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
+
+			   //--------------------------------------------------------
+
+
+
+
+
+			   //////end classic source term
+
+
+
+
 			   //forcing 
 			   ///////////////////////////////////////////////////////////////////////////////////////////
 			   if (withForcing)
@@ -418,13 +647,13 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 				   muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2);
 				   muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3);
 
-				   forcingX1 = muForcingX1.Eval();
-				   forcingX2 = muForcingX2.Eval();
-				   forcingX3 = muForcingX3.Eval();
+				   //forcingX1 = muForcingX1.Eval();
+				   //forcingX2 = muForcingX2.Eval();
+				   //forcingX3 = muForcingX3.Eval();
 
-				   vvx += forcingX1 * deltaT * 0.5; // X
-				   vvy += forcingX2 * deltaT * 0.5; // Y
-				   vvz += forcingX3 * deltaT * 0.5; // Z
+				   //vvx += forcingX1 * deltaT * 0.5; // X
+				   //vvy += forcingX2 * deltaT * 0.5; // Y
+				   //vvz += forcingX3 * deltaT * 0.5; // Z
 			   }
 
 			   LBMReal vx2;
@@ -697,12 +926,24 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 			   // Cumulants
 			   ////////////////////////////////////////////////////////////////////////////////////
 			   LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity
-			   LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
-			   LBMReal OxyyMxzz  = 1.;//2+s9;//
+			 //  LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+			 //  LBMReal OxyyMxzz  = 1.;//2+s9;//
 			   LBMReal O4 = 1.;
 			   LBMReal O5 = 1.;
 			   LBMReal O6 = 1.;
 
+
+
+			   /////fourth order parameters; here only for test. Move out of loop!
+
+			   LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0)));
+			   LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
+			//    LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
+			   LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+			   //FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' )
+			   LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+
+
 			   //Cum 4.
 			   //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
 			   //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
@@ -744,19 +985,24 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 			   //applying phase field gradients first part:
 			  // mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz);
                // 17.03.2021 attempt for statililization by assymptotically vanishing bias
-               LBMReal correctionScaling =
-                   rhoToPhi / rho; // +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000;
-               mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) *
-                            correctionScaling; // As in Hesam's code
-               mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
-               mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
-               mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
-               mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
-               mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
-
-			   LBMReal dxux = 0.0;// -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
-			   LBMReal dyuy = 0.0;// dxux + collFactorM * c3o2 * mxxMyy;
-			   LBMReal dzuz = 0.0;// dxux + collFactorM * c3o2 * mxxMzz;
+               //LBMReal correctionScaling =
+               //    rhoToPhi / rho; // +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000;
+               //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) *
+               //             correctionScaling; // As in Hesam's code
+               //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
+               //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
+               //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
+               //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
+               //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+
+			   LBMReal dxux =  -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
+			   LBMReal dyuy =  dxux + collFactorM * c3o2 * mxxMyy;
+			   LBMReal dzuz =  dxux + collFactorM * c3o2 * mxxMzz;
+
+			   LBMReal Dxy = -three * collFactorM * mfbba;
+			   LBMReal Dxz = -three * collFactorM * mfbab;
+			   LBMReal Dyz = -three * collFactorM * mfabb;
+
 
 			   //relax
 			   mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
@@ -769,16 +1015,16 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 
 			   //applying phase field gradients second part:
 			   //mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz);
-               mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) *
-                            correctionScaling; // As in Hesam's code
-               mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
-               mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
-               mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
-               mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
-               mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+               //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) *
+               //             correctionScaling; // As in Hesam's code
+               //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
+               //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
+               //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
+               //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
+               //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
 
                ////updated pressure
-               mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
+               //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
 
                mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa
 			   // linear combinations back
@@ -822,13 +1068,19 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 			   mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
 
 			   //4.
-			   CUMacc += O4 * (-CUMacc);
-			   CUMcac += O4 * (-CUMcac);
-			   CUMcca += O4 * (-CUMcca);
-
-			   CUMbbc += O4 * (-CUMbbc);
-			   CUMbcb += O4 * (-CUMbcb);
-			   CUMcbb += O4 * (-CUMcbb);
+			   //CUMacc += O4 * (-CUMacc);
+			   //CUMcac += O4 * (-CUMcac);
+			   //CUMcca += O4 * (-CUMcca);
+
+			   //CUMbbc += O4 * (-CUMbbc);
+			   //CUMbcb += O4 * (-CUMbcb);
+			   //CUMcbb += O4 * (-CUMcbb);
+			   CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc);
+			   CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac);
+			   CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca);
+			   CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc);
+			   CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb);
+			   CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb);
 
 			   //5.
 			   CUMbcc += O5 * (-CUMbcc);
@@ -1090,60 +1342,92 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 			   mfbcc = m1;
 			   mfccc = m2;
 
+			   /////classical source term 8.4.2021
+
+			   mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+			   mfbcb += 3.0 * (0.5 * forcingTerm[DIR_0P0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+			   mfbbc += 3.0 * (0.5 * forcingTerm[DIR_00P]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+			   mfccb += 3.0 * (0.5 * forcingTerm[DIR_PP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+			   mfacb += 3.0 * (0.5 * forcingTerm[DIR_MP0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+			   mfcbc += 3.0 * (0.5 * forcingTerm[DIR_P0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+			   mfabc += 3.0 * (0.5 * forcingTerm[DIR_M0P]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+			   mfbcc += 3.0 * (0.5 * forcingTerm[DIR_0PP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+			   mfbac += 3.0 * (0.5 * forcingTerm[DIR_0MP]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+			   mfccc += 3.0 * (0.5 * forcingTerm[DIR_PPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+			   mfacc += 3.0 * (0.5 * forcingTerm[DIR_MPP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+			   mfcac += 3.0 * (0.5 * forcingTerm[DIR_PMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+			   mfaac += 3.0 * (0.5 * forcingTerm[DIR_MMP]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+			   mfabb += 3.0 * (0.5 * forcingTerm[DIR_M00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+			   mfbab += 3.0 * (0.5 * forcingTerm[DIR_0M0]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+			   mfbba += 3.0 * (0.5 * forcingTerm[DIR_00M]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+			   mfaab += 3.0 * (0.5 * forcingTerm[DIR_MM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+			   mfcab += 3.0 * (0.5 * forcingTerm[DIR_PM0]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+			   mfaba += 3.0 * (0.5 * forcingTerm[DIR_M0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+			   mfcba += 3.0 * (0.5 * forcingTerm[DIR_P0M]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+			   mfbaa += 3.0 * (0.5 * forcingTerm[DIR_0MM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+			   mfbca += 3.0 * (0.5 * forcingTerm[DIR_0PM]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+			   mfaaa += 3.0 * (0.5 * forcingTerm[DIR_MMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+			   mfcaa += 3.0 * (0.5 * forcingTerm[DIR_PMM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+			   mfaca += 3.0 * (0.5 * forcingTerm[DIR_MPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+			   mfcca += 3.0 * (0.5 * forcingTerm[DIR_PPM]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+			   mfbbb += 3.0 * (0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
+
+
+
 			   //////////////////////////////////////////////////////////////////////////
 			   //proof correctness
 			   //////////////////////////////////////////////////////////////////////////
-#ifdef  PROOF_CORRECTNESS
-			   LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
-				   + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
-				   + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
-			   //LBMReal dif = fabs(drho - rho_post);
-               LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post;
-#ifdef SINGLEPRECISION
-			   if (dif > 10.0E-7 || dif < -10.0E-7)
-#else
-			   if (dif > 10.0E-15 || dif < -10.0E-15)
-#endif
-			   {
-				   UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post)
-					   + " dif=" + UbSystem::toString(dif)
-					   + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
-				   //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
-				   //exit(EXIT_FAILURE);
-			   }
-#endif
+//#ifdef  PROOF_CORRECTNESS
+//			   LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+//				   + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+//				   + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+//			   //LBMReal dif = fabs(drho - rho_post);
+//               LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post;
+//#ifdef SINGLEPRECISION
+//			   if (dif > 10.0E-7 || dif < -10.0E-7)
+//#else
+//			   if (dif > 10.0E-15 || dif < -10.0E-15)
+//#endif
+//			   {
+//				   UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post)
+//					   + " dif=" + UbSystem::toString(dif)
+//					   + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+//				   //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+//				   //exit(EXIT_FAILURE);
+//			   }
+//#endif
 			   //////////////////////////////////////////////////////////////////////////
 			   //write distribution
 			   //////////////////////////////////////////////////////////////////////////
-			   (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca * rho;
-			   (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca * rho;
-
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac * rho;
-			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac * rho;
-
-			   (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb * rho;
+			   (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca * rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca * rho * c1o3;
+
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac * rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac * rho * c1o3;
+
+			   (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb * rho * c1o3;
 			   //////////////////////////////////////////////////////////////////////////
 
 			   ////!Incompressible Kernal
@@ -1203,7 +1487,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 //
 //                        //--------------------------------------------------------
 //
-//                        mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[E]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+//                        mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
 //                        mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
 //                        mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
 //                        mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
@@ -1911,7 +2195,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 //                        }
 //#endif
 //
-//                        mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[E];
+//                        mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00];
 //                        mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N];
 //                        mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T];
 //                        mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE];
@@ -1977,7 +2261,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
                         ////////////////////////////////////////////
 		/////CUMULANT PHASE-FIELD
 				LBMReal omegaD =1.0/( 3.0 * mob + 0.5);
-
+				{
 			   mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
 			   mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
 			   mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
@@ -2134,12 +2418,15 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 			   LBMReal Mccb = mfccb - mfaab * c1o9;
 
 			   // collision of 1st order moments
+			  // LBMReal ccx, ccy, ccz;
+			   
+
                cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
-                    normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale;
+                    normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
                cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
-                    normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale;
+                    normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
                cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
-                    normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale;
+                    normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
 
 			   //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx;
 			   //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy;
@@ -2281,6 +2568,323 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
    (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1,  x2,  x3p) = mfaac;
 
    (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb;
+   }
+
+   ////Phasefield 2:
+
+   {
+
+   normX1 *= -1;
+   normX2 *= -1;
+   normX3 *= -1;
+
+   mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3);
+   mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3);
+   mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3);
+   mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3);
+   mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3);
+   mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3);
+   mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3);
+   mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3);
+   mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3);
+   mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3);
+   mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3);
+   mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3);
+   mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3);
+   mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3);
+   mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3);
+   mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p);
+   mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3);
+   mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3);
+   mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p);
+   mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p);
+   mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p);
+   mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p);
+   mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+   mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p);
+   mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p);
+   mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p);
+   mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3);
+
+
+   ////////////////////////////////////////////////////////////////////////////////////
+//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
+//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+//!
+////////////////////////////////////////////////////////////////////////////////////
+// fluid component
+	   //LBMReal drhoFluid =
+		  // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) +
+		  // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) +
+			 //  ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb;
+
+	   //LBMReal rhoFluid = c1 + drhoFluid;
+	   //LBMReal OOrhoFluid = c1 / rhoFluid;
+
+
+	   //LBMReal vvx =
+		  // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) +
+		  // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) +
+			 //  (fcbb - fabb)) * OOrhoFluid;
+	   //LBMReal vvy =
+		  // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) +
+		  // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) +
+			 //  (fbcb - fbab)) * OOrhoFluid;
+	   //LBMReal vvz =
+		  // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) +
+		  // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) +
+			 //  (fbbc - fbba)) * OOrhoFluid;
+
+	 //  LBMReal vvx = ux;
+	 //  LBMReal vvy = uy;
+	 //  LBMReal vvz = uz;
+	   ////////////////////////////////////////////////////////////////////////////////////
+	   // second component
+   LBMReal concentration =
+	   ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+	   (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+		   ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref
+   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+   //!
+  // LBMReal fx = forces[0];
+  // LBMReal fy = forces[1];
+  // LBMReal fz = -concentration * forces[2];
+  // vvx += fx * c1o2;
+  // vvy += fy * c1o2;
+  // vvz += fz * c1o2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   LBMReal oneMinusRho = c1 - concentration;
+
+   LBMReal cx =
+	   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+	   (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+		   (mfcbb - mfabb));
+   LBMReal cy =
+	   ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+	   (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+		   (mfbcb - mfbab));
+   LBMReal cz =
+	   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+	   (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+		   (mfbbc - mfbba));
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // calculate the square of velocities for this lattice node
+   LBMReal cx2 = cx * cx;
+   LBMReal cy2 = cy * cy;
+   LBMReal cz2 = cz * cz;
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
+   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+   //! see also Eq. (6)-(14) in \ref
+   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+   //!
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Z - Dir
+   forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Y - Dir
+   forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+   forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+   forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+   forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+   forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+   forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+   forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // X - Dir
+   forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+   forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+   forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+   forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+   forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+   forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+   forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+   forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+   forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - experimental Cumulant ... to be published ... hopefully
+   //!
+
+   // linearized orthogonalization of 3rd order central moments
+   LBMReal Mabc = mfabc - mfaba * c1o3;
+   LBMReal Mbca = mfbca - mfbaa * c1o3;
+   LBMReal Macb = mfacb - mfaab * c1o3;
+   LBMReal Mcba = mfcba - mfaba * c1o3;
+   LBMReal Mcab = mfcab - mfaab * c1o3;
+   LBMReal Mbac = mfbac - mfbaa * c1o3;
+   // linearized orthogonalization of 5th order central moments
+   LBMReal Mcbc = mfcbc - mfaba * c1o9;
+   LBMReal Mbcc = mfbcc - mfbaa * c1o9;
+   LBMReal Mccb = mfccb - mfaab * c1o9;
+
+   // collision of 1st order moments
+   cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+	   normX1 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale;
+   cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+	   normX2 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale;
+   cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+	   normX3 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale;
+
+   //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx;
+   //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy;
+//mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz;
+
+
+   cx2 = cx * cx;
+   cy2 = cy * cy;
+   cz2 = cz * cz;
+
+   // equilibration of 2nd order moments
+   mfbba = zeroReal;
+   mfbab = zeroReal;
+   mfabb = zeroReal;
+
+   mfcaa = c1o3 * concentration;
+   mfaca = c1o3 * concentration;
+   mfaac = c1o3 * concentration;
+
+
+   //LBMReal omega2 = 1.0f;// omegaD;
+   //mfbba *= (c1 - omega2);
+   //mfbab *= (c1 - omega2);
+   //mfabb *= (c1 - omega2);
+
+   //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration;
+   //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration;
+   //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration;
+
+   // equilibration of 3rd order moments
+   Mabc = zeroReal;
+   Mbca = zeroReal;
+   Macb = zeroReal;
+   Mcba = zeroReal;
+   Mcab = zeroReal;
+   Mbac = zeroReal;
+   mfbbb = zeroReal;
+
+   // from linearized orthogonalization 3rd order central moments to central moments
+   mfabc = Mabc + mfaba * c1o3;
+   mfbca = Mbca + mfbaa * c1o3;
+   mfacb = Macb + mfaab * c1o3;
+   mfcba = Mcba + mfaba * c1o3;
+   mfcab = Mcab + mfaab * c1o3;
+   mfbac = Mbac + mfbaa * c1o3;
+
+   // equilibration of 4th order moments
+   mfacc = c1o9 * concentration;
+   mfcac = c1o9 * concentration;
+   mfcca = c1o9 * concentration;
+
+   mfcbb = zeroReal;
+   mfbcb = zeroReal;
+   mfbbc = zeroReal;
+
+   // equilibration of 5th order moments
+   Mcbc = zeroReal;
+   Mbcc = zeroReal;
+   Mccb = zeroReal;
+
+   // from linearized orthogonalization 5th order central moments to central moments
+   mfcbc = Mcbc + mfaba * c1o9;
+   mfbcc = Mbcc + mfbaa * c1o9;
+   mfccb = Mccb + mfaab * c1o9;
+
+   // equilibration of 6th order moment
+   mfccc = c1o27 * concentration;
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
+   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+   //! see also Eq. (88)-(96) in
+   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+   //!
+   ////////////////////////////////////////////////////////////////////////////////////
+   // X - Dir
+   backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+   backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+   backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+   backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+   backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+   backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+   backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+   backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+   backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Y - Dir
+   backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+   backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+   backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+   backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+   backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+   backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+   backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Z - Dir
+   backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+
+
+   (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+   (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+   (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+   (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+   (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+   (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+   (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+   (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+   (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+   (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+   (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+   (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+   (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+
+   (*this->zeroDistributionsH2)(x1, x2, x3) = mfbbb;
+
+   }
+
+
 
 		/////!CUMULANT PHASE-FIELD
 
@@ -2288,7 +2892,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 
                         /////////////////////   PHASE-FIELD BGK SOLVER ///////////////////////////////
 
-                        //h[E]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+                        //h[DIR_P00]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
                         //h[N]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
                         //h[T]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
                         //h[NE]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
@@ -2371,8 +2975,8 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
                     }
                 }
             }
-        }
-        dataSet->setPhaseField(divU);
+        
+       // dataSet->setPhaseField(divU);
 		}
 }
 //////////////////////////////////////////////////////////////////////////
@@ -2380,9 +2984,9 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step)
 LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX1_phi()
 {
     using namespace D3Q27System;
-	return 3.0* ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) + (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) + (phi[BNE] - phi[TSW])))
-		+ WEIGTH[NE] * (((phi[TE] - phi[BW]) + (phi[BE] - phi[TW])) + ((phi[SE] - phi[NW]) + (phi[NE] - phi[SW])))) +
-		+WEIGTH[N] * (phi[E] - phi[W]));
+	return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00]));
     //LBMReal sum = 0.0;
     //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
     //    sum += WEIGTH[k] * DX1[k] * phi[k];
@@ -2393,9 +2997,9 @@ LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX1_phi()
 LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX2_phi()
 {
     using namespace D3Q27System;
-	return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[BNE] - phi[TSW])- (phi[TSE] - phi[BNW])))
-		+ WEIGTH[NE] * (((phi[TN] - phi[BS]) + (phi[BN] - phi[TS])) + ((phi[NE] - phi[SW])- (phi[SE] - phi[NW])))) +
-		+WEIGTH[N] * (phi[N] - phi[S]));
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0]));
     //LBMReal sum = 0.0;
     //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
     //    sum += WEIGTH[k] * DX2[k] * phi[k];
@@ -2406,9 +3010,9 @@ LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX2_phi()
 LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX3_phi()
 {
     using namespace D3Q27System;
-	return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) - (phi[BNE] - phi[TSW])))
-		+ WEIGTH[NE] * (((phi[TE] - phi[BW]) - (phi[BE] - phi[TW])) + ((phi[TS] - phi[BN]) + (phi[TN] - phi[BS])))) +
-		+WEIGTH[N] * (phi[T] - phi[B]));
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M]));
     //LBMReal sum = 0.0;
     //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
     //    sum += WEIGTH[k] * DX3[k] * phi[k];
@@ -2416,21 +3020,64 @@ LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX3_phi()
     //return 3.0 * sum;
 }
 
+LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX1_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00]));
+	//LBMReal sum = 0.0;
+	//for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+	//    sum += WEIGTH[k] * DX1[k] * phi2[k];
+	//}
+	//return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX2_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0]));
+	//LBMReal sum = 0.0;
+	//for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+	//    sum += WEIGTH[k] * DX2[k] * phi2[k];
+	//}
+	//return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX3_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M]));
+	//LBMReal sum = 0.0;
+	//for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+	//    sum += WEIGTH[k] * DX3[k] * phi2[k];
+	//}
+	//return 3.0 * sum;
+}
+
+
+
+
+
 LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::nabla2_phi()
 {
     using namespace D3Q27System;
     LBMReal sum = 0.0;
-	sum += WEIGTH[TNE] * ((((phi[TNE] - phi[REST]) + (phi[BSW] - phi[REST])) + ((phi[TSW] - phi[REST]) + (phi[BNE] - phi[REST])))
-		+ (((phi[TNW] - phi[REST]) + (phi[BSE] - phi[REST])) + ((phi[TSE] - phi[REST]) + (phi[BNW] - phi[REST]))));
-	sum += WEIGTH[TN] * (
-			(((phi[TN] - phi[REST]) + (phi[BS] - phi[REST])) + ((phi[TS] - phi[REST]) + (phi[BN] - phi[REST])))
-		+	(((phi[TE] - phi[REST]) + (phi[BW] - phi[REST])) + ((phi[TW] - phi[REST]) + (phi[BE] - phi[REST])))
-		+	(((phi[NE] - phi[REST]) + (phi[SW] - phi[REST])) + ((phi[NW] - phi[REST]) + (phi[SE] - phi[REST])))
+	sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000])))
+		+ (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000]))));
+	sum += WEIGTH[DIR_0PP] * (
+			(((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000])))
+		+	(((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000])))
+		+	(((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000])))
 		);
-	sum += WEIGTH[T] * (
-			((phi[T] - phi[REST]) + (phi[B] - phi[REST]))
-		+	((phi[N] - phi[REST]) + (phi[S] - phi[REST]))
-		+	((phi[E] - phi[REST]) + (phi[W] - phi[REST]))
+	sum += WEIGTH[DIR_00P] * (
+			((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000]))
+		+	((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000]))
+		+	((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000]))
 		);
     //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
     //    sum += WEIGTH[k] * (phi[k] - phi[REST]);
@@ -2460,35 +3107,35 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::computePhasefield()
                     int x2p = x2 + 1;
                     int x3p = x3 + 1;
 
-                    h[E]   = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
-                    h[N]   = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
-                    h[T]   = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
-                    h[NE]  = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
-                    h[NW]  = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
-                    h[TE]  = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
-                    h[TW]  = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
-                    h[TN]  = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
-                    h[TS]  = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
-                    h[TNE] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
-                    h[TNW] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
-                    h[TSE] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
-                    h[TSW] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
-
-                    h[W]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
-                    h[S]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
-                    h[B]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
-                    h[SW]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
-                    h[SE]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
-                    h[BW]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
-                    h[BE]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
-                    h[BS]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
-                    h[BN]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
-                    h[BSW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
-                    h[BSE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
-                    h[BNW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
-                    h[BNE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
-
-                    h[REST] = (*this->zeroDistributionsH1)(x1, x2, x3);
+                    h[DIR_P00]   = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+                    h[DIR_0P0]   = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+                    h[DIR_00P]   = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+                    h[DIR_PP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+                    h[DIR_MP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+                    h[DIR_P0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+                    h[DIR_M0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+                    h[DIR_0PP]  = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+                    h[DIR_0MP]  = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+                    h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+                    h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+                    h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+                    h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+                    h[DIR_M00]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+                    h[DIR_0M0]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+                    h[DIR_00M]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+                    h[DIR_MM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+                    h[DIR_PM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+                    h[DIR_M0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+                    h[DIR_P0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+                    h[DIR_0MM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+                    h[DIR_0PM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+                    h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                    h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                    h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                    h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                    h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3);
                 }
             }
         }
@@ -2502,7 +3149,8 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal,
 
     SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
 
-    phi[REST] = (*ph)(x1, x2, x3);
+    phi[DIR_000] = (*ph)(x1, x2, x3);
+
 
     for (int k = FSTARTDIR; k <= FENDDIR; k++) {
 
@@ -2514,8 +3162,30 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal,
     }
 }
 
+void MultiphaseTwoPhaseFieldsCumulantLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+	int x3)
+{
+	using namespace D3Q27System;
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	phi2[DIR_000] = (*ph)(x1, x2, x3);
+
+
+	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+			phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+		}
+		else {
+			phi2[k] = 0.0;
+		}
+	}
+}
+
 void MultiphaseTwoPhaseFieldsCumulantLBMKernel::swapDistributions()
 {
     LBMKernel::swapDistributions();
     dataSet->getHdistributions()->swap();
+	dataSet->getH2distributions()->swap();
 }
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h
index bc7609a2903948e6362a91e863cd10c9376a37be..a65fe073fc18258f518f72df97e6e8751adc4479 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h
@@ -80,18 +80,23 @@ protected:
    LBMReal h2[D3Q27System::ENDF + 1];
    LBMReal g  [D3Q27System::ENDF+1];
    LBMReal phi[D3Q27System::ENDF+1];
+   LBMReal phi2[D3Q27System::ENDF + 1];
    LBMReal pr1[D3Q27System::ENDF+1];
    LBMReal phi_cutoff[D3Q27System::ENDF+1];
 
    LBMReal gradX1_phi();
    LBMReal gradX2_phi();
    LBMReal gradX3_phi();
+   LBMReal gradX1_phi2();
+   LBMReal gradX2_phi2();
+   LBMReal gradX3_phi2();
    //LBMReal gradX1_pr1();
    //LBMReal gradX2_pr1();
    //LBMReal gradX3_pr1();
    //LBMReal dirgradC_phi(int n, int k);
    void computePhasefield();
    void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3);
+   void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3);
    //void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, int x1, int x2, int x3);
    //void pressureFiltering(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf_filtered /*Pressure-Field*/);
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3baddc4fef5447c83b242727276fd0ec7b64c206
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp
@@ -0,0 +1,3580 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp
+//! \ingroup LBMKernel
+//! \author Hesameddin Safari
+//=======================================================================================
+
+#include "MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h"
+#include "BCArray3D.h"
+#include "Block3D.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "D3Q27System.h"
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+#include <cmath>
+
+#define PROOF_CORRECTNESS
+
+//////////////////////////////////////////////////////////////////////////
+MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::MultiphaseTwoPhaseFieldsPressureFilterLBMKernel() { this->compressible = false; }
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::initDataSet()
+{
+    SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9));
+    SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field
+    SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field
+    //SPtr<PhaseFieldArray3D> divU(new PhaseFieldArray3D(            nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D(            nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new  CbArray3D<LBMReal, IndexerX3X2X1>(    nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+    dataSet->setFdistributions(f);
+    dataSet->setHdistributions(h); // For phase-field
+    dataSet->setH2distributions(h2); // For phase-field
+    //dataSet->setPhaseField(divU);
+	dataSet->setPhaseField(divU1);
+	dataSet->setPressureField(pressure);
+
+	phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0));
+	phaseField2 = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0));
+	divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::clone()
+{
+    SPtr<LBMKernel> kernel(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel());
+    kernel->setNX(nx);
+    dynamicPointerCast<MultiphaseTwoPhaseFieldsPressureFilterLBMKernel>(kernel)->initDataSet();
+    kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG);
+    kernel->setDensityRatio(this->densityRatio);
+    kernel->setMultiphaseModelParameters(this->beta, this->kappa);
+    kernel->setContactAngle(this->contactAngle);
+    kernel->setPhiL(this->phiL);
+    kernel->setPhiH(this->phiH);
+    kernel->setPhaseFieldRelaxation(this->tauH);
+    kernel->setMobility(this->mob);
+	kernel->setInterfaceWidth(this->interfaceWidth);
+
+    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setWithForcing(withForcing);
+    kernel->setForcingX1(muForcingX1);
+    kernel->setForcingX2(muForcingX2);
+    kernel->setForcingX3(muForcingX3);
+    kernel->setIndex(ix1, ix2, ix3);
+    kernel->setDeltaT(deltaT);
+	kernel->setGhostLayerWidth(2);
+	dynamicPointerCast<MultiphaseTwoPhaseFieldsPressureFilterLBMKernel>(kernel)->initForcing();
+
+    return kernel;
+}
+//////////////////////////////////////////////////////////////////////////
+ void  MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+    LBMReal m2 = mfa + mfc;
+	LBMReal m1 = mfc - mfa;
+	LBMReal m0 = m2 + mfb;
+	mfa = m0;
+	m0 *= Kinverse;
+	m0 += oneMinusRho;
+	mfb = (m1 * Kinverse - m0 * vv) * K;
+	mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+ void  MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+    LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K;
+	LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K;
+	mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K;
+	mfa = m0;
+	mfb = m1;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+ void  MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+    LBMReal m1 = (mfa + mfc) + mfb;
+	LBMReal m2 = mfc - mfa;
+	mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2);
+	mfb = m2 - vv * m1;
+	mfa = m1;
+}
+
+
+ void  MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+    LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2);
+	LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv;
+	mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2);
+	mfb = mb;
+	mfa = ma;
+}
+
+
+void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::calculate(int step)
+{
+    using namespace D3Q27System;
+    using namespace UbMath;
+
+    forcingX1 = 0.0;
+    forcingX2 = 0.0;
+    forcingX3 = 0.0;
+
+	LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5;
+    /////////////////////////////////////
+
+    localDistributionsF    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+    nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+    zeroDistributionsF     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+
+    localDistributionsH1    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions();
+    nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
+    zeroDistributionsH1     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
+
+	localDistributionsH2    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getLocalDistributions();
+    nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions();
+    zeroDistributionsH2     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions();
+
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
+
+    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+    const int bcArrayMaxX1 = (int)bcArray->getNX1();
+    const int bcArrayMaxX2 = (int)bcArray->getNX2();
+    const int bcArrayMaxX3 = (int)bcArray->getNX3();
+	    
+	int minX1 = ghostLayerWidth;
+    int minX2 = ghostLayerWidth;
+    int minX3 = ghostLayerWidth;
+    int maxX1 = bcArrayMaxX1 - ghostLayerWidth;
+    int maxX2 = bcArrayMaxX2 - ghostLayerWidth;
+    int maxX3 = bcArrayMaxX3 - ghostLayerWidth;
+
+
+
+    //TODO
+	//very expensive !!!!!
+	//CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField(
+ //           new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, -999.0));
+ //   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField2(
+ //       new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, -999.0));
+ //       CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU(
+ //           new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0));
+
+//#pragma omp parallel for
+	  for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) {
+            for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) {
+                for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) {
+                    if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+                        int x1p = x1 + 1;
+                        int x2p = x2 + 1;
+                        int x3p = x3 + 1;
+
+                        LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+                        LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+                        LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+                        LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+                        LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+                        LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+                        LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+                        LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+                        LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+                        LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+                        LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+                        LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+                        LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+                        LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+                        LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+                        LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+                        LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+                        LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+                        LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+                        LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+                        LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+                        LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+                        LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                        LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                        LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                        LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                        LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+						(*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca)  + (mfcaa + mfacc))  ) +
+                                                    (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) +
+                                                    ((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) +
+                                                    (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb;
+
+                        mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3);
+                        mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3);
+                        mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3);
+                        mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3);
+                        mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3);
+                        mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3);
+                        mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3);
+                        mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3);
+                        mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3);
+                        mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3);
+                        mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3);
+                        mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3);
+                        mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3);
+                        mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3);
+                        mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3);
+                        mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p);
+                        mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3);
+                        mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3);
+                        mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p);
+                        mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p);
+                        mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p);
+                        mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p);
+                        mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                        mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                        mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                        mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                        mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3);
+						(*phaseField2)(x1, x2, x3) =
+                            (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc))) +
+                            (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) +
+                             ((mfbaa + mfbac) + (mfbca + mfbcc))) +
+                            ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb;
+						//(*phaseField)(x1, x2, x3) = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +
+						//	(mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) +
+						//	(mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) +
+						//	(mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+////// read F-distributions for velocity formalism
+
+
+						 mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+						 mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+						 mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+						 mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+						 mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+						 mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+						 mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+						 mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+						 mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+						 mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+						 mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+						 mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+						 mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+						 mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+						 mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+						 mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+						 mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+						 mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+						 mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+						 mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+						 mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+						 mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+						 mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						 mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						 mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						 mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+						 mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+						LBMReal rhoH = 1.0;
+						LBMReal rhoL = 1.0 / densityRatio;
+
+						LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+						LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+							+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+							+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+						LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH);
+						//! variable density -> TRANSFER!
+						//LBMReal rho = rhoH * ((*phaseField)(x1, x2, x3)) + rhoL * ((*phaseField2)(x1, x2, x3));
+
+						(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + rho * c1o3 * drho;
+
+						//(*pressure)(x1, x2, x3) = (((*phaseField)(x1, x2, x3)) + ((*phaseField2)(x1, x2, x3)) - c1) * c1o3;
+						////!!!!!! relplace by pointer swap!
+						//(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3);
+                    }
+                }
+            }
+        }
+
+        LBMReal collFactorM;
+        //LBMReal forcingTerm[D3Q27System::ENDF + 1];
+
+		////filter
+
+		//for (int x3 = minX3; x3 < maxX3; x3++) {
+		//	for (int x2 = minX2; x2 < maxX2; x2++) {
+		//		for (int x1 = minX1; x1 < maxX1; x1++) {
+		//			if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+
+		//				LBMReal sum = 0.;
+
+		//				//Lapalce pressure
+		//				//sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3+1) - (*pressure)(x1, x2, x3))))
+		//				//	+ ((((*pressure)(x1+1, x2-1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3+1) - (*pressure)(x1, x2, x3)))));
+		//				//sum += WEIGTH[TN] * (
+		//				//	((((*pressure)(x1+1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3) - (*pressure)(x1, x2, x3))))
+		//				//	+ ((((*pressure)(x1+1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3+1) - (*pressure)(x1, x2, x3))))
+		//				//	+ ((((*pressure)(x1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) - (*pressure)(x1, x2, x3))))
+		//				//	);
+		//				//sum += WEIGTH[T] * (
+		//				//	(((*pressure)(x1+1, x2, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3) - (*pressure)(x1, x2, x3)))
+		//				//	+ (((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3) - (*pressure)(x1, x2, x3)))
+		//				//	+ (((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2, x3-1) - (*pressure)(x1, x2, x3)))
+		//				//	);
+
+
+		//				//LBMReal pressureFilter = 100;
+		//				//(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + pressureFilter * sum * (sqrt(fabs(sum)));
+
+		//				//Situpol Eq. 81
+		//				sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1)) + ((*pressure)(x1-1, x2-1, x3-1) )) + (((*pressure)(x1+1, x2+1, x3-1) ) + ((*pressure)(x1-1, x2-1, x3+1) )))
+		//					+ ((((*pressure)(x1+1, x2-1, x3+1) ) + ((*pressure)(x1-1, x2+1, x3-1) )) + (((*pressure)(x1+1, x2-1, x3-1) ) + ((*pressure)(x1-1, x2+1, x3+1) ))));
+		//				sum += WEIGTH[TN] * (
+		//					((((*pressure)(x1+1, x2+1, x3) ) + ((*pressure)(x1-1, x2-1, x3) )) + (((*pressure)(x1+1, x2-1, x3) ) + ((*pressure)(x1-1, x2+1, x3) )))
+		//					+ ((((*pressure)(x1+1, x2, x3+1) ) + ((*pressure)(x1-1, x2, x3-1) )) + (((*pressure)(x1+1, x2, x3-1) ) + ((*pressure)(x1-1, x2, x3+1) )))
+		//					+ ((((*pressure)(x1, x2+1, x3+1) ) + ((*pressure)(x1, x2-1, x3-1) )) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) )))
+		//					);
+		//				sum += WEIGTH[T] * (
+		//					(((*pressure)(x1+1, x2, x3) ) + ((*pressure)(x1-1, x2, x3) ))
+		//					+ (((*pressure)(x1, x2+1, x3) ) + ((*pressure)(x1, x2-1, x3) ))
+		//					+ (((*pressure)(x1, x2, x3+1)) + ((*pressure)(x1, x2, x3-1) ))
+		//					);
+		//				sum += WEIGTH[REST] * (*pressure)(x1, x2, x3);
+		//				(*pressureOld)(x1, x2, x3) = sum;
+
+
+
+
+		//			}
+		//		}
+		//	}
+		//}
+
+		////Periodic Filter
+//#pragma omp parallel for
+		for (int x3 = minX3-1; x3 <= maxX3; x3++) {
+			for (int x2 = minX2-1; x2 <= maxX2; x2++) {
+				for (int x1 = minX1-1; x1 <= maxX1; x1++) {
+					if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+
+						LBMReal sum = 0.;
+
+
+
+						//Lapalce pressure
+						//sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3+1) - (*pressure)(x1, x2, x3))))
+						//	+ ((((*pressure)(x1+1, x2-1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3+1) - (*pressure)(x1, x2, x3)))));
+						//sum += WEIGTH[TN] * (
+						//	((((*pressure)(x1+1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3) - (*pressure)(x1, x2, x3))))
+						//	+ ((((*pressure)(x1+1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3+1) - (*pressure)(x1, x2, x3))))
+						//	+ ((((*pressure)(x1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) - (*pressure)(x1, x2, x3))))
+						//	);
+						//sum += WEIGTH[T] * (
+						//	(((*pressure)(x1+1, x2, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3) - (*pressure)(x1, x2, x3)))
+						//	+ (((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3) - (*pressure)(x1, x2, x3)))
+						//	+ (((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2, x3-1) - (*pressure)(x1, x2, x3)))
+						//	);
+
+
+						//LBMReal pressureFilter = 100;
+						//(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + pressureFilter * sum * (sqrt(fabs(sum)));
+
+						//Situpol Eq. 81
+
+						//int x1p = (x1 < maxX1) ? x1 + 1 : 0;
+						//int x1m = (x1 > 0) ? x1 - 1 : maxX1;
+						//int x2p = (x2 < maxX2) ? x2 + 1 : 0;
+						//int x2m = (x2 > 0) ? x2 - 1 : maxX2;
+						//int x3p = (x3 < maxX3) ? x3 + 1 : 0;
+						//int x3m = (x3 > 0) ? x3 - 1 : maxX3;
+						//sum += WEIGTH[TNE] * (((((*pressure)(x1p, x2p, x3p)) + ((*pressure)(x1m, x2m, x3m))) + (((*pressure)(x1p, x2p, x3m)) + ((*pressure)(x1m, x2m, x3p))))
+						//	+ ((((*pressure)(x1p, x2m, x3p)) + ((*pressure)(x1m, x2p, x3m))) + (((*pressure)(x1p, x2m, x3m)) + ((*pressure)(x1m, x2p, x3p)))));
+						//sum += WEIGTH[TN] * (
+						//	((((*pressure)(x1p, x2p, x3)) + ((*pressure)(x1m, x2m, x3))) + (((*pressure)(x1p, x2m, x3)) + ((*pressure)(x1m, x2p, x3))))
+						//	+ ((((*pressure)(x1p, x2, x3p)) + ((*pressure)(x1m, x2, x3m))) + (((*pressure)(x1p, x2, x3m)) + ((*pressure)(x1m, x2, x3p))))
+						//	+ ((((*pressure)(x1, x2p, x3p)) + ((*pressure)(x1, x2m, x3m))) + (((*pressure)(x1, x2p, x3m) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2m, x3p))))
+						//	);
+						//sum += WEIGTH[T] * (
+						//	(((*pressure)(x1p, x2, x3)) + ((*pressure)(x1m, x2, x3)))
+						//	+ (((*pressure)(x1, x2p, x3)) + ((*pressure)(x1, x2m, x3)))
+						//	+ (((*pressure)(x1, x2, x3p)) + ((*pressure)(x1, x2, x3m)))
+						//	);
+						//sum += WEIGTH[REST] * (*pressure)(x1, x2, x3);
+						//(*pressureOld)(x1, x2, x3) = sum;
+						 
+						///Version for boundaries
+						for (int xx = -1; xx <= 1; xx++) {
+							//int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0;
+							int xxx = xx + x1;
+
+							for (int yy = -1; yy <= 1; yy++) {
+								//int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0;
+								int yyy = yy + x2;
+
+								for (int zz = -1; zz <= 1; zz++) {
+									//int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0;
+									int zzz = zz + x3;
+									
+									if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) {
+										sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz);
+									}
+									else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3);
+									}
+
+
+								}
+							}
+						}
+						(*pressure)(x1, x2, x3) = sum;
+
+
+
+					}
+				}
+			}
+		}
+
+//#pragma omp parallel for
+		// for (int x3 = minX3-1; x3 <= maxX3; x3++) {
+		// 	for (int x2 = minX2-1; x2 <= maxX2; x2++) {
+		// 		for (int x1 = minX1-1; x1 <= maxX1; x1++) {
+		// 			if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+		// 				///filter!
+
+		// 				(*pressure)(x1, x2, x3) = (*pressureOld)(x1, x2, x3);
+		// 			}
+		// 		}
+		// 	}
+		// }
+		////!filter
+
+
+//#pragma omp parallel for
+        for (int x3 = minX3; x3 < maxX3; x3++) {
+            for (int x2 = minX2; x2 < maxX2; x2++) {
+                for (int x1 = minX1; x1 < maxX1; x1++) {
+                    if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+                        int x1p = x1 + 1;
+                        int x2p = x2 + 1;
+                        int x3p = x3 + 1;
+
+
+
+                        //////////////////////////////////////////////////////////////////////////
+                        // Read distributions and phase field
+                        ////////////////////////////////////////////////////////////////////////////
+                        //////////////////////////////////////////////////////////////////////////
+
+                        // E   N  T
+                        // c   c  c
+                        //////////
+                        // W   S  B
+                        // a   a  a
+
+                        // Rest ist b
+
+                        // mfxyz
+                        // a - negative
+                        // b - null
+                        // c - positive
+
+                        // a b c
+                        //-1 0 1
+
+                        findNeighbors(phaseField, x1, x2, x3);
+						findNeighbors2(phaseField2, x1, x2, x3);
+
+                        LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+                        LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+                        LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+                        LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+                        LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+                        LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+                        LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+                        LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+                        LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+                        LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+                        LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+                        LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+                        LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+                        LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+                        LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+                        LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+                        LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+                        LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+                        LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+                        LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+                        LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+                        LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+                        LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                        LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                        LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                        LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                        LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+                        LBMReal rhoH = 1.0;
+                        LBMReal rhoL = 1.0 / densityRatio;
+
+                        LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+                        LBMReal dX1_phi = gradX1_phi();
+                        LBMReal dX2_phi = gradX2_phi();
+                        LBMReal dX3_phi = gradX3_phi();
+
+						//LBMReal dX1_phi2 = gradX1_phi2();
+						//LBMReal dX2_phi2 = gradX2_phi2();
+						//LBMReal dX3_phi2 = gradX3_phi2();
+
+
+      //                  LBMReal denom2 = sqrt(dX1_phi * dX1_phi+ dX1_phi2 * dX1_phi2 + dX2_phi * dX2_phi + dX2_phi2 * dX2_phi2 + dX3_phi * dX3_phi+ dX3_phi2 * dX3_phi2) + 1e-9;
+      //                  LBMReal normX1 = (dX1_phi-dX1_phi2)/denom2;
+						//LBMReal normX2 = (dX2_phi-dX2_phi2)/denom2;
+						//LBMReal normX3 = (dX3_phi-dX3_phi2)/denom2;
+
+						LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9;
+						LBMReal normX1 = dX1_phi / denom;
+						LBMReal normX2 = dX2_phi / denom;
+						LBMReal normX3 = dX3_phi / denom;
+
+
+
+						collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL);
+
+
+                        LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi();
+
+                        //----------- Calculating Macroscopic Values -------------
+                        LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH);
+
+						//! variable density -> TRANSFER!
+						//LBMReal rho = rhoH * ((*phaseField)(x1, x2, x3)) + rhoL * ((*phaseField2)(x1, x2, x3));
+
+
+                            			   ////Incompressible Kernal
+
+						//mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)         ;// / rho * c3;
+						//mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3)         ;// / rho * c3;
+						//mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3)        ;// / rho * c3;
+						//mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3)       ;// / rho * c3;
+						//mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3)         ;// / rho * c3;
+						//mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3)        ;// / rho * c3;
+						//mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3)       ;// / rho * c3;
+						//mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3)        ;// / rho * c3;
+						//mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3)       ;// / rho * c3;
+						//mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3)       ;// / rho * c3;
+						//mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3)      ;// / rho * c3;
+						//mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3)      ;// / rho * c3;
+						//mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3)     ;// / rho * c3;																								    
+						//mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3)     ;// / rho * c3;
+						//mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3)     ;// / rho * c3;
+						//mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p)     ;// / rho * c3;
+						//mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3)   ;// / rho * c3;
+						//mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3)    ;// / rho * c3;
+						//mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p)   ;// / rho * c3;
+						//mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p)    ;// / rho * c3;
+						//mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p)   ;// / rho * c3;
+						//mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p)    ;// / rho * c3;
+						//mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) ;// / rho * c3;
+						//mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p)  ;// / rho * c3;
+						//mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p)  ;// / rho * c3;
+						//mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p)   ;// / rho * c3;
+
+						//mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);// / rho * c3;
+
+
+			   LBMReal m0, m1, m2;
+			   LBMReal rhoRef=c1;
+
+			  //LBMReal 
+			//    LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+			// 	   + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+			// 	   + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+			   LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+				   (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+				   (mfcbb - mfabb))/rhoRef;
+			   LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+				   (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+				   (mfbcb - mfbab))/rhoRef;
+			   LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+				   (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+				   (mfbbc - mfbba))/rhoRef;
+
+			 //  (*pressure)(x1, x2, x3) = (*pressureOld)(x1, x2, x3)+rho*c1o3*drho;
+
+			   //LBMReal gradPx = c1o2 * ((*pressure)(x1 + 1, x2, x3) - (*pressure)(x1 - 1, x2, x3));
+			   //LBMReal gradPy = c1o2 * ((*pressure)(x1, x2 + 1, x3) - (*pressure)(x1, x2 - 1, x3));
+			   //LBMReal gradPz = c1o2 * ((*pressure)(x1, x2, x3 + 1) - (*pressure)(x1, x2, x3 - 1));
+
+			   //LBMReal gradPx = 3.0 * (WEIGTH[TNE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 + 1, x2 - 1, x3 + 1) - (*pressure)(x1 - 1, x2 + 1, x3 - 1)))
+				  // + (((*pressure)(x1 + 1, x2 - 1, x3 - 1) - (*pressure)(x1 - 1, x2 + 1, x3 + 1)) + ((*pressure)(x1 + 1, x2 + 1, x3 - 1) - (*pressure)(x1 - 1, x2 - 1, x3 + 1))))
+				  // + WEIGTH[NE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3) - (*pressure)(x1 - 1, x2 - 1, x3)) + ((*pressure)(x1 + 1, x2 - 1, x3) - (*pressure)(x1 - 1, x2 + 1, x3)))
+					 //  + (((*pressure)(x1 + 1, x2, x3 - 1) - (*pressure)(x1 - 1, x2, x3 + 1)) + ((*pressure)(x1 + 1, x2, x3 + 1) - (*pressure)(x1 - 1, x2, x3 - 1))))
+				  // + WEIGTH[DIR_P00] * ((*pressure)(x1 + 1, x2, x3) - (*pressure)(x1 - 1, x2, x3)));
+
+			   //LBMReal gradPy = 3.0 * (WEIGTH[TNE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 - 1, x2 + 1, x3 + 1) - (*pressure)(x1 + 1, x2 - 1, x3 - 1)))
+				  // + (((*pressure)(x1 - 1, x2 + 1, x3 - 1) - (*pressure)(x1 + 1, x2 - 1, x3 + 1)) + ((*pressure)(x1 + 1, x2 + 1, x3 - 1) - (*pressure)(x1 - 1, x2 - 1, x3 + 1))))
+				  // + WEIGTH[NE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3) - (*pressure)(x1 - 1, x2 - 1, x3)) + ((*pressure)(x1 - 1, x2 + 1, x3) - (*pressure)(x1 + 1, x2 - 1, x3)))
+					 //  + (((*pressure)(x1, x2+1, x3 - 1) - (*pressure)(x1, x2-1, x3 + 1)) + ((*pressure)(x1, x2+1, x3 + 1) - (*pressure)(x1, x2-1, x3 - 1))))
+				  // + WEIGTH[DIR_P00] * ((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2-1, x3)));
+
+			   //LBMReal gradPz = 3.0 * (WEIGTH[TNE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 - 1, x2 + 1, x3 + 1) - (*pressure)(x1 + 1, x2 - 1, x3 - 1)))
+				  // + (((*pressure)(x1 - 1, x2 - 1, x3 + 1) - (*pressure)(x1 + 1, x2 + 1, x3 - 1)) + ((*pressure)(x1 + 1, x2 - 1, x3 + 1) - (*pressure)(x1 - 1, x2 + 1, x3 - 1))))
+				  // + WEIGTH[NE] * (
+				  // (((*pressure)(x1 + 1, x2, x3+1) - (*pressure)(x1 - 1, x2, x3-1)) + ((*pressure)(x1 - 1, x2, x3+1) - (*pressure)(x1 + 1, x2, x3-1)))
+					 //  + (((*pressure)(x1, x2 - 1, x3 + 1) - (*pressure)(x1, x2 + 1, x3 - 1)) + ((*pressure)(x1, x2 + 1, x3 + 1) - (*pressure)(x1, x2 - 1, x3 - 1))))
+				  // + WEIGTH[DIR_P00] * ((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3-1)));
+			  
+			   
+			   LBMReal gradPx = 0.0;
+			   LBMReal gradPy = 0.0;
+			   LBMReal gradPz = 0.0;
+			   for (int dir1 = -1; dir1 <= 1; dir1++) {
+				   for (int dir2 = -1; dir2 <= 1; dir2++) {
+					   int yyy = x2 + dir1;
+					   int zzz = x3 + dir2;
+					   if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) {
+						   gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) {
+						   gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+
+					   int xxx = x1 + dir1;
+					   if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) {
+						   gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) {
+						   gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+
+					   yyy = x2 + dir2;
+					   if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) {
+						   gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) {
+						   gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+
+				   }
+			   }
+
+			   //Viscosity increase by pressure gradient
+			   LBMReal errPhi = (((1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale)- denom);
+			   //LBMReal limVis = 0.0000001*10;//0.01;
+			  // collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM);
+			  // collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM;
+			   errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi;
+			   //collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis);
+
+			   //3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW])))
+			   //+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) +
+			   //+WEIGTH[N] * (phi2[T] - phi2[B]));
+
+			   //if (withForcing) {
+				   // muX1 = static_cast<double>(x1-1+ix1*maxX1);
+				   // muX2 = static_cast<double>(x2-1+ix2*maxX2);
+				   // muX3 = static_cast<double>(x3-1+ix3*maxX3);
+
+				  // forcingX1 = muForcingX1.Eval()+c1o3*drho*dX1_phi*rhoToPhi/rho;//-gradPx/rho;
+				  // forcingX2 = muForcingX2.Eval() + c1o3*drho*dX2_phi * rhoToPhi / rho;//-gradPy/rho;
+				   //forcingX3 = muForcingX3.Eval() + c1o3*drho*dX3_phi * rhoToPhi / rho;//-gradPz/rho;
+
+
+				   muRho = rho;
+				   
+			       //muForcingX1.DefineConst("rho", rho);
+			       //muForcingX2.DefineConst("rho", rho);
+			       //muForcingX3.DefineConst("rho", rho);
+				   			   
+
+				   forcingX1 = muForcingX1.Eval()/rho - gradPx/rho;
+				   forcingX2 = muForcingX2.Eval()/rho - gradPy/rho;
+				   forcingX3 = muForcingX3.Eval()/rho - gradPz/rho;
+
+				   //LBMReal rho_m = 1.0 / densityRatio;
+				   //forcingX1 = forcingX1 * (rho - rho_m);
+				   //forcingX2 = forcingX2 * (rho - rho_m);
+				   //forcingX3 = forcingX3 * (rho - rho_m);
+				   vvx += forcingX1 * deltaT * 0.5; // X
+				   vvy += forcingX2 * deltaT * 0.5; // Y
+				   vvz += forcingX3 * deltaT * 0.5; // Z
+
+			   //}
+
+
+			   ///surface tension force
+			   vvx += mu * dX1_phi * c1o2 / rho;
+			   vvy += mu * dX2_phi * c1o2 / rho ;
+			   vvz += mu * dX3_phi * c1o2 / rho;
+
+			   //////classic source term
+			   ///----Classic source term 8.4.2021
+
+			   //LBMReal vvxF, vvyF, vvzF;
+			   //vvxF = vvx;//-2*c1o24 * lap_vx;// 
+			   //vvyF = vvy;//-2*c1o24 * lap_vy;// 
+			   //vvzF = vvz;//-2*c1o24 * lap_vz;// 
+
+//			   vvxF = 1.2* vvx- 0.2*0.5 * ((*velocityX)(x1 - 1, x2, x3) + (*velocityX)(x1 + 1, x2, x3));
+//			   vvyF = 1.2 *vvy- 0.2*0.5* ((*velocityY)(x1 , x2-1, x3) + (*velocityY)(x1 , x2+1, x3));
+//			   vvzF = 1.2 *vvz-0.2*0.5* ((*velocityZ)(x1 , x2, x3-1) + (*velocityZ)(x1 , x2, x3+1));
+			   //if (vvxF != vvx) {
+				  // vvxF = vvxF;
+			   //}
+			   //LBMReal weightGrad = 1.0;// -denom * denom / (denom * denom + 0.0001 * 0.001);
+			   //LBMReal dX1_phiF = dX1_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX1;
+			   //LBMReal dX2_phiF = dX2_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX2;
+			   //LBMReal dX3_phiF = dX3_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX3;
+
+			   //dX1_phiF *= 1.2;
+			   //dX2_phiF *= 1.2;
+			   //dX3_phiF *= 1.2;
+
+			   //LBMReal gradFD = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi);
+			   //LBMReal gradPhi = (1.0 - phi[REST]) * (phi[REST]);
+			   //gradPhi = (gradPhi > gradFD) ? gradPhi : gradFD;
+			   //dX1_phiF = gradPhi * normX1;
+				  // dX2_phiF = gradPhi * normX2;
+				  // dX3_phiF = gradPhi * normX3;
+
+			   //LBMReal ux2;
+			   //LBMReal uy2;
+			   //LBMReal uz2;
+			   //ux2 = vvxF * vvxF;
+			   //uy2 = vvyF * vvyF;
+			   //uz2 = vvzF * vvzF;
+			   //LBMReal forcingTerm[D3Q27System::ENDF + 1];
+			   //for (int dir = STARTF; dir <= (FENDDIR); dir++) {
+				  // LBMReal velProd = DX1[dir] * vvxF + DX2[dir] * vvyF + DX3[dir] * vvzF;
+				  // LBMReal velSq1 = velProd * velProd;
+				  // LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + (4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)));
+
+				  // //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi;
+
+				  // //forcingTerm[dir] =
+					 // // (-vvxF) * (fac1 * dX1_phiF) +
+					 // // (-vvyF) * (fac1 * dX2_phiF) +
+					 // // (-vvzF) * (fac1 * dX3_phiF) +
+					 // // (DX1[dir]) * (fac1 * dX1_phiF) +
+					 // // (DX2[dir]) * (fac1 * dX2_phiF) +
+					 // // (DX3[dir]) * (fac1 * dX3_phiF);
+
+
+				  // //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 ;
+
+				  // //forcingTerm[dir] =
+					 // // (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) +
+					 // // (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) +
+					 // // (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)) +
+					 // // (DX1[dir]) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) +
+					 // // (DX2[dir]) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) +
+					 // // (DX3[dir]) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL));
+
+
+
+			   //}
+
+			   //LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+			   //LBMReal fac1 = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi;
+			   //forcingTerm[REST] =	 (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) +
+				  // (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) +
+				  // (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL));
+
+			   ////////
+			  // LBMReal divAfterSource=
+			  //( mfcbb + 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF)  *(vvzF)-1)+
+			  //( mfbcb + 3.0 * (0.5 * forcingTerm[N]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfbbc + 3.0 * (0.5 * forcingTerm[T]) / rho	) *((vvxF)  *(vvxF)  +(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfccb + 3.0 * (0.5 * forcingTerm[NE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfacb + 3.0 * (0.5 * forcingTerm[NW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfcbc + 3.0 * (0.5 * forcingTerm[TE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfabc + 3.0 * (0.5 * forcingTerm[TW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfbcc + 3.0 * (0.5 * forcingTerm[TN]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfbac + 3.0 * (0.5 * forcingTerm[TS]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfccc + 3.0 * (0.5 * forcingTerm[TNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfacc + 3.0 * (0.5 * forcingTerm[TNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfcac + 3.0 * (0.5 * forcingTerm[TSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfaac + 3.0 * (0.5 * forcingTerm[TSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfabb + 3.0 * (0.5 * forcingTerm[W]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF)  *(vvzF)-1)+
+			  //( mfbab + 3.0 * (0.5 * forcingTerm[S]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfbba + 3.0 * (0.5 * forcingTerm[B]) / rho	) *((vvxF)  *(vvxF)  +(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaab + 3.0 * (0.5 * forcingTerm[SW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfcab + 3.0 * (0.5 * forcingTerm[SE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfaba + 3.0 * (0.5 * forcingTerm[BW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcba + 3.0 * (0.5 * forcingTerm[BE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbaa + 3.0 * (0.5 * forcingTerm[BS]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbca + 3.0 * (0.5 * forcingTerm[BN]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaaa + 3.0 * (0.5 * forcingTerm[BSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcaa + 3.0 * (0.5 * forcingTerm[BSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaca + 3.0 * (0.5 * forcingTerm[BNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcca + 3.0 * (0.5 * forcingTerm[BNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbbb + 3.0 * (0.5 * forcingTerm[REST]) / rho)*((vvxF)*(vvxF)+(vvyF)*(vvyF)+(vvzF)*(vvzF)-1);
+
+			  // LBMReal divBeforeSource =
+				 //  (mfcbb)    * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) +
+				 //  (mfbcb)    * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfbbc)    * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfccb)   * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfacb)   * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfcbc)   * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfabc)   * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfbcc)   * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfbac)   * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfccc)  * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfacc)  * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfcac)  * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfaac)  * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfabb)    * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) +
+				 //  (mfbab)    * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfbba)    * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaab)   * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfcab)   * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfaba)   * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcba)   * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbaa)   * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbca)   * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaaa)  * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcaa)  * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaca)  * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcca)  * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbbb) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF) * (vvzF)-1);
+			   //if (divAfterSource - divBeforeSource != 0 && phi[REST]>0.0001 && phi[REST]<0.999) {
+				  // std::cout << phi[REST]<<" "<< divAfterSource << " " << divBeforeSource <<" "<< divAfterSource/ divBeforeSource << std::endl;
+			   //}
+
+			   //if (fabs(divAfterSource - divBeforeSource)/(fabs(divAfterSource) + fabs(divBeforeSource)+1e-10) > 1e-5) {
+				  // LBMReal scaleDiv =0.95+(1-0.95)* (divBeforeSource) / (divBeforeSource - divAfterSource);
+
+				  // forcingTerm[DIR_P00]	 *=scaleDiv;
+				  // forcingTerm[N]	 *=scaleDiv;
+				  // forcingTerm[T]	 *=scaleDiv;
+				  // forcingTerm[NE]	 *=scaleDiv;
+				  // forcingTerm[NW]	 *=scaleDiv;
+				  // forcingTerm[TE]	 *=scaleDiv;
+				  // forcingTerm[TW]	 *=scaleDiv;
+				  // forcingTerm[TN]	 *=scaleDiv;
+				  // forcingTerm[TS]	 *=scaleDiv;
+				  // forcingTerm[TNE]	 *=scaleDiv;
+				  // forcingTerm[TNW]	 *=scaleDiv;
+				  // forcingTerm[TSE]	 *=scaleDiv;
+				  // forcingTerm[TSW]	 *=scaleDiv;
+				  // forcingTerm[W]	 *=scaleDiv;
+				  // forcingTerm[S]	 *=scaleDiv;
+				  // forcingTerm[B]	 *=scaleDiv;
+				  // forcingTerm[SW]	 *=scaleDiv;
+				  // forcingTerm[SE]	 *=scaleDiv;
+				  // forcingTerm[BW]	 *=scaleDiv;
+				  // forcingTerm[BE]	 *=scaleDiv;
+				  // forcingTerm[BS]	 *=scaleDiv;
+				  // forcingTerm[BN]	 *=scaleDiv;
+				  // forcingTerm[BSW]	 *=scaleDiv;
+				  // forcingTerm[BSE]	 *=scaleDiv;
+				  // forcingTerm[BNW]	 *=scaleDiv;
+				  // forcingTerm[BNE]	 *=scaleDiv;
+				  // forcingTerm[REST] *=scaleDiv;
+			   //}
+			   ////////
+
+
+			   //mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+			   //mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+			   //mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+			   //mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+			   //mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+			   //mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+			   //mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+			   //mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+			   //mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+			   //mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+			   //mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+			   //mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+			   //mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+			   //mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+			   //mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+			   //mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+			   //mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+			   //mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+			   //mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+			   //mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+			   //mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+			   //mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+			   //mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+			   //mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+			   //mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+			   //mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+			   //mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
+
+			   //--------------------------------------------------------
+
+
+
+
+
+			   //////end classic source term
+
+
+
+
+			   //forcing 
+			   ///////////////////////////////////////////////////////////////////////////////////////////
+			   //if (withForcing)
+			   //{
+				  // muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1);
+				  // muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2);
+				  // muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3);
+
+				  // //forcingX1 = muForcingX1.Eval();
+				  // //forcingX2 = muForcingX2.Eval();
+				  // //forcingX3 = muForcingX3.Eval();
+
+				  // //vvx += forcingX1 * deltaT * 0.5; // X
+				  // //vvy += forcingX2 * deltaT * 0.5; // Y
+				  // //vvz += forcingX3 * deltaT * 0.5; // Z
+			   //}
+
+			   LBMReal vx2;
+               LBMReal vy2;
+               LBMReal vz2;
+               vx2 = vvx * vvx;
+               vy2 = vvy * vvy;
+               vz2 = vvz * vvz;
+			   ///////////////////////////////////////////////////////////////////////////////////////////               
+			   LBMReal oMdrho;
+
+
+			   oMdrho = mfccc + mfaaa;
+			   m0 = mfaca + mfcac;
+			   m1 = mfacc + mfcaa;
+			   m2 = mfaac + mfcca;
+			   oMdrho += m0;
+			   m1 += m2;
+			   oMdrho += m1;
+			   m0 = mfbac + mfbca;
+			   m1 = mfbaa + mfbcc;
+			   m0 += m1;
+			   m1 = mfabc + mfcba;
+			   m2 = mfaba + mfcbc;
+			   m1 += m2;
+			   m0 += m1;
+			   m1 = mfacb + mfcab;
+			   m2 = mfaab + mfccb;
+			   m1 += m2;
+			   m0 += m1;
+			   oMdrho += m0;
+			   m0 = mfabb + mfcbb;
+			   m1 = mfbab + mfbcb;
+			   m2 = mfbba + mfbbc;
+			   m0 += m1 + m2;
+			   m0 += mfbbb; //hat gefehlt
+			   oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!!
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   LBMReal wadjust;
+			   LBMReal qudricLimit = 0.01;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //Hin
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Z - Dir
+			   m2 = mfaaa + mfaac;
+			   m1 = mfaac - mfaaa;
+			   m0 = m2 + mfaab;
+			   mfaaa = m0;
+			   m0 += c1o36 * oMdrho;
+			   mfaab = m1 - m0 * vvz;
+			   mfaac = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaba + mfabc;
+			   m1 = mfabc - mfaba;
+			   m0 = m2 + mfabb;
+			   mfaba = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfabb = m1 - m0 * vvz;
+			   mfabc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaca + mfacc;
+			   m1 = mfacc - mfaca;
+			   m0 = m2 + mfacb;
+			   mfaca = m0;
+			   m0 += c1o36 * oMdrho;
+			   mfacb = m1 - m0 * vvz;
+			   mfacc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbaa + mfbac;
+			   m1 = mfbac - mfbaa;
+			   m0 = m2 + mfbab;
+			   mfbaa = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfbab = m1 - m0 * vvz;
+			   mfbac = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbba + mfbbc;
+			   m1 = mfbbc - mfbba;
+			   m0 = m2 + mfbbb;
+			   mfbba = m0;
+			   m0 += c4o9 * oMdrho;
+			   mfbbb = m1 - m0 * vvz;
+			   mfbbc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbca + mfbcc;
+			   m1 = mfbcc - mfbca;
+			   m0 = m2 + mfbcb;
+			   mfbca = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfbcb = m1 - m0 * vvz;
+			   mfbcc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcaa + mfcac;
+			   m1 = mfcac - mfcaa;
+			   m0 = m2 + mfcab;
+			   mfcaa = m0;
+			   m0 += c1o36 * oMdrho;
+			   mfcab = m1 - m0 * vvz;
+			   mfcac = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcba + mfcbc;
+			   m1 = mfcbc - mfcba;
+			   m0 = m2 + mfcbb;
+			   mfcba = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfcbb = m1 - m0 * vvz;
+			   mfcbc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcca + mfccc;
+			   m1 = mfccc - mfcca;
+			   m0 = m2 + mfccb;
+			   mfcca = m0;
+			   m0 += c1o36 * oMdrho;
+			   mfccb = m1 - m0 * vvz;
+			   mfccc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Y - Dir
+			   m2 = mfaaa + mfaca;
+			   m1 = mfaca - mfaaa;
+			   m0 = m2 + mfaba;
+			   mfaaa = m0;
+			   m0 += c1o6 * oMdrho;
+			   mfaba = m1 - m0 * vvy;
+			   mfaca = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaab + mfacb;
+			   m1 = mfacb - mfaab;
+			   m0 = m2 + mfabb;
+			   mfaab = m0;
+			   mfabb = m1 - m0 * vvy;
+			   mfacb = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaac + mfacc;
+			   m1 = mfacc - mfaac;
+			   m0 = m2 + mfabc;
+			   mfaac = m0;
+			   m0 += c1o18 * oMdrho;
+			   mfabc = m1 - m0 * vvy;
+			   mfacc = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbaa + mfbca;
+			   m1 = mfbca - mfbaa;
+			   m0 = m2 + mfbba;
+			   mfbaa = m0;
+			   m0 += c2o3 * oMdrho;
+			   mfbba = m1 - m0 * vvy;
+			   mfbca = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbab + mfbcb;
+			   m1 = mfbcb - mfbab;
+			   m0 = m2 + mfbbb;
+			   mfbab = m0;
+			   mfbbb = m1 - m0 * vvy;
+			   mfbcb = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbac + mfbcc;
+			   m1 = mfbcc - mfbac;
+			   m0 = m2 + mfbbc;
+			   mfbac = m0;
+			   m0 += c2o9 * oMdrho;
+			   mfbbc = m1 - m0 * vvy;
+			   mfbcc = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcaa + mfcca;
+			   m1 = mfcca - mfcaa;
+			   m0 = m2 + mfcba;
+			   mfcaa = m0;
+			   m0 += c1o6 * oMdrho;
+			   mfcba = m1 - m0 * vvy;
+			   mfcca = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcab + mfccb;
+			   m1 = mfccb - mfcab;
+			   m0 = m2 + mfcbb;
+			   mfcab = m0;
+			   mfcbb = m1 - m0 * vvy;
+			   mfccb = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcac + mfccc;
+			   m1 = mfccc - mfcac;
+			   m0 = m2 + mfcbc;
+			   mfcac = m0;
+			   m0 += c1o18 * oMdrho;
+			   mfcbc = m1 - m0 * vvy;
+			   mfccc = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // X - Dir
+			   m2 = mfaaa + mfcaa;
+			   m1 = mfcaa - mfaaa;
+			   m0 = m2 + mfbaa;
+			   mfaaa = m0;
+			   m0 += 1. * oMdrho;
+			   mfbaa = m1 - m0 * vvx;
+			   mfcaa = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaba + mfcba;
+			   m1 = mfcba - mfaba;
+			   m0 = m2 + mfbba;
+			   mfaba = m0;
+			   mfbba = m1 - m0 * vvx;
+			   mfcba = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaca + mfcca;
+			   m1 = mfcca - mfaca;
+			   m0 = m2 + mfbca;
+			   mfaca = m0;
+			   m0 += c1o3 * oMdrho;
+			   mfbca = m1 - m0 * vvx;
+			   mfcca = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaab + mfcab;
+			   m1 = mfcab - mfaab;
+			   m0 = m2 + mfbab;
+			   mfaab = m0;
+			   mfbab = m1 - m0 * vvx;
+			   mfcab = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfabb + mfcbb;
+			   m1 = mfcbb - mfabb;
+			   m0 = m2 + mfbbb;
+			   mfabb = m0;
+			   mfbbb = m1 - m0 * vvx;
+			   mfcbb = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfacb + mfccb;
+			   m1 = mfccb - mfacb;
+			   m0 = m2 + mfbcb;
+			   mfacb = m0;
+			   mfbcb = m1 - m0 * vvx;
+			   mfccb = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaac + mfcac;
+			   m1 = mfcac - mfaac;
+			   m0 = m2 + mfbac;
+			   mfaac = m0;
+			   m0 += c1o3 * oMdrho;
+			   mfbac = m1 - m0 * vvx;
+			   mfcac = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfabc + mfcbc;
+			   m1 = mfcbc - mfabc;
+			   m0 = m2 + mfbbc;
+			   mfabc = m0;
+			   mfbbc = m1 - m0 * vvx;
+			   mfcbc = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfacc + mfccc;
+			   m1 = mfccc - mfacc;
+			   m0 = m2 + mfbcc;
+			   mfacc = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfbcc = m1 - m0 * vvx;
+			   mfccc = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Cumulants
+			   ////////////////////////////////////////////////////////////////////////////////////
+
+
+			  // mfaaa = 0.0;
+			   LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity
+			 //  LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+			 //  LBMReal OxyyMxzz  = 1.;//2+s9;//
+			   LBMReal O4 = 1.;
+			   LBMReal O5 = 1.;
+			   LBMReal O6 = 1.;
+
+
+
+			   /////fourth order parameters; here only for test. Move out of loop!
+
+			   LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0)));
+			   LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
+			//    LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
+			   LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+			   //FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' )
+			   LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+
+
+			   //Cum 4.
+			   //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+			   //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+			   //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+			   LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+			   LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+			   LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+			   LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+			   LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+			   LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+
+			   //Cum 5.
+			   LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+			   LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+			   LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+
+			   //Cum 6.
+			   LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb
+				   - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+				   - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+				   - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+				   + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+					   + 2. * (mfcaa * mfaca * mfaac)
+					   + 16. * mfbba * mfbab * mfabb)
+				   - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+				   - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+				   + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+					   + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho;
+
+				///storing pre collision second moments
+				// LBMReal mbxx = mfcaa - c1o3 * mfaaa;
+				// LBMReal mbyy = mfaca - c1o3 * mfaaa;
+				// LBMReal mbzz = mfaac - c1o3 * mfaaa;
+				// LBMReal mbxy = mfbba;
+				// LBMReal mbxz = mfbab;
+				// LBMReal mbyz = mfabb;
+
+			   //2.
+			   // linear combinations
+			   LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+
+			//  LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho));
+			  mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa
+				//mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa
+			   LBMReal mxxMyy = mfcaa - mfaca;
+			   LBMReal mxxMzz = mfcaa - mfaac;
+
+			   //applying phase field gradients first part:
+			  // mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz);
+               // 17.03.2021 attempt for statililization by assymptotically vanishing bias
+               //LBMReal correctionScaling =
+               //    rhoToPhi / rho; // +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000;
+               //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) *
+               //             correctionScaling; // As in Hesam's code
+               //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
+               //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
+               //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
+               //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
+               //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+
+			   LBMReal dxux =  -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
+			   LBMReal dyuy =  dxux + collFactorM * c3o2 * mxxMyy;
+			   LBMReal dzuz =  dxux + collFactorM * c3o2 * mxxMzz;
+
+			   LBMReal Dxy = -three * collFactorM * mfbba;
+			   LBMReal Dxz = -three * collFactorM * mfbab;
+			   LBMReal Dyz = -three * collFactorM * mfabb;
+
+
+			   //relax
+			   mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+			   mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy);
+			   mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz);
+
+			   mfabb += collFactorM * (-mfabb);
+			   mfbab += collFactorM * (-mfbab);
+			   mfbba += collFactorM * (-mfbba);
+
+			   //applying phase field gradients second part:
+			   //mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz);
+               //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) *
+               //             correctionScaling; // As in Hesam's code
+               //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
+               //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
+               //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
+               //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
+               //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+
+               ////updated pressure
+               //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
+			   mfaaa = 0.0; // Pressure elimination as in standard velocity model
+			 //  mfaaa += (rho - c1) * (dxux + dyuy + dzuz);
+
+               mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa
+
+			  // mxxPyyPzz += (mfaaa + mfaaaS) * c1o2;
+			   //mfaaa = mfaaaS;
+			   // linear combinations back
+			   mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+			   mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+			   mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+
+			   //3.
+			   // linear combinations
+			   LBMReal mxxyPyzz = mfcba + mfabc;
+			   LBMReal mxxyMyzz = mfcba - mfabc;
+
+			   LBMReal mxxzPyyz = mfcab + mfacb;
+			   LBMReal mxxzMyyz = mfcab - mfacb;
+
+			   LBMReal mxyyPxzz = mfbca + mfbac;
+			   LBMReal mxyyMxzz = mfbca - mfbac;
+
+			   //relax
+			   wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+			   mfbbb += wadjust * (-mfbbb);
+			   wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+			   mxxyPyzz += wadjust * (-mxxyPyzz);
+			   wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+			   mxxyMyzz += wadjust * (-mxxyMyzz);
+			   wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+			   mxxzPyyz += wadjust * (-mxxzPyyz);
+			   wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+			   mxxzMyyz += wadjust * (-mxxzMyyz);
+			   wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+			   mxyyPxzz += wadjust * (-mxyyPxzz);
+			   wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+			   mxyyMxzz += wadjust * (-mxyyMxzz);
+
+			   // linear combinations back
+			   mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+			   mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+			   mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+			   mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+			   mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+			   mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+			   //4.
+			   //CUMacc += O4 * (-CUMacc);
+			   //CUMcac += O4 * (-CUMcac);
+			   //CUMcca += O4 * (-CUMcca);
+
+			   //CUMbbc += O4 * (-CUMbbc);
+			   //CUMbcb += O4 * (-CUMbcb);
+			   //CUMcbb += O4 * (-CUMcbb);
+			   CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc);
+			   CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac);
+			   CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca);
+			   CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc);
+			   CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb);
+			   CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb);
+
+			   //5.
+			   CUMbcc += O5 * (-CUMbcc);
+			   CUMcbc += O5 * (-CUMcbc);
+			   CUMccb += O5 * (-CUMccb);
+
+			   //6.
+			   CUMccc += O6 * (-CUMccc);
+
+			   //back cumulants to central moments
+			   //4.
+			   //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+			   //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+			   //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+			   mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+			   mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+			   mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+			   mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+			   mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+			   mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+
+			   //5.
+			   mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+			   mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+			   mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+
+			   //6.
+			   mfccc = CUMccc - ((-4. * mfbbb * mfbbb
+				   - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+				   - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+				   - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+				   + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+					   + 2. * (mfcaa * mfaca * mfaac)
+					   + 16. * mfbba * mfbab * mfabb)
+				   - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+				   - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+				   + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+					   + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho;
+
+
+			   ////////
+
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //forcing
+			   mfbaa = -mfbaa;
+			   mfaba = -mfaba;
+			   mfaab = -mfaab;
+			   //////////////////////////////////////////////////////////////////////////////////////
+			   //mfbaa += -rho * rhoToPhi * c1o2 * ((mbxx + mfcaa) * dX1_phi + (mbxy + mfbba) * dX2_phi + (mbxz + mfbab) * dX3_phi);
+			   //mfaba += -rho * rhoToPhi * c1o2 * ((mbxy + mfbba) * dX1_phi + (mbyy + mfaca) * dX2_phi + (mbyz + mfabb) * dX3_phi);
+			   //mfaab += -rho * rhoToPhi * c1o2 * ((mbxz + mfbab) * dX1_phi + (mbyz + mfabb) * dX2_phi + (mbzz + mfaac) * dX3_phi);
+			   mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho);
+			   mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho);
+			   mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho);
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //back
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Z - Dir
+			   m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
+			   m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2;
+			   m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+			   mfaaa = m0;
+			   mfaab = m1;
+			   mfaac = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+			   m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2);
+			   m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+			   mfaba = m0;
+			   mfabb = m1;
+			   mfabc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+			   m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2;
+			   m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+			   mfaca = m0;
+			   mfacb = m1;
+			   mfacc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+			   m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2);
+			   m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+			   mfbaa = m0;
+			   mfbab = m1;
+			   mfbac = m2;
+			   /////////b//////////////////////////////////////////////////////////////////////////
+			   m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+			   m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2);
+			   m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+			   mfbba = m0;
+			   mfbbb = m1;
+			   mfbbc = m2;
+			   /////////b//////////////////////////////////////////////////////////////////////////
+			   m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+			   m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2);
+			   m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+			   mfbca = m0;
+			   mfbcb = m1;
+			   mfbcc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+			   m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2;
+			   m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+			   mfcaa = m0;
+			   mfcab = m1;
+			   mfcac = m2;
+			   /////////c//////////////////////////////////////////////////////////////////////////
+			   m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+			   m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2);
+			   m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+			   mfcba = m0;
+			   mfcbb = m1;
+			   mfcbc = m2;
+			   /////////c//////////////////////////////////////////////////////////////////////////
+			   m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+			   m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2;
+			   m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+			   mfcca = m0;
+			   mfccb = m1;
+			   mfccc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Y - Dir
+			   m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2;
+			   m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfaaa = m0;
+			   mfaba = m1;
+			   mfaca = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2;
+			   m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfaab = m0;
+			   mfabb = m1;
+			   mfacb = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2;
+			   m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfaac = m0;
+			   mfabc = m1;
+			   mfacc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+			   m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2);
+			   m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+			   mfbaa = m0;
+			   mfbba = m1;
+			   mfbca = m2;
+			   /////////b//////////////////////////////////////////////////////////////////////////
+			   m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+			   m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2);
+			   m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+			   mfbab = m0;
+			   mfbbb = m1;
+			   mfbcb = m2;
+			   /////////b//////////////////////////////////////////////////////////////////////////
+			   m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+			   m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2);
+			   m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+			   mfbac = m0;
+			   mfbbc = m1;
+			   mfbcc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2;
+			   m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfcaa = m0;
+			   mfcba = m1;
+			   mfcca = m2;
+			   /////////c//////////////////////////////////////////////////////////////////////////
+			   m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2;
+			   m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfcab = m0;
+			   mfcbb = m1;
+			   mfccb = m2;
+			   /////////c//////////////////////////////////////////////////////////////////////////
+			   m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2;
+			   m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfcac = m0;
+			   mfcbc = m1;
+			   mfccc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // X - Dir
+			   m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2;
+			   m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaaa = m0;
+			   mfbaa = m1;
+			   mfcaa = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2;
+			   m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaba = m0;
+			   mfbba = m1;
+			   mfcba = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2;
+			   m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaca = m0;
+			   mfbca = m1;
+			   mfcca = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2;
+			   m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaab = m0;
+			   mfbab = m1;
+			   mfcab = m2;
+			   ///////////b////////////////////////////////////////////////////////////////////////
+			   m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2;
+			   m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfabb = m0;
+			   mfbbb = m1;
+			   mfcbb = m2;
+			   ///////////b////////////////////////////////////////////////////////////////////////
+			   m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2;
+			   m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfacb = m0;
+			   mfbcb = m1;
+			   mfccb = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2;
+			   m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaac = m0;
+			   mfbac = m1;
+			   mfcac = m2;
+			   ///////////c////////////////////////////////////////////////////////////////////////
+			   m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2;
+			   m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfabc = m0;
+			   mfbbc = m1;
+			   mfcbc = m2;
+			   ///////////c////////////////////////////////////////////////////////////////////////
+			   m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2;
+			   m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfacc = m0;
+			   mfbcc = m1;
+			   mfccc = m2;
+
+			   /////classical source term 8.4.2021
+
+			   //mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+			   //mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+			   //mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+			   //mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+			   //mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+			   //mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+			   //mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+			   //mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+			   //mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+			   //mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+			   //mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+			   //mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+			   //mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+			   //mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+			   //mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+			   //mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+			   //mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+			   //mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+			   //mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+			   //mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+			   //mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+			   //mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+			   //mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+			   //mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+			   //mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+			   //mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+			   //mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
+
+
+
+			   //////////////////////////////////////////////////////////////////////////
+			   //proof correctness
+			   //////////////////////////////////////////////////////////////////////////
+//#ifdef  PROOF_CORRECTNESS
+			   LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+				   + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+				   + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+//			   //LBMReal dif = fabs(drho - rho_post);
+//               LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post;
+//#ifdef SINGLEPRECISION
+//			   if (dif > 10.0E-7 || dif < -10.0E-7)
+//#else
+//			   if (dif > 10.0E-15 || dif < -10.0E-15)
+//#endif
+//			   {
+//				   UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post)
+//					   + " dif=" + UbSystem::toString(dif)
+//					   + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+//				   //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+//				   //exit(EXIT_FAILURE);
+//			   }
+//#endif
+
+			   if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post))
+				   UB_THROW(UbException(
+					   UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," +
+					   UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+
+			   //////////////////////////////////////////////////////////////////////////
+			   //write distribution
+			   //////////////////////////////////////////////////////////////////////////
+			   (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb         ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab         ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba         ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab        ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab       ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba        ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba       ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa        ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca       ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa       ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa      ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca      ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca     ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb     ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb     ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc     ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb   ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb    ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc   ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc    ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc   ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac    ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc  ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac  ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac   ;//* rho * c1o3;
+
+			   (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3;
+			   //////////////////////////////////////////////////////////////////////////
+
+			   ////!Incompressible Kernal
+
+                            
+//                            ///////Old Kernel \|/
+//                            // ux += forcingX1*deltaT*0.5; // X
+//                            // uy += forcingX2*deltaT*0.5; // Y
+//                            // uz += forcingX3*deltaT*0.5; // Z
+//                        }
+//
+//                        LBMReal ux = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+//                                      (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+//                                      (mfcbb - mfabb)) /
+//                                         (rho * c1o3) +
+//                                     (mu * dX1_phi + forcingX1) / (2 * rho);
+//
+//                        LBMReal uy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+//                                      (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+//                                      (mfbcb - mfbab)) /
+//                                         (rho * c1o3) +
+//                                     (mu * dX2_phi + forcingX2) / (2 * rho);
+//
+//                        LBMReal uz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+//                                      (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+//                                      (mfbbc - mfbba)) /
+//                                         (rho * c1o3) +
+//                                     (mu * dX3_phi + forcingX3) / (2 * rho);
+//
+//                        //--------------------------------------------------------
+//
+//                        LBMReal ux2 = ux * ux;
+//                        LBMReal uy2 = uy * uy;
+//                        LBMReal uz2 = uz * uz;
+//
+//                        //----------- Calculating Forcing Terms * -------------
+//                        for (int dir = STARTF; dir <= (FENDDIR); dir++) {
+//                            LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz;
+//                            LBMReal velSq1  = velProd * velProd;
+//                            LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2));
+//
+//                            LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi;
+//
+//                            forcingTerm[dir] = ((-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) +
+//                                                (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) +
+//                                                (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3))) +
+//                                               (DX1[dir]) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) +
+//                                               (DX2[dir]) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) +
+//                                               (DX3[dir]) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3));
+//                        }
+//
+//                        LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+//                        LBMReal fac1      = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi;
+//                        forcingTerm[REST] = (-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) +
+//                                            (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) +
+//                                            (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3));
+//
+//                        //--------------------------------------------------------
+//
+//                        mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+//                        mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+//                        mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+//                        mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+//                        mfacb = 3.0 * (mfacb + 0.5 * forcingTerm[NW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+//                        mfcbc = 3.0 * (mfcbc + 0.5 * forcingTerm[TE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+//                        mfabc = 3.0 * (mfabc + 0.5 * forcingTerm[TW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+//                        mfbcc = 3.0 * (mfbcc + 0.5 * forcingTerm[TN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+//                        mfbac = 3.0 * (mfbac + 0.5 * forcingTerm[TS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+//                        mfccc = 3.0 * (mfccc + 0.5 * forcingTerm[TNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+//                        mfacc = 3.0 * (mfacc + 0.5 * forcingTerm[TNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+//                        mfcac = 3.0 * (mfcac + 0.5 * forcingTerm[TSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+//                        mfaac = 3.0 * (mfaac + 0.5 * forcingTerm[TSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+//                        mfabb = 3.0 * (mfabb + 0.5 * forcingTerm[W]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+//                        mfbab = 3.0 * (mfbab + 0.5 * forcingTerm[S]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+//                        mfbba = 3.0 * (mfbba + 0.5 * forcingTerm[B]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+//                        mfaab = 3.0 * (mfaab + 0.5 * forcingTerm[SW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+//                        mfcab = 3.0 * (mfcab + 0.5 * forcingTerm[SE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+//                        mfaba = 3.0 * (mfaba + 0.5 * forcingTerm[BW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+//                        mfcba = 3.0 * (mfcba + 0.5 * forcingTerm[BE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+//                        mfbaa = 3.0 * (mfbaa + 0.5 * forcingTerm[BS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+//                        mfbca = 3.0 * (mfbca + 0.5 * forcingTerm[BN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+//                        mfaaa = 3.0 * (mfaaa + 0.5 * forcingTerm[BSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+//                        mfcaa = 3.0 * (mfcaa + 0.5 * forcingTerm[BSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+//                        mfaca = 3.0 * (mfaca + 0.5 * forcingTerm[BNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+//                        mfcca = 3.0 * (mfcca + 0.5 * forcingTerm[BNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+//                        mfbbb = 3.0 * (mfbbb + 0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST];
+//
+//                        LBMReal rho1 = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +
+//                                       (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) +
+//                                       (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) +
+//                                       (mfbba + mfbbc) + mfbbb;
+//
+//
+//                        LBMReal oMdrho, m0, m1, m2;
+//
+//                        oMdrho = mfccc + mfaaa;
+//                        m0     = mfaca + mfcac;
+//                        m1     = mfacc + mfcaa;
+//                        m2     = mfaac + mfcca;
+//                        oMdrho += m0;
+//                        m1 += m2;
+//                        oMdrho += m1;
+//                        m0 = mfbac + mfbca;
+//                        m1 = mfbaa + mfbcc;
+//                        m0 += m1;
+//                        m1 = mfabc + mfcba;
+//                        m2 = mfaba + mfcbc;
+//                        m1 += m2;
+//                        m0 += m1;
+//                        m1 = mfacb + mfcab;
+//                        m2 = mfaab + mfccb;
+//                        m1 += m2;
+//                        m0 += m1;
+//                        oMdrho += m0;
+//                        m0 = mfabb + mfcbb;
+//                        m1 = mfbab + mfbcb;
+//                        m2 = mfbba + mfbbc;
+//                        m0 += m1 + m2;
+//                        m0 += mfbbb; // hat gefehlt
+//                        oMdrho = 1. - (oMdrho + m0);
+//                        // oMdrho = rho - (oMdrho + m0);
+//
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        LBMReal wadjust;
+//                        LBMReal qudricLimit = 0.01;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Hin
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Z - Dir
+//                        m2    = mfaaa + mfaac;
+//                        m1    = mfaac - mfaaa;
+//                        m0    = m2 + mfaab;
+//                        mfaaa = m0;
+//                        m0 += c1o36 * oMdrho;
+//                        mfaab = m1 - m0 * uz;
+//                        mfaac = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaba + mfabc;
+//                        m1    = mfabc - mfaba;
+//                        m0    = m2 + mfabb;
+//                        mfaba = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfabb = m1 - m0 * uz;
+//                        mfabc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaca + mfacc;
+//                        m1    = mfacc - mfaca;
+//                        m0    = m2 + mfacb;
+//                        mfaca = m0;
+//                        m0 += c1o36 * oMdrho;
+//                        mfacb = m1 - m0 * uz;
+//                        mfacc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbaa + mfbac;
+//                        m1    = mfbac - mfbaa;
+//                        m0    = m2 + mfbab;
+//                        mfbaa = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfbab = m1 - m0 * uz;
+//                        mfbac = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbba + mfbbc;
+//                        m1    = mfbbc - mfbba;
+//                        m0    = m2 + mfbbb;
+//                        mfbba = m0;
+//                        m0 += c4o9 * oMdrho;
+//                        mfbbb = m1 - m0 * uz;
+//                        mfbbc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbca + mfbcc;
+//                        m1    = mfbcc - mfbca;
+//                        m0    = m2 + mfbcb;
+//                        mfbca = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfbcb = m1 - m0 * uz;
+//                        mfbcc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcaa + mfcac;
+//                        m1    = mfcac - mfcaa;
+//                        m0    = m2 + mfcab;
+//                        mfcaa = m0;
+//                        m0 += c1o36 * oMdrho;
+//                        mfcab = m1 - m0 * uz;
+//                        mfcac = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcba + mfcbc;
+//                        m1    = mfcbc - mfcba;
+//                        m0    = m2 + mfcbb;
+//                        mfcba = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfcbb = m1 - m0 * uz;
+//                        mfcbc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcca + mfccc;
+//                        m1    = mfccc - mfcca;
+//                        m0    = m2 + mfccb;
+//                        mfcca = m0;
+//                        m0 += c1o36 * oMdrho;
+//                        mfccb = m1 - m0 * uz;
+//                        mfccc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Y - Dir
+//                        m2    = mfaaa + mfaca;
+//                        m1    = mfaca - mfaaa;
+//                        m0    = m2 + mfaba;
+//                        mfaaa = m0;
+//                        m0 += c1o6 * oMdrho;
+//                        mfaba = m1 - m0 * uy;
+//                        mfaca = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaab + mfacb;
+//                        m1    = mfacb - mfaab;
+//                        m0    = m2 + mfabb;
+//                        mfaab = m0;
+//                        mfabb = m1 - m0 * uy;
+//                        mfacb = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaac + mfacc;
+//                        m1    = mfacc - mfaac;
+//                        m0    = m2 + mfabc;
+//                        mfaac = m0;
+//                        m0 += c1o18 * oMdrho;
+//                        mfabc = m1 - m0 * uy;
+//                        mfacc = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbaa + mfbca;
+//                        m1    = mfbca - mfbaa;
+//                        m0    = m2 + mfbba;
+//                        mfbaa = m0;
+//                        m0 += c2o3 * oMdrho;
+//                        mfbba = m1 - m0 * uy;
+//                        mfbca = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbab + mfbcb;
+//                        m1    = mfbcb - mfbab;
+//                        m0    = m2 + mfbbb;
+//                        mfbab = m0;
+//                        mfbbb = m1 - m0 * uy;
+//                        mfbcb = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbac + mfbcc;
+//                        m1    = mfbcc - mfbac;
+//                        m0    = m2 + mfbbc;
+//                        mfbac = m0;
+//                        m0 += c2o9 * oMdrho;
+//                        mfbbc = m1 - m0 * uy;
+//                        mfbcc = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcaa + mfcca;
+//                        m1    = mfcca - mfcaa;
+//                        m0    = m2 + mfcba;
+//                        mfcaa = m0;
+//                        m0 += c1o6 * oMdrho;
+//                        mfcba = m1 - m0 * uy;
+//                        mfcca = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcab + mfccb;
+//                        m1    = mfccb - mfcab;
+//                        m0    = m2 + mfcbb;
+//                        mfcab = m0;
+//                        mfcbb = m1 - m0 * uy;
+//                        mfccb = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcac + mfccc;
+//                        m1    = mfccc - mfcac;
+//                        m0    = m2 + mfcbc;
+//                        mfcac = m0;
+//                        m0 += c1o18 * oMdrho;
+//                        mfcbc = m1 - m0 * uy;
+//                        mfccc = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // X - Dir
+//                        m2    = mfaaa + mfcaa;
+//                        m1    = mfcaa - mfaaa;
+//                        m0    = m2 + mfbaa;
+//                        mfaaa = m0;
+//                        m0 += 1. * oMdrho;
+//                        mfbaa = m1 - m0 * ux;
+//                        mfcaa = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaba + mfcba;
+//                        m1    = mfcba - mfaba;
+//                        m0    = m2 + mfbba;
+//                        mfaba = m0;
+//                        mfbba = m1 - m0 * ux;
+//                        mfcba = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaca + mfcca;
+//                        m1    = mfcca - mfaca;
+//                        m0    = m2 + mfbca;
+//                        mfaca = m0;
+//                        m0 += c1o3 * oMdrho;
+//                        mfbca = m1 - m0 * ux;
+//                        mfcca = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaab + mfcab;
+//                        m1    = mfcab - mfaab;
+//                        m0    = m2 + mfbab;
+//                        mfaab = m0;
+//                        mfbab = m1 - m0 * ux;
+//                        mfcab = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfabb + mfcbb;
+//                        m1    = mfcbb - mfabb;
+//                        m0    = m2 + mfbbb;
+//                        mfabb = m0;
+//                        mfbbb = m1 - m0 * ux;
+//                        mfcbb = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfacb + mfccb;
+//                        m1    = mfccb - mfacb;
+//                        m0    = m2 + mfbcb;
+//                        mfacb = m0;
+//                        mfbcb = m1 - m0 * ux;
+//                        mfccb = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaac + mfcac;
+//                        m1    = mfcac - mfaac;
+//                        m0    = m2 + mfbac;
+//                        mfaac = m0;
+//                        m0 += c1o3 * oMdrho;
+//                        mfbac = m1 - m0 * ux;
+//                        mfcac = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfabc + mfcbc;
+//                        m1    = mfcbc - mfabc;
+//                        m0    = m2 + mfbbc;
+//                        mfabc = m0;
+//                        mfbbc = m1 - m0 * ux;
+//                        mfcbc = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfacc + mfccc;
+//                        m1    = mfccc - mfacc;
+//                        m0    = m2 + mfbcc;
+//                        mfacc = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfbcc = m1 - m0 * ux;
+//                        mfccc = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Cumulants
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        LBMReal OxxPyyPzz = 1.; // omega2 or bulk viscosity
+//                        LBMReal OxyyPxzz  = 1.; //-s9;//2+s9;//
+//                        LBMReal OxyyMxzz  = 1.; // 2+s9;//
+//                        LBMReal O4        = 1.;
+//                        LBMReal O5        = 1.;
+//                        LBMReal O6        = 1.;
+//
+//                        // Cum 4.
+//                        LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+//                        LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+//                        LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+//
+//                        LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) +
+//                                                  c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+//                        LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) +
+//                                                  c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+//                        LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) +
+//                                                  c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+//
+//                        // Cum 5.
+//                        LBMReal CUMbcc = mfbcc -
+//                                         (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb +
+//                                          2. * (mfbab * mfacb + mfbba * mfabc)) -
+//                                         c1o3 * (mfbca + mfbac) * oMdrho;
+//                        LBMReal CUMcbc = mfcbc -
+//                                         (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb +
+//                                          2. * (mfabb * mfcab + mfbba * mfbac)) -
+//                                         c1o3 * (mfcba + mfabc) * oMdrho;
+//                        LBMReal CUMccb = mfccb -
+//                                         (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb +
+//                                          2. * (mfbab * mfbca + mfabb * mfcba)) -
+//                                         c1o3 * (mfacb + mfcab) * oMdrho;
+//
+//                        // Cum 6.
+//                        LBMReal CUMccc =
+//                            mfccc +
+//                            ((-4. * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) -
+//                              4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) -
+//                              2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) +
+//                             (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +
+//                              2. * (mfcaa * mfaca * mfaac) + 16. * mfbba * mfbab * mfabb) -
+//                             c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho -
+//                             c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) -
+//                             c1o27 * oMdrho * oMdrho * (-2. * oMdrho) +
+//                             (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +
+//                              (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) *
+//                                 c2o3 * oMdrho) +
+//                            c1o27 * oMdrho;
+//
+//                        // 2.
+//                        // linear combinations
+//                        LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+//                        LBMReal mxxMyy    = mfcaa - mfaca;
+//                        LBMReal mxxMzz    = mfcaa - mfaac;
+//
+//                        LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz);
+//                        LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy;
+//                        LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz;
+//
+//                        (*divU)(x1, x2, x3) = dxux + dyuy + dzuz;
+//
+//                        // relax
+//                        mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) -
+//                                     3. * (1. - c1o2 * OxxPyyPzz) * (ux2 * dxux + uy2 * dyuy + uz2 * dzuz);
+//                        mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (ux2 * dxux - uy2 * dyuy);
+//                        mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (ux2 * dxux - uz2 * dzuz);
+//
+//                        mfabb += collFactorM * (-mfabb);
+//                        mfbab += collFactorM * (-mfbab);
+//                        mfbba += collFactorM * (-mfbba);
+//
+//                        // linear combinations back
+//                        mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+//                        mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+//                        mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+//
+//                        // 3.
+//                        // linear combinations
+//                        LBMReal mxxyPyzz = mfcba + mfabc;
+//                        LBMReal mxxyMyzz = mfcba - mfabc;
+//
+//                        LBMReal mxxzPyyz = mfcab + mfacb;
+//                        LBMReal mxxzMyyz = mfcab - mfacb;
+//
+//                        LBMReal mxyyPxzz = mfbca + mfbac;
+//                        LBMReal mxyyMxzz = mfbca - mfbac;
+//
+//                        // relax
+//                        wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+//                        mfbbb += wadjust * (-mfbbb);
+//                        wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+//                        mxxyPyzz += wadjust * (-mxxyPyzz);
+//                        wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+//                        mxxyMyzz += wadjust * (-mxxyMyzz);
+//                        wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+//                        mxxzPyyz += wadjust * (-mxxzPyyz);
+//                        wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+//                        mxxzMyyz += wadjust * (-mxxzMyyz);
+//                        wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+//                        mxyyPxzz += wadjust * (-mxyyPxzz);
+//                        wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+//                        mxyyMxzz += wadjust * (-mxyyMxzz);
+//
+//                        // linear combinations back
+//                        mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+//                        mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+//                        mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+//                        mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+//                        mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+//                        mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+//
+//                        // 4.
+//                        CUMacc += O4 * (-CUMacc);
+//                        CUMcac += O4 * (-CUMcac);
+//                        CUMcca += O4 * (-CUMcca);
+//
+//                        CUMbbc += O4 * (-CUMbbc);
+//                        CUMbcb += O4 * (-CUMbcb);
+//                        CUMcbb += O4 * (-CUMcbb);
+//
+//                        // 5.
+//                        CUMbcc += O5 * (-CUMbcc);
+//                        CUMcbc += O5 * (-CUMcbc);
+//                        CUMccb += O5 * (-CUMccb);
+//
+//                        // 6.
+//                        CUMccc += O6 * (-CUMccc);
+//
+//                        // back cumulants to central moments
+//                        // 4.
+//                        mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+//                        mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+//                        mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+//
+//                        mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho +
+//                                c1o9 * (oMdrho - 1) * oMdrho;
+//                        mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho +
+//                                c1o9 * (oMdrho - 1) * oMdrho;
+//                        mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho +
+//                                c1o9 * (oMdrho - 1) * oMdrho;
+//
+//                        // 5.
+//                        mfbcc = CUMbcc +
+//                                (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb +
+//                                 2. * (mfbab * mfacb + mfbba * mfabc)) +
+//                                c1o3 * (mfbca + mfbac) * oMdrho;
+//                        mfcbc = CUMcbc +
+//                                (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb +
+//                                 2. * (mfabb * mfcab + mfbba * mfbac)) +
+//                                c1o3 * (mfcba + mfabc) * oMdrho;
+//                        mfccb = CUMccb +
+//                                (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb +
+//                                 2. * (mfbab * mfbca + mfabb * mfcba)) +
+//                                c1o3 * (mfacb + mfcab) * oMdrho;
+//
+//                        // 6.
+//                        mfccc = CUMccc -
+//                                ((-4. * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) -
+//                                  4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) -
+//                                  2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) +
+//                                 (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +
+//                                  2. * (mfcaa * mfaca * mfaac) + 16. * mfbba * mfbab * mfabb) -
+//                                 c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho -
+//                                 c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) -
+//                                 c1o27 * oMdrho * oMdrho * (-2. * oMdrho) +
+//                                 (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +
+//                                  (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) *
+//                                     c2o3 * oMdrho) -
+//                                c1o27 * oMdrho;
+//
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // forcing
+//                        mfbaa = -mfbaa;
+//                        mfaba = -mfaba;
+//                        mfaab = -mfaab;
+//                        //////////////////////////////////////////////////////////////////////////////////////
+//
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // back
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Z - Dir
+//                        m0    = mfaac * c1o2 + mfaab * (uz - c1o2) + (mfaaa + 1. * oMdrho) * (uz2 - uz) * c1o2;
+//                        m1    = -mfaac - 2. * mfaab * uz + mfaaa * (1. - uz2) - 1. * oMdrho * uz2;
+//                        m2    = mfaac * c1o2 + mfaab * (uz + c1o2) + (mfaaa + 1. * oMdrho) * (uz2 + uz) * c1o2;
+//                        mfaaa = m0;
+//                        mfaab = m1;
+//                        mfaac = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfabc * c1o2 + mfabb * (uz - c1o2) + mfaba * (uz2 - uz) * c1o2;
+//                        m1    = -mfabc - 2. * mfabb * uz + mfaba * (1. - uz2);
+//                        m2    = mfabc * c1o2 + mfabb * (uz + c1o2) + mfaba * (uz2 + uz) * c1o2;
+//                        mfaba = m0;
+//                        mfabb = m1;
+//                        mfabc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfacc * c1o2 + mfacb * (uz - c1o2) + (mfaca + c1o3 * oMdrho) * (uz2 - uz) * c1o2;
+//                        m1    = -mfacc - 2. * mfacb * uz + mfaca * (1. - uz2) - c1o3 * oMdrho * uz2;
+//                        m2    = mfacc * c1o2 + mfacb * (uz + c1o2) + (mfaca + c1o3 * oMdrho) * (uz2 + uz) * c1o2;
+//                        mfaca = m0;
+//                        mfacb = m1;
+//                        mfacc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbac * c1o2 + mfbab * (uz - c1o2) + mfbaa * (uz2 - uz) * c1o2;
+//                        m1    = -mfbac - 2. * mfbab * uz + mfbaa * (1. - uz2);
+//                        m2    = mfbac * c1o2 + mfbab * (uz + c1o2) + mfbaa * (uz2 + uz) * c1o2;
+//                        mfbaa = m0;
+//                        mfbab = m1;
+//                        mfbac = m2;
+//                        /////////b//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbbc * c1o2 + mfbbb * (uz - c1o2) + mfbba * (uz2 - uz) * c1o2;
+//                        m1    = -mfbbc - 2. * mfbbb * uz + mfbba * (1. - uz2);
+//                        m2    = mfbbc * c1o2 + mfbbb * (uz + c1o2) + mfbba * (uz2 + uz) * c1o2;
+//                        mfbba = m0;
+//                        mfbbb = m1;
+//                        mfbbc = m2;
+//                        /////////b//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbcc * c1o2 + mfbcb * (uz - c1o2) + mfbca * (uz2 - uz) * c1o2;
+//                        m1    = -mfbcc - 2. * mfbcb * uz + mfbca * (1. - uz2);
+//                        m2    = mfbcc * c1o2 + mfbcb * (uz + c1o2) + mfbca * (uz2 + uz) * c1o2;
+//                        mfbca = m0;
+//                        mfbcb = m1;
+//                        mfbcc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcac * c1o2 + mfcab * (uz - c1o2) + (mfcaa + c1o3 * oMdrho) * (uz2 - uz) * c1o2;
+//                        m1    = -mfcac - 2. * mfcab * uz + mfcaa * (1. - uz2) - c1o3 * oMdrho * uz2;
+//                        m2    = mfcac * c1o2 + mfcab * (uz + c1o2) + (mfcaa + c1o3 * oMdrho) * (uz2 + uz) * c1o2;
+//                        mfcaa = m0;
+//                        mfcab = m1;
+//                        mfcac = m2;
+//                        /////////c//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcbc * c1o2 + mfcbb * (uz - c1o2) + mfcba * (uz2 - uz) * c1o2;
+//                        m1    = -mfcbc - 2. * mfcbb * uz + mfcba * (1. - uz2);
+//                        m2    = mfcbc * c1o2 + mfcbb * (uz + c1o2) + mfcba * (uz2 + uz) * c1o2;
+//                        mfcba = m0;
+//                        mfcbb = m1;
+//                        mfcbc = m2;
+//                        /////////c//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccc * c1o2 + mfccb * (uz - c1o2) + (mfcca + c1o9 * oMdrho) * (uz2 - uz) * c1o2;
+//                        m1    = -mfccc - 2. * mfccb * uz + mfcca * (1. - uz2) - c1o9 * oMdrho * uz2;
+//                        m2    = mfccc * c1o2 + mfccb * (uz + c1o2) + (mfcca + c1o9 * oMdrho) * (uz2 + uz) * c1o2;
+//                        mfcca = m0;
+//                        mfccb = m1;
+//                        mfccc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Y - Dir
+//                        m0    = mfaca * c1o2 + mfaba * (uy - c1o2) + (mfaaa + c1o6 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfaca - 2. * mfaba * uy + mfaaa * (1. - uy2) - c1o6 * oMdrho * uy2;
+//                        m2    = mfaca * c1o2 + mfaba * (uy + c1o2) + (mfaaa + c1o6 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfaaa = m0;
+//                        mfaba = m1;
+//                        mfaca = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfacb * c1o2 + mfabb * (uy - c1o2) + (mfaab + c2o3 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfacb - 2. * mfabb * uy + mfaab * (1. - uy2) - c2o3 * oMdrho * uy2;
+//                        m2    = mfacb * c1o2 + mfabb * (uy + c1o2) + (mfaab + c2o3 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfaab = m0;
+//                        mfabb = m1;
+//                        mfacb = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfacc * c1o2 + mfabc * (uy - c1o2) + (mfaac + c1o6 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfacc - 2. * mfabc * uy + mfaac * (1. - uy2) - c1o6 * oMdrho * uy2;
+//                        m2    = mfacc * c1o2 + mfabc * (uy + c1o2) + (mfaac + c1o6 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfaac = m0;
+//                        mfabc = m1;
+//                        mfacc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbca * c1o2 + mfbba * (uy - c1o2) + mfbaa * (uy2 - uy) * c1o2;
+//                        m1    = -mfbca - 2. * mfbba * uy + mfbaa * (1. - uy2);
+//                        m2    = mfbca * c1o2 + mfbba * (uy + c1o2) + mfbaa * (uy2 + uy) * c1o2;
+//                        mfbaa = m0;
+//                        mfbba = m1;
+//                        mfbca = m2;
+//                        /////////b//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbcb * c1o2 + mfbbb * (uy - c1o2) + mfbab * (uy2 - uy) * c1o2;
+//                        m1    = -mfbcb - 2. * mfbbb * uy + mfbab * (1. - uy2);
+//                        m2    = mfbcb * c1o2 + mfbbb * (uy + c1o2) + mfbab * (uy2 + uy) * c1o2;
+//                        mfbab = m0;
+//                        mfbbb = m1;
+//                        mfbcb = m2;
+//                        /////////b//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbcc * c1o2 + mfbbc * (uy - c1o2) + mfbac * (uy2 - uy) * c1o2;
+//                        m1    = -mfbcc - 2. * mfbbc * uy + mfbac * (1. - uy2);
+//                        m2    = mfbcc * c1o2 + mfbbc * (uy + c1o2) + mfbac * (uy2 + uy) * c1o2;
+//                        mfbac = m0;
+//                        mfbbc = m1;
+//                        mfbcc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcca * c1o2 + mfcba * (uy - c1o2) + (mfcaa + c1o18 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfcca - 2. * mfcba * uy + mfcaa * (1. - uy2) - c1o18 * oMdrho * uy2;
+//                        m2    = mfcca * c1o2 + mfcba * (uy + c1o2) + (mfcaa + c1o18 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfcaa = m0;
+//                        mfcba = m1;
+//                        mfcca = m2;
+//                        /////////c//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccb * c1o2 + mfcbb * (uy - c1o2) + (mfcab + c2o9 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfccb - 2. * mfcbb * uy + mfcab * (1. - uy2) - c2o9 * oMdrho * uy2;
+//                        m2    = mfccb * c1o2 + mfcbb * (uy + c1o2) + (mfcab + c2o9 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfcab = m0;
+//                        mfcbb = m1;
+//                        mfccb = m2;
+//                        /////////c//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccc * c1o2 + mfcbc * (uy - c1o2) + (mfcac + c1o18 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfccc - 2. * mfcbc * uy + mfcac * (1. - uy2) - c1o18 * oMdrho * uy2;
+//                        m2    = mfccc * c1o2 + mfcbc * (uy + c1o2) + (mfcac + c1o18 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfcac = m0;
+//                        mfcbc = m1;
+//                        mfccc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // X - Dir
+//                        m0    = mfcaa * c1o2 + mfbaa * (ux - c1o2) + (mfaaa + c1o36 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcaa - 2. * mfbaa * ux + mfaaa * (1. - ux2) - c1o36 * oMdrho * ux2;
+//                        m2    = mfcaa * c1o2 + mfbaa * (ux + c1o2) + (mfaaa + c1o36 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaaa = m0;
+//                        mfbaa = m1;
+//                        mfcaa = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcba * c1o2 + mfbba * (ux - c1o2) + (mfaba + c1o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcba - 2. * mfbba * ux + mfaba * (1. - ux2) - c1o9 * oMdrho * ux2;
+//                        m2    = mfcba * c1o2 + mfbba * (ux + c1o2) + (mfaba + c1o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaba = m0;
+//                        mfbba = m1;
+//                        mfcba = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcca * c1o2 + mfbca * (ux - c1o2) + (mfaca + c1o36 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcca - 2. * mfbca * ux + mfaca * (1. - ux2) - c1o36 * oMdrho * ux2;
+//                        m2    = mfcca * c1o2 + mfbca * (ux + c1o2) + (mfaca + c1o36 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaca = m0;
+//                        mfbca = m1;
+//                        mfcca = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcab * c1o2 + mfbab * (ux - c1o2) + (mfaab + c1o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcab - 2. * mfbab * ux + mfaab * (1. - ux2) - c1o9 * oMdrho * ux2;
+//                        m2    = mfcab * c1o2 + mfbab * (ux + c1o2) + (mfaab + c1o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaab = m0;
+//                        mfbab = m1;
+//                        mfcab = m2;
+//                        ///////////b////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcbb * c1o2 + mfbbb * (ux - c1o2) + (mfabb + c4o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcbb - 2. * mfbbb * ux + mfabb * (1. - ux2) - c4o9 * oMdrho * ux2;
+//                        m2    = mfcbb * c1o2 + mfbbb * (ux + c1o2) + (mfabb + c4o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfabb = m0;
+//                        mfbbb = m1;
+//                        mfcbb = m2;
+//                        ///////////b////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccb * c1o2 + mfbcb * (ux - c1o2) + (mfacb + c1o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfccb - 2. * mfbcb * ux + mfacb * (1. - ux2) - c1o9 * oMdrho * ux2;
+//                        m2    = mfccb * c1o2 + mfbcb * (ux + c1o2) + (mfacb + c1o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfacb = m0;
+//                        mfbcb = m1;
+//                        mfccb = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcac * c1o2 + mfbac * (ux - c1o2) + (mfaac + c1o36 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcac - 2. * mfbac * ux + mfaac * (1. - ux2) - c1o36 * oMdrho * ux2;
+//                        m2    = mfcac * c1o2 + mfbac * (ux + c1o2) + (mfaac + c1o36 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaac = m0;
+//                        mfbac = m1;
+//                        mfcac = m2;
+//                        ///////////c////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcbc * c1o2 + mfbbc * (ux - c1o2) + (mfabc + c1o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcbc - 2. * mfbbc * ux + mfabc * (1. - ux2) - c1o9 * oMdrho * ux2;
+//                        m2    = mfcbc * c1o2 + mfbbc * (ux + c1o2) + (mfabc + c1o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfabc = m0;
+//                        mfbbc = m1;
+//                        mfcbc = m2;
+//                        ///////////c////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccc * c1o2 + mfbcc * (ux - c1o2) + (mfacc + c1o36 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfccc - 2. * mfbcc * ux + mfacc * (1. - ux2) - c1o36 * oMdrho * ux2;
+//                        m2    = mfccc * c1o2 + mfbcc * (ux + c1o2) + (mfacc + c1o36 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfacc = m0;
+//                        mfbcc = m1;
+//                        mfccc = m2;
+//
+//                        ///////////////////////////////////////////////////////////////////////////
+//
+//                        //////////////////////////////////////////////////////////////////////////
+//                        // proof correctness
+//                        //////////////////////////////////////////////////////////////////////////
+//#ifdef PROOF_CORRECTNESS
+//                        LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +
+//                                           (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) +
+//                                           (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) +
+//                                           (mfbba + mfbbc) + mfbbb;
+//
+//                        LBMReal dif = rho1 - rho_post;
+//#ifdef SINGLEPRECISION
+//                        if (dif > 10.0E-7 || dif < -10.0E-7)
+//#else
+//                        if (dif > 10.0E-15 || dif < -10.0E-15)
+//#endif
+//                        {
+//                            UB_THROW(UbException(UB_EXARGS,
+//                                                 "rho=" + UbSystem::toString(rho) + ", rho_post=" +
+//                                                     UbSystem::toString(rho_post) + " dif=" + UbSystem::toString(dif) +
+//                                                     " rho is not correct for node " + UbSystem::toString(x1) + "," +
+//                                                     UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+//                        }
+//#endif
+//
+//                        mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00];
+//                        mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N];
+//                        mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T];
+//                        mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE];
+//                        mfacb = rho * c1o3 * (mfacb) + 0.5 * forcingTerm[NW];
+//                        mfcbc = rho * c1o3 * (mfcbc) + 0.5 * forcingTerm[TE];
+//                        mfabc = rho * c1o3 * (mfabc) + 0.5 * forcingTerm[TW];
+//                        mfbcc = rho * c1o3 * (mfbcc) + 0.5 * forcingTerm[TN];
+//                        mfbac = rho * c1o3 * (mfbac) + 0.5 * forcingTerm[TS];
+//                        mfccc = rho * c1o3 * (mfccc) + 0.5 * forcingTerm[TNE];
+//                        mfacc = rho * c1o3 * (mfacc) + 0.5 * forcingTerm[TNW];
+//                        mfcac = rho * c1o3 * (mfcac) + 0.5 * forcingTerm[TSE];
+//                        mfaac = rho * c1o3 * (mfaac) + 0.5 * forcingTerm[TSW];
+//                        mfabb = rho * c1o3 * (mfabb) + 0.5 * forcingTerm[W];
+//                        mfbab = rho * c1o3 * (mfbab) + 0.5 * forcingTerm[S];
+//                        mfbba = rho * c1o3 * (mfbba) + 0.5 * forcingTerm[B];
+//                        mfaab = rho * c1o3 * (mfaab) + 0.5 * forcingTerm[SW];
+//                        mfcab = rho * c1o3 * (mfcab) + 0.5 * forcingTerm[SE];
+//                        mfaba = rho * c1o3 * (mfaba) + 0.5 * forcingTerm[BW];
+//                        mfcba = rho * c1o3 * (mfcba) + 0.5 * forcingTerm[BE];
+//                        mfbaa = rho * c1o3 * (mfbaa) + 0.5 * forcingTerm[BS];
+//                        mfbca = rho * c1o3 * (mfbca) + 0.5 * forcingTerm[BN];
+//                        mfaaa = rho * c1o3 * (mfaaa) + 0.5 * forcingTerm[BSW];
+//                        mfcaa = rho * c1o3 * (mfcaa) + 0.5 * forcingTerm[BSE];
+//                        mfaca = rho * c1o3 * (mfaca) + 0.5 * forcingTerm[BNW];
+//                        mfcca = rho * c1o3 * (mfcca) + 0.5 * forcingTerm[BNE];
+//                        mfbbb = rho * c1o3 * (mfbbb) + 0.5 * forcingTerm[REST];
+//
+//                        //////////////////////////////////////////////////////////////////////////
+//                        // write distribution for F
+//                        //////////////////////////////////////////////////////////////////////////
+//
+//                        (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3)     = mfabb;
+//                        (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3)     = mfbab;
+//                        (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)     = mfbba;
+//                        (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3)    = mfaab;
+//                        (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3)   = mfcab;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3)    = mfaba;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3)   = mfcba;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3)    = mfbaa;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3)   = mfbca;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3)   = mfaaa;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3)  = mfcaa;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3)  = mfaca;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+//
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3)     = mfcbb;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3)     = mfbcb;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p)     = mfbbc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3)   = mfccb;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3)    = mfacb;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p)   = mfcbc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p)    = mfabc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p)   = mfbcc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p)    = mfbac;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p)  = mfacc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p)  = mfcac;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p)   = mfaac;
+//
+//                        (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;
+// !Old Kernel
+                        /////////////////////  P H A S E - F I E L D   S O L V E R
+                        ////////////////////////////////////////////
+		/////CUMULANT PHASE-FIELD
+				LBMReal omegaD =1.0/( 3.0 * mob + 0.5);
+				{
+			   mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+			   mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+			   mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+			   mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+			   mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+			   mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+			   mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+			   mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+			   mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+			   mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+			   mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+			   mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+			   mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+			   mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+			   mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+			   mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+			   mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+			   mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+			   mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+			   mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+			   mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+			   mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+			   mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+			   mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+			   mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+			   mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+			   mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+
+
+					////////////////////////////////////////////////////////////////////////////////////
+		//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
+		//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+		//!
+		////////////////////////////////////////////////////////////////////////////////////
+		// fluid component
+			   //LBMReal drhoFluid =
+				  // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) +
+				  // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) +
+					 //  ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb;
+
+			   //LBMReal rhoFluid = c1 + drhoFluid;
+			   //LBMReal OOrhoFluid = c1 / rhoFluid;
+
+
+			   //LBMReal vvx =
+				  // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) +
+				  // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) +
+					 //  (fcbb - fabb)) * OOrhoFluid;
+			   //LBMReal vvy =
+				  // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) +
+				  // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) +
+					 //  (fbcb - fbab)) * OOrhoFluid;
+			   //LBMReal vvz =
+				  // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) +
+				  // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) +
+					 //  (fbbc - fbba)) * OOrhoFluid;
+
+			 //  LBMReal vvx = ux;
+			 //  LBMReal vvy = uy;
+			 //  LBMReal vvz = uz;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // second component
+			   LBMReal concentration =
+				   ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+				   (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+					   ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref
+			   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+			   //!
+			  // LBMReal fx = forces[0];
+			  // LBMReal fy = forces[1];
+			  // LBMReal fz = -concentration * forces[2];
+			  // vvx += fx * c1o2;
+			  // vvy += fy * c1o2;
+			  // vvz += fz * c1o2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   LBMReal oneMinusRho = c1- concentration;
+
+			   LBMReal cx =
+				   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+				   (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+					   (mfcbb - mfabb));
+			   LBMReal cy =
+				   ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+				   (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+					   (mfbcb - mfbab));
+			   LBMReal cz =
+				   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+				   (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+					   (mfbbc - mfbba));
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // calculate the square of velocities for this lattice node
+			   LBMReal cx2 = cx * cx;
+			   LBMReal cy2 = cy * cy;
+			   LBMReal cz2 = cz * cz;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
+			   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+			   //! see also Eq. (6)-(14) in \ref
+			   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+			   //!
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Z - Dir
+			   forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Y - Dir
+			   forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+			   forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+			   forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+			   forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+			   forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+			   forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+			   forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // X - Dir
+			   forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+			   forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+			   forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+			   forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+			   forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+			   forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+			   forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+			   forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+			   forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //! - experimental Cumulant ... to be published ... hopefully
+			   //!
+
+			   // linearized orthogonalization of 3rd order central moments
+			   LBMReal Mabc = mfabc - mfaba * c1o3;
+			   LBMReal Mbca = mfbca - mfbaa * c1o3;
+			   LBMReal Macb = mfacb - mfaab * c1o3;
+			   LBMReal Mcba = mfcba - mfaba * c1o3;
+			   LBMReal Mcab = mfcab - mfaab * c1o3;
+			   LBMReal Mbac = mfbac - mfbaa * c1o3;
+			   // linearized orthogonalization of 5th order central moments
+			   LBMReal Mcbc = mfcbc - mfaba * c1o9;
+			   LBMReal Mbcc = mfbcc - mfbaa * c1o9;
+			   LBMReal Mccb = mfccb - mfaab * c1o9;
+
+			   // collision of 1st order moments
+			  // LBMReal ccx, ccy, ccz;
+			   
+
+               cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+                    normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+               cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+                    normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+               cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+                    normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+
+			   //cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+				  // normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST])*(phi[REST]+phi2[REST]) * c1o3 * oneOverInterfaceScale;
+			   //cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+				  // normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * (phi[REST] + phi2[REST]) * c1o3 * oneOverInterfaceScale;
+			   //cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+				  // normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * (phi[REST] + phi2[REST]) * c1o3 * oneOverInterfaceScale;
+
+			   //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx;
+			   //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy;
+			//mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz;
+
+
+			   cx2 = cx * cx;
+			   cy2 = cy * cy;
+			   cz2 = cz * cz;
+
+			   // equilibration of 2nd order moments
+			   mfbba = zeroReal;
+			   mfbab = zeroReal;
+			   mfabb = zeroReal;
+
+			   mfcaa = c1o3 * concentration;
+			   mfaca = c1o3 * concentration;
+			   mfaac = c1o3 * concentration;
+
+
+			   //LBMReal omega2 = 1.0f;// omegaD;
+			   //mfbba *= (c1 - omega2);
+			   //mfbab *= (c1 - omega2);
+			   //mfabb *= (c1 - omega2);
+
+			   //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration;
+			   //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration;
+			   //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration;
+
+			   // equilibration of 3rd order moments
+			   Mabc = zeroReal;
+			   Mbca = zeroReal;
+			   Macb = zeroReal;
+			   Mcba = zeroReal;
+			   Mcab = zeroReal;
+			   Mbac = zeroReal;
+			   mfbbb = zeroReal;
+
+			   // from linearized orthogonalization 3rd order central moments to central moments
+			   mfabc = Mabc + mfaba * c1o3;
+			   mfbca = Mbca + mfbaa * c1o3;
+			   mfacb = Macb + mfaab * c1o3;
+			   mfcba = Mcba + mfaba * c1o3;
+			   mfcab = Mcab + mfaab * c1o3;
+			   mfbac = Mbac + mfbaa * c1o3;
+
+			   // equilibration of 4th order moments
+			   mfacc = c1o9 * concentration;
+			   mfcac = c1o9 * concentration;
+			   mfcca = c1o9 * concentration;
+
+			   mfcbb = zeroReal;
+			   mfbcb = zeroReal;
+			   mfbbc = zeroReal;
+
+			   // equilibration of 5th order moments
+			   Mcbc = zeroReal;
+			   Mbcc = zeroReal;
+			   Mccb = zeroReal;
+
+			   // from linearized orthogonalization 5th order central moments to central moments
+			   mfcbc = Mcbc + mfaba * c1o9;
+			   mfbcc = Mbcc + mfbaa * c1o9;
+			   mfccb = Mccb + mfaab * c1o9;
+
+			   // equilibration of 6th order moment
+			   mfccc = c1o27 * concentration;
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
+			   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+			   //! see also Eq. (88)-(96) in
+			   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+			   //!
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // X - Dir
+			   backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+			   backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+			   backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+			   backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+			   backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+			   backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+			   backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+			   backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+			   backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Y - Dir
+			   backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+			   backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+			   backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+			   backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+			   backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+			   backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+			   backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Z - Dir
+			   backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+
+
+			   (*this->localDistributionsH1)(D3Q27System::ET_E,   x1,  x2,  x3) = mfabb;
+   (*this->localDistributionsH1)(D3Q27System::ET_N,   x1,  x2,  x3) = mfbab;
+   (*this->localDistributionsH1)(D3Q27System::ET_T,   x1,  x2,  x3) = mfbba;
+   (*this->localDistributionsH1)(D3Q27System::ET_NE,  x1,  x2,  x3) = mfaab;
+   (*this->localDistributionsH1)(D3Q27System::ET_NW,  x1p, x2,  x3) = mfcab;
+   (*this->localDistributionsH1)(D3Q27System::ET_TE,  x1,  x2,  x3) = mfaba;
+   (*this->localDistributionsH1)(D3Q27System::ET_TW,  x1p, x2,  x3) = mfcba;
+   (*this->localDistributionsH1)(D3Q27System::ET_TN,  x1,  x2,  x3) = mfbaa;
+   (*this->localDistributionsH1)(D3Q27System::ET_TS,  x1,  x2p, x3) = mfbca;
+   (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1,  x2,  x3) = mfaaa;
+   (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2,  x3) = mfcaa;
+   (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1,  x2p, x3) = mfaca;
+   (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_W,   x1p, x2,  x3 ) = mfcbb;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_S,   x1,  x2p, x3 ) = mfbcb;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_B,   x1,  x2,  x3p) = mfbbc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW,  x1p, x2p, x3 ) = mfccb;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE,  x1,  x2p, x3 ) = mfacb;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW,  x1p, x2,  x3p) = mfcbc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE,  x1,  x2,  x3p) = mfabc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS,  x1,  x2p, x3p) = mfbcc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN,  x1,  x2,  x3p) = mfbac;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1,  x2p, x3p) = mfacc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2,  x3p) = mfcac;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1,  x2,  x3p) = mfaac;
+
+   (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb;
+   }
+
+   ////Phasefield 2:
+
+   {
+
+   normX1 *= -1;
+   normX2 *= -1;
+   normX3 *= -1;
+
+   mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3);
+   mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3);
+   mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3);
+   mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3);
+   mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3);
+   mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3);
+   mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3);
+   mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3);
+   mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3);
+   mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3);
+   mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3);
+   mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3);
+   mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3);
+   mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3);
+   mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3);
+   mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p);
+   mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3);
+   mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3);
+   mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p);
+   mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p);
+   mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p);
+   mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p);
+   mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+   mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p);
+   mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p);
+   mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p);
+   mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3);
+
+
+   ////////////////////////////////////////////////////////////////////////////////////
+//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
+//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+//!
+////////////////////////////////////////////////////////////////////////////////////
+// fluid component
+	   //LBMReal drhoFluid =
+		  // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) +
+		  // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) +
+			 //  ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb;
+
+	   //LBMReal rhoFluid = c1 + drhoFluid;
+	   //LBMReal OOrhoFluid = c1 / rhoFluid;
+
+
+	   //LBMReal vvx =
+		  // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) +
+		  // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) +
+			 //  (fcbb - fabb)) * OOrhoFluid;
+	   //LBMReal vvy =
+		  // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) +
+		  // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) +
+			 //  (fbcb - fbab)) * OOrhoFluid;
+	   //LBMReal vvz =
+		  // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) +
+		  // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) +
+			 //  (fbbc - fbba)) * OOrhoFluid;
+
+	 //  LBMReal vvx = ux;
+	 //  LBMReal vvy = uy;
+	 //  LBMReal vvz = uz;
+	   ////////////////////////////////////////////////////////////////////////////////////
+	   // second component
+   LBMReal concentration =
+	   ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+	   (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+		   ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref
+   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+   //!
+  // LBMReal fx = forces[0];
+  // LBMReal fy = forces[1];
+  // LBMReal fz = -concentration * forces[2];
+  // vvx += fx * c1o2;
+  // vvy += fy * c1o2;
+  // vvz += fz * c1o2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   LBMReal oneMinusRho = c1 - concentration;
+
+   LBMReal cx =
+	   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+	   (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+		   (mfcbb - mfabb));
+   LBMReal cy =
+	   ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+	   (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+		   (mfbcb - mfbab));
+   LBMReal cz =
+	   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+	   (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+		   (mfbbc - mfbba));
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // calculate the square of velocities for this lattice node
+   LBMReal cx2 = cx * cx;
+   LBMReal cy2 = cy * cy;
+   LBMReal cz2 = cz * cz;
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
+   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+   //! see also Eq. (6)-(14) in \ref
+   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+   //!
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Z - Dir
+   forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Y - Dir
+   forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+   forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+   forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+   forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+   forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+   forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+   forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // X - Dir
+   forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+   forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+   forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+   forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+   forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+   forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+   forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+   forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+   forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - experimental Cumulant ... to be published ... hopefully
+   //!
+
+   // linearized orthogonalization of 3rd order central moments
+   LBMReal Mabc = mfabc - mfaba * c1o3;
+   LBMReal Mbca = mfbca - mfbaa * c1o3;
+   LBMReal Macb = mfacb - mfaab * c1o3;
+   LBMReal Mcba = mfcba - mfaba * c1o3;
+   LBMReal Mcab = mfcab - mfaab * c1o3;
+   LBMReal Mbac = mfbac - mfbaa * c1o3;
+   // linearized orthogonalization of 5th order central moments
+   LBMReal Mcbc = mfcbc - mfaba * c1o9;
+   LBMReal Mbcc = mfbcc - mfbaa * c1o9;
+   LBMReal Mccb = mfccb - mfaab * c1o9;
+
+   // collision of 1st order moments
+   cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+	   normX1 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale;
+   cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+	   normX2 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale;
+   cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+	   normX3 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale;
+
+   //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx;
+   //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy;
+//mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz;
+
+
+   cx2 = cx * cx;
+   cy2 = cy * cy;
+   cz2 = cz * cz;
+
+   // equilibration of 2nd order moments
+   mfbba = zeroReal;
+   mfbab = zeroReal;
+   mfabb = zeroReal;
+
+   mfcaa = c1o3 * concentration;
+   mfaca = c1o3 * concentration;
+   mfaac = c1o3 * concentration;
+
+
+   //LBMReal omega2 = 1.0f;// omegaD;
+   //mfbba *= (c1 - omega2);
+   //mfbab *= (c1 - omega2);
+   //mfabb *= (c1 - omega2);
+
+   //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration;
+   //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration;
+   //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration;
+
+   // equilibration of 3rd order moments
+   Mabc = zeroReal;
+   Mbca = zeroReal;
+   Macb = zeroReal;
+   Mcba = zeroReal;
+   Mcab = zeroReal;
+   Mbac = zeroReal;
+   mfbbb = zeroReal;
+
+   // from linearized orthogonalization 3rd order central moments to central moments
+   mfabc = Mabc + mfaba * c1o3;
+   mfbca = Mbca + mfbaa * c1o3;
+   mfacb = Macb + mfaab * c1o3;
+   mfcba = Mcba + mfaba * c1o3;
+   mfcab = Mcab + mfaab * c1o3;
+   mfbac = Mbac + mfbaa * c1o3;
+
+   // equilibration of 4th order moments
+   mfacc = c1o9 * concentration;
+   mfcac = c1o9 * concentration;
+   mfcca = c1o9 * concentration;
+
+   mfcbb = zeroReal;
+   mfbcb = zeroReal;
+   mfbbc = zeroReal;
+
+   // equilibration of 5th order moments
+   Mcbc = zeroReal;
+   Mbcc = zeroReal;
+   Mccb = zeroReal;
+
+   // from linearized orthogonalization 5th order central moments to central moments
+   mfcbc = Mcbc + mfaba * c1o9;
+   mfbcc = Mbcc + mfbaa * c1o9;
+   mfccb = Mccb + mfaab * c1o9;
+
+   // equilibration of 6th order moment
+   mfccc = c1o27 * concentration;
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
+   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+   //! see also Eq. (88)-(96) in
+   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+   //!
+   ////////////////////////////////////////////////////////////////////////////////////
+   // X - Dir
+   backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+   backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+   backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+   backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+   backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+   backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+   backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+   backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+   backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Y - Dir
+   backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+   backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+   backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+   backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+   backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+   backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+   backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Z - Dir
+   backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+
+
+   (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+   (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+   (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+   (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+   (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+   (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+   (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+   (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+   (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+   (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+   (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+   (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+   (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+
+   (*this->zeroDistributionsH2)(x1, x2, x3) = mfbbb;
+
+   }
+
+
+
+		/////!CUMULANT PHASE-FIELD
+
+
+
+                        /////////////////////   PHASE-FIELD BGK SOLVER ///////////////////////////////
+
+                        //h[DIR_P00]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+                        //h[N]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
+                        //h[T]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
+                        //h[NE]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
+                        //h[NW]  = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
+                        //h[TE]  = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
+                        //h[TW]  = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
+                        //h[TN]  = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
+                        //h[TS]  = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
+                        //h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
+                        //h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
+                        //h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
+                        //h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+                        //h[W]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
+                        //h[S]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
+                        //h[B]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
+                        //h[SW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
+                        //h[SE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
+                        //h[BW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
+                        //h[BE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
+                        //h[BS]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
+                        //h[BN]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
+                        //h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                        //h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                        //h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                        //h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                        //h[REST] = (*this->zeroDistributionsH)(x1, x2, x3);
+
+                        //for (int dir = STARTF; dir < (ENDF + 1); dir++) {
+                        //    LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz;
+                        //    LBMReal velSq1  = velProd * velProd;
+                        //    LBMReal hEq; //, gEq;
+
+                        //    if (dir != REST) {
+                        //        LBMReal dirGrad_phi = (phi[dir] - phi[INVDIR[dir]]) / 2.0;
+                        //        LBMReal hSource     = (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST]) * (dirGrad_phi) / denom; 
+                        //        hEq = phi[REST] * WEIGTH[dir] * (1.0 + 3.0 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)) +                                 hSource * WEIGTH[dir];
+
+                        //        // This corresponds with the collision factor of 1.0 which equals (tauH + 0.5).
+                        //        h[dir] = h[dir] - (h[dir] - hEq) / (tauH); 
+
+                        //    } else {
+                        //        hEq = phi[REST] * WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+                        //        h[REST] = h[REST] - (h[REST] - hEq) / (tauH); 
+                        //    }
+                        //}
+
+                        //(*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3)     = h[D3Q27System::INV_E];
+                        //(*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3)     = h[D3Q27System::INV_N];
+                        //(*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3)     = h[D3Q27System::INV_T];
+                        //(*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3)    = h[D3Q27System::INV_NE];
+                        //(*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3)   = h[D3Q27System::INV_NW];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3)    = h[D3Q27System::INV_TE];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3)   = h[D3Q27System::INV_TW];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3)    = h[D3Q27System::INV_TN];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3)   = h[D3Q27System::INV_TS];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3)   = h[D3Q27System::INV_TNE];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3)  = h[D3Q27System::INV_TNW];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3)  = h[D3Q27System::INV_TSE];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = h[D3Q27System::INV_TSW];
+
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3)     = h[D3Q27System::INV_W];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3)     = h[D3Q27System::INV_S];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p)     = h[D3Q27System::INV_B];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3)   = h[D3Q27System::INV_SW];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3)    = h[D3Q27System::INV_SE];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p)   = h[D3Q27System::INV_BW];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p)    = h[D3Q27System::INV_BE];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p)   = h[D3Q27System::INV_BS];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p)    = h[D3Q27System::INV_BN];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = h[D3Q27System::INV_BSW];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p)  = h[D3Q27System::INV_BSE];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p)  = h[D3Q27System::INV_BNW];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p)   = h[D3Q27System::INV_BNE];
+
+                        //(*this->zeroDistributionsH)(x1, x2, x3) = h[D3Q27System::REST];
+
+                        /////////////////////   END OF OLD BGK SOLVER ///////////////////////////////
+                    }
+                }
+            }
+        
+       // dataSet->setPhaseField(divU);
+		}
+}
+//////////////////////////////////////////////////////////////////////////
+
+LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX1_phi()
+{
+    using namespace D3Q27System;
+	return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00]));
+    //LBMReal sum = 0.0;
+    //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+    //    sum += WEIGTH[k] * DX1[k] * phi[k];
+    //}
+    //return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX2_phi()
+{
+    using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0]));
+    //LBMReal sum = 0.0;
+    //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+    //    sum += WEIGTH[k] * DX2[k] * phi[k];
+    //}
+    //return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX3_phi()
+{
+    using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M]));
+    //LBMReal sum = 0.0;
+    //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+    //    sum += WEIGTH[k] * DX3[k] * phi[k];
+    //}
+    //return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX1_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00]));
+	//LBMReal sum = 0.0;
+	//for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+	//    sum += WEIGTH[k] * DX1[k] * phi2[k];
+	//}
+	//return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX2_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0]));
+	//LBMReal sum = 0.0;
+	//for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+	//    sum += WEIGTH[k] * DX2[k] * phi2[k];
+	//}
+	//return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX3_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M]));
+	//LBMReal sum = 0.0;
+	//for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+	//    sum += WEIGTH[k] * DX3[k] * phi2[k];
+	//}
+	//return 3.0 * sum;
+}
+
+
+
+
+
+LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::nabla2_phi()
+{
+    using namespace D3Q27System;
+    LBMReal sum = 0.0;
+	sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000])))
+		+ (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000]))));
+	sum += WEIGTH[DIR_0PP] * (
+			(((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000])))
+		+	(((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000])))
+		+	(((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000])))
+		);
+	sum += WEIGTH[DIR_00P] * (
+			((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000]))
+		+	((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000]))
+		+	((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000]))
+		);
+    //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+    //    sum += WEIGTH[k] * (phi[k] - phi[REST]);
+    //}
+    return 6.0 * sum;
+}
+
+void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::computePhasefield()
+{
+    using namespace D3Q27System;
+    SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions();
+
+    int minX1 = ghostLayerWidth;
+    int minX2 = ghostLayerWidth;
+    int minX3 = ghostLayerWidth;
+    int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth;
+    int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth;
+    int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth;
+
+    //------------- Computing the phase-field ------------------
+    for (int x3 = minX3; x3 < maxX3; x3++) {
+        for (int x2 = minX2; x2 < maxX2; x2++) {
+            for (int x1 = minX1; x1 < maxX1; x1++) {
+                // if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3))
+                {
+                    int x1p = x1 + 1;
+                    int x2p = x2 + 1;
+                    int x3p = x3 + 1;
+
+                    h[DIR_P00]   = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+                    h[DIR_0P0]   = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+                    h[DIR_00P]   = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+                    h[DIR_PP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+                    h[DIR_MP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+                    h[DIR_P0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+                    h[DIR_M0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+                    h[DIR_0PP]  = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+                    h[DIR_0MP]  = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+                    h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+                    h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+                    h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+                    h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+                    h[DIR_M00]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+                    h[DIR_0M0]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+                    h[DIR_00M]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+                    h[DIR_MM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+                    h[DIR_PM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+                    h[DIR_M0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+                    h[DIR_P0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+                    h[DIR_0MM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+                    h[DIR_0PM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+                    h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                    h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                    h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                    h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                    h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3);
+                }
+            }
+        }
+    }
+}
+
+void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+                                                int x3)
+{
+    using namespace D3Q27System;
+
+    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+    phi[DIR_000] = (*ph)(x1, x2, x3);
+
+
+    for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+        if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+            phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+        } else {
+			phi[k] = 0.0;
+         }
+    }
+}
+
+void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+	int x3)
+{
+	using namespace D3Q27System;
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	phi2[DIR_000] = (*ph)(x1, x2, x3);
+
+
+	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+			phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+		}
+		else {
+			phi2[k] = 0.0;
+		}
+	}
+}
+
+void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::swapDistributions()
+{
+    LBMKernel::swapDistributions();
+    dataSet->getHdistributions()->swap();
+	dataSet->getH2distributions()->swap();
+}
+
+void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::initForcing()
+{
+	muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3);
+	muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3);
+	muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3);
+
+	muDeltaT = deltaT;
+
+	muForcingX1.DefineVar("dt", &muDeltaT);
+	muForcingX2.DefineVar("dt", &muDeltaT);
+	muForcingX3.DefineVar("dt", &muDeltaT);
+
+	muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0);
+
+	muForcingX1.DefineVar("nu", &muNu);
+	muForcingX2.DefineVar("nu", &muNu);
+	muForcingX3.DefineVar("nu", &muNu);
+
+	muForcingX1.DefineVar("rho",&muRho); 
+	muForcingX2.DefineVar("rho",&muRho); 
+	muForcingX3.DefineVar("rho",&muRho); 
+
+}
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..7d20f8210474b665da49c88068746a39faacfb2e
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h
@@ -0,0 +1,130 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h
+//! \ingroup LBMKernel
+//! \author Hesameddin Safari
+//=======================================================================================
+
+#ifndef MultiphaseTwoPhaseFieldsPressureFilterLBMKernel_H
+#define MultiphaseTwoPhaseFieldsPressureFilterLBMKernel_H
+
+#include "LBMKernel.h"
+#include "BCProcessor.h"
+#include "D3Q27System.h"
+#include "basics/utilities/UbTiming.h"
+#include "basics/container/CbArray4D.h"
+#include "basics/container/CbArray3D.h"
+
+//! \brief  Multiphase Cascaded Cumulant LBM kernel. 
+//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model
+//! \author  H. Safari, K. Kutscher, M. Geier
+class MultiphaseTwoPhaseFieldsPressureFilterLBMKernel : public LBMKernel
+{
+public:
+   MultiphaseTwoPhaseFieldsPressureFilterLBMKernel();
+   virtual ~MultiphaseTwoPhaseFieldsPressureFilterLBMKernel(void) = default;
+   void calculate(int step) override;
+   SPtr<LBMKernel> clone() override;
+
+
+   ///refactor
+   //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure;
+   
+
+   double getCalculationTime() override { return .0; }
+protected:
+   virtual void initDataSet();
+   void swapDistributions() override;
+
+   void initForcing();
+
+   void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+   void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+   void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+   void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+
+   LBMReal f1[D3Q27System::ENDF+1];
+
+   CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF;
+   CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF;
+   CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsF;
+
+   CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1;
+   CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1;
+   CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsH1;
+
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH2;
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH2;
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH2;
+
+   //CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   phaseField;
+
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld;
+
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField;
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField2; 
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU; 
+
+   LBMReal h  [D3Q27System::ENDF+1];
+   LBMReal h2[D3Q27System::ENDF + 1];
+   LBMReal g  [D3Q27System::ENDF+1];
+   LBMReal phi[D3Q27System::ENDF+1];
+   LBMReal phi2[D3Q27System::ENDF + 1];
+   LBMReal pr1[D3Q27System::ENDF+1];
+   LBMReal phi_cutoff[D3Q27System::ENDF+1];
+
+   LBMReal gradX1_phi();
+   LBMReal gradX2_phi();
+   LBMReal gradX3_phi();
+   LBMReal gradX1_phi2();
+   LBMReal gradX2_phi2();
+   LBMReal gradX3_phi2();
+   //LBMReal gradX1_pr1();
+   //LBMReal gradX2_pr1();
+   //LBMReal gradX3_pr1();
+   //LBMReal dirgradC_phi(int n, int k);
+   void computePhasefield();
+   void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3);
+   void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3);
+   //void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, int x1, int x2, int x3);
+   //void pressureFiltering(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf_filtered /*Pressure-Field*/);
+
+   LBMReal nabla2_phi();
+
+
+   mu::value_type muX1,muX2,muX3;
+   mu::value_type muDeltaT;
+   mu::value_type muNu;
+   mu::value_type muRho;
+   LBMReal forcingX1;
+   LBMReal forcingX2;
+   LBMReal forcingX3;
+};
+
+#endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ffed1483ca63e674b26023aca87cb63986644813
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp
@@ -0,0 +1,3488 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp
+//! \ingroup LBMKernel
+//! \author Hesameddin Safari
+//=======================================================================================
+
+#include "MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h"
+#include "BCArray3D.h"
+#include "Block3D.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "D3Q27System.h"
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+#include <cmath>
+
+#define PROOF_CORRECTNESS
+
+//////////////////////////////////////////////////////////////////////////
+MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel() { this->compressible = false; }
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::initDataSet()
+{
+    SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9));
+    SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9)); // For phase-field
+    SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9)); // For phase-field
+    SPtr<PhaseFieldArray3D> divU(new PhaseFieldArray3D(nx[0] + 2, nx[1] + 2, nx[2] + 2, 0.0));
+	 pressure= CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 2, nx[1] + 2, nx[2] + 2, 0.0));
+	 pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 2, nx[1] + 2, nx[2] + 2, 0.0));
+    dataSet->setFdistributions(f);
+    dataSet->setHdistributions(h); // For phase-field
+    dataSet->setH2distributions(h2); // For phase-field
+    dataSet->setPhaseField(divU);
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::clone()
+{
+    SPtr<LBMKernel> kernel(new MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel());
+    kernel->setNX(nx);
+    dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel>(kernel)->initDataSet();
+    kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG);
+    kernel->setDensityRatio(this->densityRatio);
+    kernel->setMultiphaseModelParameters(this->beta, this->kappa);
+    kernel->setContactAngle(this->contactAngle);
+    kernel->setPhiL(this->phiL);
+    kernel->setPhiH(this->phiH);
+    kernel->setPhaseFieldRelaxation(this->tauH);
+    kernel->setMobility(this->mob);
+
+    kernel->setBCProcessor(bcProcessor->clone(kernel));
+    kernel->setWithForcing(withForcing);
+    kernel->setForcingX1(muForcingX1);
+    kernel->setForcingX2(muForcingX2);
+    kernel->setForcingX3(muForcingX3);
+    kernel->setIndex(ix1, ix2, ix3);
+    kernel->setDeltaT(deltaT);
+
+    return kernel;
+}
+//////////////////////////////////////////////////////////////////////////
+ void  MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+    LBMReal m2 = mfa + mfc;
+	LBMReal m1 = mfc - mfa;
+	LBMReal m0 = m2 + mfb;
+	mfa = m0;
+	m0 *= Kinverse;
+	m0 += oneMinusRho;
+	mfb = (m1 * Kinverse - m0 * vv) * K;
+	mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+ void  MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) {
+	using namespace UbMath;
+    LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K;
+	LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K;
+	mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K;
+	mfa = m0;
+	mfb = m1;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+ void  MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+    LBMReal m1 = (mfa + mfc) + mfb;
+	LBMReal m2 = mfc - mfa;
+	mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2);
+	mfb = m2 - vv * m1;
+	mfa = m1;
+}
+
+
+ void  MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) {
+	using namespace UbMath;
+    LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2);
+	LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv;
+	mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2);
+	mfb = mb;
+	mfa = ma;
+}
+
+
+void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::calculate(int step)
+{
+    using namespace D3Q27System;
+    using namespace UbMath;
+
+    forcingX1 = 0.0;
+    forcingX2 = 0.0;
+    forcingX3 = 0.0;
+
+	LBMReal oneOverInterfaceScale = 1.0;
+    /////////////////////////////////////
+
+    localDistributionsF    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+    nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+    zeroDistributionsF     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+
+    localDistributionsH1    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions();
+    nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
+    zeroDistributionsH1     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions();
+
+	localDistributionsH2    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getLocalDistributions();
+    nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions();
+    zeroDistributionsH2     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions();
+
+    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+    const int bcArrayMaxX1 = (int)bcArray->getNX1();
+    const int bcArrayMaxX2 = (int)bcArray->getNX2();
+    const int bcArrayMaxX3 = (int)bcArray->getNX3();
+
+    int minX1 = ghostLayerWidth;
+    int minX2 = ghostLayerWidth;
+    int minX3 = ghostLayerWidth;
+    int maxX1 = bcArrayMaxX1 - ghostLayerWidth;
+    int maxX2 = bcArrayMaxX2 - ghostLayerWidth;
+    int maxX3 = bcArrayMaxX3 - ghostLayerWidth;
+
+    //TODO
+	//very expensive !!!!!
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField(
+            new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, -999.0));
+    CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField2(
+        new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, -999.0));
+        CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU(
+            new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0));
+
+#pragma omp parallel for
+	  for (int x3 = 0; x3 <= maxX3; x3++) {
+            for (int x2 = 0; x2 <= maxX2; x2++) {
+                for (int x1 = 0; x1 <= maxX1; x1++) {
+                    if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+                        int x1p = x1 + 1;
+                        int x2p = x2 + 1;
+                        int x3p = x3 + 1;
+
+                        LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+                        LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+                        LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+                        LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+                        LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+                        LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+                        LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+                        LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+                        LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+                        LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+                        LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+                        LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+                        LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+                        LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+                        LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+                        LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+                        LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+                        LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+                        LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+                        LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+                        LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+                        LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+                        LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                        LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                        LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                        LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                        LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+                        (*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca)  + (mfcaa + mfacc))  ) +
+                                                    (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) +
+                                                    ((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) +
+                                                    (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb;
+
+                        mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3);
+                        mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3);
+                        mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3);
+                        mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3);
+                        mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3);
+                        mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3);
+                        mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3);
+                        mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3);
+                        mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3);
+                        mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3);
+                        mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3);
+                        mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3);
+                        mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3);
+                        mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3);
+                        mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3);
+                        mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p);
+                        mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3);
+                        mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3);
+                        mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p);
+                        mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p);
+                        mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p);
+                        mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p);
+                        mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                        mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                        mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                        mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                        mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3);
+                        (*phaseField2)(x1, x2, x3) =
+                            (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc))) +
+                            (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) +
+                             ((mfbaa + mfbac) + (mfbca + mfbcc))) +
+                            ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb;
+						//(*phaseField)(x1, x2, x3) = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +
+						//	(mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) +
+						//	(mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) +
+						//	(mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+////// read F-distributions for velocity formalism
+
+
+						 mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+						 mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+						 mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+						 mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+						 mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+						 mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+						 mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+						 mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+						 mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+						 mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+						 mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+						 mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+						 mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+						 mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+						 mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+						 mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+						 mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+						 mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+						 mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+						 mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+						 mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+						 mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+						 mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						 mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						 mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						 mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+						 mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+						LBMReal rhoH = 1.0;
+						LBMReal rhoL = 1.0 / densityRatio;
+
+						LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+						LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+							+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+							+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+						LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH);
+						(*pressure)(x1, x2, x3) = (*pressure)(x1, x2, x3) + rho * c1o3 * drho;
+
+						////!!!!!! relplace by pointer swap!
+						(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3);
+                    }
+                }
+            }
+        }
+
+        LBMReal collFactorM;
+        //LBMReal forcingTerm[D3Q27System::ENDF + 1];
+
+		////filter
+
+		//for (int x3 = minX3; x3 < maxX3; x3++) {
+		//	for (int x2 = minX2; x2 < maxX2; x2++) {
+		//		for (int x1 = minX1; x1 < maxX1; x1++) {
+		//			if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+
+		//				LBMReal sum = 0.;
+
+		//				//Lapalce pressure
+		//				//sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3+1) - (*pressure)(x1, x2, x3))))
+		//				//	+ ((((*pressure)(x1+1, x2-1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3+1) - (*pressure)(x1, x2, x3)))));
+		//				//sum += WEIGTH[TN] * (
+		//				//	((((*pressure)(x1+1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3) - (*pressure)(x1, x2, x3))))
+		//				//	+ ((((*pressure)(x1+1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3+1) - (*pressure)(x1, x2, x3))))
+		//				//	+ ((((*pressure)(x1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) - (*pressure)(x1, x2, x3))))
+		//				//	);
+		//				//sum += WEIGTH[T] * (
+		//				//	(((*pressure)(x1+1, x2, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3) - (*pressure)(x1, x2, x3)))
+		//				//	+ (((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3) - (*pressure)(x1, x2, x3)))
+		//				//	+ (((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2, x3-1) - (*pressure)(x1, x2, x3)))
+		//				//	);
+
+
+		//				//LBMReal pressureFilter = 100;
+		//				//(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + pressureFilter * sum * (sqrt(fabs(sum)));
+
+		//				//Situpol Eq. 81
+		//				sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1)) + ((*pressure)(x1-1, x2-1, x3-1) )) + (((*pressure)(x1+1, x2+1, x3-1) ) + ((*pressure)(x1-1, x2-1, x3+1) )))
+		//					+ ((((*pressure)(x1+1, x2-1, x3+1) ) + ((*pressure)(x1-1, x2+1, x3-1) )) + (((*pressure)(x1+1, x2-1, x3-1) ) + ((*pressure)(x1-1, x2+1, x3+1) ))));
+		//				sum += WEIGTH[TN] * (
+		//					((((*pressure)(x1+1, x2+1, x3) ) + ((*pressure)(x1-1, x2-1, x3) )) + (((*pressure)(x1+1, x2-1, x3) ) + ((*pressure)(x1-1, x2+1, x3) )))
+		//					+ ((((*pressure)(x1+1, x2, x3+1) ) + ((*pressure)(x1-1, x2, x3-1) )) + (((*pressure)(x1+1, x2, x3-1) ) + ((*pressure)(x1-1, x2, x3+1) )))
+		//					+ ((((*pressure)(x1, x2+1, x3+1) ) + ((*pressure)(x1, x2-1, x3-1) )) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) )))
+		//					);
+		//				sum += WEIGTH[T] * (
+		//					(((*pressure)(x1+1, x2, x3) ) + ((*pressure)(x1-1, x2, x3) ))
+		//					+ (((*pressure)(x1, x2+1, x3) ) + ((*pressure)(x1, x2-1, x3) ))
+		//					+ (((*pressure)(x1, x2, x3+1)) + ((*pressure)(x1, x2, x3-1) ))
+		//					);
+		//				sum += WEIGTH[REST] * (*pressure)(x1, x2, x3);
+		//				(*pressureOld)(x1, x2, x3) = sum;
+
+
+
+
+		//			}
+		//		}
+		//	}
+		//}
+
+		////Periodic Filter
+#pragma omp parallel for
+		for (int x3 = 0; x3 <= maxX3; x3++) {
+			for (int x2 = 0; x2 <= maxX2; x2++) {
+				for (int x1 = 0; x1 <= maxX1; x1++) {
+					if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+
+						LBMReal sum = 0.;
+
+
+
+						//Lapalce pressure
+						//sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3+1) - (*pressure)(x1, x2, x3))))
+						//	+ ((((*pressure)(x1+1, x2-1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3+1) - (*pressure)(x1, x2, x3)))));
+						//sum += WEIGTH[TN] * (
+						//	((((*pressure)(x1+1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3) - (*pressure)(x1, x2, x3))))
+						//	+ ((((*pressure)(x1+1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3+1) - (*pressure)(x1, x2, x3))))
+						//	+ ((((*pressure)(x1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) - (*pressure)(x1, x2, x3))))
+						//	);
+						//sum += WEIGTH[T] * (
+						//	(((*pressure)(x1+1, x2, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3) - (*pressure)(x1, x2, x3)))
+						//	+ (((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3) - (*pressure)(x1, x2, x3)))
+						//	+ (((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2, x3-1) - (*pressure)(x1, x2, x3)))
+						//	);
+
+
+						//LBMReal pressureFilter = 100;
+						//(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + pressureFilter * sum * (sqrt(fabs(sum)));
+
+						//Situpol Eq. 81
+
+						//int x1p = (x1 < maxX1) ? x1 + 1 : 0;
+						//int x1m = (x1 > 0) ? x1 - 1 : maxX1;
+						//int x2p = (x2 < maxX2) ? x2 + 1 : 0;
+						//int x2m = (x2 > 0) ? x2 - 1 : maxX2;
+						//int x3p = (x3 < maxX3) ? x3 + 1 : 0;
+						//int x3m = (x3 > 0) ? x3 - 1 : maxX3;
+						//sum += WEIGTH[TNE] * (((((*pressure)(x1p, x2p, x3p)) + ((*pressure)(x1m, x2m, x3m))) + (((*pressure)(x1p, x2p, x3m)) + ((*pressure)(x1m, x2m, x3p))))
+						//	+ ((((*pressure)(x1p, x2m, x3p)) + ((*pressure)(x1m, x2p, x3m))) + (((*pressure)(x1p, x2m, x3m)) + ((*pressure)(x1m, x2p, x3p)))));
+						//sum += WEIGTH[TN] * (
+						//	((((*pressure)(x1p, x2p, x3)) + ((*pressure)(x1m, x2m, x3))) + (((*pressure)(x1p, x2m, x3)) + ((*pressure)(x1m, x2p, x3))))
+						//	+ ((((*pressure)(x1p, x2, x3p)) + ((*pressure)(x1m, x2, x3m))) + (((*pressure)(x1p, x2, x3m)) + ((*pressure)(x1m, x2, x3p))))
+						//	+ ((((*pressure)(x1, x2p, x3p)) + ((*pressure)(x1, x2m, x3m))) + (((*pressure)(x1, x2p, x3m) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2m, x3p))))
+						//	);
+						//sum += WEIGTH[T] * (
+						//	(((*pressure)(x1p, x2, x3)) + ((*pressure)(x1m, x2, x3)))
+						//	+ (((*pressure)(x1, x2p, x3)) + ((*pressure)(x1, x2m, x3)))
+						//	+ (((*pressure)(x1, x2, x3p)) + ((*pressure)(x1, x2, x3m)))
+						//	);
+						//sum += WEIGTH[REST] * (*pressure)(x1, x2, x3);
+						//(*pressureOld)(x1, x2, x3) = sum;
+						 
+						///Version for boundaries
+						for (int xx = -1; xx <= 1; xx++) {
+							int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0;
+
+							for (int yy = -1; yy <= 1; yy++) {
+								int yyy = (yy+x2 <= maxX2) ? ((yy + x2 > 0) ? yy + x2 : maxX2) : 0;
+
+								for (int zz = -1; zz <= 1; zz++) {
+									int zzz = (zz+x3 <= maxX3) ? ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0;
+
+									if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) {
+										sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressure)(xxx, yyy, zzz);
+									}
+									else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressure)(x1, x2, x3);
+									}
+
+
+								}
+							}
+						}
+						(*pressureOld)(x1, x2, x3) = sum;
+
+
+
+					}
+				}
+			}
+		}
+
+#pragma omp parallel for
+		for (int x3 = 0; x3 <= maxX3; x3++) {
+			for (int x2 = 0; x2 <= maxX2; x2++) {
+				for (int x1 = 0; x1 <= maxX1; x1++) {
+					if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+						///filter!
+
+						(*pressure)(x1, x2, x3) = (*pressureOld)(x1, x2, x3);
+					}
+				}
+			}
+		}
+		////!filter
+
+
+#pragma omp parallel for
+        for (int x3 = minX3; x3 < maxX3; x3++) {
+            for (int x2 = minX2; x2 < maxX2; x2++) {
+                for (int x1 = minX1; x1 < maxX1; x1++) {
+                    if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
+                        int x1p = x1 + 1;
+                        int x2p = x2 + 1;
+                        int x3p = x3 + 1;
+
+
+
+                        //////////////////////////////////////////////////////////////////////////
+                        // Read distributions and phase field
+                        ////////////////////////////////////////////////////////////////////////////
+                        //////////////////////////////////////////////////////////////////////////
+
+                        // E   N  T
+                        // c   c  c
+                        //////////
+                        // W   S  B
+                        // a   a  a
+
+                        // Rest ist b
+
+                        // mfxyz
+                        // a - negative
+                        // b - null
+                        // c - positive
+
+                        // a b c
+                        //-1 0 1
+
+                        findNeighbors(phaseField, x1, x2, x3);
+						findNeighbors2(phaseField2, x1, x2, x3);
+
+                        LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+                        LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+                        LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+                        LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+                        LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+                        LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+                        LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+                        LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+                        LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+                        LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+                        LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+                        LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+                        LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+                        LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+                        LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+                        LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+                        LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+                        LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+                        LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+                        LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+                        LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+                        LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+                        LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                        LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                        LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                        LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                        LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+                        LBMReal rhoH = 1.0;
+                        LBMReal rhoL = 1.0 / densityRatio;
+
+                        LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL);
+
+                        LBMReal dX1_phi = gradX1_phi();
+                        LBMReal dX2_phi = gradX2_phi();
+                        LBMReal dX3_phi = gradX3_phi();
+
+						//LBMReal dX1_phi2 = gradX1_phi2();
+						//LBMReal dX2_phi2 = gradX2_phi2();
+						//LBMReal dX3_phi2 = gradX3_phi2();
+
+
+      //                  LBMReal denom2 = sqrt(dX1_phi * dX1_phi+ dX1_phi2 * dX1_phi2 + dX2_phi * dX2_phi + dX2_phi2 * dX2_phi2 + dX3_phi * dX3_phi+ dX3_phi2 * dX3_phi2) + 1e-9;
+      //                  LBMReal normX1 = (dX1_phi-dX1_phi2)/denom2;
+						//LBMReal normX2 = (dX2_phi-dX2_phi2)/denom2;
+						//LBMReal normX3 = (dX3_phi-dX3_phi2)/denom2;
+
+						LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9;
+						LBMReal normX1 = dX1_phi / denom;
+						LBMReal normX2 = dX2_phi / denom;
+						LBMReal normX3 = dX3_phi / denom;
+
+
+
+						collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL);
+
+
+                        LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi();
+
+                        //----------- Calculating Macroscopic Values -------------
+                        LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH);
+
+                            			   ////Incompressible Kernal
+
+						//mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)         ;// / rho * c3;
+						//mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3)         ;// / rho * c3;
+						//mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3)        ;// / rho * c3;
+						//mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3)       ;// / rho * c3;
+						//mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3)         ;// / rho * c3;
+						//mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3)        ;// / rho * c3;
+						//mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3)       ;// / rho * c3;
+						//mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3)        ;// / rho * c3;
+						//mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3)       ;// / rho * c3;
+						//mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3)       ;// / rho * c3;
+						//mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3)      ;// / rho * c3;
+						//mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3)      ;// / rho * c3;
+						//mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3)     ;// / rho * c3;																								    
+						//mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3)     ;// / rho * c3;
+						//mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3)     ;// / rho * c3;
+						//mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p)     ;// / rho * c3;
+						//mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3)   ;// / rho * c3;
+						//mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3)    ;// / rho * c3;
+						//mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p)   ;// / rho * c3;
+						//mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p)    ;// / rho * c3;
+						//mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p)   ;// / rho * c3;
+						//mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p)    ;// / rho * c3;
+						//mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) ;// / rho * c3;
+						//mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p)  ;// / rho * c3;
+						//mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p)  ;// / rho * c3;
+						//mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p)   ;// / rho * c3;
+
+						//mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);// / rho * c3;
+
+
+			   LBMReal m0, m1, m2;
+			   LBMReal rhoRef=c1;
+
+			  //LBMReal 
+			//    LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+			// 	   + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+			// 	   + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+			   LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+				   (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+				   (mfcbb - mfabb))/rhoRef;
+			   LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+				   (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+				   (mfbcb - mfbab))/rhoRef;
+			   LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+				   (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+				   (mfbbc - mfbba))/rhoRef;
+
+			 //  (*pressure)(x1, x2, x3) = (*pressureOld)(x1, x2, x3)+rho*c1o3*drho;
+
+			   //LBMReal gradPx = c1o2 * ((*pressure)(x1 + 1, x2, x3) - (*pressure)(x1 - 1, x2, x3));
+			   //LBMReal gradPy = c1o2 * ((*pressure)(x1, x2 + 1, x3) - (*pressure)(x1, x2 - 1, x3));
+			   //LBMReal gradPz = c1o2 * ((*pressure)(x1, x2, x3 + 1) - (*pressure)(x1, x2, x3 - 1));
+
+			   //LBMReal gradPx = 3.0 * (WEIGTH[TNE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 + 1, x2 - 1, x3 + 1) - (*pressure)(x1 - 1, x2 + 1, x3 - 1)))
+				  // + (((*pressure)(x1 + 1, x2 - 1, x3 - 1) - (*pressure)(x1 - 1, x2 + 1, x3 + 1)) + ((*pressure)(x1 + 1, x2 + 1, x3 - 1) - (*pressure)(x1 - 1, x2 - 1, x3 + 1))))
+				  // + WEIGTH[NE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3) - (*pressure)(x1 - 1, x2 - 1, x3)) + ((*pressure)(x1 + 1, x2 - 1, x3) - (*pressure)(x1 - 1, x2 + 1, x3)))
+					 //  + (((*pressure)(x1 + 1, x2, x3 - 1) - (*pressure)(x1 - 1, x2, x3 + 1)) + ((*pressure)(x1 + 1, x2, x3 + 1) - (*pressure)(x1 - 1, x2, x3 - 1))))
+				  // + WEIGTH[DIR_P00] * ((*pressure)(x1 + 1, x2, x3) - (*pressure)(x1 - 1, x2, x3)));
+
+			   //LBMReal gradPy = 3.0 * (WEIGTH[TNE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 - 1, x2 + 1, x3 + 1) - (*pressure)(x1 + 1, x2 - 1, x3 - 1)))
+				  // + (((*pressure)(x1 - 1, x2 + 1, x3 - 1) - (*pressure)(x1 + 1, x2 - 1, x3 + 1)) + ((*pressure)(x1 + 1, x2 + 1, x3 - 1) - (*pressure)(x1 - 1, x2 - 1, x3 + 1))))
+				  // + WEIGTH[NE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3) - (*pressure)(x1 - 1, x2 - 1, x3)) + ((*pressure)(x1 - 1, x2 + 1, x3) - (*pressure)(x1 + 1, x2 - 1, x3)))
+					 //  + (((*pressure)(x1, x2+1, x3 - 1) - (*pressure)(x1, x2-1, x3 + 1)) + ((*pressure)(x1, x2+1, x3 + 1) - (*pressure)(x1, x2-1, x3 - 1))))
+				  // + WEIGTH[DIR_P00] * ((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2-1, x3)));
+
+			   //LBMReal gradPz = 3.0 * (WEIGTH[TNE] * (
+				  // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 - 1, x2 + 1, x3 + 1) - (*pressure)(x1 + 1, x2 - 1, x3 - 1)))
+				  // + (((*pressure)(x1 - 1, x2 - 1, x3 + 1) - (*pressure)(x1 + 1, x2 + 1, x3 - 1)) + ((*pressure)(x1 + 1, x2 - 1, x3 + 1) - (*pressure)(x1 - 1, x2 + 1, x3 - 1))))
+				  // + WEIGTH[NE] * (
+				  // (((*pressure)(x1 + 1, x2, x3+1) - (*pressure)(x1 - 1, x2, x3-1)) + ((*pressure)(x1 - 1, x2, x3+1) - (*pressure)(x1 + 1, x2, x3-1)))
+					 //  + (((*pressure)(x1, x2 - 1, x3 + 1) - (*pressure)(x1, x2 + 1, x3 - 1)) + ((*pressure)(x1, x2 + 1, x3 + 1) - (*pressure)(x1, x2 - 1, x3 - 1))))
+				  // + WEIGTH[DIR_P00] * ((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3-1)));
+			  
+			   
+			   LBMReal gradPx = 0.0;
+			   LBMReal gradPy = 0.0;
+			   LBMReal gradPz = 0.0;
+			   for (int dir1 = -1; dir1 <= 1; dir1++) {
+				   for (int dir2 = -1; dir2 <= 1; dir2++) {
+					   int yyy = x2 + dir1;
+					   int zzz = x3 + dir2;
+					   if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) {
+						   gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 - 1, yyy, zzz)) {
+						   gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+
+					   int xxx = x1 + dir1;
+					   if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) {
+						   gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) {
+						   gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+
+					   yyy = x2 + dir2;
+					   if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) {
+						   gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) {
+						   gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+					   else {
+						   gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)));
+					   }
+
+				   }
+			   }
+
+			   //3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW])))
+			   //+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) +
+			   //+WEIGTH[N] * (phi2[T] - phi2[B]));
+
+			   if (withForcing) {
+				   // muX1 = static_cast<double>(x1-1+ix1*maxX1);
+				   // muX2 = static_cast<double>(x2-1+ix2*maxX2);
+				   // muX3 = static_cast<double>(x3-1+ix3*maxX3);
+
+				  // forcingX1 = muForcingX1.Eval()+c1o3*drho*dX1_phi*rhoToPhi/rho;//-gradPx/rho;
+				  // forcingX2 = muForcingX2.Eval() + c1o3*drho*dX2_phi * rhoToPhi / rho;//-gradPy/rho;
+				   //forcingX3 = muForcingX3.Eval() + c1o3*drho*dX3_phi * rhoToPhi / rho;//-gradPz/rho;
+
+				   forcingX1 = muForcingX1.Eval() -gradPx/rho;
+				   forcingX2 = muForcingX2.Eval() -gradPy/rho;
+				   forcingX3 = muForcingX3.Eval() -gradPz/rho;
+
+				   //LBMReal rho_m = 1.0 / densityRatio;
+				   //forcingX1 = forcingX1 * (rho - rho_m);
+				   //forcingX2 = forcingX2 * (rho - rho_m);
+				   //forcingX3 = forcingX3 * (rho - rho_m);
+				   vvx += forcingX1 * deltaT * 0.5; // X
+				   vvy += forcingX2 * deltaT * 0.5; // Y
+				   vvz += forcingX3 * deltaT * 0.5; // Z
+
+			   }
+
+
+			   ///surface tension force
+			   vvx += mu * dX1_phi * c1o2;
+			   vvy += mu * dX2_phi * c1o2 ;
+			   vvz += mu * dX3_phi * c1o2;
+
+			   //////classic source term
+			   ///----Classic source term 8.4.2021
+
+			   //LBMReal vvxF, vvyF, vvzF;
+			   //vvxF = vvx;//-2*c1o24 * lap_vx;// 
+			   //vvyF = vvy;//-2*c1o24 * lap_vy;// 
+			   //vvzF = vvz;//-2*c1o24 * lap_vz;// 
+
+//			   vvxF = 1.2* vvx- 0.2*0.5 * ((*velocityX)(x1 - 1, x2, x3) + (*velocityX)(x1 + 1, x2, x3));
+//			   vvyF = 1.2 *vvy- 0.2*0.5* ((*velocityY)(x1 , x2-1, x3) + (*velocityY)(x1 , x2+1, x3));
+//			   vvzF = 1.2 *vvz-0.2*0.5* ((*velocityZ)(x1 , x2, x3-1) + (*velocityZ)(x1 , x2, x3+1));
+			   //if (vvxF != vvx) {
+				  // vvxF = vvxF;
+			   //}
+			   //LBMReal weightGrad = 1.0;// -denom * denom / (denom * denom + 0.0001 * 0.001);
+			   //LBMReal dX1_phiF = dX1_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX1;
+			   //LBMReal dX2_phiF = dX2_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX2;
+			   //LBMReal dX3_phiF = dX3_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX3;
+
+			   //dX1_phiF *= 1.2;
+			   //dX2_phiF *= 1.2;
+			   //dX3_phiF *= 1.2;
+
+			   //LBMReal gradFD = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi);
+			   //LBMReal gradPhi = (1.0 - phi[REST]) * (phi[REST]);
+			   //gradPhi = (gradPhi > gradFD) ? gradPhi : gradFD;
+			   //dX1_phiF = gradPhi * normX1;
+				  // dX2_phiF = gradPhi * normX2;
+				  // dX3_phiF = gradPhi * normX3;
+
+			   //LBMReal ux2;
+			   //LBMReal uy2;
+			   //LBMReal uz2;
+			   //ux2 = vvxF * vvxF;
+			   //uy2 = vvyF * vvyF;
+			   //uz2 = vvzF * vvzF;
+			   //LBMReal forcingTerm[D3Q27System::ENDF + 1];
+			   //for (int dir = STARTF; dir <= (FENDDIR); dir++) {
+				  // LBMReal velProd = DX1[dir] * vvxF + DX2[dir] * vvyF + DX3[dir] * vvzF;
+				  // LBMReal velSq1 = velProd * velProd;
+				  // LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + (4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)));
+
+				  // //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi;
+
+				  // //forcingTerm[dir] =
+					 // // (-vvxF) * (fac1 * dX1_phiF) +
+					 // // (-vvyF) * (fac1 * dX2_phiF) +
+					 // // (-vvzF) * (fac1 * dX3_phiF) +
+					 // // (DX1[dir]) * (fac1 * dX1_phiF) +
+					 // // (DX2[dir]) * (fac1 * dX2_phiF) +
+					 // // (DX3[dir]) * (fac1 * dX3_phiF);
+
+
+				  // //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 ;
+
+				  // //forcingTerm[dir] =
+					 // // (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) +
+					 // // (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) +
+					 // // (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)) +
+					 // // (DX1[dir]) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) +
+					 // // (DX2[dir]) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) +
+					 // // (DX3[dir]) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL));
+
+
+
+			   //}
+
+			   //LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+			   //LBMReal fac1 = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi;
+			   //forcingTerm[REST] =	 (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) +
+				  // (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) +
+				  // (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL));
+
+			   ////////
+			  // LBMReal divAfterSource=
+			  //( mfcbb + 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF)  *(vvzF)-1)+
+			  //( mfbcb + 3.0 * (0.5 * forcingTerm[N]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfbbc + 3.0 * (0.5 * forcingTerm[T]) / rho	) *((vvxF)  *(vvxF)  +(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfccb + 3.0 * (0.5 * forcingTerm[NE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfacb + 3.0 * (0.5 * forcingTerm[NW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF)  *(vvzF)-1)+
+			  //( mfcbc + 3.0 * (0.5 * forcingTerm[TE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfabc + 3.0 * (0.5 * forcingTerm[TW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF-1)*(vvzF-1)-1)+
+			  //( mfbcc + 3.0 * (0.5 * forcingTerm[TN]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfbac + 3.0 * (0.5 * forcingTerm[TS]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfccc + 3.0 * (0.5 * forcingTerm[TNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfacc + 3.0 * (0.5 * forcingTerm[TNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfcac + 3.0 * (0.5 * forcingTerm[TSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfaac + 3.0 * (0.5 * forcingTerm[TSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+
+			  //( mfabb + 3.0 * (0.5 * forcingTerm[W]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF)  *(vvzF)-1)+
+			  //( mfbab + 3.0 * (0.5 * forcingTerm[S]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfbba + 3.0 * (0.5 * forcingTerm[B]) / rho	) *((vvxF)  *(vvxF)  +(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaab + 3.0 * (0.5 * forcingTerm[SW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfcab + 3.0 * (0.5 * forcingTerm[SE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF)  *(vvzF)-1)+
+			  //( mfaba + 3.0 * (0.5 * forcingTerm[BW]) / rho	) *((vvxF+1)*(vvxF+1)+(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcba + 3.0 * (0.5 * forcingTerm[BE]) / rho	) *((vvxF-1)*(vvxF-1)+(vvyF)  *(vvyF)  +(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbaa + 3.0 * (0.5 * forcingTerm[BS]) / rho	) *((vvxF)  *(vvxF)  +(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbca + 3.0 * (0.5 * forcingTerm[BN]) / rho	) *((vvxF)  *(vvxF)  +(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaaa + 3.0 * (0.5 * forcingTerm[BSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcaa + 3.0 * (0.5 * forcingTerm[BSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfaca + 3.0 * (0.5 * forcingTerm[BNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfcca + 3.0 * (0.5 * forcingTerm[BNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+
+			  //( mfbbb + 3.0 * (0.5 * forcingTerm[REST]) / rho)*((vvxF)*(vvxF)+(vvyF)*(vvyF)+(vvzF)*(vvzF)-1);
+
+			  // LBMReal divBeforeSource =
+				 //  (mfcbb)    * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) +
+				 //  (mfbcb)    * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfbbc)    * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfccb)   * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfacb)   * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfcbc)   * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfabc)   * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfbcc)   * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfbac)   * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfccc)  * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfacc)  * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfcac)  * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfaac)  * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) +
+				 //  (mfabb)    * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) +
+				 //  (mfbab)    * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfbba)    * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaab)   * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfcab)   * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) +
+				 //  (mfaba)   * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcba)   * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbaa)   * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbca)   * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaaa)  * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcaa)  * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfaca)  * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfcca)  * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) +
+				 //  (mfbbb) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF) * (vvzF)-1);
+			   //if (divAfterSource - divBeforeSource != 0 && phi[REST]>0.0001 && phi[REST]<0.999) {
+				  // std::cout << phi[REST]<<" "<< divAfterSource << " " << divBeforeSource <<" "<< divAfterSource/ divBeforeSource << std::endl;
+			   //}
+
+			   //if (fabs(divAfterSource - divBeforeSource)/(fabs(divAfterSource) + fabs(divBeforeSource)+1e-10) > 1e-5) {
+				  // LBMReal scaleDiv =0.95+(1-0.95)* (divBeforeSource) / (divBeforeSource - divAfterSource);
+
+				  // forcingTerm[DIR_P00]	 *=scaleDiv;
+				  // forcingTerm[N]	 *=scaleDiv;
+				  // forcingTerm[T]	 *=scaleDiv;
+				  // forcingTerm[NE]	 *=scaleDiv;
+				  // forcingTerm[NW]	 *=scaleDiv;
+				  // forcingTerm[TE]	 *=scaleDiv;
+				  // forcingTerm[TW]	 *=scaleDiv;
+				  // forcingTerm[TN]	 *=scaleDiv;
+				  // forcingTerm[TS]	 *=scaleDiv;
+				  // forcingTerm[TNE]	 *=scaleDiv;
+				  // forcingTerm[TNW]	 *=scaleDiv;
+				  // forcingTerm[TSE]	 *=scaleDiv;
+				  // forcingTerm[TSW]	 *=scaleDiv;
+				  // forcingTerm[W]	 *=scaleDiv;
+				  // forcingTerm[S]	 *=scaleDiv;
+				  // forcingTerm[B]	 *=scaleDiv;
+				  // forcingTerm[SW]	 *=scaleDiv;
+				  // forcingTerm[SE]	 *=scaleDiv;
+				  // forcingTerm[BW]	 *=scaleDiv;
+				  // forcingTerm[BE]	 *=scaleDiv;
+				  // forcingTerm[BS]	 *=scaleDiv;
+				  // forcingTerm[BN]	 *=scaleDiv;
+				  // forcingTerm[BSW]	 *=scaleDiv;
+				  // forcingTerm[BSE]	 *=scaleDiv;
+				  // forcingTerm[BNW]	 *=scaleDiv;
+				  // forcingTerm[BNE]	 *=scaleDiv;
+				  // forcingTerm[REST] *=scaleDiv;
+			   //}
+			   ////////
+
+
+			   //mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+			   //mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+			   //mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+			   //mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+			   //mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+			   //mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+			   //mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+			   //mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+			   //mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+			   //mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+			   //mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+			   //mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+			   //mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+			   //mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+			   //mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+			   //mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+			   //mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+			   //mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+			   //mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+			   //mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+			   //mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+			   //mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+			   //mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+			   //mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+			   //mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+			   //mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+			   //mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
+
+			   //--------------------------------------------------------
+
+
+
+
+
+			   //////end classic source term
+
+
+
+
+			   //forcing 
+			   ///////////////////////////////////////////////////////////////////////////////////////////
+			   if (withForcing)
+			   {
+				   muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1);
+				   muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2);
+				   muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3);
+
+				   //forcingX1 = muForcingX1.Eval();
+				   //forcingX2 = muForcingX2.Eval();
+				   //forcingX3 = muForcingX3.Eval();
+
+				   //vvx += forcingX1 * deltaT * 0.5; // X
+				   //vvy += forcingX2 * deltaT * 0.5; // Y
+				   //vvz += forcingX3 * deltaT * 0.5; // Z
+			   }
+
+			   LBMReal vx2;
+               LBMReal vy2;
+               LBMReal vz2;
+               vx2 = vvx * vvx;
+               vy2 = vvy * vvy;
+               vz2 = vvz * vvz;
+			   ///////////////////////////////////////////////////////////////////////////////////////////               
+			   LBMReal oMdrho;
+
+
+			   oMdrho = mfccc + mfaaa;
+			   m0 = mfaca + mfcac;
+			   m1 = mfacc + mfcaa;
+			   m2 = mfaac + mfcca;
+			   oMdrho += m0;
+			   m1 += m2;
+			   oMdrho += m1;
+			   m0 = mfbac + mfbca;
+			   m1 = mfbaa + mfbcc;
+			   m0 += m1;
+			   m1 = mfabc + mfcba;
+			   m2 = mfaba + mfcbc;
+			   m1 += m2;
+			   m0 += m1;
+			   m1 = mfacb + mfcab;
+			   m2 = mfaab + mfccb;
+			   m1 += m2;
+			   m0 += m1;
+			   oMdrho += m0;
+			   m0 = mfabb + mfcbb;
+			   m1 = mfbab + mfbcb;
+			   m2 = mfbba + mfbbc;
+			   m0 += m1 + m2;
+			   m0 += mfbbb; //hat gefehlt
+			   oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!!
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   LBMReal wadjust;
+			   LBMReal qudricLimit = 0.01;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //Hin
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Z - Dir
+			   m2 = mfaaa + mfaac;
+			   m1 = mfaac - mfaaa;
+			   m0 = m2 + mfaab;
+			   mfaaa = m0;
+			   m0 += c1o36 * oMdrho;
+			   mfaab = m1 - m0 * vvz;
+			   mfaac = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaba + mfabc;
+			   m1 = mfabc - mfaba;
+			   m0 = m2 + mfabb;
+			   mfaba = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfabb = m1 - m0 * vvz;
+			   mfabc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaca + mfacc;
+			   m1 = mfacc - mfaca;
+			   m0 = m2 + mfacb;
+			   mfaca = m0;
+			   m0 += c1o36 * oMdrho;
+			   mfacb = m1 - m0 * vvz;
+			   mfacc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbaa + mfbac;
+			   m1 = mfbac - mfbaa;
+			   m0 = m2 + mfbab;
+			   mfbaa = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfbab = m1 - m0 * vvz;
+			   mfbac = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbba + mfbbc;
+			   m1 = mfbbc - mfbba;
+			   m0 = m2 + mfbbb;
+			   mfbba = m0;
+			   m0 += c4o9 * oMdrho;
+			   mfbbb = m1 - m0 * vvz;
+			   mfbbc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbca + mfbcc;
+			   m1 = mfbcc - mfbca;
+			   m0 = m2 + mfbcb;
+			   mfbca = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfbcb = m1 - m0 * vvz;
+			   mfbcc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcaa + mfcac;
+			   m1 = mfcac - mfcaa;
+			   m0 = m2 + mfcab;
+			   mfcaa = m0;
+			   m0 += c1o36 * oMdrho;
+			   mfcab = m1 - m0 * vvz;
+			   mfcac = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcba + mfcbc;
+			   m1 = mfcbc - mfcba;
+			   m0 = m2 + mfcbb;
+			   mfcba = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfcbb = m1 - m0 * vvz;
+			   mfcbc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcca + mfccc;
+			   m1 = mfccc - mfcca;
+			   m0 = m2 + mfccb;
+			   mfcca = m0;
+			   m0 += c1o36 * oMdrho;
+			   mfccb = m1 - m0 * vvz;
+			   mfccc = m2 - 2. * m1 * vvz + vz2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Y - Dir
+			   m2 = mfaaa + mfaca;
+			   m1 = mfaca - mfaaa;
+			   m0 = m2 + mfaba;
+			   mfaaa = m0;
+			   m0 += c1o6 * oMdrho;
+			   mfaba = m1 - m0 * vvy;
+			   mfaca = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaab + mfacb;
+			   m1 = mfacb - mfaab;
+			   m0 = m2 + mfabb;
+			   mfaab = m0;
+			   mfabb = m1 - m0 * vvy;
+			   mfacb = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaac + mfacc;
+			   m1 = mfacc - mfaac;
+			   m0 = m2 + mfabc;
+			   mfaac = m0;
+			   m0 += c1o18 * oMdrho;
+			   mfabc = m1 - m0 * vvy;
+			   mfacc = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbaa + mfbca;
+			   m1 = mfbca - mfbaa;
+			   m0 = m2 + mfbba;
+			   mfbaa = m0;
+			   m0 += c2o3 * oMdrho;
+			   mfbba = m1 - m0 * vvy;
+			   mfbca = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbab + mfbcb;
+			   m1 = mfbcb - mfbab;
+			   m0 = m2 + mfbbb;
+			   mfbab = m0;
+			   mfbbb = m1 - m0 * vvy;
+			   mfbcb = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfbac + mfbcc;
+			   m1 = mfbcc - mfbac;
+			   m0 = m2 + mfbbc;
+			   mfbac = m0;
+			   m0 += c2o9 * oMdrho;
+			   mfbbc = m1 - m0 * vvy;
+			   mfbcc = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcaa + mfcca;
+			   m1 = mfcca - mfcaa;
+			   m0 = m2 + mfcba;
+			   mfcaa = m0;
+			   m0 += c1o6 * oMdrho;
+			   mfcba = m1 - m0 * vvy;
+			   mfcca = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcab + mfccb;
+			   m1 = mfccb - mfcab;
+			   m0 = m2 + mfcbb;
+			   mfcab = m0;
+			   mfcbb = m1 - m0 * vvy;
+			   mfccb = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfcac + mfccc;
+			   m1 = mfccc - mfcac;
+			   m0 = m2 + mfcbc;
+			   mfcac = m0;
+			   m0 += c1o18 * oMdrho;
+			   mfcbc = m1 - m0 * vvy;
+			   mfccc = m2 - 2. * m1 * vvy + vy2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // X - Dir
+			   m2 = mfaaa + mfcaa;
+			   m1 = mfcaa - mfaaa;
+			   m0 = m2 + mfbaa;
+			   mfaaa = m0;
+			   m0 += 1. * oMdrho;
+			   mfbaa = m1 - m0 * vvx;
+			   mfcaa = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaba + mfcba;
+			   m1 = mfcba - mfaba;
+			   m0 = m2 + mfbba;
+			   mfaba = m0;
+			   mfbba = m1 - m0 * vvx;
+			   mfcba = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaca + mfcca;
+			   m1 = mfcca - mfaca;
+			   m0 = m2 + mfbca;
+			   mfaca = m0;
+			   m0 += c1o3 * oMdrho;
+			   mfbca = m1 - m0 * vvx;
+			   mfcca = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaab + mfcab;
+			   m1 = mfcab - mfaab;
+			   m0 = m2 + mfbab;
+			   mfaab = m0;
+			   mfbab = m1 - m0 * vvx;
+			   mfcab = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfabb + mfcbb;
+			   m1 = mfcbb - mfabb;
+			   m0 = m2 + mfbbb;
+			   mfabb = m0;
+			   mfbbb = m1 - m0 * vvx;
+			   mfcbb = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfacb + mfccb;
+			   m1 = mfccb - mfacb;
+			   m0 = m2 + mfbcb;
+			   mfacb = m0;
+			   mfbcb = m1 - m0 * vvx;
+			   mfccb = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfaac + mfcac;
+			   m1 = mfcac - mfaac;
+			   m0 = m2 + mfbac;
+			   mfaac = m0;
+			   m0 += c1o3 * oMdrho;
+			   mfbac = m1 - m0 * vvx;
+			   mfcac = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfabc + mfcbc;
+			   m1 = mfcbc - mfabc;
+			   m0 = m2 + mfbbc;
+			   mfabc = m0;
+			   mfbbc = m1 - m0 * vvx;
+			   mfcbc = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m2 = mfacc + mfccc;
+			   m1 = mfccc - mfacc;
+			   m0 = m2 + mfbcc;
+			   mfacc = m0;
+			   m0 += c1o9 * oMdrho;
+			   mfbcc = m1 - m0 * vvx;
+			   mfccc = m2 - 2. * m1 * vvx + vx2 * m0;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Cumulants
+			   ////////////////////////////////////////////////////////////////////////////////////
+
+
+			  // mfaaa = 0.0;
+			   LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity
+			 //  LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+			 //  LBMReal OxyyMxzz  = 1.;//2+s9;//
+			   LBMReal O4 = 1.;
+			   LBMReal O5 = 1.;
+			   LBMReal O6 = 1.;
+
+
+
+			   /////fourth order parameters; here only for test. Move out of loop!
+
+			   LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0)));
+			   LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM);
+			//    LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0));
+			   LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+			   //FIXME:  warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' )
+			   LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM));
+
+
+			   //Cum 4.
+			   //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+			   //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+			   //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+			   LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+			   LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+			   LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+			   LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+			   LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+			   LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho);
+
+			   //Cum 5.
+			   LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+			   LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+			   LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+
+			   //Cum 6.
+			   LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb
+				   - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+				   - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+				   - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+				   + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+					   + 2. * (mfcaa * mfaca * mfaac)
+					   + 16. * mfbba * mfbab * mfabb)
+				   - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+				   - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+				   + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+					   + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho;
+
+			   //2.
+			   // linear combinations
+			   LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+
+			//  LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho));
+			  mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa
+				//mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa
+			   LBMReal mxxMyy = mfcaa - mfaca;
+			   LBMReal mxxMzz = mfcaa - mfaac;
+
+			   //applying phase field gradients first part:
+			  // mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz);
+               // 17.03.2021 attempt for statililization by assymptotically vanishing bias
+               //LBMReal correctionScaling =
+               //    rhoToPhi / rho; // +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000;
+               //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) *
+               //             correctionScaling; // As in Hesam's code
+               //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
+               //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
+               //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
+               //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
+               //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+
+			   LBMReal dxux =  -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz);
+			   LBMReal dyuy =  dxux + collFactorM * c3o2 * mxxMyy;
+			   LBMReal dzuz =  dxux + collFactorM * c3o2 * mxxMzz;
+
+			   LBMReal Dxy = -three * collFactorM * mfbba;
+			   LBMReal Dxz = -three * collFactorM * mfbab;
+			   LBMReal Dyz = -three * collFactorM * mfabb;
+
+
+			   //relax
+			   mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+			   mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy);
+			   mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz);
+
+			   mfabb += collFactorM * (-mfabb);
+			   mfbab += collFactorM * (-mfbab);
+			   mfbba += collFactorM * (-mfbba);
+
+			   //applying phase field gradients second part:
+			   //mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz);
+               //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) *
+               //             correctionScaling; // As in Hesam's code
+               //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling;
+               //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling;
+               //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling;
+               //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling;
+               //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling;
+
+               ////updated pressure
+               //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling;
+			   mfaaa = 0.0; // Pressure elimination as in standard velocity model
+			 //  mfaaa += (rho - c1) * (dxux + dyuy + dzuz);
+
+               mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa
+
+			  // mxxPyyPzz += (mfaaa + mfaaaS) * c1o2;
+			   //mfaaa = mfaaaS;
+			   // linear combinations back
+			   mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+			   mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+			   mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+
+			   //3.
+			   // linear combinations
+			   LBMReal mxxyPyzz = mfcba + mfabc;
+			   LBMReal mxxyMyzz = mfcba - mfabc;
+
+			   LBMReal mxxzPyyz = mfcab + mfacb;
+			   LBMReal mxxzMyyz = mfcab - mfacb;
+
+			   LBMReal mxyyPxzz = mfbca + mfbac;
+			   LBMReal mxyyMxzz = mfbca - mfbac;
+
+			   //relax
+			   wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+			   mfbbb += wadjust * (-mfbbb);
+			   wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+			   mxxyPyzz += wadjust * (-mxxyPyzz);
+			   wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+			   mxxyMyzz += wadjust * (-mxxyMyzz);
+			   wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+			   mxxzPyyz += wadjust * (-mxxzPyyz);
+			   wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+			   mxxzMyyz += wadjust * (-mxxzMyyz);
+			   wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+			   mxyyPxzz += wadjust * (-mxyyPxzz);
+			   wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+			   mxyyMxzz += wadjust * (-mxyyMxzz);
+
+			   // linear combinations back
+			   mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+			   mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+			   mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+			   mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+			   mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+			   mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+			   //4.
+			   //CUMacc += O4 * (-CUMacc);
+			   //CUMcac += O4 * (-CUMcac);
+			   //CUMcca += O4 * (-CUMcca);
+
+			   //CUMbbc += O4 * (-CUMbbc);
+			   //CUMbcb += O4 * (-CUMbcb);
+			   //CUMcbb += O4 * (-CUMcbb);
+			   CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc);
+			   CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac);
+			   CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca);
+			   CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc);
+			   CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb);
+			   CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb);
+
+			   //5.
+			   CUMbcc += O5 * (-CUMbcc);
+			   CUMcbc += O5 * (-CUMcbc);
+			   CUMccb += O5 * (-CUMccb);
+
+			   //6.
+			   CUMccc += O6 * (-CUMccc);
+
+			   //back cumulants to central moments
+			   //4.
+			   //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+			   //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+			   //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+			   mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+			   mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+			   mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+			   mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+			   mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+			   mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho;
+
+			   //5.
+			   mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+			   mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+			   mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+
+			   //6.
+			   mfccc = CUMccc - ((-4. * mfbbb * mfbbb
+				   - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+				   - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+				   - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+				   + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+					   + 2. * (mfcaa * mfaca * mfaac)
+					   + 16. * mfbba * mfbab * mfabb)
+				   - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+				   - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+				   + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+					   + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho;
+
+
+			   ////////
+
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //forcing
+			   mfbaa = -mfbaa;
+			   mfaba = -mfaba;
+			   mfaab = -mfaab;
+			   //////////////////////////////////////////////////////////////////////////////////////
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //back
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Z - Dir
+			   m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
+			   m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2;
+			   m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+			   mfaaa = m0;
+			   mfaab = m1;
+			   mfaac = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+			   m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2);
+			   m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+			   mfaba = m0;
+			   mfabb = m1;
+			   mfabc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+			   m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2;
+			   m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+			   mfaca = m0;
+			   mfacb = m1;
+			   mfacc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+			   m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2);
+			   m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+			   mfbaa = m0;
+			   mfbab = m1;
+			   mfbac = m2;
+			   /////////b//////////////////////////////////////////////////////////////////////////
+			   m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+			   m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2);
+			   m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+			   mfbba = m0;
+			   mfbbb = m1;
+			   mfbbc = m2;
+			   /////////b//////////////////////////////////////////////////////////////////////////
+			   m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+			   m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2);
+			   m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+			   mfbca = m0;
+			   mfbcb = m1;
+			   mfbcc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+			   m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2;
+			   m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+			   mfcaa = m0;
+			   mfcab = m1;
+			   mfcac = m2;
+			   /////////c//////////////////////////////////////////////////////////////////////////
+			   m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+			   m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2);
+			   m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+			   mfcba = m0;
+			   mfcbb = m1;
+			   mfcbc = m2;
+			   /////////c//////////////////////////////////////////////////////////////////////////
+			   m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+			   m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2;
+			   m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+			   mfcca = m0;
+			   mfccb = m1;
+			   mfccc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Y - Dir
+			   m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2;
+			   m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfaaa = m0;
+			   mfaba = m1;
+			   mfaca = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2;
+			   m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfaab = m0;
+			   mfabb = m1;
+			   mfacb = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2;
+			   m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfaac = m0;
+			   mfabc = m1;
+			   mfacc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+			   m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2);
+			   m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+			   mfbaa = m0;
+			   mfbba = m1;
+			   mfbca = m2;
+			   /////////b//////////////////////////////////////////////////////////////////////////
+			   m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+			   m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2);
+			   m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+			   mfbab = m0;
+			   mfbbb = m1;
+			   mfbcb = m2;
+			   /////////b//////////////////////////////////////////////////////////////////////////
+			   m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+			   m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2);
+			   m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+			   mfbac = m0;
+			   mfbbc = m1;
+			   mfbcc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2;
+			   m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfcaa = m0;
+			   mfcba = m1;
+			   mfcca = m2;
+			   /////////c//////////////////////////////////////////////////////////////////////////
+			   m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2;
+			   m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfcab = m0;
+			   mfcbb = m1;
+			   mfccb = m2;
+			   /////////c//////////////////////////////////////////////////////////////////////////
+			   m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+			   m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2;
+			   m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+			   mfcac = m0;
+			   mfcbc = m1;
+			   mfccc = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // X - Dir
+			   m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2;
+			   m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaaa = m0;
+			   mfbaa = m1;
+			   mfcaa = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2;
+			   m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaba = m0;
+			   mfbba = m1;
+			   mfcba = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2;
+			   m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaca = m0;
+			   mfbca = m1;
+			   mfcca = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2;
+			   m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaab = m0;
+			   mfbab = m1;
+			   mfcab = m2;
+			   ///////////b////////////////////////////////////////////////////////////////////////
+			   m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2;
+			   m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfabb = m0;
+			   mfbbb = m1;
+			   mfcbb = m2;
+			   ///////////b////////////////////////////////////////////////////////////////////////
+			   m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2;
+			   m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfacb = m0;
+			   mfbcb = m1;
+			   mfccb = m2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2;
+			   m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfaac = m0;
+			   mfbac = m1;
+			   mfcac = m2;
+			   ///////////c////////////////////////////////////////////////////////////////////////
+			   m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2;
+			   m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfabc = m0;
+			   mfbbc = m1;
+			   mfcbc = m2;
+			   ///////////c////////////////////////////////////////////////////////////////////////
+			   m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			   m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2;
+			   m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			   mfacc = m0;
+			   mfbcc = m1;
+			   mfccc = m2;
+
+			   /////classical source term 8.4.2021
+
+			   //mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+			   //mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+			   //mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+			   //mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+			   //mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+			   //mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+			   //mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+			   //mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+			   //mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+			   //mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+			   //mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+			   //mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+			   //mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+			   //mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+			   //mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+			   //mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+			   //mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+			   //mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+			   //mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+			   //mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+			   //mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+			   //mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+			   //mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+			   //mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+			   //mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+			   //mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+			   //mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]
+
+
+
+			   //////////////////////////////////////////////////////////////////////////
+			   //proof correctness
+			   //////////////////////////////////////////////////////////////////////////
+//#ifdef  PROOF_CORRECTNESS
+//			   LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+//				   + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+//				   + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+//			   //LBMReal dif = fabs(drho - rho_post);
+//               LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post;
+//#ifdef SINGLEPRECISION
+//			   if (dif > 10.0E-7 || dif < -10.0E-7)
+//#else
+//			   if (dif > 10.0E-15 || dif < -10.0E-15)
+//#endif
+//			   {
+//				   UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post)
+//					   + " dif=" + UbSystem::toString(dif)
+//					   + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+//				   //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+//				   //exit(EXIT_FAILURE);
+//			   }
+//#endif
+			   //////////////////////////////////////////////////////////////////////////
+			   //write distribution
+			   //////////////////////////////////////////////////////////////////////////
+			   (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb         ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab         ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba         ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab        ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab       ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba        ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba       ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa        ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca       ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa       ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa      ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca      ;//* rho * c1o3;
+			   (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca     ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb     ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb     ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc     ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb   ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb    ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc   ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc    ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc   ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac    ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc  ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac  ;//* rho * c1o3;
+			   (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac   ;//* rho * c1o3;
+
+			   (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3;
+			   //////////////////////////////////////////////////////////////////////////
+
+			   ////!Incompressible Kernal
+
+                            
+//                            ///////Old Kernel \|/
+//                            // ux += forcingX1*deltaT*0.5; // X
+//                            // uy += forcingX2*deltaT*0.5; // Y
+//                            // uz += forcingX3*deltaT*0.5; // Z
+//                        }
+//
+//                        LBMReal ux = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+//                                      (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+//                                      (mfcbb - mfabb)) /
+//                                         (rho * c1o3) +
+//                                     (mu * dX1_phi + forcingX1) / (2 * rho);
+//
+//                        LBMReal uy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+//                                      (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+//                                      (mfbcb - mfbab)) /
+//                                         (rho * c1o3) +
+//                                     (mu * dX2_phi + forcingX2) / (2 * rho);
+//
+//                        LBMReal uz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+//                                      (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+//                                      (mfbbc - mfbba)) /
+//                                         (rho * c1o3) +
+//                                     (mu * dX3_phi + forcingX3) / (2 * rho);
+//
+//                        //--------------------------------------------------------
+//
+//                        LBMReal ux2 = ux * ux;
+//                        LBMReal uy2 = uy * uy;
+//                        LBMReal uz2 = uz * uz;
+//
+//                        //----------- Calculating Forcing Terms * -------------
+//                        for (int dir = STARTF; dir <= (FENDDIR); dir++) {
+//                            LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz;
+//                            LBMReal velSq1  = velProd * velProd;
+//                            LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2));
+//
+//                            LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi;
+//
+//                            forcingTerm[dir] = ((-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) +
+//                                                (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) +
+//                                                (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3))) +
+//                                               (DX1[dir]) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) +
+//                                               (DX2[dir]) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) +
+//                                               (DX3[dir]) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3));
+//                        }
+//
+//                        LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+//                        LBMReal fac1      = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi;
+//                        forcingTerm[REST] = (-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) +
+//                                            (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) +
+//                                            (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3));
+//
+//                        //--------------------------------------------------------
+//
+//                        mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho;    //-(3.0*p1 - rho)*WEIGTH[E  ];
+//                        mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho;    //-(3.0*p1 - rho)*WEIGTH[N  ];
+//                        mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho;    //-(3.0*p1 - rho)*WEIGTH[T  ];
+//                        mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NE ];
+//                        mfacb = 3.0 * (mfacb + 0.5 * forcingTerm[NW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[NW ];
+//                        mfcbc = 3.0 * (mfcbc + 0.5 * forcingTerm[TE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TE ];
+//                        mfabc = 3.0 * (mfabc + 0.5 * forcingTerm[TW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TW ];
+//                        mfbcc = 3.0 * (mfbcc + 0.5 * forcingTerm[TN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TN ];
+//                        mfbac = 3.0 * (mfbac + 0.5 * forcingTerm[TS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[TS ];
+//                        mfccc = 3.0 * (mfccc + 0.5 * forcingTerm[TNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNE];
+//                        mfacc = 3.0 * (mfacc + 0.5 * forcingTerm[TNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TNW];
+//                        mfcac = 3.0 * (mfcac + 0.5 * forcingTerm[TSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSE];
+//                        mfaac = 3.0 * (mfaac + 0.5 * forcingTerm[TSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[TSW];
+//                        mfabb = 3.0 * (mfabb + 0.5 * forcingTerm[W]) / rho;    //-(3.0*p1 - rho)*WEIGTH[W  ];
+//                        mfbab = 3.0 * (mfbab + 0.5 * forcingTerm[S]) / rho;    //-(3.0*p1 - rho)*WEIGTH[S  ];
+//                        mfbba = 3.0 * (mfbba + 0.5 * forcingTerm[B]) / rho;    //-(3.0*p1 - rho)*WEIGTH[B  ];
+//                        mfaab = 3.0 * (mfaab + 0.5 * forcingTerm[SW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SW ];
+//                        mfcab = 3.0 * (mfcab + 0.5 * forcingTerm[SE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[SE ];
+//                        mfaba = 3.0 * (mfaba + 0.5 * forcingTerm[BW]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BW ];
+//                        mfcba = 3.0 * (mfcba + 0.5 * forcingTerm[BE]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BE ];
+//                        mfbaa = 3.0 * (mfbaa + 0.5 * forcingTerm[BS]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BS ];
+//                        mfbca = 3.0 * (mfbca + 0.5 * forcingTerm[BN]) / rho;   //-(3.0*p1 - rho)*WEIGTH[BN ];
+//                        mfaaa = 3.0 * (mfaaa + 0.5 * forcingTerm[BSW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSW];
+//                        mfcaa = 3.0 * (mfcaa + 0.5 * forcingTerm[BSE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BSE];
+//                        mfaca = 3.0 * (mfaca + 0.5 * forcingTerm[BNW]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNW];
+//                        mfcca = 3.0 * (mfcca + 0.5 * forcingTerm[BNE]) / rho;  //-(3.0*p1 - rho)*WEIGTH[BNE];
+//                        mfbbb = 3.0 * (mfbbb + 0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST];
+//
+//                        LBMReal rho1 = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +
+//                                       (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) +
+//                                       (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) +
+//                                       (mfbba + mfbbc) + mfbbb;
+//
+//
+//                        LBMReal oMdrho, m0, m1, m2;
+//
+//                        oMdrho = mfccc + mfaaa;
+//                        m0     = mfaca + mfcac;
+//                        m1     = mfacc + mfcaa;
+//                        m2     = mfaac + mfcca;
+//                        oMdrho += m0;
+//                        m1 += m2;
+//                        oMdrho += m1;
+//                        m0 = mfbac + mfbca;
+//                        m1 = mfbaa + mfbcc;
+//                        m0 += m1;
+//                        m1 = mfabc + mfcba;
+//                        m2 = mfaba + mfcbc;
+//                        m1 += m2;
+//                        m0 += m1;
+//                        m1 = mfacb + mfcab;
+//                        m2 = mfaab + mfccb;
+//                        m1 += m2;
+//                        m0 += m1;
+//                        oMdrho += m0;
+//                        m0 = mfabb + mfcbb;
+//                        m1 = mfbab + mfbcb;
+//                        m2 = mfbba + mfbbc;
+//                        m0 += m1 + m2;
+//                        m0 += mfbbb; // hat gefehlt
+//                        oMdrho = 1. - (oMdrho + m0);
+//                        // oMdrho = rho - (oMdrho + m0);
+//
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        LBMReal wadjust;
+//                        LBMReal qudricLimit = 0.01;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Hin
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Z - Dir
+//                        m2    = mfaaa + mfaac;
+//                        m1    = mfaac - mfaaa;
+//                        m0    = m2 + mfaab;
+//                        mfaaa = m0;
+//                        m0 += c1o36 * oMdrho;
+//                        mfaab = m1 - m0 * uz;
+//                        mfaac = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaba + mfabc;
+//                        m1    = mfabc - mfaba;
+//                        m0    = m2 + mfabb;
+//                        mfaba = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfabb = m1 - m0 * uz;
+//                        mfabc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaca + mfacc;
+//                        m1    = mfacc - mfaca;
+//                        m0    = m2 + mfacb;
+//                        mfaca = m0;
+//                        m0 += c1o36 * oMdrho;
+//                        mfacb = m1 - m0 * uz;
+//                        mfacc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbaa + mfbac;
+//                        m1    = mfbac - mfbaa;
+//                        m0    = m2 + mfbab;
+//                        mfbaa = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfbab = m1 - m0 * uz;
+//                        mfbac = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbba + mfbbc;
+//                        m1    = mfbbc - mfbba;
+//                        m0    = m2 + mfbbb;
+//                        mfbba = m0;
+//                        m0 += c4o9 * oMdrho;
+//                        mfbbb = m1 - m0 * uz;
+//                        mfbbc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbca + mfbcc;
+//                        m1    = mfbcc - mfbca;
+//                        m0    = m2 + mfbcb;
+//                        mfbca = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfbcb = m1 - m0 * uz;
+//                        mfbcc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcaa + mfcac;
+//                        m1    = mfcac - mfcaa;
+//                        m0    = m2 + mfcab;
+//                        mfcaa = m0;
+//                        m0 += c1o36 * oMdrho;
+//                        mfcab = m1 - m0 * uz;
+//                        mfcac = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcba + mfcbc;
+//                        m1    = mfcbc - mfcba;
+//                        m0    = m2 + mfcbb;
+//                        mfcba = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfcbb = m1 - m0 * uz;
+//                        mfcbc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcca + mfccc;
+//                        m1    = mfccc - mfcca;
+//                        m0    = m2 + mfccb;
+//                        mfcca = m0;
+//                        m0 += c1o36 * oMdrho;
+//                        mfccb = m1 - m0 * uz;
+//                        mfccc = m2 - 2. * m1 * uz + uz2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Y - Dir
+//                        m2    = mfaaa + mfaca;
+//                        m1    = mfaca - mfaaa;
+//                        m0    = m2 + mfaba;
+//                        mfaaa = m0;
+//                        m0 += c1o6 * oMdrho;
+//                        mfaba = m1 - m0 * uy;
+//                        mfaca = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaab + mfacb;
+//                        m1    = mfacb - mfaab;
+//                        m0    = m2 + mfabb;
+//                        mfaab = m0;
+//                        mfabb = m1 - m0 * uy;
+//                        mfacb = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaac + mfacc;
+//                        m1    = mfacc - mfaac;
+//                        m0    = m2 + mfabc;
+//                        mfaac = m0;
+//                        m0 += c1o18 * oMdrho;
+//                        mfabc = m1 - m0 * uy;
+//                        mfacc = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbaa + mfbca;
+//                        m1    = mfbca - mfbaa;
+//                        m0    = m2 + mfbba;
+//                        mfbaa = m0;
+//                        m0 += c2o3 * oMdrho;
+//                        mfbba = m1 - m0 * uy;
+//                        mfbca = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbab + mfbcb;
+//                        m1    = mfbcb - mfbab;
+//                        m0    = m2 + mfbbb;
+//                        mfbab = m0;
+//                        mfbbb = m1 - m0 * uy;
+//                        mfbcb = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfbac + mfbcc;
+//                        m1    = mfbcc - mfbac;
+//                        m0    = m2 + mfbbc;
+//                        mfbac = m0;
+//                        m0 += c2o9 * oMdrho;
+//                        mfbbc = m1 - m0 * uy;
+//                        mfbcc = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcaa + mfcca;
+//                        m1    = mfcca - mfcaa;
+//                        m0    = m2 + mfcba;
+//                        mfcaa = m0;
+//                        m0 += c1o6 * oMdrho;
+//                        mfcba = m1 - m0 * uy;
+//                        mfcca = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcab + mfccb;
+//                        m1    = mfccb - mfcab;
+//                        m0    = m2 + mfcbb;
+//                        mfcab = m0;
+//                        mfcbb = m1 - m0 * uy;
+//                        mfccb = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfcac + mfccc;
+//                        m1    = mfccc - mfcac;
+//                        m0    = m2 + mfcbc;
+//                        mfcac = m0;
+//                        m0 += c1o18 * oMdrho;
+//                        mfcbc = m1 - m0 * uy;
+//                        mfccc = m2 - 2. * m1 * uy + uy2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // X - Dir
+//                        m2    = mfaaa + mfcaa;
+//                        m1    = mfcaa - mfaaa;
+//                        m0    = m2 + mfbaa;
+//                        mfaaa = m0;
+//                        m0 += 1. * oMdrho;
+//                        mfbaa = m1 - m0 * ux;
+//                        mfcaa = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaba + mfcba;
+//                        m1    = mfcba - mfaba;
+//                        m0    = m2 + mfbba;
+//                        mfaba = m0;
+//                        mfbba = m1 - m0 * ux;
+//                        mfcba = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaca + mfcca;
+//                        m1    = mfcca - mfaca;
+//                        m0    = m2 + mfbca;
+//                        mfaca = m0;
+//                        m0 += c1o3 * oMdrho;
+//                        mfbca = m1 - m0 * ux;
+//                        mfcca = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaab + mfcab;
+//                        m1    = mfcab - mfaab;
+//                        m0    = m2 + mfbab;
+//                        mfaab = m0;
+//                        mfbab = m1 - m0 * ux;
+//                        mfcab = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfabb + mfcbb;
+//                        m1    = mfcbb - mfabb;
+//                        m0    = m2 + mfbbb;
+//                        mfabb = m0;
+//                        mfbbb = m1 - m0 * ux;
+//                        mfcbb = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfacb + mfccb;
+//                        m1    = mfccb - mfacb;
+//                        m0    = m2 + mfbcb;
+//                        mfacb = m0;
+//                        mfbcb = m1 - m0 * ux;
+//                        mfccb = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfaac + mfcac;
+//                        m1    = mfcac - mfaac;
+//                        m0    = m2 + mfbac;
+//                        mfaac = m0;
+//                        m0 += c1o3 * oMdrho;
+//                        mfbac = m1 - m0 * ux;
+//                        mfcac = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfabc + mfcbc;
+//                        m1    = mfcbc - mfabc;
+//                        m0    = m2 + mfbbc;
+//                        mfabc = m0;
+//                        mfbbc = m1 - m0 * ux;
+//                        mfcbc = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m2    = mfacc + mfccc;
+//                        m1    = mfccc - mfacc;
+//                        m0    = m2 + mfbcc;
+//                        mfacc = m0;
+//                        m0 += c1o9 * oMdrho;
+//                        mfbcc = m1 - m0 * ux;
+//                        mfccc = m2 - 2. * m1 * ux + ux2 * m0;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Cumulants
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        LBMReal OxxPyyPzz = 1.; // omega2 or bulk viscosity
+//                        LBMReal OxyyPxzz  = 1.; //-s9;//2+s9;//
+//                        LBMReal OxyyMxzz  = 1.; // 2+s9;//
+//                        LBMReal O4        = 1.;
+//                        LBMReal O5        = 1.;
+//                        LBMReal O6        = 1.;
+//
+//                        // Cum 4.
+//                        LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+//                        LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+//                        LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+//
+//                        LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) +
+//                                                  c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+//                        LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) +
+//                                                  c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+//                        LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) +
+//                                                  c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+//
+//                        // Cum 5.
+//                        LBMReal CUMbcc = mfbcc -
+//                                         (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb +
+//                                          2. * (mfbab * mfacb + mfbba * mfabc)) -
+//                                         c1o3 * (mfbca + mfbac) * oMdrho;
+//                        LBMReal CUMcbc = mfcbc -
+//                                         (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb +
+//                                          2. * (mfabb * mfcab + mfbba * mfbac)) -
+//                                         c1o3 * (mfcba + mfabc) * oMdrho;
+//                        LBMReal CUMccb = mfccb -
+//                                         (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb +
+//                                          2. * (mfbab * mfbca + mfabb * mfcba)) -
+//                                         c1o3 * (mfacb + mfcab) * oMdrho;
+//
+//                        // Cum 6.
+//                        LBMReal CUMccc =
+//                            mfccc +
+//                            ((-4. * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) -
+//                              4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) -
+//                              2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) +
+//                             (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +
+//                              2. * (mfcaa * mfaca * mfaac) + 16. * mfbba * mfbab * mfabb) -
+//                             c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho -
+//                             c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) -
+//                             c1o27 * oMdrho * oMdrho * (-2. * oMdrho) +
+//                             (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +
+//                              (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) *
+//                                 c2o3 * oMdrho) +
+//                            c1o27 * oMdrho;
+//
+//                        // 2.
+//                        // linear combinations
+//                        LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+//                        LBMReal mxxMyy    = mfcaa - mfaca;
+//                        LBMReal mxxMzz    = mfcaa - mfaac;
+//
+//                        LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz);
+//                        LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy;
+//                        LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz;
+//
+//                        (*divU)(x1, x2, x3) = dxux + dyuy + dzuz;
+//
+//                        // relax
+//                        mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) -
+//                                     3. * (1. - c1o2 * OxxPyyPzz) * (ux2 * dxux + uy2 * dyuy + uz2 * dzuz);
+//                        mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (ux2 * dxux - uy2 * dyuy);
+//                        mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (ux2 * dxux - uz2 * dzuz);
+//
+//                        mfabb += collFactorM * (-mfabb);
+//                        mfbab += collFactorM * (-mfbab);
+//                        mfbba += collFactorM * (-mfbba);
+//
+//                        // linear combinations back
+//                        mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+//                        mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+//                        mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+//
+//                        // 3.
+//                        // linear combinations
+//                        LBMReal mxxyPyzz = mfcba + mfabc;
+//                        LBMReal mxxyMyzz = mfcba - mfabc;
+//
+//                        LBMReal mxxzPyyz = mfcab + mfacb;
+//                        LBMReal mxxzMyyz = mfcab - mfacb;
+//
+//                        LBMReal mxyyPxzz = mfbca + mfbac;
+//                        LBMReal mxyyMxzz = mfbca - mfbac;
+//
+//                        // relax
+//                        wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+//                        mfbbb += wadjust * (-mfbbb);
+//                        wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+//                        mxxyPyzz += wadjust * (-mxxyPyzz);
+//                        wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+//                        mxxyMyzz += wadjust * (-mxxyMyzz);
+//                        wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+//                        mxxzPyyz += wadjust * (-mxxzPyyz);
+//                        wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+//                        mxxzMyyz += wadjust * (-mxxzMyyz);
+//                        wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+//                        mxyyPxzz += wadjust * (-mxyyPxzz);
+//                        wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+//                        mxyyMxzz += wadjust * (-mxyyMxzz);
+//
+//                        // linear combinations back
+//                        mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+//                        mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+//                        mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+//                        mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+//                        mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+//                        mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+//
+//                        // 4.
+//                        CUMacc += O4 * (-CUMacc);
+//                        CUMcac += O4 * (-CUMcac);
+//                        CUMcca += O4 * (-CUMcca);
+//
+//                        CUMbbc += O4 * (-CUMbbc);
+//                        CUMbcb += O4 * (-CUMbcb);
+//                        CUMcbb += O4 * (-CUMcbb);
+//
+//                        // 5.
+//                        CUMbcc += O5 * (-CUMbcc);
+//                        CUMcbc += O5 * (-CUMcbc);
+//                        CUMccb += O5 * (-CUMccb);
+//
+//                        // 6.
+//                        CUMccc += O6 * (-CUMccc);
+//
+//                        // back cumulants to central moments
+//                        // 4.
+//                        mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+//                        mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+//                        mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+//
+//                        mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho +
+//                                c1o9 * (oMdrho - 1) * oMdrho;
+//                        mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho +
+//                                c1o9 * (oMdrho - 1) * oMdrho;
+//                        mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho +
+//                                c1o9 * (oMdrho - 1) * oMdrho;
+//
+//                        // 5.
+//                        mfbcc = CUMbcc +
+//                                (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb +
+//                                 2. * (mfbab * mfacb + mfbba * mfabc)) +
+//                                c1o3 * (mfbca + mfbac) * oMdrho;
+//                        mfcbc = CUMcbc +
+//                                (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb +
+//                                 2. * (mfabb * mfcab + mfbba * mfbac)) +
+//                                c1o3 * (mfcba + mfabc) * oMdrho;
+//                        mfccb = CUMccb +
+//                                (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb +
+//                                 2. * (mfbab * mfbca + mfabb * mfcba)) +
+//                                c1o3 * (mfacb + mfcab) * oMdrho;
+//
+//                        // 6.
+//                        mfccc = CUMccc -
+//                                ((-4. * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) -
+//                                  4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) -
+//                                  2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) +
+//                                 (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +
+//                                  2. * (mfcaa * mfaca * mfaac) + 16. * mfbba * mfbab * mfabb) -
+//                                 c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho -
+//                                 c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) -
+//                                 c1o27 * oMdrho * oMdrho * (-2. * oMdrho) +
+//                                 (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +
+//                                  (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) *
+//                                     c2o3 * oMdrho) -
+//                                c1o27 * oMdrho;
+//
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // forcing
+//                        mfbaa = -mfbaa;
+//                        mfaba = -mfaba;
+//                        mfaab = -mfaab;
+//                        //////////////////////////////////////////////////////////////////////////////////////
+//
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // back
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Z - Dir
+//                        m0    = mfaac * c1o2 + mfaab * (uz - c1o2) + (mfaaa + 1. * oMdrho) * (uz2 - uz) * c1o2;
+//                        m1    = -mfaac - 2. * mfaab * uz + mfaaa * (1. - uz2) - 1. * oMdrho * uz2;
+//                        m2    = mfaac * c1o2 + mfaab * (uz + c1o2) + (mfaaa + 1. * oMdrho) * (uz2 + uz) * c1o2;
+//                        mfaaa = m0;
+//                        mfaab = m1;
+//                        mfaac = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfabc * c1o2 + mfabb * (uz - c1o2) + mfaba * (uz2 - uz) * c1o2;
+//                        m1    = -mfabc - 2. * mfabb * uz + mfaba * (1. - uz2);
+//                        m2    = mfabc * c1o2 + mfabb * (uz + c1o2) + mfaba * (uz2 + uz) * c1o2;
+//                        mfaba = m0;
+//                        mfabb = m1;
+//                        mfabc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfacc * c1o2 + mfacb * (uz - c1o2) + (mfaca + c1o3 * oMdrho) * (uz2 - uz) * c1o2;
+//                        m1    = -mfacc - 2. * mfacb * uz + mfaca * (1. - uz2) - c1o3 * oMdrho * uz2;
+//                        m2    = mfacc * c1o2 + mfacb * (uz + c1o2) + (mfaca + c1o3 * oMdrho) * (uz2 + uz) * c1o2;
+//                        mfaca = m0;
+//                        mfacb = m1;
+//                        mfacc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbac * c1o2 + mfbab * (uz - c1o2) + mfbaa * (uz2 - uz) * c1o2;
+//                        m1    = -mfbac - 2. * mfbab * uz + mfbaa * (1. - uz2);
+//                        m2    = mfbac * c1o2 + mfbab * (uz + c1o2) + mfbaa * (uz2 + uz) * c1o2;
+//                        mfbaa = m0;
+//                        mfbab = m1;
+//                        mfbac = m2;
+//                        /////////b//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbbc * c1o2 + mfbbb * (uz - c1o2) + mfbba * (uz2 - uz) * c1o2;
+//                        m1    = -mfbbc - 2. * mfbbb * uz + mfbba * (1. - uz2);
+//                        m2    = mfbbc * c1o2 + mfbbb * (uz + c1o2) + mfbba * (uz2 + uz) * c1o2;
+//                        mfbba = m0;
+//                        mfbbb = m1;
+//                        mfbbc = m2;
+//                        /////////b//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbcc * c1o2 + mfbcb * (uz - c1o2) + mfbca * (uz2 - uz) * c1o2;
+//                        m1    = -mfbcc - 2. * mfbcb * uz + mfbca * (1. - uz2);
+//                        m2    = mfbcc * c1o2 + mfbcb * (uz + c1o2) + mfbca * (uz2 + uz) * c1o2;
+//                        mfbca = m0;
+//                        mfbcb = m1;
+//                        mfbcc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcac * c1o2 + mfcab * (uz - c1o2) + (mfcaa + c1o3 * oMdrho) * (uz2 - uz) * c1o2;
+//                        m1    = -mfcac - 2. * mfcab * uz + mfcaa * (1. - uz2) - c1o3 * oMdrho * uz2;
+//                        m2    = mfcac * c1o2 + mfcab * (uz + c1o2) + (mfcaa + c1o3 * oMdrho) * (uz2 + uz) * c1o2;
+//                        mfcaa = m0;
+//                        mfcab = m1;
+//                        mfcac = m2;
+//                        /////////c//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcbc * c1o2 + mfcbb * (uz - c1o2) + mfcba * (uz2 - uz) * c1o2;
+//                        m1    = -mfcbc - 2. * mfcbb * uz + mfcba * (1. - uz2);
+//                        m2    = mfcbc * c1o2 + mfcbb * (uz + c1o2) + mfcba * (uz2 + uz) * c1o2;
+//                        mfcba = m0;
+//                        mfcbb = m1;
+//                        mfcbc = m2;
+//                        /////////c//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccc * c1o2 + mfccb * (uz - c1o2) + (mfcca + c1o9 * oMdrho) * (uz2 - uz) * c1o2;
+//                        m1    = -mfccc - 2. * mfccb * uz + mfcca * (1. - uz2) - c1o9 * oMdrho * uz2;
+//                        m2    = mfccc * c1o2 + mfccb * (uz + c1o2) + (mfcca + c1o9 * oMdrho) * (uz2 + uz) * c1o2;
+//                        mfcca = m0;
+//                        mfccb = m1;
+//                        mfccc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // Y - Dir
+//                        m0    = mfaca * c1o2 + mfaba * (uy - c1o2) + (mfaaa + c1o6 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfaca - 2. * mfaba * uy + mfaaa * (1. - uy2) - c1o6 * oMdrho * uy2;
+//                        m2    = mfaca * c1o2 + mfaba * (uy + c1o2) + (mfaaa + c1o6 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfaaa = m0;
+//                        mfaba = m1;
+//                        mfaca = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfacb * c1o2 + mfabb * (uy - c1o2) + (mfaab + c2o3 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfacb - 2. * mfabb * uy + mfaab * (1. - uy2) - c2o3 * oMdrho * uy2;
+//                        m2    = mfacb * c1o2 + mfabb * (uy + c1o2) + (mfaab + c2o3 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfaab = m0;
+//                        mfabb = m1;
+//                        mfacb = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfacc * c1o2 + mfabc * (uy - c1o2) + (mfaac + c1o6 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfacc - 2. * mfabc * uy + mfaac * (1. - uy2) - c1o6 * oMdrho * uy2;
+//                        m2    = mfacc * c1o2 + mfabc * (uy + c1o2) + (mfaac + c1o6 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfaac = m0;
+//                        mfabc = m1;
+//                        mfacc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbca * c1o2 + mfbba * (uy - c1o2) + mfbaa * (uy2 - uy) * c1o2;
+//                        m1    = -mfbca - 2. * mfbba * uy + mfbaa * (1. - uy2);
+//                        m2    = mfbca * c1o2 + mfbba * (uy + c1o2) + mfbaa * (uy2 + uy) * c1o2;
+//                        mfbaa = m0;
+//                        mfbba = m1;
+//                        mfbca = m2;
+//                        /////////b//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbcb * c1o2 + mfbbb * (uy - c1o2) + mfbab * (uy2 - uy) * c1o2;
+//                        m1    = -mfbcb - 2. * mfbbb * uy + mfbab * (1. - uy2);
+//                        m2    = mfbcb * c1o2 + mfbbb * (uy + c1o2) + mfbab * (uy2 + uy) * c1o2;
+//                        mfbab = m0;
+//                        mfbbb = m1;
+//                        mfbcb = m2;
+//                        /////////b//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfbcc * c1o2 + mfbbc * (uy - c1o2) + mfbac * (uy2 - uy) * c1o2;
+//                        m1    = -mfbcc - 2. * mfbbc * uy + mfbac * (1. - uy2);
+//                        m2    = mfbcc * c1o2 + mfbbc * (uy + c1o2) + mfbac * (uy2 + uy) * c1o2;
+//                        mfbac = m0;
+//                        mfbbc = m1;
+//                        mfbcc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcca * c1o2 + mfcba * (uy - c1o2) + (mfcaa + c1o18 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfcca - 2. * mfcba * uy + mfcaa * (1. - uy2) - c1o18 * oMdrho * uy2;
+//                        m2    = mfcca * c1o2 + mfcba * (uy + c1o2) + (mfcaa + c1o18 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfcaa = m0;
+//                        mfcba = m1;
+//                        mfcca = m2;
+//                        /////////c//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccb * c1o2 + mfcbb * (uy - c1o2) + (mfcab + c2o9 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfccb - 2. * mfcbb * uy + mfcab * (1. - uy2) - c2o9 * oMdrho * uy2;
+//                        m2    = mfccb * c1o2 + mfcbb * (uy + c1o2) + (mfcab + c2o9 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfcab = m0;
+//                        mfcbb = m1;
+//                        mfccb = m2;
+//                        /////////c//////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccc * c1o2 + mfcbc * (uy - c1o2) + (mfcac + c1o18 * oMdrho) * (uy2 - uy) * c1o2;
+//                        m1    = -mfccc - 2. * mfcbc * uy + mfcac * (1. - uy2) - c1o18 * oMdrho * uy2;
+//                        m2    = mfccc * c1o2 + mfcbc * (uy + c1o2) + (mfcac + c1o18 * oMdrho) * (uy2 + uy) * c1o2;
+//                        mfcac = m0;
+//                        mfcbc = m1;
+//                        mfccc = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        // X - Dir
+//                        m0    = mfcaa * c1o2 + mfbaa * (ux - c1o2) + (mfaaa + c1o36 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcaa - 2. * mfbaa * ux + mfaaa * (1. - ux2) - c1o36 * oMdrho * ux2;
+//                        m2    = mfcaa * c1o2 + mfbaa * (ux + c1o2) + (mfaaa + c1o36 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaaa = m0;
+//                        mfbaa = m1;
+//                        mfcaa = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcba * c1o2 + mfbba * (ux - c1o2) + (mfaba + c1o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcba - 2. * mfbba * ux + mfaba * (1. - ux2) - c1o9 * oMdrho * ux2;
+//                        m2    = mfcba * c1o2 + mfbba * (ux + c1o2) + (mfaba + c1o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaba = m0;
+//                        mfbba = m1;
+//                        mfcba = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcca * c1o2 + mfbca * (ux - c1o2) + (mfaca + c1o36 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcca - 2. * mfbca * ux + mfaca * (1. - ux2) - c1o36 * oMdrho * ux2;
+//                        m2    = mfcca * c1o2 + mfbca * (ux + c1o2) + (mfaca + c1o36 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaca = m0;
+//                        mfbca = m1;
+//                        mfcca = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcab * c1o2 + mfbab * (ux - c1o2) + (mfaab + c1o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcab - 2. * mfbab * ux + mfaab * (1. - ux2) - c1o9 * oMdrho * ux2;
+//                        m2    = mfcab * c1o2 + mfbab * (ux + c1o2) + (mfaab + c1o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaab = m0;
+//                        mfbab = m1;
+//                        mfcab = m2;
+//                        ///////////b////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcbb * c1o2 + mfbbb * (ux - c1o2) + (mfabb + c4o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcbb - 2. * mfbbb * ux + mfabb * (1. - ux2) - c4o9 * oMdrho * ux2;
+//                        m2    = mfcbb * c1o2 + mfbbb * (ux + c1o2) + (mfabb + c4o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfabb = m0;
+//                        mfbbb = m1;
+//                        mfcbb = m2;
+//                        ///////////b////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccb * c1o2 + mfbcb * (ux - c1o2) + (mfacb + c1o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfccb - 2. * mfbcb * ux + mfacb * (1. - ux2) - c1o9 * oMdrho * ux2;
+//                        m2    = mfccb * c1o2 + mfbcb * (ux + c1o2) + (mfacb + c1o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfacb = m0;
+//                        mfbcb = m1;
+//                        mfccb = m2;
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        ////////////////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcac * c1o2 + mfbac * (ux - c1o2) + (mfaac + c1o36 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcac - 2. * mfbac * ux + mfaac * (1. - ux2) - c1o36 * oMdrho * ux2;
+//                        m2    = mfcac * c1o2 + mfbac * (ux + c1o2) + (mfaac + c1o36 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfaac = m0;
+//                        mfbac = m1;
+//                        mfcac = m2;
+//                        ///////////c////////////////////////////////////////////////////////////////////////
+//                        m0    = mfcbc * c1o2 + mfbbc * (ux - c1o2) + (mfabc + c1o9 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfcbc - 2. * mfbbc * ux + mfabc * (1. - ux2) - c1o9 * oMdrho * ux2;
+//                        m2    = mfcbc * c1o2 + mfbbc * (ux + c1o2) + (mfabc + c1o9 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfabc = m0;
+//                        mfbbc = m1;
+//                        mfcbc = m2;
+//                        ///////////c////////////////////////////////////////////////////////////////////////
+//                        m0    = mfccc * c1o2 + mfbcc * (ux - c1o2) + (mfacc + c1o36 * oMdrho) * (ux2 - ux) * c1o2;
+//                        m1    = -mfccc - 2. * mfbcc * ux + mfacc * (1. - ux2) - c1o36 * oMdrho * ux2;
+//                        m2    = mfccc * c1o2 + mfbcc * (ux + c1o2) + (mfacc + c1o36 * oMdrho) * (ux2 + ux) * c1o2;
+//                        mfacc = m0;
+//                        mfbcc = m1;
+//                        mfccc = m2;
+//
+//                        ///////////////////////////////////////////////////////////////////////////
+//
+//                        //////////////////////////////////////////////////////////////////////////
+//                        // proof correctness
+//                        //////////////////////////////////////////////////////////////////////////
+//#ifdef PROOF_CORRECTNESS
+//                        LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +
+//                                           (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) +
+//                                           (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) +
+//                                           (mfbba + mfbbc) + mfbbb;
+//
+//                        LBMReal dif = rho1 - rho_post;
+//#ifdef SINGLEPRECISION
+//                        if (dif > 10.0E-7 || dif < -10.0E-7)
+//#else
+//                        if (dif > 10.0E-15 || dif < -10.0E-15)
+//#endif
+//                        {
+//                            UB_THROW(UbException(UB_EXARGS,
+//                                                 "rho=" + UbSystem::toString(rho) + ", rho_post=" +
+//                                                     UbSystem::toString(rho_post) + " dif=" + UbSystem::toString(dif) +
+//                                                     " rho is not correct for node " + UbSystem::toString(x1) + "," +
+//                                                     UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+//                        }
+//#endif
+//
+//                        mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00];
+//                        mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N];
+//                        mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T];
+//                        mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE];
+//                        mfacb = rho * c1o3 * (mfacb) + 0.5 * forcingTerm[NW];
+//                        mfcbc = rho * c1o3 * (mfcbc) + 0.5 * forcingTerm[TE];
+//                        mfabc = rho * c1o3 * (mfabc) + 0.5 * forcingTerm[TW];
+//                        mfbcc = rho * c1o3 * (mfbcc) + 0.5 * forcingTerm[TN];
+//                        mfbac = rho * c1o3 * (mfbac) + 0.5 * forcingTerm[TS];
+//                        mfccc = rho * c1o3 * (mfccc) + 0.5 * forcingTerm[TNE];
+//                        mfacc = rho * c1o3 * (mfacc) + 0.5 * forcingTerm[TNW];
+//                        mfcac = rho * c1o3 * (mfcac) + 0.5 * forcingTerm[TSE];
+//                        mfaac = rho * c1o3 * (mfaac) + 0.5 * forcingTerm[TSW];
+//                        mfabb = rho * c1o3 * (mfabb) + 0.5 * forcingTerm[W];
+//                        mfbab = rho * c1o3 * (mfbab) + 0.5 * forcingTerm[S];
+//                        mfbba = rho * c1o3 * (mfbba) + 0.5 * forcingTerm[B];
+//                        mfaab = rho * c1o3 * (mfaab) + 0.5 * forcingTerm[SW];
+//                        mfcab = rho * c1o3 * (mfcab) + 0.5 * forcingTerm[SE];
+//                        mfaba = rho * c1o3 * (mfaba) + 0.5 * forcingTerm[BW];
+//                        mfcba = rho * c1o3 * (mfcba) + 0.5 * forcingTerm[BE];
+//                        mfbaa = rho * c1o3 * (mfbaa) + 0.5 * forcingTerm[BS];
+//                        mfbca = rho * c1o3 * (mfbca) + 0.5 * forcingTerm[BN];
+//                        mfaaa = rho * c1o3 * (mfaaa) + 0.5 * forcingTerm[BSW];
+//                        mfcaa = rho * c1o3 * (mfcaa) + 0.5 * forcingTerm[BSE];
+//                        mfaca = rho * c1o3 * (mfaca) + 0.5 * forcingTerm[BNW];
+//                        mfcca = rho * c1o3 * (mfcca) + 0.5 * forcingTerm[BNE];
+//                        mfbbb = rho * c1o3 * (mfbbb) + 0.5 * forcingTerm[REST];
+//
+//                        //////////////////////////////////////////////////////////////////////////
+//                        // write distribution for F
+//                        //////////////////////////////////////////////////////////////////////////
+//
+//                        (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3)     = mfabb;
+//                        (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3)     = mfbab;
+//                        (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)     = mfbba;
+//                        (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3)    = mfaab;
+//                        (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3)   = mfcab;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3)    = mfaba;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3)   = mfcba;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3)    = mfbaa;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3)   = mfbca;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3)   = mfaaa;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3)  = mfcaa;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3)  = mfaca;
+//                        (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+//
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3)     = mfcbb;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3)     = mfbcb;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p)     = mfbbc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3)   = mfccb;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3)    = mfacb;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p)   = mfcbc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p)    = mfabc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p)   = mfbcc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p)    = mfbac;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p)  = mfacc;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p)  = mfcac;
+//                        (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p)   = mfaac;
+//
+//                        (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;
+// !Old Kernel
+                        /////////////////////  P H A S E - F I E L D   S O L V E R
+                        ////////////////////////////////////////////
+		/////CUMULANT PHASE-FIELD
+				LBMReal omegaD =1.0/( 3.0 * mob + 0.5);
+				{
+			   mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+			   mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+			   mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+			   mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+			   mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+			   mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+			   mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+			   mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+			   mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+			   mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+			   mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+			   mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+			   mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+			   mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+			   mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+			   mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+			   mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+			   mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+			   mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+			   mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+			   mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+			   mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+			   mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+			   mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+			   mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+			   mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+			   mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3);
+
+
+					////////////////////////////////////////////////////////////////////////////////////
+		//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
+		//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+		//!
+		////////////////////////////////////////////////////////////////////////////////////
+		// fluid component
+			   //LBMReal drhoFluid =
+				  // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) +
+				  // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) +
+					 //  ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb;
+
+			   //LBMReal rhoFluid = c1 + drhoFluid;
+			   //LBMReal OOrhoFluid = c1 / rhoFluid;
+
+
+			   //LBMReal vvx =
+				  // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) +
+				  // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) +
+					 //  (fcbb - fabb)) * OOrhoFluid;
+			   //LBMReal vvy =
+				  // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) +
+				  // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) +
+					 //  (fbcb - fbab)) * OOrhoFluid;
+			   //LBMReal vvz =
+				  // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) +
+				  // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) +
+					 //  (fbbc - fbba)) * OOrhoFluid;
+
+			 //  LBMReal vvx = ux;
+			 //  LBMReal vvy = uy;
+			 //  LBMReal vvz = uz;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // second component
+			   LBMReal concentration =
+				   ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+				   (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+					   ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref
+			   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+			   //!
+			  // LBMReal fx = forces[0];
+			  // LBMReal fy = forces[1];
+			  // LBMReal fz = -concentration * forces[2];
+			  // vvx += fx * c1o2;
+			  // vvy += fy * c1o2;
+			  // vvz += fz * c1o2;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   LBMReal oneMinusRho = c1- concentration;
+
+			   LBMReal cx =
+				   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+				   (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+					   (mfcbb - mfabb));
+			   LBMReal cy =
+				   ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+				   (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+					   (mfbcb - mfbab));
+			   LBMReal cz =
+				   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+				   (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+					   (mfbbc - mfbba));
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // calculate the square of velocities for this lattice node
+			   LBMReal cx2 = cx * cx;
+			   LBMReal cy2 = cy * cy;
+			   LBMReal cz2 = cz * cz;
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
+			   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+			   //! see also Eq. (6)-(14) in \ref
+			   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+			   //!
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Z - Dir
+			   forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Y - Dir
+			   forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+			   forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+			   forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+			   forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+			   forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+			   forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+			   forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+			   forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // X - Dir
+			   forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+			   forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+			   forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+			   forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+			   forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+			   forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+			   forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+			   forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+			   forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //! - experimental Cumulant ... to be published ... hopefully
+			   //!
+
+			   // linearized orthogonalization of 3rd order central moments
+			   LBMReal Mabc = mfabc - mfaba * c1o3;
+			   LBMReal Mbca = mfbca - mfbaa * c1o3;
+			   LBMReal Macb = mfacb - mfaab * c1o3;
+			   LBMReal Mcba = mfcba - mfaba * c1o3;
+			   LBMReal Mcab = mfcab - mfaab * c1o3;
+			   LBMReal Mbac = mfbac - mfbaa * c1o3;
+			   // linearized orthogonalization of 5th order central moments
+			   LBMReal Mcbc = mfcbc - mfaba * c1o9;
+			   LBMReal Mbcc = mfbcc - mfbaa * c1o9;
+			   LBMReal Mccb = mfccb - mfaab * c1o9;
+
+			   // collision of 1st order moments
+			  // LBMReal ccx, ccy, ccz;
+			   
+
+               cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+                    normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+               cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+                    normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+               cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+                    normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale;
+
+			   //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx;
+			   //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy;
+			//mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz;
+
+
+			   cx2 = cx * cx;
+			   cy2 = cy * cy;
+			   cz2 = cz * cz;
+
+			   // equilibration of 2nd order moments
+			   mfbba = zeroReal;
+			   mfbab = zeroReal;
+			   mfabb = zeroReal;
+
+			   mfcaa = c1o3 * concentration;
+			   mfaca = c1o3 * concentration;
+			   mfaac = c1o3 * concentration;
+
+
+			   //LBMReal omega2 = 1.0f;// omegaD;
+			   //mfbba *= (c1 - omega2);
+			   //mfbab *= (c1 - omega2);
+			   //mfabb *= (c1 - omega2);
+
+			   //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration;
+			   //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration;
+			   //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration;
+
+			   // equilibration of 3rd order moments
+			   Mabc = zeroReal;
+			   Mbca = zeroReal;
+			   Macb = zeroReal;
+			   Mcba = zeroReal;
+			   Mcab = zeroReal;
+			   Mbac = zeroReal;
+			   mfbbb = zeroReal;
+
+			   // from linearized orthogonalization 3rd order central moments to central moments
+			   mfabc = Mabc + mfaba * c1o3;
+			   mfbca = Mbca + mfbaa * c1o3;
+			   mfacb = Macb + mfaab * c1o3;
+			   mfcba = Mcba + mfaba * c1o3;
+			   mfcab = Mcab + mfaab * c1o3;
+			   mfbac = Mbac + mfbaa * c1o3;
+
+			   // equilibration of 4th order moments
+			   mfacc = c1o9 * concentration;
+			   mfcac = c1o9 * concentration;
+			   mfcca = c1o9 * concentration;
+
+			   mfcbb = zeroReal;
+			   mfbcb = zeroReal;
+			   mfbbc = zeroReal;
+
+			   // equilibration of 5th order moments
+			   Mcbc = zeroReal;
+			   Mbcc = zeroReal;
+			   Mccb = zeroReal;
+
+			   // from linearized orthogonalization 5th order central moments to central moments
+			   mfcbc = Mcbc + mfaba * c1o9;
+			   mfbcc = Mbcc + mfbaa * c1o9;
+			   mfccb = Mccb + mfaab * c1o9;
+
+			   // equilibration of 6th order moment
+			   mfccc = c1o27 * concentration;
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
+			   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+			   //! see also Eq. (88)-(96) in
+			   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+			   //!
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // X - Dir
+			   backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+			   backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+			   backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+			   backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+			   backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+			   backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+			   backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+			   backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+			   backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Y - Dir
+			   backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+			   backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+			   backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+			   backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+			   backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+			   backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+			   backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+			   ////////////////////////////////////////////////////////////////////////////////////
+			   // Z - Dir
+			   backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+			   backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+
+
+			   (*this->localDistributionsH1)(D3Q27System::ET_E,   x1,  x2,  x3) = mfabb;
+   (*this->localDistributionsH1)(D3Q27System::ET_N,   x1,  x2,  x3) = mfbab;
+   (*this->localDistributionsH1)(D3Q27System::ET_T,   x1,  x2,  x3) = mfbba;
+   (*this->localDistributionsH1)(D3Q27System::ET_NE,  x1,  x2,  x3) = mfaab;
+   (*this->localDistributionsH1)(D3Q27System::ET_NW,  x1p, x2,  x3) = mfcab;
+   (*this->localDistributionsH1)(D3Q27System::ET_TE,  x1,  x2,  x3) = mfaba;
+   (*this->localDistributionsH1)(D3Q27System::ET_TW,  x1p, x2,  x3) = mfcba;
+   (*this->localDistributionsH1)(D3Q27System::ET_TN,  x1,  x2,  x3) = mfbaa;
+   (*this->localDistributionsH1)(D3Q27System::ET_TS,  x1,  x2p, x3) = mfbca;
+   (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1,  x2,  x3) = mfaaa;
+   (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2,  x3) = mfcaa;
+   (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1,  x2p, x3) = mfaca;
+   (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_W,   x1p, x2,  x3 ) = mfcbb;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_S,   x1,  x2p, x3 ) = mfbcb;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_B,   x1,  x2,  x3p) = mfbbc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW,  x1p, x2p, x3 ) = mfccb;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE,  x1,  x2p, x3 ) = mfacb;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW,  x1p, x2,  x3p) = mfcbc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE,  x1,  x2,  x3p) = mfabc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS,  x1,  x2p, x3p) = mfbcc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN,  x1,  x2,  x3p) = mfbac;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1,  x2p, x3p) = mfacc;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2,  x3p) = mfcac;
+   (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1,  x2,  x3p) = mfaac;
+
+   (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb;
+   }
+
+   ////Phasefield 2:
+
+   {
+
+   normX1 *= -1;
+   normX2 *= -1;
+   normX3 *= -1;
+
+   mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3);
+   mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3);
+   mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3);
+   mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3);
+   mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3);
+   mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3);
+   mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3);
+   mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3);
+   mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3);
+   mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3);
+   mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3);
+   mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3);
+   mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3);
+   mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3);
+   mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3);
+   mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p);
+   mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3);
+   mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3);
+   mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p);
+   mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p);
+   mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p);
+   mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p);
+   mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+   mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p);
+   mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p);
+   mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p);
+   mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3);
+
+
+   ////////////////////////////////////////////////////////////////////////////////////
+//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
+//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+//!
+////////////////////////////////////////////////////////////////////////////////////
+// fluid component
+	   //LBMReal drhoFluid =
+		  // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) +
+		  // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) +
+			 //  ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb;
+
+	   //LBMReal rhoFluid = c1 + drhoFluid;
+	   //LBMReal OOrhoFluid = c1 / rhoFluid;
+
+
+	   //LBMReal vvx =
+		  // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) +
+		  // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) +
+			 //  (fcbb - fabb)) * OOrhoFluid;
+	   //LBMReal vvy =
+		  // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) +
+		  // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) +
+			 //  (fbcb - fbab)) * OOrhoFluid;
+	   //LBMReal vvz =
+		  // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) +
+		  // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) +
+			 //  (fbbc - fbba)) * OOrhoFluid;
+
+	 //  LBMReal vvx = ux;
+	 //  LBMReal vvy = uy;
+	 //  LBMReal vvz = uz;
+	   ////////////////////////////////////////////////////////////////////////////////////
+	   // second component
+   LBMReal concentration =
+	   ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+	   (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+		   ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref
+   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+   //!
+  // LBMReal fx = forces[0];
+  // LBMReal fy = forces[1];
+  // LBMReal fz = -concentration * forces[2];
+  // vvx += fx * c1o2;
+  // vvy += fy * c1o2;
+  // vvz += fz * c1o2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   LBMReal oneMinusRho = c1 - concentration;
+
+   LBMReal cx =
+	   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+	   (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+		   (mfcbb - mfabb));
+   LBMReal cy =
+	   ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+	   (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+		   (mfbcb - mfbab));
+   LBMReal cz =
+	   ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+	   (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+		   (mfbbc - mfbba));
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // calculate the square of velocities for this lattice node
+   LBMReal cx2 = cx * cx;
+   LBMReal cy2 = cy * cy;
+   LBMReal cz2 = cz * cz;
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref
+   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+   //! see also Eq. (6)-(14) in \ref
+   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+   //!
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Z - Dir
+   forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Y - Dir
+   forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+   forwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+   forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+   forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+   forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+   forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+   forwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+   forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // X - Dir
+   forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+   forwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+   forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+   forwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+   forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+   forwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+   forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+   forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+   forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - experimental Cumulant ... to be published ... hopefully
+   //!
+
+   // linearized orthogonalization of 3rd order central moments
+   LBMReal Mabc = mfabc - mfaba * c1o3;
+   LBMReal Mbca = mfbca - mfbaa * c1o3;
+   LBMReal Macb = mfacb - mfaab * c1o3;
+   LBMReal Mcba = mfcba - mfaba * c1o3;
+   LBMReal Mcab = mfcab - mfaab * c1o3;
+   LBMReal Mbac = mfbac - mfbaa * c1o3;
+   // linearized orthogonalization of 5th order central moments
+   LBMReal Mcbc = mfcbc - mfaba * c1o9;
+   LBMReal Mbcc = mfbcc - mfbaa * c1o9;
+   LBMReal Mccb = mfccb - mfaab * c1o9;
+
+   // collision of 1st order moments
+   cx = cx * (c1 - omegaD) + omegaD * vvx * concentration +
+	   normX1 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale;
+   cy = cy * (c1 - omegaD) + omegaD * vvy * concentration +
+	   normX2 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale;
+   cz = cz * (c1 - omegaD) + omegaD * vvz * concentration +
+	   normX3 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale;
+
+   //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx;
+   //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy;
+//mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz;
+
+
+   cx2 = cx * cx;
+   cy2 = cy * cy;
+   cz2 = cz * cz;
+
+   // equilibration of 2nd order moments
+   mfbba = zeroReal;
+   mfbab = zeroReal;
+   mfabb = zeroReal;
+
+   mfcaa = c1o3 * concentration;
+   mfaca = c1o3 * concentration;
+   mfaac = c1o3 * concentration;
+
+
+   //LBMReal omega2 = 1.0f;// omegaD;
+   //mfbba *= (c1 - omega2);
+   //mfbab *= (c1 - omega2);
+   //mfabb *= (c1 - omega2);
+
+   //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration;
+   //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration;
+   //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration;
+
+   // equilibration of 3rd order moments
+   Mabc = zeroReal;
+   Mbca = zeroReal;
+   Macb = zeroReal;
+   Mcba = zeroReal;
+   Mcab = zeroReal;
+   Mbac = zeroReal;
+   mfbbb = zeroReal;
+
+   // from linearized orthogonalization 3rd order central moments to central moments
+   mfabc = Mabc + mfaba * c1o3;
+   mfbca = Mbca + mfbaa * c1o3;
+   mfacb = Macb + mfaab * c1o3;
+   mfcba = Mcba + mfaba * c1o3;
+   mfcab = Mcab + mfaab * c1o3;
+   mfbac = Mbac + mfbaa * c1o3;
+
+   // equilibration of 4th order moments
+   mfacc = c1o9 * concentration;
+   mfcac = c1o9 * concentration;
+   mfcca = c1o9 * concentration;
+
+   mfcbb = zeroReal;
+   mfbcb = zeroReal;
+   mfbbc = zeroReal;
+
+   // equilibration of 5th order moments
+   Mcbc = zeroReal;
+   Mbcc = zeroReal;
+   Mccb = zeroReal;
+
+   // from linearized orthogonalization 5th order central moments to central moments
+   mfcbc = Mcbc + mfaba * c1o9;
+   mfbcc = Mbcc + mfbaa * c1o9;
+   mfccb = Mccb + mfaab * c1o9;
+
+   // equilibration of 6th order moment
+   mfccc = c1o27 * concentration;
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in
+   //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
+   //! see also Eq. (88)-(96) in
+   //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a>
+   //!
+   ////////////////////////////////////////////////////////////////////////////////////
+   // X - Dir
+   backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho);
+   backwardChimera(mfaba, mfbba, mfcba, cx, cx2);
+   backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho);
+   backwardChimera(mfaab, mfbab, mfcab, cx, cx2);
+   backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2);
+   backwardChimera(mfacb, mfbcb, mfccb, cx, cx2);
+   backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho);
+   backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2);
+   backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Y - Dir
+   backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho);
+   backwardChimera(mfaab, mfabb, mfacb, cy, cy2);
+   backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho);
+   backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2);
+   backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho);
+   backwardChimera(mfcab, mfcbb, mfccb, cy, cy2);
+   backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Z - Dir
+   backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho);
+   backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho);
+
+
+
+   (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+   (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+   (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+   (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+   (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+   (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+   (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+   (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+   (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+   (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+   (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+   (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+   (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+   (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+
+   (*this->zeroDistributionsH2)(x1, x2, x3) = mfbbb;
+
+   }
+
+
+
+		/////!CUMULANT PHASE-FIELD
+
+
+
+                        /////////////////////   PHASE-FIELD BGK SOLVER ///////////////////////////////
+
+                        //h[DIR_P00]   = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+                        //h[N]   = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
+                        //h[T]   = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
+                        //h[NE]  = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
+                        //h[NW]  = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
+                        //h[TE]  = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
+                        //h[TW]  = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
+                        //h[TN]  = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
+                        //h[TS]  = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
+                        //h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
+                        //h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
+                        //h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
+                        //h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+                        //h[W]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
+                        //h[S]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
+                        //h[B]   = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
+                        //h[SW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
+                        //h[SE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
+                        //h[BW]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
+                        //h[BE]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
+                        //h[BS]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
+                        //h[BN]  = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
+                        //h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                        //h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                        //h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                        //h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                        //h[REST] = (*this->zeroDistributionsH)(x1, x2, x3);
+
+                        //for (int dir = STARTF; dir < (ENDF + 1); dir++) {
+                        //    LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz;
+                        //    LBMReal velSq1  = velProd * velProd;
+                        //    LBMReal hEq; //, gEq;
+
+                        //    if (dir != REST) {
+                        //        LBMReal dirGrad_phi = (phi[dir] - phi[INVDIR[dir]]) / 2.0;
+                        //        LBMReal hSource     = (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST]) * (dirGrad_phi) / denom; 
+                        //        hEq = phi[REST] * WEIGTH[dir] * (1.0 + 3.0 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)) +                                 hSource * WEIGTH[dir];
+
+                        //        // This corresponds with the collision factor of 1.0 which equals (tauH + 0.5).
+                        //        h[dir] = h[dir] - (h[dir] - hEq) / (tauH); 
+
+                        //    } else {
+                        //        hEq = phi[REST] * WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2));
+                        //        h[REST] = h[REST] - (h[REST] - hEq) / (tauH); 
+                        //    }
+                        //}
+
+                        //(*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3)     = h[D3Q27System::INV_E];
+                        //(*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3)     = h[D3Q27System::INV_N];
+                        //(*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3)     = h[D3Q27System::INV_T];
+                        //(*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3)    = h[D3Q27System::INV_NE];
+                        //(*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3)   = h[D3Q27System::INV_NW];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3)    = h[D3Q27System::INV_TE];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3)   = h[D3Q27System::INV_TW];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3)    = h[D3Q27System::INV_TN];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3)   = h[D3Q27System::INV_TS];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3)   = h[D3Q27System::INV_TNE];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3)  = h[D3Q27System::INV_TNW];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3)  = h[D3Q27System::INV_TSE];
+                        //(*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = h[D3Q27System::INV_TSW];
+
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3)     = h[D3Q27System::INV_W];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3)     = h[D3Q27System::INV_S];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p)     = h[D3Q27System::INV_B];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3)   = h[D3Q27System::INV_SW];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3)    = h[D3Q27System::INV_SE];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p)   = h[D3Q27System::INV_BW];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p)    = h[D3Q27System::INV_BE];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p)   = h[D3Q27System::INV_BS];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p)    = h[D3Q27System::INV_BN];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = h[D3Q27System::INV_BSW];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p)  = h[D3Q27System::INV_BSE];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p)  = h[D3Q27System::INV_BNW];
+                        //(*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p)   = h[D3Q27System::INV_BNE];
+
+                        //(*this->zeroDistributionsH)(x1, x2, x3) = h[D3Q27System::REST];
+
+                        /////////////////////   END OF OLD BGK SOLVER ///////////////////////////////
+                    }
+                }
+            }
+        
+       // dataSet->setPhaseField(divU);
+		}
+}
+//////////////////////////////////////////////////////////////////////////
+
+LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX1_phi()
+{
+    using namespace D3Q27System;
+	return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00]));
+    //LBMReal sum = 0.0;
+    //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+    //    sum += WEIGTH[k] * DX1[k] * phi[k];
+    //}
+    //return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX2_phi()
+{
+    using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0]));
+    //LBMReal sum = 0.0;
+    //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+    //    sum += WEIGTH[k] * DX2[k] * phi[k];
+    //}
+    //return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX3_phi()
+{
+    using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M]));
+    //LBMReal sum = 0.0;
+    //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+    //    sum += WEIGTH[k] * DX3[k] * phi[k];
+    //}
+    //return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX1_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00]));
+	//LBMReal sum = 0.0;
+	//for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+	//    sum += WEIGTH[k] * DX1[k] * phi2[k];
+	//}
+	//return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX2_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0]));
+	//LBMReal sum = 0.0;
+	//for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+	//    sum += WEIGTH[k] * DX2[k] * phi2[k];
+	//}
+	//return 3.0 * sum;
+}
+
+LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX3_phi2()
+{
+	using namespace D3Q27System;
+	return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP])))
+		+ WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) +
+		+WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M]));
+	//LBMReal sum = 0.0;
+	//for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+	//    sum += WEIGTH[k] * DX3[k] * phi2[k];
+	//}
+	//return 3.0 * sum;
+}
+
+
+
+
+
+LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::nabla2_phi()
+{
+    using namespace D3Q27System;
+    LBMReal sum = 0.0;
+	sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000])))
+		+ (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000]))));
+	sum += WEIGTH[DIR_0PP] * (
+			(((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000])))
+		+	(((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000])))
+		+	(((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000])))
+		);
+	sum += WEIGTH[DIR_00P] * (
+			((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000]))
+		+	((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000]))
+		+	((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000]))
+		);
+    //for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+    //    sum += WEIGTH[k] * (phi[k] - phi[REST]);
+    //}
+    return 6.0 * sum;
+}
+
+void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::computePhasefield()
+{
+    using namespace D3Q27System;
+    SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions();
+
+    int minX1 = ghostLayerWidth;
+    int minX2 = ghostLayerWidth;
+    int minX3 = ghostLayerWidth;
+    int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth;
+    int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth;
+    int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth;
+
+    //------------- Computing the phase-field ------------------
+    for (int x3 = minX3; x3 < maxX3; x3++) {
+        for (int x2 = minX2; x2 < maxX2; x2++) {
+            for (int x1 = minX1; x1 < maxX1; x1++) {
+                // if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3))
+                {
+                    int x1p = x1 + 1;
+                    int x2p = x2 + 1;
+                    int x3p = x3 + 1;
+
+                    h[DIR_P00]   = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3);
+                    h[DIR_0P0]   = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3);
+                    h[DIR_00P]   = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3);
+                    h[DIR_PP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3);
+                    h[DIR_MP0]  = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3);
+                    h[DIR_P0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3);
+                    h[DIR_M0P]  = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3);
+                    h[DIR_0PP]  = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3);
+                    h[DIR_0MP]  = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3);
+                    h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3);
+                    h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3);
+                    h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3);
+                    h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+                    h[DIR_M00]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3);
+                    h[DIR_0M0]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3);
+                    h[DIR_00M]   = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p);
+                    h[DIR_MM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3);
+                    h[DIR_PM0]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3);
+                    h[DIR_M0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p);
+                    h[DIR_P0M]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p);
+                    h[DIR_0MM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p);
+                    h[DIR_0PM]  = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p);
+                    h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+                    h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p);
+                    h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p);
+                    h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+                    h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3);
+                }
+            }
+        }
+    }
+}
+
+void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+                                                int x3)
+{
+    using namespace D3Q27System;
+
+    SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+    phi[DIR_000] = (*ph)(x1, x2, x3);
+
+
+    for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+        if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+            phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+        } else {
+			phi[k] = 0.0;
+         }
+    }
+}
+
+void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2,
+	int x3)
+{
+	using namespace D3Q27System;
+
+	SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+	phi2[DIR_000] = (*ph)(x1, x2, x3);
+
+
+	for (int k = FSTARTDIR; k <= FENDDIR; k++) {
+
+		if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) {
+			phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]);
+		}
+		else {
+			phi2[k] = 0.0;
+		}
+	}
+}
+
+void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::swapDistributions()
+{
+    LBMKernel::swapDistributions();
+    dataSet->getHdistributions()->swap();
+	dataSet->getH2distributions()->swap();
+}
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..070aff23ff78d079d12806b529a750b007ae7137
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h
@@ -0,0 +1,119 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h
+//! \ingroup LBMKernel
+//! \author Hesameddin Safari
+//=======================================================================================
+
+#ifndef MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel_H
+#define MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel_H
+
+#include "LBMKernel.h"
+#include "BCProcessor.h"
+#include "D3Q27System.h"
+#include "basics/utilities/UbTiming.h"
+#include "basics/container/CbArray4D.h"
+#include "basics/container/CbArray3D.h"
+
+//! \brief  Multiphase Cascaded Cumulant LBM kernel. 
+//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model
+//! \author  H. Safari, K. Kutscher, M. Geier
+class MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel : public LBMKernel
+{
+public:
+   MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel();
+   virtual ~MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel(void) = default;
+   void calculate(int step) override;
+   SPtr<LBMKernel> clone() override;
+   void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+   void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho);
+   void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+   void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
+
+   ///refactor
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure;
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld;
+
+   double getCalculationTime() override { return .0; }
+protected:
+   virtual void initDataSet();
+   void swapDistributions() override;
+   LBMReal f1[D3Q27System::ENDF+1];
+
+   CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF;
+   CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF;
+   CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsF;
+
+   CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1;
+   CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1;
+   CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsH1;
+
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH2;
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH2;
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH2;
+
+   //CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   phaseField;
+
+
+   LBMReal h  [D3Q27System::ENDF+1];
+   LBMReal h2[D3Q27System::ENDF + 1];
+   LBMReal g  [D3Q27System::ENDF+1];
+   LBMReal phi[D3Q27System::ENDF+1];
+   LBMReal phi2[D3Q27System::ENDF + 1];
+   LBMReal pr1[D3Q27System::ENDF+1];
+   LBMReal phi_cutoff[D3Q27System::ENDF+1];
+
+   LBMReal gradX1_phi();
+   LBMReal gradX2_phi();
+   LBMReal gradX3_phi();
+   LBMReal gradX1_phi2();
+   LBMReal gradX2_phi2();
+   LBMReal gradX3_phi2();
+   //LBMReal gradX1_pr1();
+   //LBMReal gradX2_pr1();
+   //LBMReal gradX3_pr1();
+   //LBMReal dirgradC_phi(int n, int k);
+   void computePhasefield();
+   void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3);
+   void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3);
+   //void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, int x1, int x2, int x3);
+   //void pressureFiltering(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf_filtered /*Pressure-Field*/);
+
+   LBMReal nabla2_phi();
+
+
+   mu::value_type muX1,muX2,muX3;
+   mu::value_type muDeltaT;
+   mu::value_type muNu;
+   LBMReal forcingX1;
+   LBMReal forcingX2;
+   LBMReal forcingX3;
+};
+
+#endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp
index 7ee35063f0cfeb9379313a38b9eeb6f0e6388d49..09cd40c8eceb10fa57ba136ea5f1439211f928ab 100644
--- a/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp
@@ -121,11 +121,11 @@ void RheologyInterpolationProcessor::calcMoments(const LBMReal* const f, LBMReal
 
    press = rho; //interpolate rho!
 
-   kxy   = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))-(vx1*vx2));// might not be optimal MG 25.2.13
-   kyz   = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))-(vx2*vx3));
-   kxz   = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))-(vx1*vx3));
-   kxxMyy = -3./2.*omega*((((f[D3Q27System::BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))-(vx1*vx1-vx2*vx2));
-   kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))-(vx1*vx1-vx3*vx3));
+   kxy   = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))-(vx1*vx2));// might not be optimal MG 25.2.13
+   kyz   = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))-(vx2*vx3));
+   kxz   = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))-(vx1*vx3));
+   kxxMyy = -3./2.*omega*((((f[D3Q27System::DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))-(vx1*vx1-vx2*vx2));
+   kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))-(vx1*vx1-vx3*vx3));
 }
 //////////////////////////////////////////////////////////////////////////
 void RheologyInterpolationProcessor::calcInterpolatedCoefficiets_intern(const D3Q27ICell& icell,
@@ -443,33 +443,33 @@ void RheologyInterpolationProcessor::calcInterpolatedNode(LBMReal* f, /*LBMReal
    LBMReal feq[ENDF+1];
    D3Q27System::calcIncompFeq(feq,rho,vx1,vx2,vx3);
 
-   f[E]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[E];
-   f[W]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[W];
-   f[N]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[N];
-   f[S]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[S];
-   f[T]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[T];
-   f[B]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[B];
-   f[NE]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[NE];
-   f[SW]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[SW];
-   f[SE]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[SE];
-   f[NW]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[NW];
-   f[TE]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[TE];
-   f[BW]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[BW];
-   f[BE]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[BE];
-   f[TW]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[TW];
-   f[TN]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[TN];
-   f[BS]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[BS];
-   f[BN]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[BN];
-   f[TS]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[TS];
-   f[TNE]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[TNE];
-   f[TSW]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[TSW];
-   f[TSE]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[TSE];
-   f[TNW]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[TNW];
-   f[BNE]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[BNE];
-   f[BSW]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[BSW];
-   f[BSE]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[BSE];
-   f[BNW]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[BNW];
-   f[REST] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO                                                 + feq[REST];
+   f[DIR_P00]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[DIR_P00];
+   f[DIR_M00]    = f_E    + xs*x_E    + ys*y_E    + zs*z_E    + xs*ys*xy_E    + xs*zs*xz_E    + ys*zs*yz_E    + feq[DIR_M00];
+   f[DIR_0P0]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[DIR_0P0];
+   f[DIR_0M0]    = f_N    + xs*x_N    + ys*y_N    + zs*z_N    + xs*ys*xy_N    + xs*zs*xz_N    + ys*zs*yz_N    + feq[DIR_0M0];
+   f[DIR_00P]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[DIR_00P];
+   f[DIR_00M]    = f_T    + xs*x_T    + ys*y_T    + zs*z_T    + xs*ys*xy_T    + xs*zs*xz_T    + ys*zs*yz_T    + feq[DIR_00M];
+   f[DIR_PP0]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[DIR_PP0];
+   f[DIR_MM0]   = f_NE   + xs*x_NE   + ys*y_NE   + zs*z_NE   + xs*ys*xy_NE   + xs*zs*xz_NE   + ys*zs*yz_NE   + feq[DIR_MM0];
+   f[DIR_PM0]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[DIR_PM0];
+   f[DIR_MP0]   = f_SE   + xs*x_SE   + ys*y_SE   + zs*z_SE   + xs*ys*xy_SE   + xs*zs*xz_SE   + ys*zs*yz_SE   + feq[DIR_MP0];
+   f[DIR_P0P]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[DIR_P0P];
+   f[DIR_M0M]   = f_TE   + xs*x_TE   + ys*y_TE   + zs*z_TE   + xs*ys*xy_TE   + xs*zs*xz_TE   + ys*zs*yz_TE   + feq[DIR_M0M];
+   f[DIR_P0M]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[DIR_P0M];
+   f[DIR_M0P]   = f_BE   + xs*x_BE   + ys*y_BE   + zs*z_BE   + xs*ys*xy_BE   + xs*zs*xz_BE   + ys*zs*yz_BE   + feq[DIR_M0P];
+   f[DIR_0PP]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[DIR_0PP];
+   f[DIR_0MM]   = f_TN   + xs*x_TN   + ys*y_TN   + zs*z_TN   + xs*ys*xy_TN   + xs*zs*xz_TN   + ys*zs*yz_TN   + feq[DIR_0MM];
+   f[DIR_0PM]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[DIR_0PM];
+   f[DIR_0MP]   = f_BN   + xs*x_BN   + ys*y_BN   + zs*z_BN   + xs*ys*xy_BN   + xs*zs*xz_BN   + ys*zs*yz_BN   + feq[DIR_0MP];
+   f[DIR_PPP]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[DIR_PPP];
+   f[DIR_MMP]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[DIR_MMP];
+   f[DIR_PMP]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[DIR_PMP];
+   f[DIR_MPP]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[DIR_MPP];
+   f[DIR_PPM]  = f_TSW  + xs*x_TSW  + ys*y_TSW  + zs*z_TSW  + xs*ys*xy_TSW  + xs*zs*xz_TSW  + ys*zs*yz_TSW  + feq[DIR_PPM];
+   f[DIR_MMM]  = f_TNE  + xs*x_TNE  + ys*y_TNE  + zs*z_TNE  + xs*ys*xy_TNE  + xs*zs*xz_TNE  + ys*zs*yz_TNE  + feq[DIR_MMM];
+   f[DIR_PMM]  = f_TNW  + xs*x_TNW  + ys*y_TNW  + zs*z_TNW  + xs*ys*xy_TNW  + xs*zs*xz_TNW  + ys*zs*yz_TNW  + feq[DIR_PMM];
+   f[DIR_MPM]  = f_TSE  + xs*x_TSE  + ys*y_TSE  + zs*z_TSE  + xs*ys*xy_TSE  + xs*zs*xz_TSE  + ys*zs*yz_TSE  + feq[DIR_MPM];
+   f[DIR_000] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO                                                 + feq[DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 //Position SWB -0.25, -0.25, -0.25
@@ -632,33 +632,33 @@ void RheologyInterpolationProcessor::calcInterpolatedNodeFC(LBMReal* f, LBMReal
    f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o));
    f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o));
 
-   f[E]    = f_E    + feq[E];
-   f[W]    = f_E    + feq[W];
-   f[N]    = f_N    + feq[N];
-   f[S]    = f_N    + feq[S];
-   f[T]    = f_T    + feq[T];
-   f[B]    = f_T    + feq[B];
-   f[NE]   = f_NE   + feq[NE];
-   f[SW]   = f_NE   + feq[SW];
-   f[SE]   = f_SE   + feq[SE];
-   f[NW]   = f_SE   + feq[NW];
-   f[TE]   = f_TE   + feq[TE];
-   f[BW]   = f_TE   + feq[BW];
-   f[BE]   = f_BE   + feq[BE];
-   f[TW]   = f_BE   + feq[TW];
-   f[TN]   = f_TN   + feq[TN];
-   f[BS]   = f_TN   + feq[BS];
-   f[BN]   = f_BN   + feq[BN];
-   f[TS]   = f_BN   + feq[TS];
-   f[TNE]  = f_TNE  + feq[TNE];
-   f[TNW]  = f_TNW  + feq[TNW];
-   f[TSE]  = f_TSE  + feq[TSE];
-   f[TSW]  = f_TSW  + feq[TSW];
-   f[BNE]  = f_TSW  + feq[BNE];
-   f[BNW]  = f_TSE  + feq[BNW];
-   f[BSE]  = f_TNW  + feq[BSE];
-   f[BSW]  = f_TNE  + feq[BSW];
-   f[REST] = f_ZERO + feq[REST];
+   f[DIR_P00]    = f_E    + feq[DIR_P00];
+   f[DIR_M00]    = f_E    + feq[DIR_M00];
+   f[DIR_0P0]    = f_N    + feq[DIR_0P0];
+   f[DIR_0M0]    = f_N    + feq[DIR_0M0];
+   f[DIR_00P]    = f_T    + feq[DIR_00P];
+   f[DIR_00M]    = f_T    + feq[DIR_00M];
+   f[DIR_PP0]   = f_NE   + feq[DIR_PP0];
+   f[DIR_MM0]   = f_NE   + feq[DIR_MM0];
+   f[DIR_PM0]   = f_SE   + feq[DIR_PM0];
+   f[DIR_MP0]   = f_SE   + feq[DIR_MP0];
+   f[DIR_P0P]   = f_TE   + feq[DIR_P0P];
+   f[DIR_M0M]   = f_TE   + feq[DIR_M0M];
+   f[DIR_P0M]   = f_BE   + feq[DIR_P0M];
+   f[DIR_M0P]   = f_BE   + feq[DIR_M0P];
+   f[DIR_0PP]   = f_TN   + feq[DIR_0PP];
+   f[DIR_0MM]   = f_TN   + feq[DIR_0MM];
+   f[DIR_0PM]   = f_BN   + feq[DIR_0PM];
+   f[DIR_0MP]   = f_BN   + feq[DIR_0MP];
+   f[DIR_PPP]  = f_TNE  + feq[DIR_PPP];
+   f[DIR_MPP]  = f_TNW  + feq[DIR_MPP];
+   f[DIR_PMP]  = f_TSE  + feq[DIR_PMP];
+   f[DIR_MMP]  = f_TSW  + feq[DIR_MMP];
+   f[DIR_PPM]  = f_TSW  + feq[DIR_PPM];
+   f[DIR_MPM]  = f_TSE  + feq[DIR_MPM];
+   f[DIR_PMM]  = f_TNW  + feq[DIR_PMM];
+   f[DIR_MMM]  = f_TNE  + feq[DIR_MMM];
+   f[DIR_000] = f_ZERO + feq[DIR_000];
 }
 //////////////////////////////////////////////////////////////////////////
 void RheologyInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3)
diff --git a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
index c8bd2d0797af86858b40a1a29a154107f04e46c8..74627f6181cd02002e2bc2c7a2d284ff288f3c59 100644
--- a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
+++ b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h
@@ -117,12 +117,7 @@ struct BoundaryCondition {
     float bcVelocityX2;
     float bcVelocityX3;
     float bcDensity;
-
-    float bcLodiDensity;
-    float bcLodiVelocityX1;
-    float bcLodiVelocityX2;
-    float bcLodiVelocityX3;
-    float bcLodiLentgh;
+    float bcPhaseField;
 
     float nx1, nx2, nx3;
     float q[26];
@@ -172,6 +167,7 @@ struct DSArraysPresence {
     bool isRelaxationFactorPresent;
     bool isPhaseField1Present;
     bool isPhaseField2Present;
+    bool isPressureFieldPresent;
 };
 } // namespace MPIIODataStructures
 #endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/Utilities/MemoryUtil.h b/src/cpu/VirtualFluidsCore/Utilities/MemoryUtil.h
index 670a597cb84bd4e98450dad2743a8100f04497ea..4c9f30a902196f8fef5187442f45b94dc64de283 100644
--- a/src/cpu/VirtualFluidsCore/Utilities/MemoryUtil.h
+++ b/src/cpu/VirtualFluidsCore/Utilities/MemoryUtil.h
@@ -60,6 +60,13 @@
 #if defined(__CYGWIN__)
 #define MEMORYUTIL_CYGWIN
 #endif
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+#include "Grid3D.h"
+
 //////////////////////////////////////////////////////////////////////////
 // MemoryUtil
 //////////////////////////////////////////////////////////////////////////
@@ -159,6 +166,43 @@ static long long getPhysMemUsedByMe()
 }
 //////////////////////////////////////////////////////////////////////////
 
+static std::string toString(SPtr<Grid3D> grid, int numberOfProcesses)
+{
+    unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
+    int ghostLayer = grid->getGhostLayerWidth()*2+1;
+    UbTupleInt3 blockNx = grid->getBlockNX();
+
+    unsigned long long numberOfNodesPerBlock = (unsigned long long)(val<1>(blockNx)) *
+                                               (unsigned long long)(val<2>(blockNx)) *
+                                               (unsigned long long)(val<3>(blockNx));
+    unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock;
+    unsigned long long numberOfNodesPerBlockWithGhostLayer = numberOfBlocks * (val<1>(blockNx) + ghostLayer) *
+                                                             (val<2>(blockNx) + ghostLayer) *
+                                                             (val<3>(blockNx) + ghostLayer);
+    double needMemAll = double(numberOfNodesPerBlockWithGhostLayer*(27*sizeof(double)+sizeof(int)+sizeof(float)*4));
+    double needMem = needMemAll / double(numberOfProcesses);
+    
+    std::ostringstream out;
+    out << "Grid information:" << std::endl;
+    out << "###################################################" << std::endl;
+    out << "# Number of blocks = " << numberOfBlocks << std::endl;
+    out << "# Number of nodes  = " << numberOfNodes << std::endl;
+    int minInitLevel = grid->getCoarsestInitializedLevel();
+    int maxInitLevel = grid->getFinestInitializedLevel();
+    for (int level = minInitLevel; level<=maxInitLevel; level++)
+    {
+        int nobl = grid->getNumberOfBlocks(level);
+        out << "# Number of blocks for level " << level << " = " << nobl << std::endl;
+        out << "# Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock << std::endl;
+    }
+    out << "# Necessary memory  = " << needMemAll << " bytes" << std::endl;
+    out << "# Necessary memory per process = " << needMem << " bytes" << std::endl;
+    out << "# Available memory per process = " << (double)getTotalPhysMem() << " bytes" << std::endl;
+    out << "###################################################" << std::endl;
+
+    return out.str();
+}
+
 } // namespace Utilities
 
 #endif
diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
index a6372fc31712899dab0b8edaf919a141663991ca..f5c87b9fc695d81ad492f89113f2d9e5c56fa9a7 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
@@ -39,7 +39,7 @@
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "BCAdapter.h"
 #include "Block3D.h"
 #include "BCArray3D.h"
@@ -52,7 +52,9 @@
 #include "ThixotropyVelocityWithDensityBCAlgorithm.h"
 
 
-BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) {}
+BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL)
+{
+}
 //////////////////////////////////////////////////////////////////////////
 BoundaryConditionsBlockVisitor::~BoundaryConditionsBlockVisitor() = default;
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp
index b222d2c67af03cae39a385c91f25b29962565c39..e26b59729594fc3175e523e25d23ce7adc56d74e 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp
@@ -4,11 +4,11 @@
 #include "Block3D.h"
 #include "BoundaryConditions.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMKernel.h"
 
 ChangeBoundaryDensityBlockVisitor::ChangeBoundaryDensityBlockVisitor(float oldBoundaryDensity, float newBoundaryDensity)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), oldBoundaryDensity(oldBoundaryDensity),
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), oldBoundaryDensity(oldBoundaryDensity),
       newBoundaryDensity(newBoundaryDensity)
 {
 }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/CheckRatioBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/CheckRatioBlockVisitor.cpp
index 1f8a9c30e1f7a98812a06716cb461ee0e7d41aba..d329763a43d6985b8930ec0e73b7a06b991801d0 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/CheckRatioBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/CheckRatioBlockVisitor.cpp
@@ -1,10 +1,10 @@
 #include "CheckRatioBlockVisitor.h"
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 
 CheckRatioBlockVisitor::CheckRatioBlockVisitor(int levelDepth /*shut be maxGridLevel*/, bool includeNotActiveBlocks)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks),
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks),
       state(true)
 {
 }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/GenBlocksGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/GenBlocksGridVisitor.cpp
index a8270d40d7b2e193024056551591f6b0f3464b5e..29ea3bfda98c2ce191d1f7c5bc20691049dc2a04 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/GenBlocksGridVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/GenBlocksGridVisitor.cpp
@@ -35,7 +35,7 @@
 #include "Block3D.h"
 #include "CoordinateTransformation3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 
 #include <geometry3d/GbObject3D.h>
 
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp
index aba67e6749a47e1c06bf28f01d284799eb39c328..0ba49c1a0683d052a07caae46410b5ea8c35aad7 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp
@@ -38,10 +38,10 @@
 #include "DataSet3D.h"
 #include "EsoTwist3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMKernel.h"
 
-InitDistributionsBlockVisitor::InitDistributionsBlockVisitor() : Block3DVisitor(0, Grid3DSystem::MAXLEVEL)
+InitDistributionsBlockVisitor::InitDistributionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL)
 {
     this->setVx1(0.0);
     this->setVx2(0.0);
@@ -247,33 +247,33 @@ void InitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D>
                double f_TNW  = - eps_new *((bz + cy)/(36.*o)) - f_TNE;
 
 
-               f[E]    = f_E    + feq[E];
-               f[W]    = f_E    + feq[W];
-               f[N]    = f_N    + feq[N];
-               f[S]    = f_N    + feq[S];
-               f[T]    = f_T    + feq[T];
-               f[B]    = f_T    + feq[B];
-               f[NE]   = f_NE   + feq[NE];
-               f[SW]   = f_NE   + feq[SW];
-               f[SE]   = f_SE   + feq[SE];
-               f[NW]   = f_SE   + feq[NW];
-               f[TE]   = f_TE   + feq[TE];
-               f[BW]   = f_TE   + feq[BW];
-               f[BE]   = f_BE   + feq[BE];
-               f[TW]   = f_BE   + feq[TW];
-               f[TN]   = f_TN   + feq[TN];
-               f[BS]   = f_TN   + feq[BS];
-               f[BN]   = f_BN   + feq[BN];
-               f[TS]   = f_BN   + feq[TS];
-               f[TNE]  = f_TNE  + feq[TNE];
-               f[TNW]  = f_TNW  + feq[TNW];
-               f[TSE]  = f_TSE  + feq[TSE];
-               f[TSW]  = f_TSW  + feq[TSW];
-               f[BNE]  = f_TSW  + feq[BNE];
-               f[BNW]  = f_TSE  + feq[BNW];
-               f[BSE]  = f_TNW  + feq[BSE];
-               f[BSW]  = f_TNE  + feq[BSW];
-               f[REST] = f_ZERO + feq[REST];
+               f[DIR_P00]    = f_E    + feq[DIR_P00];
+               f[DIR_M00]    = f_E    + feq[DIR_M00];
+               f[DIR_0P0]    = f_N    + feq[DIR_0P0];
+               f[DIR_0M0]    = f_N    + feq[DIR_0M0];
+               f[DIR_00P]    = f_T    + feq[DIR_00P];
+               f[DIR_00M]    = f_T    + feq[DIR_00M];
+               f[DIR_PP0]   = f_NE   + feq[DIR_PP0];
+               f[DIR_MM0]   = f_NE   + feq[DIR_MM0];
+               f[DIR_PM0]   = f_SE   + feq[DIR_PM0];
+               f[DIR_MP0]   = f_SE   + feq[DIR_MP0];
+               f[DIR_P0P]   = f_TE   + feq[DIR_P0P];
+               f[DIR_M0M]   = f_TE   + feq[DIR_M0M];
+               f[DIR_P0M]   = f_BE   + feq[DIR_P0M];
+               f[DIR_M0P]   = f_BE   + feq[DIR_M0P];
+               f[DIR_0PP]   = f_TN   + feq[DIR_0PP];
+               f[DIR_0MM]   = f_TN   + feq[DIR_0MM];
+               f[DIR_0PM]   = f_BN   + feq[DIR_0PM];
+               f[DIR_0MP]   = f_BN   + feq[DIR_0MP];
+               f[DIR_PPP]  = f_TNE  + feq[DIR_PPP];
+               f[DIR_MPP]  = f_TNW  + feq[DIR_MPP];
+               f[DIR_PMP]  = f_TSE  + feq[DIR_PMP];
+               f[DIR_MMP]  = f_TSW  + feq[DIR_MMP];
+               f[DIR_PPM]  = f_TSW  + feq[DIR_PPM];
+               f[DIR_MPM]  = f_TSE  + feq[DIR_MPM];
+               f[DIR_PMM]  = f_TNW  + feq[DIR_PMM];
+               f[DIR_MMM]  = f_TNE  + feq[DIR_MMM];
+               f[DIR_000] = f_ZERO + feq[DIR_000];
 
                //calcFeqsFct(f,rho,vx1,vx2,vx3);
                distributions->setDistribution(f, ix1, ix2, ix3);
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp
index b10151a9d2926546c2807db05912f79f6815bf86..1bcb6057f5b5987ced9adc17e7d6fabd262911e6 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp
@@ -5,14 +5,14 @@
 #include "DataSet3D.h"
 #include "EsoTwist3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "InitDensityLBMKernel.h"
 #include "LBMKernel.h"
 #include <basics/utilities/UbFileInputASCII.h>
 
 InitDistributionsFromFileBlockVisitor::InitDistributionsFromFileBlockVisitor(/*LBMReal nu, */ LBMReal rho,
                                                                              std::string filename)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), /*nu(nu),*/ rho(rho)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), /*nu(nu),*/ rho(rho)
 {
     UbFileInputASCII in(filename);
     if (!in) {
@@ -202,7 +202,7 @@ void InitDistributionsFromFileBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<
                     // f_TSW = -eps_new *((ay + bx) / (36.*o)) - f_TNE; double f_TSE = -eps_new *((az + cx) / (36.*o)) -
                     // f_TNE; double f_TNW = -eps_new *((bz + cy) / (36.*o)) - f_TNE;
 
-                    // f[E] = f_E + feq[E];
+                    // f[DIR_P00] = f_E + feq[DIR_P00];
                     // f[W] = f_E + feq[W];
                     // f[N] = f_N + feq[N];
                     // f[S] = f_N + feq[S];
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp
index 343353c7b7caf58269e1b25799dbbc730fc227b5..567ce2e7ff5b40f3c8042bd404394a3fbf9ffee4 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp
@@ -7,7 +7,7 @@
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "InterpolationProcessor.h"
 #include "LBMKernel.h"
 #include <CbArray2D.h>
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp
index f9be891771838940294a5e3b348a0b4d8c31f366..9c8c05babe4fc2d454908095e8a232eb14434df2 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp
@@ -34,7 +34,7 @@
 #include "InitThixotropyBlockVisitor.h"
 #include "LBMKernel.h"
 #include "BCProcessor.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "DataSet3D.h"
 #include "EsoTwist3D.h"
 #include "Grid3D.h"
@@ -42,7 +42,7 @@
 #include "BCArray3D.h"
 
 InitThixotropyBlockVisitor::InitThixotropyBlockVisitor()
-   : Block3DVisitor(0, Grid3DSystem::MAXLEVEL)
+   : Block3DVisitor(0, D3Q27System::MAXLEVEL)
 {
    //this->setVx1(0.0);
    //this->setVx2(0.0);
@@ -56,7 +56,7 @@ InitThixotropyBlockVisitor::InitThixotropyBlockVisitor()
 }
 //////////////////////////////////////////////////////////////////////////
 //InitThixotropyBlockVisitor::InitThixotropyBlockVisitor(LBMReal lambda /*LBMReal nu, LBMReal D, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3, LBMReal c, LBMReal f1, LBMReal f2, LBMReal f3*/)
-//	: Block3DVisitor(0, Grid3DSystem::MAXLEVEL)
+//	: Block3DVisitor(0, D3Q27System::MAXLEVEL)
 //{
 //	//this->setVx1(vx1);
 //	//this->setVx2(vx2);
@@ -426,7 +426,7 @@ void InitThixotropyBlockVisitor::checkFunction(mu::Parser fct)
 //   double f_TNW = -eps_new * ((bz + cy) / (36. * o)) - f_TNE;
 //
 //
-//   f[E] = f_E + feq[E];
+//   f[DIR_P00] = f_E + feq[DIR_P00];
 //   f[W] = f_E + feq[W];
 //   f[N] = f_N + feq[N];
 //   f[S] = f_N + feq[S];
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp
index 412e9347d707fe2e4ad733cf53419f18f86faf01..7546aa30721cac1655fba94cb3d68e98d1398546 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp
@@ -133,7 +133,7 @@ void MetisPartitioningGridVisitor::buildMetisGraphLevelIntersected(SPtr<Grid3D>
             // the weights of the vertices are 2^level of grid (1, 2, 4, 8 .....) 1<<level
             metis.vwgt.push_back((idx_t)(1 << block->getLevel()));
 
-            for (int dir = 0; dir <= numOfDirs; dir++) {
+            for (int dir = D3Q27System::DIR_P00; dir <= numOfDirs; dir++) {
                 SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, block);
                 if (neighBlock) {
                     if (this->getPartitionCondition(neighBlock, level)) {
@@ -200,7 +200,7 @@ void MetisPartitioningGridVisitor::buildMetisGraphLevelBased(SPtr<Grid3D> grid,
             metis.xadj.push_back(edges);
             metis.vwgt.push_back(vertexWeight);
 
-            for (int dir = 0; dir <= numOfDirs; dir++) {
+            for (int dir = D3Q27System::DIR_P00; dir <= numOfDirs; dir++) {
                 SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, block);
                 if (neighBlock) {
                     if (this->getPartitionCondition(neighBlock, level)) {
@@ -256,11 +256,11 @@ void MetisPartitioningGridVisitor::clear()
 int MetisPartitioningGridVisitor::getEdgeWeight(int dir)
 {
     using namespace D3Q27System;
-    if (dir <= B) {
+    if (dir <= DIR_00M) {
         return 100;
-    } else if (dir >= NE && dir <= TS) {
+    } else if (dir >= DIR_PP0 && dir <= DIR_0MP) {
         return 10;
-    } else if (dir >= TNE) {
+    } else if (dir >= DIR_PPP) {
         return 1;
     }
 
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
index 34dba741103d8160304507b5e68a311c5149ddbd..003d5d31204fafc82f78a0fddb04897c2c60e77f 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp
@@ -39,14 +39,14 @@
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "BCAdapter.h"
 #include "Block3D.h"
 #include "BCArray3D.h"
 #include "LBMKernel.h"
 
 MultiphaseBoundaryConditionsBlockVisitor::MultiphaseBoundaryConditionsBlockVisitor() :
-Block3DVisitor(0, Grid3DSystem::MAXLEVEL)
+Block3DVisitor(0, D3Q27System::MAXLEVEL)
 {
 
 }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp
index 4213e2b79a83107a8a545e5daa3001c5a86af35d..a35fc289b7505c722151e2a5afe98815131a989d 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp
@@ -38,11 +38,11 @@
 #include "DataSet3D.h"
 #include "EsoTwist3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMKernel.h"
 
 MultiphaseInitDistributionsBlockVisitor::MultiphaseInitDistributionsBlockVisitor() 
-	: Block3DVisitor(0, Grid3DSystem::MAXLEVEL)
+	: Block3DVisitor(0, D3Q27System::MAXLEVEL)
 {
 	this->setVx1(0.0);
 	this->setVx2(0.0);
@@ -50,16 +50,13 @@ MultiphaseInitDistributionsBlockVisitor::MultiphaseInitDistributionsBlockVisitor
 	this->setRho(0.0);
 }
 //////////////////////////////////////////////////////////////////////////
-MultiphaseInitDistributionsBlockVisitor::MultiphaseInitDistributionsBlockVisitor( LBMReal densityRatio, LBMReal intThickness, LBMReal radius, LBMReal vx1, LBMReal vx2, LBMReal vx3)
-	: Block3DVisitor(0, Grid3DSystem::MAXLEVEL), densityRatio(densityRatio) /*, intThickness(intThickness), radius(radius) */
+MultiphaseInitDistributionsBlockVisitor::MultiphaseInitDistributionsBlockVisitor( LBMReal densityRatio, LBMReal vx1, LBMReal vx2, LBMReal vx3, LBMReal rho)
+	: Block3DVisitor(0, D3Q27System::MAXLEVEL), densityRatio(densityRatio) 
 {
-    (void) intThickness;
-    (void) radius;
-
 	this->setVx1(vx1);
 	this->setVx2(vx2);
 	this->setVx3(vx3);
-}
+	this->setRho(rho);}
 //////////////////////////////////////////////////////////////////////////
 void MultiphaseInitDistributionsBlockVisitor::setVx1( const mu::Parser& parser)  
 { 
@@ -165,7 +162,7 @@ void MultiphaseInitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPt
 	this->muRho.DefineVar("x1",&x1); this->muRho.DefineVar("x2",&x2); this->muRho.DefineVar("x3",&x3);
 	this->muPhi.DefineVar("x1",&x1); this->muPhi.DefineVar("x2",&x2); this->muPhi.DefineVar("x3",&x3);
 
-	LBMReal vx1, vx2, vx3, rho, p1, phi;
+	LBMReal vx1, vx2, vx3, rho, /*p1,*/ phi;
 
 	int gridRank = grid->getRank();
 	int blockRank = block->getRank();
@@ -196,7 +193,7 @@ void MultiphaseInitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPt
                     x3              = coords[2];
 
 					
-					p1  = 0.0;
+					//p1  = 0.0;
 					//p1 = muRho.Eval();
 					vx1 = muVx1.Eval();
 					vx2 = muVx2.Eval();
@@ -223,74 +220,105 @@ void MultiphaseInitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPt
 						LBMReal gamma = WEIGTH[dir]*(3*velProd + 4.5*velSq1 - 1.5*(vx1Sq+vx2Sq+vx3Sq));
 
 						feq[dir] = rho*WEIGTH[dir]*(1 + 3*velProd + 4.5*velSq1 - 1.5*(vx1Sq+vx2Sq+vx3Sq));
-						//geq[dir] = p1*WEIGTH1[dir] + gamma;
-						geq[dir] = p1*WEIGTH[dir]/(rho*UbMath::c1o3) + gamma;
+						//geq[dir] = p1*WEIGTH[dir] + gamma;
+						//geq[dir] = p1*WEIGTH[dir]/(rho*UbMath::c1o3) + gamma*rho;
+						//geq[dir] = (p1*WEIGTH[dir]/(rho*UbMath::c1o3) + gamma*rho)*UbMath::c1o3;
+						geq[dir] = (gamma*rho)*UbMath::c1o3;
 					}
 
 
-					f[E]    =  geq[E]    ;
-					f[W]    =  geq[W]    ;
-					f[N]    =  geq[N]    ;
-					f[S]    =  geq[S]    ;
-					f[T]    =  geq[T]    ;
-					f[B]    =  geq[B]    ;
-					f[NE]   =  geq[NE]   ;
-					f[SW]   =  geq[SW]   ;
-					f[SE]   =  geq[SE]   ;
-					f[NW]   =  geq[NW]   ;
-					f[TE]   =  geq[TE]   ;
-					f[BW]   =  geq[BW]   ;
-					f[BE]   =  geq[BE]   ;
-					f[TW]   =  geq[TW]   ;
-					f[TN]   =  geq[TN]   ;
-					f[BS]   =  geq[BS]   ;
-					f[BN]   =  geq[BN]   ;
-					f[TS]   =  geq[TS]   ;
-					f[TNE]  =  geq[TNE]  ;
-					f[TNW]  =  geq[TNW]  ;
-					f[TSE]  =  geq[TSE]  ;
-					f[TSW]  =  geq[TSW]  ;
-					f[BNE]  =  geq[BNE]  ;
-					f[BNW]  =  geq[BNW]  ;
-					f[BSE]  =  geq[BSE]  ;
-					f[BSW]  =  geq[BSW]  ;
-					f[REST] =  geq[REST] ;
+					f[DIR_P00]    =  geq[DIR_P00]    ;
+					f[DIR_M00]    =  geq[DIR_M00]    ;
+					f[DIR_0P0]    =  geq[DIR_0P0]    ;
+					f[DIR_0M0]    =  geq[DIR_0M0]    ;
+					f[DIR_00P]    =  geq[DIR_00P]    ;
+					f[DIR_00M]    =  geq[DIR_00M]    ;
+					f[DIR_PP0]   =  geq[DIR_PP0]   ;
+					f[DIR_MM0]   =  geq[DIR_MM0]   ;
+					f[DIR_PM0]   =  geq[DIR_PM0]   ;
+					f[DIR_MP0]   =  geq[DIR_MP0]   ;
+					f[DIR_P0P]   =  geq[DIR_P0P]   ;
+					f[DIR_M0M]   =  geq[DIR_M0M]   ;
+					f[DIR_P0M]   =  geq[DIR_P0M]   ;
+					f[DIR_M0P]   =  geq[DIR_M0P]   ;
+					f[DIR_0PP]   =  geq[DIR_0PP]   ;
+					f[DIR_0MM]   =  geq[DIR_0MM]   ;
+					f[DIR_0PM]   =  geq[DIR_0PM]   ;
+					f[DIR_0MP]   =  geq[DIR_0MP]   ;
+					f[DIR_PPP]  =  geq[DIR_PPP]  ;
+					f[DIR_MPP]  =  geq[DIR_MPP]  ;
+					f[DIR_PMP]  =  geq[DIR_PMP]  ;
+					f[DIR_MMP]  =  geq[DIR_MMP]  ;
+					f[DIR_PPM]  =  geq[DIR_PPM]  ;
+					f[DIR_MPM]  =  geq[DIR_MPM]  ;
+					f[DIR_PMM]  =  geq[DIR_PMM]  ;
+					f[DIR_MMM]  =  geq[DIR_MMM]  ;
+					f[DIR_000] =  geq[DIR_000] ;
 
 					distributionsF->setDistribution(f, ix1, ix2, ix3);
 					distributionsF->setDistributionInv(f, ix1, ix2, ix3);
 
-					f[E]    =  phi * feq[E]    / rho;
-					f[W]    =  phi * feq[W]    / rho;
-					f[N]    =  phi * feq[N]    / rho;
-					f[S]    =  phi * feq[S]    / rho;
-					f[T]    =  phi * feq[T]    / rho;
-					f[B]    =  phi * feq[B]    / rho;
-					f[NE]   =  phi * feq[NE]   / rho;
-					f[SW]   =  phi * feq[SW]   / rho;
-					f[SE]   =  phi * feq[SE]   / rho;
-					f[NW]   =  phi * feq[NW]   / rho;
-					f[TE]   =  phi * feq[TE]   / rho;
-					f[BW]   =  phi * feq[BW]   / rho;
-					f[BE]   =  phi * feq[BE]   / rho;
-					f[TW]   =  phi * feq[TW]   / rho;
-					f[TN]   =  phi * feq[TN]   / rho;
-					f[BS]   =  phi * feq[BS]   / rho;
-					f[BN]   =  phi * feq[BN]   / rho;
-					f[TS]   =  phi * feq[TS]   / rho;
-					f[TNE]  =  phi * feq[TNE]  / rho;
-					f[TNW]  =  phi * feq[TNW]  / rho;
-					f[TSE]  =  phi * feq[TSE]  / rho;
-					f[TSW]  =  phi * feq[TSW]  / rho;
-					f[BNE]  =  phi * feq[BNE]  / rho;
-					f[BNW]  =  phi * feq[BNW]  / rho;
-					f[BSE]  =  phi * feq[BSE]  / rho;
-					f[BSW]  =  phi * feq[BSW]  / rho;
-					f[REST] =  phi * feq[REST] / rho;
+					f[DIR_P00]    =  phi * feq[DIR_P00]    / rho;
+					f[DIR_M00]    =  phi * feq[DIR_M00]    / rho;
+					f[DIR_0P0]    =  phi * feq[DIR_0P0]    / rho;
+					f[DIR_0M0]    =  phi * feq[DIR_0M0]    / rho;
+					f[DIR_00P]    =  phi * feq[DIR_00P]    / rho;
+					f[DIR_00M]    =  phi * feq[DIR_00M]    / rho;
+					f[DIR_PP0]   =  phi * feq[DIR_PP0]   / rho;
+					f[DIR_MM0]   =  phi * feq[DIR_MM0]   / rho;
+					f[DIR_PM0]   =  phi * feq[DIR_PM0]   / rho;
+					f[DIR_MP0]   =  phi * feq[DIR_MP0]   / rho;
+					f[DIR_P0P]   =  phi * feq[DIR_P0P]   / rho;
+					f[DIR_M0M]   =  phi * feq[DIR_M0M]   / rho;
+					f[DIR_P0M]   =  phi * feq[DIR_P0M]   / rho;
+					f[DIR_M0P]   =  phi * feq[DIR_M0P]   / rho;
+					f[DIR_0PP]   =  phi * feq[DIR_0PP]   / rho;
+					f[DIR_0MM]   =  phi * feq[DIR_0MM]   / rho;
+					f[DIR_0PM]   =  phi * feq[DIR_0PM]   / rho;
+					f[DIR_0MP]   =  phi * feq[DIR_0MP]   / rho;
+					f[DIR_PPP]  =  phi * feq[DIR_PPP]  / rho;
+					f[DIR_MPP]  =  phi * feq[DIR_MPP]  / rho;
+					f[DIR_PMP]  =  phi * feq[DIR_PMP]  / rho;
+					f[DIR_MMP]  =  phi * feq[DIR_MMP]  / rho;
+					f[DIR_PPM]  =  phi * feq[DIR_PPM]  / rho;
+					f[DIR_MPM]  =  phi * feq[DIR_MPM]  / rho;
+					f[DIR_PMM]  =  phi * feq[DIR_PMM]  / rho;
+					f[DIR_MMM]  =  phi * feq[DIR_MMM]  / rho;
+					f[DIR_000] =  phi * feq[DIR_000] / rho;
 
 					distributionsH->setDistribution(f, ix1, ix2, ix3);
 					distributionsH->setDistributionInv(f, ix1, ix2, ix3);
 
 					if (distributionsH2) {
+
+						f[DIR_P00]    = (1.-phi) * feq[DIR_P00] / rho;
+						f[DIR_M00]    = (1.-phi) * feq[DIR_M00] / rho;
+						f[DIR_0P0]    = (1.-phi) * feq[DIR_0P0] / rho;
+						f[DIR_0M0]    = (1.-phi) * feq[DIR_0M0] / rho;
+						f[DIR_00P]    = (1.-phi) * feq[DIR_00P] / rho;
+						f[DIR_00M]    = (1.-phi) * feq[DIR_00M] / rho;
+						f[DIR_PP0]   = (1.-phi) * feq[DIR_PP0] / rho;
+						f[DIR_MM0]   = (1.-phi) * feq[DIR_MM0] / rho;
+						f[DIR_PM0]   = (1.-phi) * feq[DIR_PM0] / rho;
+						f[DIR_MP0]   = (1.-phi) * feq[DIR_MP0] / rho;
+						f[DIR_P0P]   = (1.-phi) * feq[DIR_P0P] / rho;
+						f[DIR_M0M]   = (1.-phi) * feq[DIR_M0M] / rho;
+						f[DIR_P0M]   = (1.-phi) * feq[DIR_P0M] / rho;
+						f[DIR_M0P]   = (1.-phi) * feq[DIR_M0P] / rho;
+						f[DIR_0PP]   = (1.-phi) * feq[DIR_0PP] / rho;
+						f[DIR_0MM]   = (1.-phi) * feq[DIR_0MM] / rho;
+						f[DIR_0PM]   = (1.-phi) * feq[DIR_0PM] / rho;
+						f[DIR_0MP]   = (1.-phi) * feq[DIR_0MP] / rho;
+						f[DIR_PPP]  = (1.-phi) * feq[DIR_PPP] / rho;
+						f[DIR_MPP]  = (1.-phi) * feq[DIR_MPP] / rho;
+						f[DIR_PMP]  = (1.-phi) * feq[DIR_PMP] / rho;
+						f[DIR_MMP]  = (1.-phi) * feq[DIR_MMP] / rho;
+						f[DIR_PPM]  = (1.-phi) * feq[DIR_PPM] / rho;
+						f[DIR_MPM]  = (1.-phi) * feq[DIR_MPM] / rho;
+						f[DIR_PMM]  = (1.-phi) * feq[DIR_PMM] / rho;
+						f[DIR_MMM]  = (1.-phi) * feq[DIR_MMM] / rho;
+						f[DIR_000] = (1.-phi) * feq[DIR_000] / rho;
+
                         distributionsH2->setDistribution(f, ix1, ix2, ix3);
                         distributionsH2->setDistributionInv(f, ix1, ix2, ix3);                    
 					}
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h
index f94167040ad2f1f8b3cdb1f1e1d4f970d80c8877..6ff60387daeef966da6143ef459fa7b7d247fbd5 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h
@@ -56,7 +56,7 @@ public:
 	//! \param vx1 - velocity in x
 	//! \param vx2 - velocity in y
 	//! \param vx3 - velocity in z
-	MultiphaseInitDistributionsBlockVisitor( LBMReal densityRatio, LBMReal intThickness, LBMReal radius, LBMReal vx1=0.0, LBMReal vx2=0.0, LBMReal vx3=0.0);
+	MultiphaseInitDistributionsBlockVisitor( LBMReal densityRatio, LBMReal vx1=0.0, LBMReal vx2=0.0, LBMReal vx3=0.0, LBMReal rho=0.0);
 	//////////////////////////////////////////////////////////////////////////
 	//automatic vars are: x1,x2, x3
 	//ussage example: setVx1("x1*0.01+x2*0.003")
@@ -95,8 +95,6 @@ private:
 
 	LBMReal nu;
 	LBMReal densityRatio;
-	//LBMReal intThickness;
-	//LBMReal radius;
 };
 
 #endif //D3Q27INITDISTRIBUTIONSPATCHVISITOR_H
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp
index 733c7177dd7624ac78c6a8d30681f20cdedb456b..4990690e2d7d464cfbdc69f2966655568021e7d0 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp
@@ -1,17 +1,17 @@
 #include "MultiphaseSetKernelBlockVisitor.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMSystem.h"
 #include "Block3D.h"
 #include "Grid3D.h"
 
 //SetKernelBlockVisitor::SetKernelBlockVisitor(LBMKernel3DPtr kernel, LBMReal nue) : 
-//                        Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(kernel), nue(nue)
+//                        Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(kernel), nue(nue)
 //{
 //
 //}
 //////////////////////////////////////////////////////////////////////////
 //SetKernelBlockVisitor::SetKernelBlockVisitor( LBMKernel3DPtr kernel, LBMReal nue, double availMem, double needMem ) : 
-//                                              Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(kernel), nue(nue)
+//                                              Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(kernel), nue(nue)
 //{
 //   if (needMem > availMem)
 //   {
@@ -19,9 +19,8 @@
 //   }
 //}
 //////////////////////////////////////////////////////////////////////////
-MultiphaseSetKernelBlockVisitor::MultiphaseSetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nuL, LBMReal nuG, LBMReal densityRatio, LBMReal beta, LBMReal kappa,
-	LBMReal contactAngle, double availMem, double needMem, MultiphaseSetKernelBlockVisitor::Action action /*= SetKernelBlockVisitor::New*/) :
-	Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(kernel), nuL(nuL), nuG(nuG), densityRatio(densityRatio), beta(beta), kappa(kappa), contactAngle(contactAngle), action(action), dataSetFlag(true)
+MultiphaseSetKernelBlockVisitor::MultiphaseSetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nuL, LBMReal nuG, double availMem, double needMem, MultiphaseSetKernelBlockVisitor::Action action /*= SetKernelBlockVisitor::New*/) :
+	Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(kernel), nuL(nuL), nuG(nuG), action(action), dataSetFlag(true)
 {
 	if (needMem > availMem)
 	{
@@ -35,11 +34,7 @@ void MultiphaseSetKernelBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> blo
 	{
 		LBMReal collFactorL = LBMSystem::calcCollisionFactor(nuL, block->getLevel());
 		LBMReal collFactorG = LBMSystem::calcCollisionFactor(nuG, block->getLevel());
-
 		kernel->setCollisionFactorMultiphase(collFactorL, collFactorG);
-		kernel->setDensityRatio(densityRatio);
-		kernel->setMultiphaseModelParameters(beta, kappa);
-		kernel->setContactAngle(contactAngle);
 
 		kernel->setIndex(block->getX1(), block->getX2(), block->getX3());
 		kernel->setDeltaT(LBMSystem::getDeltaT(block->getLevel()));
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h
index 9f952e2dddaf67fed5fa10cd8874938e584b5114..24d2b35c3a85b80e793b94d61feceb58b607ff19 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h
@@ -42,11 +42,7 @@ class MultiphaseSetKernelBlockVisitor : public Block3DVisitor
 public:
 	enum Action { NewKernel, ChangeKernel, ChangeKernelWithData};
 public:
-	//SetKernelBlockVisitor(LBMKernel3DPtr kernel, LBMReal nue);
-
-	//SetKernelBlockVisitor(LBMKernel3DPtr kernel, LBMReal nue, double availMem, double needMem);
-
-	MultiphaseSetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nuL, LBMReal nuG, LBMReal densityRatio, LBMReal beta, LBMReal kappa, LBMReal contactAngle, double availMem, double needMem, 
+	MultiphaseSetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nuL, LBMReal nuG, double availMem, double needMem, 
 		MultiphaseSetKernelBlockVisitor::Action action = MultiphaseSetKernelBlockVisitor::NewKernel);
 
 	virtual ~MultiphaseSetKernelBlockVisitor() {}
@@ -59,10 +55,6 @@ private:
 	SPtr<LBMKernel> kernel;
 	LBMReal nuL;
 	LBMReal nuG;
-	LBMReal densityRatio;
-	LBMReal beta;
-	LBMReal kappa;
-	LBMReal contactAngle;
 	Action action;
 	bool dataSetFlag;
 };
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..28b035f71f7ab83f4ef33188e0d265588835d0eb
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp
@@ -0,0 +1,377 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp
+//! \ingroup Visitors
+//! \author Hesameddin Safari
+//=======================================================================================
+
+#include "MultiphaseVelocityFormInitDistributionsBlockVisitor.h"
+#include "BCArray3D.h"
+#include "BCProcessor.h"
+#include "Block3D.h"
+#include "DataSet3D.h"
+#include "EsoTwist3D.h"
+#include "Grid3D.h"
+#include "D3Q27System.h"
+#include "LBMKernel.h"
+
+MultiphaseVelocityFormInitDistributionsBlockVisitor::MultiphaseVelocityFormInitDistributionsBlockVisitor() 
+	: Block3DVisitor(0, D3Q27System::MAXLEVEL)
+{
+	this->setVx1(0.0);
+	this->setVx2(0.0);
+	this->setVx3(0.0);
+	this->setRho(0.0);
+	this->setPressure(0.0);
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx1( const mu::Parser& parser)  
+{ 
+	this->checkFunction(parser); 
+	this->muVx1 = parser;  
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx2( const mu::Parser& parser)
+{ 
+	this->checkFunction(parser); 
+	this->muVx2 = parser;  
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx3( const mu::Parser& parser)  
+{ 
+	this->checkFunction(parser); 
+	this->muVx3 = parser;  
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setRho( const mu::Parser& parser)  
+{ 
+	this->checkFunction(parser); 
+	this->muRho = parser;  
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPhi( const mu::Parser& parser)  
+{ 
+	this->checkFunction(parser); 
+	this->muPhi = parser;  
+}
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPressure(const mu::Parser& parser)
+{
+	this->checkFunction(parser);
+	this->muPressure = parser;
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx1( const std::string& muParserString)  
+{ 
+	this->muVx1.SetExpr(muParserString); 
+	this->checkFunction(muVx1); 
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx2( const std::string& muParserString) 
+{ 
+	this->muVx2.SetExpr(muParserString); 
+	this->checkFunction(muVx2); 
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx3( const std::string& muParserString)  
+{ 
+	this->muVx3.SetExpr(muParserString); 
+	this->checkFunction(muVx3); 
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setRho( const std::string& muParserString)  
+{ 
+	this->muRho.SetExpr(muParserString); 
+	this->checkFunction(muRho); 
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPhi( const std::string& muParserString)  
+{ 
+	this->muPhi.SetExpr(muParserString); 
+	this->checkFunction(muPhi); 
+}
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPressure(const std::string& muParserString)
+{
+	this->muPressure.SetExpr(muParserString);
+	this->checkFunction(muPressure);
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx1( LBMReal vx1 ) 
+{ 
+	this->muVx1.SetExpr( UbSystem::toString(vx1,D3Q27RealLim::digits10) );  
+	this->checkFunction(muVx1); 
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx2( LBMReal vx2 ) 
+{ 
+	this->muVx2.SetExpr( UbSystem::toString(vx2,D3Q27RealLim::digits10) );  
+	this->checkFunction(muVx2); 
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx3( LBMReal vx3 ) 
+{ 
+	this->muVx3.SetExpr( UbSystem::toString(vx3,D3Q27RealLim::digits10) );  
+	this->checkFunction(muVx3); 
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setRho( LBMReal rho ) 
+{ 
+	this->muRho.SetExpr( UbSystem::toString(rho,D3Q27RealLim::digits10) );  
+	this->checkFunction(muRho); 
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPhi( LBMReal phi ) 
+{ 
+	this->muPhi.SetExpr( UbSystem::toString(phi,D3Q27RealLim::digits10) );  
+	this->checkFunction(muPhi); 
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D> block) 
+{
+	using namespace D3Q27System;
+
+	if(!block) UB_THROW( UbException(UB_EXARGS,"block is not exist") );
+
+	//define vars for functions
+	mu::value_type x1,x2,x3;
+	this->muVx1.DefineVar("x1",&x1); this->muVx1.DefineVar("x2",&x2); this->muVx1.DefineVar("x3",&x3);
+	this->muVx2.DefineVar("x1",&x1); this->muVx2.DefineVar("x2",&x2); this->muVx2.DefineVar("x3",&x3);
+	this->muVx3.DefineVar("x1",&x1); this->muVx3.DefineVar("x2",&x2); this->muVx3.DefineVar("x3",&x3);
+	this->muRho.DefineVar("x1",&x1); this->muRho.DefineVar("x2",&x2); this->muRho.DefineVar("x3",&x3);
+	this->muPhi.DefineVar("x1",&x1); this->muPhi.DefineVar("x2",&x2); this->muPhi.DefineVar("x3",&x3);
+	this->muPressure.DefineVar("x1", &x1); this->muPressure.DefineVar("x2", &x2); this->muPressure.DefineVar("x3", &x3);
+
+	
+
+	int gridRank = grid->getRank();
+	int blockRank = block->getRank();
+
+	if (blockRank == gridRank && block->isActive())
+	{
+        SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel());
+		if (!kernel)
+			throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: "+block->toString());
+
+		SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+        SPtr<EsoTwist3D> distributionsF = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getFdistributions()); 
+		SPtr<EsoTwist3D> distributionsH = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getHdistributions());
+        SPtr<EsoTwist3D> distributionsH2 = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getH2distributions());
+		SPtr<PhaseFieldArray3D> pressure = dynamicPointerCast<PhaseFieldArray3D>(kernel->getDataSet()->getPressureField());
+
+
+		//LBMReal phiL = kernel->getPhiL();
+		//LBMReal phiH = kernel->getPhiH();
+
+		LBMReal f[D3Q27System::ENDF+1];
+
+		for(int ix3=0; ix3<(int)bcArray->getNX3(); ix3++)
+            for (int ix2 = 0; ix2 < (int)bcArray->getNX2(); ix2++)
+                for (int ix1 = 0; ix1 < (int)bcArray->getNX1(); ix1++)
+				{
+					Vector3D coords = grid->getNodeCoordinates(block, ix1, ix2, ix3);
+                    x1              = coords[0];
+                    x2              = coords[1];
+                    x3              = coords[2];
+
+					LBMReal vx1 = 0, vx2 = 0, vx3 = 0, p1 = 0, phi = 0,pres=0;
+					//p1  = 0.0;
+					p1 = muRho.Eval();
+					vx1 = muVx1.Eval();
+					vx2 = muVx2.Eval();
+					vx3 = muVx3.Eval();
+					phi = muPhi.Eval();
+					pres = muPressure.Eval();
+					(*pressure)(ix1, ix2, ix3) = pres;
+
+					
+					//rho = phi*1.0 + (1.0-phi)/densityRatio;
+					//LBMReal rhoH = 1.0;
+					//LBMReal rhoL = 1.0/densityRatio;
+					//LBMReal rho = rhoH + (rhoH - rhoL)*(phi - phiH)/(phiH - phiL);
+
+			
+					LBMReal feq[27];
+					LBMReal geq[27];
+
+					//calcFeqsFct(feq,rho,vx1,vx2,vx3);
+					LBMReal vx1Sq = vx1*vx1;
+					LBMReal vx2Sq = vx2*vx2;
+					LBMReal vx3Sq = vx3*vx3;
+					for (int dir = STARTF; dir < (ENDF+1); dir++)
+					{
+						LBMReal velProd = DX1[dir]*vx1 + DX2[dir]*vx2 + DX3[dir]*vx3;
+						LBMReal velSq1 = velProd*velProd;
+						LBMReal gamma = WEIGTH[dir]*(3*velProd + 4.5*velSq1 - 1.5*(vx1Sq+vx2Sq+vx3Sq));
+
+						//feq[dir] = rho*WEIGTH[dir]*(1 + 3*velProd + 4.5*velSq1 - 1.5*(vx1Sq+vx2Sq+vx3Sq));
+						feq[dir] =  WEIGTH[dir] * (1 + 3 * velProd + 4.5 * velSq1 - 1.5 * (vx1Sq + vx2Sq + vx3Sq));
+						//geq[dir] = p1*WEIGTH1[dir] + gamma;
+						//geq[dir] = p1*WEIGTH[dir]/(rho*UbMath::c1o3) + gamma*rho;
+						geq[dir] = p1 * WEIGTH[dir] / ( UbMath::c1o3) + gamma ;
+					}
+
+
+					f[DIR_P00]    =  geq[DIR_P00]    ;
+					f[DIR_00M]    =  geq[DIR_00M]    ;
+					f[DIR_0P0]    =  geq[DIR_0P0]    ;
+					f[DIR_0M0]    =  geq[DIR_0M0]    ;
+					f[DIR_00P]    =  geq[DIR_00P]    ;
+					f[DIR_00M]    =  geq[DIR_00M]    ;
+					f[DIR_PP0]   =  geq[DIR_PP0]   ;
+					f[DIR_MM0]   =  geq[DIR_MM0]   ;
+					f[DIR_PM0]   =  geq[DIR_PM0]   ;
+					f[DIR_MP0]   =  geq[DIR_MP0]   ;
+					f[DIR_P0P]   =  geq[DIR_P0P]   ;
+					f[DIR_M0M]   =  geq[DIR_M0M]   ;
+					f[DIR_P0M]   =  geq[DIR_P0M]   ;
+					f[DIR_M0P]   =  geq[DIR_M0P]   ;
+					f[DIR_0PP]   =  geq[DIR_0PP]   ;
+					f[DIR_0MM]   =  geq[DIR_0MM]   ;
+					f[DIR_0PM]   =  geq[DIR_0PM]   ;
+					f[DIR_0MP]   =  geq[DIR_0MP]   ;
+					f[DIR_PPP]  =  geq[DIR_PPP]  ;
+					f[DIR_MPP]  =  geq[DIR_MPP]  ;
+					f[DIR_PMP]  =  geq[DIR_PMP]  ;
+					f[DIR_MMP]  =  geq[DIR_MMP]  ;
+					f[DIR_PPM]  =  geq[DIR_PPM]  ;
+					f[DIR_MPM]  =  geq[DIR_MPM]  ;
+					f[DIR_PMM]  =  geq[DIR_PMM]  ;
+					f[DIR_MMM]  =  geq[DIR_MMM]  ;
+					f[DIR_000] =  geq[DIR_000] ;
+
+					distributionsF->setDistribution(f, ix1, ix2, ix3);
+					distributionsF->setDistributionInv(f, ix1, ix2, ix3);
+
+					f[DIR_000] = phi * feq[DIR_000];        // / rho;
+					f[DIR_P00] = phi * feq[DIR_P00]    ;// / rho;
+					f[DIR_M00] = phi * feq[DIR_M00]    ;// / rho;
+					f[DIR_0P0] = phi * feq[DIR_0P0]    ;// / rho;
+					f[DIR_0M0] = phi * feq[DIR_0M0]    ;// / rho;
+					f[DIR_00P] = phi * feq[DIR_00P]    ;// / rho;
+					f[DIR_00M] = phi * feq[DIR_00M]    ;// / rho;
+					f[DIR_PP0] = phi * feq[DIR_PP0]   ;// / rho;
+					f[DIR_MM0] = phi * feq[DIR_MM0]   ;// / rho;
+					f[DIR_PM0] = phi * feq[DIR_PM0]   ;// / rho;
+					f[DIR_MP0] = phi * feq[DIR_MP0]   ;// / rho;
+					f[DIR_P0P] = phi * feq[DIR_P0P]   ;// / rho;
+					f[DIR_M0M] = phi * feq[DIR_M0M]   ;// / rho;
+					f[DIR_P0M] = phi * feq[DIR_P0M]   ;// / rho;
+					f[DIR_M0P] = phi * feq[DIR_M0P]   ;// / rho;
+					f[DIR_0PP] = phi * feq[DIR_0PP]   ;// / rho;
+					f[DIR_0MM] = phi * feq[DIR_0MM]   ;// / rho;
+					f[DIR_0PM] = phi * feq[DIR_0PM]   ;// / rho;
+					f[DIR_0MP] = phi * feq[DIR_0MP]   ;// / rho;
+					f[DIR_PPP] = phi * feq[DIR_PPP]  ;// / rho;
+					f[DIR_MPP] = phi * feq[DIR_MPP]  ;// / rho;
+					f[DIR_PMP] = phi * feq[DIR_PMP]  ;// / rho;
+					f[DIR_MMP] = phi * feq[DIR_MMP]  ;// / rho;
+					f[DIR_PPM] = phi * feq[DIR_PPM]  ;// / rho;
+					f[DIR_MPM] = phi * feq[DIR_MPM]  ;// / rho;
+					f[DIR_PMM] = phi * feq[DIR_PMM]  ;// / rho;
+					f[DIR_MMM] =  phi * feq[DIR_MMM]  ;// / rho;
+					
+
+					distributionsH->setDistribution(f, ix1, ix2, ix3);
+					distributionsH->setDistributionInv(f, ix1, ix2, ix3);
+
+					if (distributionsH2) {
+
+						f[DIR_000] = 0;//(1. - phi) * feq[DIR_000]; //  / rho;
+						f[DIR_P00] = 0;//(1.-phi) * feq[DIR_P00]   ;// / rho;
+						f[DIR_M00] = 0;//(1.-phi) * feq[DIR_M00]   ;// / rho;
+						f[DIR_0P0] = 0;//(1.-phi) * feq[DIR_0P0]   ;// / rho;
+						f[DIR_0M0] = 0;//(1.-phi) * feq[DIR_0M0]   ;// / rho;
+						f[DIR_00P] = 0;//(1.-phi) * feq[DIR_00P]   ;// / rho;
+						f[DIR_00M] = 0;//(1.-phi) * feq[DIR_00M]   ;// / rho;
+						f[DIR_PP0] = 0;//(1.-phi) * feq[DIR_PP0]  ;// / rho;
+						f[DIR_MM0] = 0;//(1.-phi) * feq[DIR_MM0]  ;// / rho;
+						f[DIR_PM0] = 0;//(1.-phi) * feq[DIR_PM0]  ;// / rho;
+						f[DIR_MP0] = 0;//(1.-phi) * feq[DIR_MP0]  ;// / rho;
+						f[DIR_P0P] = 0;//(1.-phi) * feq[DIR_P0P]  ;// / rho;
+						f[DIR_M0M] = 0;//(1.-phi) * feq[DIR_M0M]  ;// / rho;
+						f[DIR_P0M] = 0;//(1.-phi) * feq[DIR_P0M]  ;// / rho;
+						f[DIR_M0P] = 0;//(1.-phi) * feq[DIR_M0P]  ;// / rho;
+						f[DIR_0PP] = 0;//(1.-phi) * feq[DIR_0PP]  ;// / rho;
+						f[DIR_0MM] = 0;//(1.-phi) * feq[DIR_0MM]  ;// / rho;
+						f[DIR_0PM] = 0;//(1.-phi) * feq[DIR_0PM]  ;// / rho;
+						f[DIR_0MP] = 0;//(1.-phi) * feq[DIR_0MP]  ;// / rho;
+						f[DIR_PPP] = 0;//(1.-phi) * feq[DIR_PPP] ;// / rho;
+						f[DIR_MPP] = 0;//(1.-phi) * feq[DIR_MPP] ;// / rho;
+						f[DIR_PMP] = 0;//(1.-phi) * feq[DIR_PMP] ;// / rho;
+						f[DIR_MMP] = 0;//(1.-phi) * feq[DIR_MMP] ;// / rho;
+						f[DIR_PPM] = 0;//(1.-phi) * feq[DIR_PPM] ;// / rho;
+						f[DIR_MPM] = 0;//(1.-phi) * feq[DIR_MPM] ;// / rho;
+						f[DIR_PMM] = 0;//(1.-phi) * feq[DIR_PMM] ;// / rho;
+						f[DIR_MMM] = 0;//(1.-phi) * feq[DIR_MMM] ;// / rho;
+						
+
+                        distributionsH2->setDistribution(f, ix1, ix2, ix3);
+                        distributionsH2->setDistributionInv(f, ix1, ix2, ix3);                    
+					}
+				}
+	}
+
+	//variablen der functions loeschen, da die verwiesenen Objecte nach dem verlassen des scopes ungueltig sind!
+	this->muVx1.ClearVar();
+	this->muVx2.ClearVar();
+	this->muVx3.ClearVar();
+	this->muRho.ClearVar();
+
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::checkFunction(mu::Parser fct)
+{
+	double x1=1.0,x2=1.0,x3=1.0;
+	fct.DefineVar("x1",&x1); 
+	fct.DefineVar("x2",&x2); 
+	fct.DefineVar("x3",&x3);
+
+	try
+	{
+		fct.Eval();
+		fct.ClearVar();
+	}
+	catch(mu::ParserError& e)
+	{
+		throw UbException(UB_EXARGS,"function: "+e.GetExpr() + (std::string)"error: "+e.GetMsg()
+			+(std::string)", only x1,x2,x3 are allowed as variables" );
+	}
+}
+//////////////////////////////////////////////////////////////////////////
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setNu( LBMReal nu )
+{
+	this->nu = nu;
+}
+
+void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPressure(LBMReal pres)
+{
+	this->muPressure.SetExpr(UbSystem::toString(pres, D3Q27RealLim::digits10));
+	this->checkFunction(muPressure);
+
+}
+
diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h
new file mode 100644
index 0000000000000000000000000000000000000000..553cfe75b6b881c96a0542f184bf50c88146babc
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h
@@ -0,0 +1,102 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 MultiphaseVelocityFormInitDistributionsBlockVisitor.h
+//! \ingroup Visitors
+//! \author Hesameddin Safari, Martin Geier, Konstantin Kutscher
+//=======================================================================================
+
+#ifndef MultiphaseVelocityFormInitDistributionsBlockVisitor_H
+#define MultiphaseVelocityFormInitDistributionsBlockVisitor_H
+
+#include "Block3DVisitor.h"
+#include "D3Q27System.h"
+#include "Block3D.h"
+
+#include <muParser.h>
+
+
+
+class MultiphaseVelocityFormInitDistributionsBlockVisitor : public Block3DVisitor
+{
+public:
+	typedef std::numeric_limits<LBMReal> D3Q27RealLim;
+
+public:
+	MultiphaseVelocityFormInitDistributionsBlockVisitor();
+	//D3Q27ETInitDistributionsBlockVisitor(LBMReal rho, LBMReal vx1=0.0, LBMReal vx2=0.0, LBMReal vx3=0.0);
+	//! Constructor
+	//! \param nu - viscosity
+	//! \param rho - density
+	//! \param vx1 - velocity in x
+	//! \param vx2 - velocity in y
+	//! \param vx3 - velocity in z
+	//////////////////////////////////////////////////////////////////////////
+	//automatic vars are: x1,x2, x3
+	//ussage example: setVx1("x1*0.01+x2*0.003")
+	//////////////////////////////////////////////////////////////////////////
+	void setVx1( const mu::Parser& parser);
+	void setVx2( const mu::Parser& parser);
+	void setVx3( const mu::Parser& parser);
+	void setRho( const mu::Parser& parser);
+	void setPhi( const mu::Parser& parser);
+	void setPressure(const mu::Parser& parser);
+
+	void setVx1( const std::string& muParserString);
+	void setVx2( const std::string& muParserString);
+	void setVx3( const std::string& muParserString);
+	void setRho( const std::string& muParserString);
+	void setPhi( const std::string& muParserString);
+	void setPressure(const std::string& muParserString);
+
+	//////////////////////////////////////////////////////////////////////////
+	void setVx1( LBMReal vx1 );
+	void setVx2( LBMReal vx2 );
+	void setVx3( LBMReal vx3 );
+	void setRho( LBMReal rho );
+	void setPhi( LBMReal rho );
+	void setNu( LBMReal nu );
+	void setPressure(LBMReal pres);
+
+	void visit(SPtr<Grid3D> grid, SPtr<Block3D> block);
+
+protected:
+	void checkFunction(mu::Parser fct);
+
+private:
+	mu::Parser muVx1;
+	mu::Parser muVx2;
+	mu::Parser muVx3;
+	mu::Parser muRho;
+	mu::Parser muPhi;
+	mu::Parser muPressure;
+
+	LBMReal nu;
+};
+
+#endif //D3Q27INITDISTRIBUTIONSPATCHVISITOR_H
diff --git a/src/cpu/VirtualFluidsCore/Visitors/OverlapBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/OverlapBlockVisitor.cpp
index 338c6de90499db39836910c47a7b60f00ee7c675..54bbeda59663bf16173abcdb302f123a97b776ac 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/OverlapBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/OverlapBlockVisitor.cpp
@@ -1,10 +1,10 @@
 #include "OverlapBlockVisitor.h"
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 
 OverlapBlockVisitor::OverlapBlockVisitor(int levelDepth /*shut be maxGridLevel*/, bool includeNotActiveBlocks)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks)
 {
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RatioBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/RatioBlockVisitor.cpp
index bf25b8876f540c6ff5f678b32ad67ddd736c145d..137c737e6dd85853da328b0d0cc9ccf1bca1f878 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RatioBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/RatioBlockVisitor.cpp
@@ -1,10 +1,10 @@
 #include "RatioBlockVisitor.h"
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 
 RatioBlockVisitor::RatioBlockVisitor(int levelDepth, bool includeNotActiveBlocks)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), maxLevelRatio(1), expandBlocks(true), levelDepth(levelDepth),
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), maxLevelRatio(1), expandBlocks(true), levelDepth(levelDepth),
       includeNotActiveBlocks(includeNotActiveBlocks)
 {
 }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RatioSmoothBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/RatioSmoothBlockVisitor.cpp
index 3bcdd29299a8183a2cda60253101df89b681a51a..b48aee7cd8dcd3d3cc33c949e8a71281214c8f19 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RatioSmoothBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/RatioSmoothBlockVisitor.cpp
@@ -1,10 +1,10 @@
 #include "RatioSmoothBlockVisitor.h"
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 
 RatioSmoothBlockVisitor::RatioSmoothBlockVisitor(int levelDepth, bool includeNotActiveBlocks)
-    : Block3DVisitor(Grid3DSystem::MAXLEVEL, 0), maxLevelRatio(1), expandBlocks(true), levelDepth(levelDepth),
+    : Block3DVisitor(D3Q27System::MAXLEVEL, 0), maxLevelRatio(1), expandBlocks(true), levelDepth(levelDepth),
       includeNotActiveBlocks(includeNotActiveBlocks)
 {
 }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp b/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp
index c151ac90492bc7545f7d498fdfd2b3f9efbc9ab6..b0b0cf7743fd195796ef2fb3276a9a3921adf465 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp
@@ -38,7 +38,7 @@ void RefineAroundGbObjectHelper::refine()
     grid->accept(overlapVisitor);
 
     std::vector<int> dirs;
-    for (int i = D3Q27System::E; i <= D3Q27System::TS; i++) {
+    for (int i = D3Q27System::DIR_P00; i <= D3Q27System::DIR_0MP; i++) {
         dirs.push_back(i);
     }
     SetInterpolationDirsBlockVisitor interDirsVisitor(dirs);
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp b/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp
index 656457c0580739bd00783b3050fb2c460eaa5a14..3bb1546896ee40ecdb9acf69586251ad1f03bb62 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp
@@ -55,7 +55,7 @@ void RefineCrossAndInsideGbObjectHelper::refine()
 
     std::vector<int> dirs;
 
-    for (int i = D3Q27System::E; i < D3Q27System::ENDDIR; i++) {
+    for (int i = D3Q27System::STARTDIR; i <= D3Q27System::ENDDIR; i++) {
         dirs.push_back(i);
     }
     SetInterpolationDirsBlockVisitor interDirsVisitor(dirs);
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RenumberBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/RenumberBlockVisitor.cpp
index 538fd95118b0c07069ba854c2fbb8264713907d3..b2a4d9337ad49edc4e508555929a6ca64e6f9243 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RenumberBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/RenumberBlockVisitor.cpp
@@ -1,12 +1,12 @@
 #include "RenumberBlockVisitor.h"
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMSystem.h"
 
 int RenumberBlockVisitor::counter = 0;
 
-RenumberBlockVisitor::RenumberBlockVisitor() : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) {}
+RenumberBlockVisitor::RenumberBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL) {}
 //////////////////////////////////////////////////////////////////////////
 void RenumberBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
 {
diff --git a/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp
index fc9c5c203c5d631ae7e125f75d72d70e8502890d..ed9a3ee59c87ab755416eecd5468a4cc763837e4 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp
@@ -1,7 +1,7 @@
 #include "RenumberGridVisitor.h"
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 //#include <mpi.h>
 
 RenumberGridVisitor::RenumberGridVisitor(std::shared_ptr<vf::mpi::Communicator> com) : comm(com) {}
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetBcBlocksBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetBcBlocksBlockVisitor.cpp
index bbccaa785583fdc810865337af46fca8a9872a65..de3924453dadb396a5eef4a8fb23e85f850d760f 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetBcBlocksBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetBcBlocksBlockVisitor.cpp
@@ -35,11 +35,11 @@
 
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "Interactor3D.h"
 
 SetBcBlocksBlockVisitor::SetBcBlocksBlockVisitor(SPtr<Interactor3D> interactor)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), interactor(interactor)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), interactor(interactor)
 {
 }
 
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h
index bd28c23f9ec7bf43acbd37a532ce07652ae6ee93..7930219451088aaef222d06c1a5a72d159817798 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h
@@ -38,7 +38,7 @@
 
 #include "Block3DVisitor.h"
 #include "D3Q27System.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "Grid3D.h"
 #include "CreateTransmittersHelper.h"
 #include <mpi/Communicator.h>
@@ -46,8 +46,12 @@
 #include "OneDistributionFullVectorConnector.h"
 #include "TwoDistributionsFullDirectConnector.h"
 #include "TwoDistributionsFullVectorConnector.h"
+#include "TwoDistributionsDoubleGhostLayerFullDirectConnector.h"
+#include "TwoDistributionsDoubleGhostLayerFullVectorConnector.h"
 #include "ThreeDistributionsFullDirectConnector.h"
 #include "ThreeDistributionsFullVectorConnector.h"
+#include "ThreeDistributionsDoubleGhostLayerFullDirectConnector.h"
+#include "ThreeDistributionsDoubleGhostLayerFullVectorConnector.h"
 #include <basics/transmitter/TbTransmitterLocal.h>
 
 //! \brief  A class sets connectors between blocks.
@@ -66,13 +70,12 @@ protected:
     void setSameLevelConnectors(SPtr<Grid3D> grid, SPtr<Block3D> block);
     void setRemoteConnectors(SPtr<Block3D> sblock, SPtr<Block3D> tblock, int dir);
     std::shared_ptr<vf::mpi::Communicator> comm;
-    int dirs;
-    int gridRank;
+    int gridRank{0};
 };
 
 template <class T1, class T2>
 SetConnectorsBlockVisitor<T1, T2>::SetConnectorsBlockVisitor(std::shared_ptr<vf::mpi::Communicator> comm)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), comm(comm)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), comm(comm)
 {
 }
 //////////////////////////////////////////////////////////////////////////
@@ -111,7 +114,7 @@ void SetConnectorsBlockVisitor<T1, T2>::setSameLevelConnectors(SPtr<Grid3D> grid
         int ix3   = block->getX3();
         int level = block->getLevel();
 
-        for (int dir = 0; dir < D3Q27System::ENDDIR; dir++) {
+        for (int dir = D3Q27System::STARTDIR; dir <= D3Q27System::ENDDIR; dir++) {
             SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level);
 
             if (neighBlock) {
@@ -123,7 +126,7 @@ void SetConnectorsBlockVisitor<T1, T2>::setSameLevelConnectors(SPtr<Grid3D> grid
                 } else if (blockRank != neighBlockRank && neighBlock->isActive()) {
                     setRemoteConnectors(block, neighBlock, dir);
 
-                    if (dir >= 0 && dir <= 5) {
+                    if (dir >= D3Q27System::DIR_P00 && dir <= D3Q27System::DIR_00M) {
                         int weight = block->getWeight(neighBlockRank);
                         weight++;
                         block->setWeight(neighBlockRank, weight);
@@ -157,6 +160,8 @@ void SetConnectorsBlockVisitor<T1, T2>::setRemoteConnectors(SPtr<Block3D> sblock
 
 using OneDistributionSetConnectorsBlockVisitor  = SetConnectorsBlockVisitor<OneDistributionFullDirectConnector, OneDistributionFullVectorConnector>;
 using TwoDistributionsSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<TwoDistributionsFullDirectConnector, TwoDistributionsFullVectorConnector>;
+using TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<TwoDistributionsDoubleGhostLayerFullDirectConnector, TwoDistributionsDoubleGhostLayerFullVectorConnector>;
 using ThreeDistributionsSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<ThreeDistributionsFullDirectConnector, ThreeDistributionsFullVectorConnector>;
+using ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<ThreeDistributionsDoubleGhostLayerFullDirectConnector, ThreeDistributionsDoubleGhostLayerFullVectorConnector>;
 
 #endif // SETCONNECTORSBLOCKVISITOR_H
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetForcingBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetForcingBlockVisitor.cpp
index 679b63de44dd451f030aaf866bc259579efab8ef..abf828a06e0ec83b492ff9107be4a9a3c4445674 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetForcingBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetForcingBlockVisitor.cpp
@@ -1,18 +1,18 @@
 #include "SetForcingBlockVisitor.h"
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMSystem.h"
 
 SetForcingBlockVisitor::SetForcingBlockVisitor(LBMReal forcingX1, LBMReal forcingX2, LBMReal forcingX3)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), forcingX1(forcingX1), forcingX2(forcingX2), forcingX3(forcingX3)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), forcingX1(forcingX1), forcingX2(forcingX2), forcingX3(forcingX3)
 {
     ftype = 0;
 }
 //////////////////////////////////////////////////////////////////////////
 SetForcingBlockVisitor::SetForcingBlockVisitor(const mu::Parser &muForcingX1, const mu::Parser &muForcingX2,
                                                const mu::Parser &muForcingX3)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), muForcingX1(muForcingX1), muForcingX2(muForcingX2),
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), muForcingX1(muForcingX1), muForcingX2(muForcingX2),
       muForcingX3(muForcingX3)
 
 {
@@ -21,7 +21,7 @@ SetForcingBlockVisitor::SetForcingBlockVisitor(const mu::Parser &muForcingX1, co
 //////////////////////////////////////////////////////////////////////////
 SetForcingBlockVisitor::SetForcingBlockVisitor(const std::string &sForcingX1, const std::string &sForcingX2,
                                                const std::string &sForcingX3)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), sForcingX1(sForcingX1), sForcingX2(sForcingX2), sForcingX3(sForcingX3)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), sForcingX1(sForcingX1), sForcingX2(sForcingX2), sForcingX3(sForcingX3)
 
 {
     ftype = 2;
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp
index 6a55ee5af55df96b4c1335976728ca7e08ee8ece..54f46c811d4c2d065bbda7232bd4e32f24559c22 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp
@@ -36,14 +36,14 @@
 #include "FineToCoarseVectorConnector.h"
 #include "TwoDistributionsFullDirectConnector.h"
 #include "TwoDistributionsFullVectorConnector.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include <basics/transmitter/TbTransmitterLocal.h>
 
 #include <mpi/Communicator.h>
 #include "InterpolationProcessor.h"
 
 SetInterpolationConnectorsBlockVisitor::SetInterpolationConnectorsBlockVisitor(std::shared_ptr<vf::mpi::Communicator> comm, LBMReal nue, SPtr<InterpolationProcessor> iProcessor) :
-Block3DVisitor(0, Grid3DSystem::MAXLEVEL), 
+Block3DVisitor(0, D3Q27System::MAXLEVEL), 
 	comm(comm),
 	nue(nue),
 	iProcessor(iProcessor)
@@ -82,110 +82,110 @@ void SetInterpolationConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Gri
 		int fbx3 = block->getX3() << 1;
 		int level = block->getLevel() + 1;
 
-		if( block->hasInterpolationFlagCF(D3Q27System::E))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_P00))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
 			SPtr<Block3D> fblockNW = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
 			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::E);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_P00);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::W))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_M00))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3,level);
 			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2,fbx3+1,level);
 			SPtr<Block3D> fblockNE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::W);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_M00);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::N))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_0P0))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+1,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
 			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
 			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::N);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0P0);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::S))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_0M0))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level);
 			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2,fbx3+1,level);
 			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::S);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0M0);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::T))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_00P))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3+1,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
 			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
 			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::T);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_00P);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::B))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_00M))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level);
 			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3,level);
 			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::B);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_00M);
 		}
 
 		//////NE-NW-SE-SW
-		if( block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_P00))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+1,fbx3+0,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NE);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PP0);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_MM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2,fbx3+1,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SW);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MM0);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_PM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2,fbx3+0,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SE);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PM0);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_MP0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_M00))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+1,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NW);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MP0);
 		}
 
 		/////////TE-BW-BE-TW 1-0
-		if( block->hasInterpolationFlagCF(D3Q27System::TE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::T))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00P))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+0,fbx3+1,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+0, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TE);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_P0P);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::B))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_M0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00M))
 		{
 
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+0,fbx3,level);
@@ -193,140 +193,140 @@ void SetInterpolationConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Gri
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+0, fbx3, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BW);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_M0M);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::BE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::B))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_P0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00M))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+0,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+0, fbx3, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BE);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_P0M);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::TW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::T))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_M0P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00P))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+0,fbx3+1,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+0, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TW);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_M0P);
 		}
 
 		//////TN-BS-BN-TS
-		if( block->hasInterpolationFlagCF(D3Q27System::TN)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::T))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00P))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2+1,fbx3+1,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2+1, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TN);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0PP);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::S) && !block->hasInterpolationFlagCF(D3Q27System::B))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_0MM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00M))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2, fbx3, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BS);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0MM);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::B))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_0PM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00M))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2+1,fbx3,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2+1, fbx3, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BN);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0PM);
 		}
-		if( block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::S) && !block->hasInterpolationFlagCF(D3Q27System::T))
+		if( block->hasInterpolationFlagCF(D3Q27System::DIR_0MP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00P))
 		{
 			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2,fbx3+1,level);
 			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
 
-			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TS);
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0MP);
 		}
 
 
 
 
       //////corners
-      if (block->hasInterpolationFlagCF(D3Q27System::TNE)&&!block->hasInterpolationFlagCF(D3Q27System::TE)&&!block->hasInterpolationFlagCF(D3Q27System::TN)&&!block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::T)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E))
+      if (block->hasInterpolationFlagCF(D3Q27System::DIR_PPP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_00P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_P00))
       {
          SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
          SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
 
-         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNE);
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PPP);
       }
-      if (block->hasInterpolationFlagCF(D3Q27System::TSW)&&!block->hasInterpolationFlagCF(D3Q27System::TW)&&!block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S))
+      if (block->hasInterpolationFlagCF(D3Q27System::DIR_MMP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_M0P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0MP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_MM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0))
       {
          SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3+1, level);
          SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2, fbx3, level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
 
-         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSW);
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MMP);
       }
-      if (block->hasInterpolationFlagCF(D3Q27System::TSE)&&!block->hasInterpolationFlagCF(D3Q27System::TE)&&!block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S))
+      if (block->hasInterpolationFlagCF(D3Q27System::DIR_PMP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0MP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_PM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0))
       {
          SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
          SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2, fbx3+0, level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
 
-         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSE);
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PMP);
       }
-      if (block->hasInterpolationFlagCF(D3Q27System::TNW)&&!block->hasInterpolationFlagCF(D3Q27System::TW)&&!block->hasInterpolationFlagCF(D3Q27System::TN)&& !block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W))
+      if (block->hasInterpolationFlagCF(D3Q27System::DIR_MPP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_M0P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_MP0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_M00))
       {
          SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
          SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
 
-         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNW);
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MPP);
       }
-      if (block->hasInterpolationFlagCF(D3Q27System::BNE)&&!block->hasInterpolationFlagCF(D3Q27System::BE)&&!block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::B)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E))
+      if (block->hasInterpolationFlagCF(D3Q27System::DIR_PPM)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_P0M)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0PM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_00M)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_P00))
       {
          SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level);
          SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
 
-         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNE);
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PPM);
       }
-      if (block->hasInterpolationFlagCF(D3Q27System::BSW)&& !block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S))
+      if (block->hasInterpolationFlagCF(D3Q27System::DIR_MMM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0MM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_MM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0))
       {
          SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3+0, level);
          SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2, fbx3, level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
 
-         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSW);
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MMM);
       }
-      if (block->hasInterpolationFlagCF(D3Q27System::BSE)&& !block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::BE)&& !block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S))
+      if (block->hasInterpolationFlagCF(D3Q27System::DIR_PMM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0MM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_PM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0))
       {
          SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2, fbx3, level);
          SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2, fbx3+0, level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
 
-         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSE);
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PMM);
       }
-      if (block->hasInterpolationFlagCF(D3Q27System::BNW)&& !block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W))
+      if (block->hasInterpolationFlagCF(D3Q27System::DIR_MPM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0PM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_MP0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_M00))
       {
          SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2+1, fbx3+0, level);
          SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level);
          SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
          SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
 
-         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNW);
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MPM);
       }
 
 	}
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationDirsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationDirsBlockVisitor.cpp
index bb1ae79620179f65abd51672bd9958f471c398c7..689d84d0754f74c2f680fd2b7aa22ec0c54008c1 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationDirsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationDirsBlockVisitor.cpp
@@ -1,11 +1,11 @@
 #include "SetInterpolationDirsBlockVisitor.h"
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include <D3Q27System.h>
 
 SetInterpolationDirsBlockVisitor::SetInterpolationDirsBlockVisitor(std::vector<int> &dirs)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), dirs(dirs)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), dirs(dirs)
 {
 }
 //////////////////////////////////////////////////////////////////////////
@@ -32,103 +32,103 @@ void SetInterpolationDirsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bl
             if (p_nblock) {
                 bool flagDir;
                 switch (dir) {
-                    case NE:
-                        checkFlagDir(grid, E, N, flagDir, ix1, ix2, ix3, level);
+                    case DIR_PP0:
+                        checkFlagDir(grid, DIR_P00, DIR_0P0, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case SW:
-                        checkFlagDir(grid, W, S, flagDir, ix1, ix2, ix3, level);
+                    case DIR_MM0:
+                        checkFlagDir(grid, DIR_M00, DIR_0M0, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case SE:
-                        checkFlagDir(grid, E, S, flagDir, ix1, ix2, ix3, level);
+                    case DIR_PM0:
+                        checkFlagDir(grid, DIR_P00, DIR_0M0, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case NW:
-                        checkFlagDir(grid, W, N, flagDir, ix1, ix2, ix3, level);
+                    case DIR_MP0:
+                        checkFlagDir(grid, DIR_M00, DIR_0P0, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case TE:
-                        checkFlagDir(grid, E, T, flagDir, ix1, ix2, ix3, level);
+                    case DIR_P0P:
+                        checkFlagDir(grid, DIR_P00, DIR_00P, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case BW:
-                        checkFlagDir(grid, W, B, flagDir, ix1, ix2, ix3, level);
+                    case DIR_M0M:
+                        checkFlagDir(grid, DIR_M00, DIR_00M, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case BE:
-                        checkFlagDir(grid, E, B, flagDir, ix1, ix2, ix3, level);
+                    case DIR_P0M:
+                        checkFlagDir(grid, DIR_P00, DIR_00M, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case TW:
-                        checkFlagDir(grid, W, T, flagDir, ix1, ix2, ix3, level);
+                    case DIR_M0P:
+                        checkFlagDir(grid, DIR_M00, DIR_00P, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case TN:
-                        checkFlagDir(grid, N, T, flagDir, ix1, ix2, ix3, level);
+                    case DIR_0PP:
+                        checkFlagDir(grid, DIR_0P0, DIR_00P, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case BS:
-                        checkFlagDir(grid, S, B, flagDir, ix1, ix2, ix3, level);
+                    case DIR_0MM:
+                        checkFlagDir(grid, DIR_0M0, DIR_00M, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case BN:
-                        checkFlagDir(grid, N, B, flagDir, ix1, ix2, ix3, level);
+                    case DIR_0PM:
+                        checkFlagDir(grid, DIR_0P0, DIR_00M, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case TS:
-                        checkFlagDir(grid, S, T, flagDir, ix1, ix2, ix3, level);
+                    case DIR_0MP:
+                        checkFlagDir(grid, DIR_0M0, DIR_00P, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case TNE:
-                        checkFlagDir(grid, E, N, T, flagDir, ix1, ix2, ix3, level);
+                    case DIR_PPP:
+                        checkFlagDir(grid, DIR_P00, DIR_0P0, DIR_00P, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case TSW:
-                        checkFlagDir(grid, W, S, T, flagDir, ix1, ix2, ix3, level);
+                    case DIR_MMP:
+                        checkFlagDir(grid, DIR_M00, DIR_0M0, DIR_00P, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case TSE:
-                        checkFlagDir(grid, E, S, T, flagDir, ix1, ix2, ix3, level);
+                    case DIR_PMP:
+                        checkFlagDir(grid, DIR_P00, DIR_0M0, DIR_00P, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case TNW:
-                        checkFlagDir(grid, W, N, T, flagDir, ix1, ix2, ix3, level);
+                    case DIR_MPP:
+                        checkFlagDir(grid, DIR_M00, DIR_0P0, DIR_00P, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case BNE:
-                        checkFlagDir(grid, E, N, B, flagDir, ix1, ix2, ix3, level);
+                    case DIR_PPM:
+                        checkFlagDir(grid, DIR_P00, DIR_0P0, DIR_00M, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case BSW:
-                        checkFlagDir(grid, W, S, B, flagDir, ix1, ix2, ix3, level);
+                    case DIR_MMM:
+                        checkFlagDir(grid, DIR_M00, DIR_0M0, DIR_00M, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case BSE:
-                        checkFlagDir(grid, E, S, B, flagDir, ix1, ix2, ix3, level);
+                    case DIR_PMM:
+                        checkFlagDir(grid, DIR_P00, DIR_0M0, DIR_00M, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
-                    case BNW:
-                        checkFlagDir(grid, W, N, B, flagDir, ix1, ix2, ix3, level);
+                    case DIR_MPM:
+                        checkFlagDir(grid, DIR_M00, DIR_0P0, DIR_00M, flagDir, ix1, ix2, ix3, level);
                         if (!flagDir)
                             continue;
                         break;
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp
index 5c813d28951b24269735b0dbf1f84fdfb360cf31..354a577e701f9d017181e6006833ad40749eef60 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp
@@ -38,7 +38,7 @@
 #include "Block3D.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMKernel.h"
 #include "LBMSystem.h"
 #include <utility>
@@ -46,16 +46,16 @@
 //////////////////////////////////////////////////////////////////////////
 SetKernelBlockVisitor::SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, double availMem, double needMem,
                                              SetKernelBlockVisitor::Action action)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(std::move(kernel)), nue(nue), action(action), dataSetFlag(true)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(std::move(kernel)), nue(nue), action(action), dataSetFlag(true)
 {
     if (needMem > availMem) {
         throw UbException(UB_EXARGS, "SetKernelBlockVisitor: Not enough memory!!!");
     }
 }
 
-SetKernelBlockVisitor::SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, int &numberOfProcesses,
+SetKernelBlockVisitor::SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, int numberOfProcesses,
                                              SetKernelBlockVisitor::Action action)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(std::move(kernel)), nue(nue), action(action), dataSetFlag(true),
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(std::move(kernel)), nue(nue), action(action), dataSetFlag(true),
       numberOfProcesses(numberOfProcesses)
 {
 }
@@ -127,7 +127,7 @@ double SetKernelBlockVisitor::getRequiredPhysicalMemory(const SPtr<Grid3D> &grid
     unsigned long long numberOfNodesPerBlockWithGhostLayer;
     auto numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
     auto blockNx        = grid->getBlockNX();
-    int ghostLayer      = 3;
+    int ghostLayer      = grid->getGhostLayerWidth() * 2 + 1;
 
     numberOfNodesPerBlockWithGhostLayer = numberOfBlocks * (val<1>(blockNx) + ghostLayer) *
                                           (val<2>(blockNx) + ghostLayer) * (val<3>(blockNx) + ghostLayer);
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h
index 51cbc256cfeac03b2d51acf8ebe8fca12a3f33ed..1e0621f22379e52701aafa4ab06f858cb1247d7e 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h
@@ -52,7 +52,7 @@ public:
     SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, double availMem, double needMem,
                           SetKernelBlockVisitor::Action action = SetKernelBlockVisitor::NewKernel);
 
-    SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, int &numberOfProcesses,
+    SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, int numberOfProcesses,
                           SetKernelBlockVisitor::Action action = SetKernelBlockVisitor::NewKernel);
 
     ~SetKernelBlockVisitor() override = default;
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetSolidBlocksBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetSolidBlocksBlockVisitor.cpp
index 3354755f22f18df700523d795c8fced0d0f19628..e78300c5af6590da72bec3b28516143e4ec18a1d 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetSolidBlocksBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetSolidBlocksBlockVisitor.cpp
@@ -37,11 +37,11 @@
 
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "Interactor3D.h"
 
 SetSolidBlocksBlockVisitor::SetSolidBlocksBlockVisitor(SPtr<Interactor3D> interactor)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), interactor(std::move(interactor))
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), interactor(std::move(interactor))
 {
 }
 
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetSpongeLayerBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetSpongeLayerBlockVisitor.cpp
index 040f54b0fd645a206952ce2c992d4abeea3ace85..789b3e3dc932462155a897be1c2c998400adb7f3 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetSpongeLayerBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetSpongeLayerBlockVisitor.cpp
@@ -1,5 +1,5 @@
 #include "SetSpongeLayerBlockVisitor.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMSystem.h"
 
 #include "Block3D.h"
@@ -7,7 +7,7 @@
 #include "LBMKernel.h"
 
 SetSpongeLayerBlockVisitor::SetSpongeLayerBlockVisitor(const mu::Parser &spongeLayer)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), spongeLayer(spongeLayer)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), spongeLayer(spongeLayer)
 {
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp
index 15c8b82bae5c95f6783f73c7e7a70004f3c76574..3b9eb9493fe0fa66f05fdd3ea42505604836d218 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp
@@ -5,11 +5,11 @@
 #include "BoundaryConditions.h"
 #include "D3Q27System.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "ILBMKernel.h"
 
 SetUndefinedNodesBlockVisitor::SetUndefinedNodesBlockVisitor(bool twoTypeOfConnectorsCheck)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), twoTypeOfConnectorsCheck(twoTypeOfConnectorsCheck)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), twoTypeOfConnectorsCheck(twoTypeOfConnectorsCheck)
 {
 }
 //////////////////////////////////////////////////////////////////////////
@@ -40,7 +40,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
     // int offset = 2;
     int offset = 3;
 
-    if (block->hasInterpolationFlag(D3Q27System::E)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_P00)) {
         int startix1 = maxX1;
         int endix1   = maxX1;
         if (block->hasInterpolationFlagCF())
@@ -51,7 +51,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::W)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_M00)) {
         int startix1 = minX1;
         int endix1   = minX1;
         if (block->hasInterpolationFlagCF())
@@ -62,7 +62,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::N)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_0P0)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = maxX2;
@@ -73,7 +73,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::S)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_0M0)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -84,7 +84,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::T)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_00P)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -95,7 +95,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             startix3 = startix3 - offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::B)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_00M)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -106,7 +106,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             endix3 = endix3 + offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::NE)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_PP0)) {
         int startix1 = maxX1;
         int endix1   = maxX1;
         if (block->hasInterpolationFlagCF())
@@ -119,7 +119,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::SW)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_MM0)) {
         int startix1 = minX1;
         int endix1   = minX1;
         if (block->hasInterpolationFlagCF())
@@ -132,7 +132,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::SE)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_PM0)) {
         int startix1 = maxX1;
         int endix1   = maxX1;
         if (block->hasInterpolationFlagCF())
@@ -145,7 +145,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::NW)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_MP0)) {
         int startix1 = minX1;
         int endix1   = minX1;
         if (block->hasInterpolationFlagCF())
@@ -158,7 +158,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::TE)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_P0P)) {
         int startix1 = maxX1;
         int endix1   = maxX1;
         if (block->hasInterpolationFlagCF())
@@ -171,7 +171,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             startix3 = startix3 - offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::BW)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_M0M)) {
         int startix1 = minX1;
         int endix1   = minX1;
         if (block->hasInterpolationFlagCF())
@@ -184,7 +184,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             endix3 = endix3 + offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::BE)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_P0M)) {
         int startix1 = maxX1;
         int endix1   = maxX1;
         if (block->hasInterpolationFlagCF())
@@ -197,7 +197,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             endix3 = endix3 + offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::TW)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_M0P)) {
         int startix1 = minX1;
         int endix1   = minX1;
         if (block->hasInterpolationFlagCF())
@@ -210,7 +210,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             startix3 = startix3 - offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::TN)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_0PP)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = maxX2;
@@ -223,7 +223,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             startix3 = startix3 - offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::BS)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_0MM)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -236,7 +236,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             endix3 = endix3 + offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::BN)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_0PM)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = maxX2;
@@ -249,7 +249,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             endix3 = endix3 + offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::TS)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_0MP)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -262,7 +262,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             startix3 = startix3 - offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::TNE)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_PPP)) {
         int startix1 = maxX1;
         int endix1   = maxX1;
         if (block->hasInterpolationFlagCF())
@@ -277,7 +277,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             startix3 = startix3 - offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::TNW)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_MPP)) {
         int startix1 = minX1;
         int endix1   = minX1;
         if (block->hasInterpolationFlagCF())
@@ -292,7 +292,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             startix3 = startix3 - offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::TSE)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_PMP)) {
         int startix1 = maxX1;
         int endix1   = maxX1;
         if (block->hasInterpolationFlagCF())
@@ -307,7 +307,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             startix3 = startix3 - offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::TSW)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_MMP)) {
         int startix1 = minX1;
         int endix1   = minX1;
         if (block->hasInterpolationFlagCF())
@@ -322,7 +322,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             startix3 = startix3 - offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::BNE)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_PPM)) {
         int startix1 = maxX1;
         int endix1   = maxX1;
         if (block->hasInterpolationFlagCF())
@@ -337,7 +337,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             endix3 = endix3 + offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::BNW)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_MPM)) {
         int startix1 = minX1;
         int endix1   = minX1;
         if (block->hasInterpolationFlagCF())
@@ -352,7 +352,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             endix3 = endix3 + offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::BSE)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_PMM)) {
         int startix1 = maxX1;
         int endix1   = maxX1;
         if (block->hasInterpolationFlagCF())
@@ -367,7 +367,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
             endix3 = endix3 + offset;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlag(D3Q27System::BSW)) {
+    if (block->hasInterpolationFlag(D3Q27System::DIR_MMM)) {
         int startix1 = minX1;
         int endix1   = minX1;
         if (block->hasInterpolationFlagCF())
@@ -395,7 +395,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
     maxX2 = static_cast<int>(bcMatrix->getNX2()) - 1 - ll;
     maxX3 = static_cast<int>(bcMatrix->getNX3()) - 1 - ll;
 
-    if (block->hasInterpolationFlagFC(D3Q27System::E)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_P00)) {
         int startix1 = maxX1 - offset2;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -404,7 +404,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::W)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_M00)) {
         int startix1 = minX1;
         int endix1   = minX1 + offset2;
         int startix2 = minX2;
@@ -413,7 +413,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::N)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_0P0)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = maxX2 - offset2;
@@ -422,7 +422,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::S)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_0M0)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -431,7 +431,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::T)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_00P)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -440,7 +440,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::B)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_00M)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -449,7 +449,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = minX3 + offset2;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::NE)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_PP0)) {
         int startix1 = maxX1 - offset2;
         int endix1   = maxX1;
         int startix2 = maxX2 - offset2;
@@ -458,7 +458,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::SW)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_MM0)) {
         int startix1 = minX1;
         int endix1   = minX1 + offset2;
         int startix2 = minX2;
@@ -467,7 +467,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::SE)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_PM0)) {
         int startix1 = maxX1 - offset2;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -476,7 +476,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::NW)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_MP0)) {
         int startix1 = minX1;
         int endix1   = minX1 + offset2;
         int startix2 = maxX2 - offset2;
@@ -485,7 +485,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::TE)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_P0P)) {
         int startix1 = maxX1 - offset2;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -494,7 +494,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::BW)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_M0M)) {
         int startix1 = minX1;
         int endix1   = minX1 + offset2;
         int startix2 = minX2;
@@ -503,7 +503,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = minX3 + offset2;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::BE)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_P0M)) {
         int startix1 = maxX1 - offset2;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -512,7 +512,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = minX3 + offset2;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::TW)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_M0P)) {
         int startix1 = minX1;
         int endix1   = minX1 + offset2;
         int startix2 = minX2;
@@ -521,7 +521,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::TN)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_0PP)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = maxX2 - offset2;
@@ -530,7 +530,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::BS)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_0MM)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -539,7 +539,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = minX3 + offset2;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::BN)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_0PM)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = maxX2 - offset2;
@@ -548,7 +548,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = minX3 + offset2;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::TS)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_0MP)) {
         int startix1 = minX1;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -557,7 +557,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::TNE)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_PPP)) {
         int startix1 = maxX1 - offset2;
         int endix1   = maxX1;
         int startix2 = maxX2 - offset2;
@@ -566,7 +566,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::TNW)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_MPP)) {
         int startix1 = minX1;
         int endix1   = minX1 + offset2;
         int startix2 = maxX2 - offset2;
@@ -575,7 +575,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::TSE)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_PMP)) {
         int startix1 = maxX1 - offset2;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -584,7 +584,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::TSW)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_MMP)) {
         int startix1 = minX1;
         int endix1   = minX1 + offset2;
         int startix2 = minX2;
@@ -593,7 +593,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = maxX3;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::BNE)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_PPM)) {
         int startix1 = maxX1 - offset2;
         int endix1   = maxX1;
         int startix2 = maxX2 - offset2;
@@ -602,7 +602,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = minX3 + offset2;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::BNW)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_MPM)) {
         int startix1 = minX1;
         int endix1   = minX1 + offset2;
         int startix2 = maxX2 - offset2;
@@ -611,7 +611,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = minX3 + offset2;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::BSE)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_PMM)) {
         int startix1 = maxX1 - offset2;
         int endix1   = maxX1;
         int startix2 = minX2;
@@ -620,7 +620,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
         int endix3   = minX3 + offset2;
         this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix);
     }
-    if (block->hasInterpolationFlagFC(D3Q27System::BSW)) {
+    if (block->hasInterpolationFlagFC(D3Q27System::DIR_MMM)) {
         int startix1 = minX1;
         int endix1   = minX1 + offset2;
         int startix2 = minX2;
@@ -633,10 +633,10 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block
     // invert scaleCF blocks
     if (block->hasInterpolationFlagCF()) {
         if (block->hasInterpolationFlagFC() && twoTypeOfConnectorsCheck) {
-            for (int i = D3Q27System::E; i <= D3Q27System::BSW; i++) {
+            for (int i = D3Q27System::DIR_P00; i <= D3Q27System::DIR_MMM; i++) {
                 UBLOG(logINFO, "FC in dir=" << i << " " << block->hasInterpolationFlagFC(i));
             }
-            for (int i = D3Q27System::E; i <= D3Q27System::BSW; i++) {
+            for (int i = D3Q27System::DIR_P00; i <= D3Q27System::DIR_MMM; i++) {
                 UBLOG(logINFO, "CF in dir=" << i << " " << block->hasInterpolationFlagCF(i));
             }
             throw UbException(UB_EXARGS, "block " + block->toString() + " has CF and FC");
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp
index c9bbc78cdd575f115d86d3e470cefe50dd636ba6..1ef34e0e8bbf54625efbc946b141cf16f24c213d 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp
@@ -1,5 +1,5 @@
 #include "SpongeLayerBlockVisitor.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "LBMSystem.h"
 
 #include "BCArray3D.h"
@@ -15,7 +15,7 @@ using namespace std;
 
 SpongeLayerBlockVisitor::SpongeLayerBlockVisitor(SPtr<GbCuboid3D> boundingBox, SPtr<LBMKernel> kernel, double nue,
                                                  int dir)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), boundingBox(boundingBox), kernel(kernel), nue(nue), dir(dir)
+    : Block3DVisitor(0, D3Q27System::MAXLEVEL), boundingBox(boundingBox), kernel(kernel), nue(nue), dir(dir)
 {
 }
 //////////////////////////////////////////////////////////////////////////
@@ -72,22 +72,22 @@ void SpongeLayerBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
 
             double newCollFactor;
 
-            if (dir == D3Q27System::E) {
+            if (dir == D3Q27System::DIR_P00) {
                 int ibX1      = block->getX1();
                 int ibMax     = val<1>(ixMax) - val<1>(ixMin) + 1;
                 double index  = (double)(ibX1 - val<1>(ixMin) + 1);
                 newCollFactor = oldCollFactor - (oldCollFactor - 1.0) / (double)(ibMax)*index;
-            } else if (dir == D3Q27System::W) {
+            } else if (dir == D3Q27System::DIR_M00) {
                 int ibX1      = block->getX1();
                 int ibMax     = val<1>(ixMax) - val<1>(ixMin) + 1;
                 double index  = (double)(ibX1 - val<1>(ixMin) + 1);
                 newCollFactor = (oldCollFactor - 1.0) / (double)(ibMax)*index;
-            } else if (dir == D3Q27System::T) {
+            } else if (dir == D3Q27System::DIR_00P) {
                 int ibX3      = block->getX3();
                 int ibMax     = val<3>(ixMax) - val<3>(ixMin) + 1;
                 double index  = (double)(ibX3 - val<3>(ixMin) + 1);
                 newCollFactor = oldCollFactor - (oldCollFactor - 1.0) / (double)(ibMax)*index;
-            } else if (dir == D3Q27System::B) {
+            } else if (dir == D3Q27System::DIR_00M) {
                 int ibX3      = block->getX3();
                 int ibMax     = val<3>(ixMax) - val<3>(ixMin) + 1;
                 double index  = (double)(ibX3 - val<3>(ixMin) + 1);
diff --git a/src/cpu/VirtualFluidsCore/Visitors/ViscosityBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/ViscosityBlockVisitor.cpp
index 67d185d6ac401909d85b99b74ef1ede2d0054a6a..311a8bf19786198e85b00eb500f6e7c90d2d5106 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/ViscosityBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/ViscosityBlockVisitor.cpp
@@ -1,11 +1,11 @@
 #include "ViscosityBlockVisitor.h"
 #include "Block3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
+#include "D3Q27System.h"
 #include "ILBMKernel.h"
 #include "LBMSystem.h"
 
-ViscosityBlockVisitor::ViscosityBlockVisitor(LBMReal nu) : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), nu(nu) {}
+ViscosityBlockVisitor::ViscosityBlockVisitor(LBMReal nu) : Block3DVisitor(0, D3Q27System::MAXLEVEL), nu(nu) {}
 //////////////////////////////////////////////////////////////////////////
 void ViscosityBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
 {
diff --git a/src/cpu/simulationconfig/src/Simulation.cpp b/src/cpu/simulationconfig/src/Simulation.cpp
index ab818f5280628e51648e6d478dbb827b2bcc78ed..1258df75b8440b468c942688c9dc3366e3e2a833 100644
--- a/src/cpu/simulationconfig/src/Simulation.cpp
+++ b/src/cpu/simulationconfig/src/Simulation.cpp
@@ -120,7 +120,7 @@ void Simulation::run()
 
     auto metisVisitor = std::make_shared<MetisPartitioningGridVisitor>(communicator,
                                                                        MetisPartitioningGridVisitor::LevelBased,
-                                                                       D3Q27System::B, MetisPartitioner::RECURSIVE);
+                                                                       D3Q27System::DIR_00M, MetisPartitioner::RECURSIVE);
 
     InteractorsHelper intHelper(grid, metisVisitor);
     for (auto const &interactor : interactors)
diff --git a/src/gpu/GksGpu/BoundaryConditions/BoundaryCondition.h b/src/gpu/GksGpu/BoundaryConditions/BoundaryCondition.h
index fe4078af95904fa5e1580b54f3aa2edbb006bd3d..9c3bac9c3e2795fa99f339461c6a7f2d16448696 100644
--- a/src/gpu/GksGpu/BoundaryConditions/BoundaryCondition.h
+++ b/src/gpu/GksGpu/BoundaryConditions/BoundaryCondition.h
@@ -47,13 +47,13 @@ struct GKSGPU_EXPORT BoundaryCondition : virtual public BoundaryConditionStruct,
     virtual bool isWall() = 0;
 
     virtual bool isFluxBC();
-    
+
     virtual bool isInsulated();
 
     virtual bool secondCellsNeeded();
 
     virtual void runBoundaryConditionKernel( const SPtr<DataBase> dataBase,
-                                             const Parameters parameters, 
+                                             const Parameters parameters,
                                              const uint level ) = 0;
 
     BoundaryConditionStruct toStruct()
diff --git a/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.cpp b/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.cpp
index a61a6ba3c5e6f5dbdc93f33f66ceacec1ee24a39..9557dbee8c2c7be6ed11bef3e995292c47d8c89a 100644
--- a/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.cpp
+++ b/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.cpp
@@ -156,7 +156,8 @@ void VTKFile::unloadFile()
     this->loaded = false;
 }
 
-void VTKFile::getData(real* data, uint numberOfNodes, const std::vector<uint>& readIndices, const std::vector<uint>& writeIndices, uint offsetRead, uint offsetWrite)
+void VTKFile::getData(real *data, uint numberOfNodes, const std::vector<uint> &readIndices,
+                      const std::vector<uint> &writeIndices, uint offsetRead, uint offsetWrite)
 {
     if(!this->loaded) loadFile();
 
@@ -305,7 +306,10 @@ void VTKReader::fillArrays(std::vector<real>& coordsY, std::vector<real>& coords
                     this->planeNeighbor0PM.push_back(writeIdx);
                     this->planeNeighbor0MP.push_back(writeIdx);
                     this->planeNeighbor0MM.push_back(writeIdx);
-                    found0PP = true; found0PM = true; found0MM = true; found0MP = true;
+                    found0PP = true;
+                    found0PM = true;
+                    found0MM = true;
+                    found0MP = true;
                 } 
                 else
                 {
@@ -325,40 +329,40 @@ void VTKReader::fillArrays(std::vector<real>& coordsY, std::vector<real>& coords
             
             if(!found0PP) //NT in simulation is EN in precursor
             {
-                int idx = file.findNeighborPPM(posY, posZ, 0.f);
-                if(idx!=-1)
+                int index = file.findNeighborPPM(posY, posZ, 0.f);
+                if(index!=-1)
                 {
                     found0PP = true;
-                    real dy = file.getX(idx)-posY;
-                    real dz = file.getY(idx)-posZ;
+                    real dy = file.getX(index)-posY;
+                    real dz = file.getY(index)-posZ;
                     this->weights0PP.emplace_back(1.f/(dy*dy+dz*dz+eps));
-                    this->planeNeighbor0PP.emplace_back(getWriteIndex(level, fileId, idx));
+                    this->planeNeighbor0PP.emplace_back(getWriteIndex(level, fileId, index));
                 }
             }
 
             if(!found0PM) //NB in simulation is ES in precursor
             {
-                int idx = file.findNeighborPMM(posY, posZ, 0.f);
-                if(idx!=-1)
+                int index = file.findNeighborPMM(posY, posZ, 0.f);
+                if(index!=-1)
                 {
                     found0PM = true;
-                    real dy = file.getX(idx)-posY;
-                    real dz = file.getY(idx)-posZ;
+                    real dy = file.getX(index)-posY;
+                    real dz = file.getY(index)-posZ;
                     this->weights0PM.emplace_back(1.f/(dy*dy+dz*dz+eps));
-                    this->planeNeighbor0PP.emplace_back(getWriteIndex(level, fileId, idx));
+                    this->planeNeighbor0PP.emplace_back(getWriteIndex(level, fileId, index));
                 }
             }
 
             if(!found0MP) //ST in simulation is WN in precursor
             {
-                int idx = file.findNeighborMPM(posY, posZ, 0.f);
-                if(idx!=-1)
+                int index = file.findNeighborMPM(posY, posZ, 0.f);
+                if(index!=-1)
                 {
                     found0MP = true;
-                    real dy = file.getX(idx)-posY;
-                    real dz = file.getY(idx)-posZ;
+                    real dy = file.getX(index)-posY;
+                    real dz = file.getY(index)-posZ;
                     this->weights0MP.emplace_back(1.f/(dy*dy+dz*dz+eps));
-                    this->planeNeighbor0MP.emplace_back(getWriteIndex(level, fileId, idx));
+                    this->planeNeighbor0MP.emplace_back(getWriteIndex(level, fileId, index));
                 }
             }
 
@@ -413,7 +417,7 @@ void VTKReader::getNextData(real* data, uint numberOfNodes, real time)
             {
                 numberOfFiles++;
 
-                printf("switching to precursor file no. %zd\n", numberOfFiles);
+                VF_LOG_INFO("PrecursorBC on level {}: switching to file no. {}\n", level, numberOfFiles);
                 if(numberOfFiles == this->fileCollection->files[level][id].size())
                     throw std::runtime_error("Not enough Precursor Files to read");
 
@@ -437,4 +441,4 @@ void VTKReader::getNextData(real* data, uint numberOfNodes, real time)
             this->nFile[level][id] = numberOfFiles;
         }
     // }
-}
\ No newline at end of file
+}
diff --git a/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.h b/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.h
index 5bee61e194670c74ca8bd8da87f3881956fff466..1663a3ff37ba1bb062647847462d4e364baed93b 100644
--- a/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.h
+++ b/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.h
@@ -32,7 +32,7 @@ struct Quantity
 class VTKFile
 {
 public: 
-    VTKFile(std::string _fileName): 
+    explicit VTKFile(std::string _fileName): 
     fileName(_fileName)
     {
         readHeader();
@@ -100,9 +100,9 @@ public:
 
     virtual ~FileCollection() = default;
 
-    virtual size_t getNumberOfQuantities()=0;
+    virtual size_t getNumberOfQuantities() = 0;
 
-    virtual FileType getFileType()=0;
+    virtual FileType getFileType() = 0;
 
 protected:
     std::string prefix;
@@ -118,8 +118,8 @@ public:
         findFiles();
     };
 
-    FileType getFileType(){ return FileType::VTK; };
-    size_t getNumberOfQuantities(){ return files[0][0][0].getNumberOfQuantities(); }
+    FileType getFileType() override{ return FileType::VTK; };
+    size_t getNumberOfQuantities() override{ return files[0][0][0].getNumberOfQuantities(); }
     
 
 private:
@@ -198,4 +198,4 @@ private:
 SPtr<FileCollection> createFileCollection(std::string prefix, FileType type);
 SPtr<TransientBCInputFileReader> createReaderForCollection(SPtr<FileCollection> fileCollection, uint readLevel);
 
-#endif //TRANSIENTBCSETTER_H_
\ No newline at end of file
+#endif //TRANSIENTBCSETTER_H_
diff --git a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp
index 0900c2d587ba9811c480427b833e7e083216cf10..043d8277b17c6a186f3efbeaab046bf35e5852db 100644
--- a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp
+++ b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp
@@ -1,28 +1,28 @@
 //=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __         
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
-//      \    \  |    |   ________________________________________________________________    
-//       \    \ |    |  |  ______________________________________________________________|   
-//        \    \|    |  |  |         __          __     __     __     ______      _______    
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
 //           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
 //
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can 
+//  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 
+//  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 
+//
+//  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/>.
 //
@@ -53,7 +53,7 @@ std::vector<real> Side::getNormal()
 }
 
 void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::string coord, real constant,
-                      real startInner, real endInner, real startOuter, real endOuter)
+                      real startInner, real endInner, real startOuter, real endOuter, real q)
 {
     for (real v2 = startOuter; v2 <= endOuter; v2 += grid->getDelta())
     {
@@ -65,14 +65,14 @@ void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition
                                             ||  grid->getFieldEntry(index) == vf::gpu::FLUID_CFC
                                             ||  grid->getFieldEntry(index) == vf::gpu::FLUID_CFF
                                             ||  grid->getFieldEntry(index) == vf::gpu::FLUID_FCC
-                                            ||  grid->getFieldEntry(index) == vf::gpu::FLUID_FCF 
                                             ||  grid->getFieldEntry(index) == vf::gpu::FLUID_FCF
-                                            
+                                            ||  grid->getFieldEntry(index) == vf::gpu::FLUID_FCF
+
                                             //! Enforce overlap of BCs on edge nodes
                                             ||  grid->getFieldEntry(index)  == vf::gpu::BC_PRESSURE
-                                            ||  grid->getFieldEntry(index)  == vf::gpu::BC_VELOCITY 
-                                            ||  grid->getFieldEntry(index)  == vf::gpu::BC_NOSLIP   
-                                            ||  grid->getFieldEntry(index)  == vf::gpu::BC_SLIP     
+                                            ||  grid->getFieldEntry(index)  == vf::gpu::BC_VELOCITY
+                                            ||  grid->getFieldEntry(index)  == vf::gpu::BC_NOSLIP
+                                            ||  grid->getFieldEntry(index)  == vf::gpu::BC_SLIP
                                             ||  grid->getFieldEntry(index)  == vf::gpu::BC_STRESS ))
             {
                 grid->setFieldEntry(index, boundaryCondition->getType());
@@ -80,7 +80,7 @@ void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition
                 setPressureNeighborIndices(boundaryCondition, grid, index);
                 setStressSamplingIndices(boundaryCondition, grid, index);
 
-                setQs(grid, boundaryCondition, index);
+                setQs(grid, boundaryCondition, index, q);
 
                 boundaryCondition->patches.push_back(0);
             }
@@ -136,7 +136,7 @@ void Side::setStressSamplingIndices(SPtr<BoundaryCondition> boundaryCondition, S
     }
 }
 
-void Side::setQs(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, uint index)
+void Side::setQs(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, uint index,  real q)
 {
 
     std::vector<real> qNode(grid->getEndDirection() + 1);
@@ -175,17 +175,17 @@ void Side::setQs(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, uin
         bool alignedWithNormal = (this->getNormal()[0]*grid->getDirection()[dir * DIMENSION + 0]+
                                   this->getNormal()[1]*grid->getDirection()[dir * DIMENSION + 1]+
                                   this->getNormal()[2]*grid->getDirection()[dir * DIMENSION + 2] ) > 0;
-        
+
         uint neighborIndex = grid->transCoordToIndex( neighborX, neighborY, neighborZ );
         if((grid->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID_BOUNDARY ||
             grid->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID          ||
             grid->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_SOLID)               &&
             alignedWithNormal )
-            qNode[dir] = 0.5;
+            qNode[dir] = q;
         else
             qNode[dir] = -1.0;
     }
-    
+
     boundaryCondition->qs.push_back(qNode);
 }
 
@@ -201,7 +201,7 @@ uint Side::getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1,
 }
 
 
-void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<BoundaryCondition> boundaryCondition)
+void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<BoundaryCondition> boundaryCondition, real q)
 {
     auto geometryBoundaryCondition = std::dynamic_pointer_cast<GeometryBoundaryCondition>(boundaryCondition);
 
@@ -214,7 +214,7 @@ void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<Bound
 
         for (int dir = 0; dir <= grids[level]->getEndDirection(); dir++)
         {
-			const real q = grids[level]->getQValue(index, dir);
+            const real q = grids[level]->getQValue(index, dir);
 
             qNode[dir] = q;
 
@@ -231,7 +231,7 @@ void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<Bound
             if( qNode[dir] < -0.5 && ( grids[level]->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID_BOUNDARY ||
                                        grids[level]->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID ||
                                        grids[level]->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_SOLID ) )
-                qNode[dir] = 0.5;
+                qNode[dir] = q;
         }
 
         geometryBoundaryCondition->indices.push_back(index);
@@ -242,7 +242,7 @@ void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<Bound
 
 
 
-void MX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition)
+void MX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q)
 {
     real startInner = grid[level]->getStartY();
     real endInner = grid[level]->getEndY();
@@ -254,11 +254,11 @@ void MX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond
 
     if( coordinateNormal > grid[0]->getStartX() + grid[0]->getDelta() ) return;
 
-    Side::addIndices(grid[level], boundaryCondition, "x", coordinateNormal, startInner, endInner, startOuter, endOuter);
+    Side::addIndices(grid[level], boundaryCondition, "x", coordinateNormal, startInner, endInner, startOuter, endOuter, q);
 
 }
 
-void PX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition)
+void PX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q)
 {
     real startInner = grid[level]->getStartY();
     real endInner = grid[level]->getEndY();
@@ -270,10 +270,10 @@ void PX::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond
 
     if( coordinateNormal < grid[0]->getEndX() - grid[0]->getDelta() ) return;
 
-    Side::addIndices(grid[level], boundaryCondition, "x", coordinateNormal, startInner, endInner, startOuter, endOuter);
+    Side::addIndices(grid[level], boundaryCondition, "x", coordinateNormal, startInner, endInner, startOuter, endOuter, q);
 }
 
-void MY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition)
+void MY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q)
 {
     real startInner = grid[level]->getStartX();
     real endInner = grid[level]->getEndX();
@@ -284,12 +284,12 @@ void MY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond
     real coordinateNormal = grid[level]->getStartY() + grid[level]->getDelta();
 
     if( coordinateNormal > grid[0]->getStartY() + grid[0]->getDelta() ) return;
-    
-    Side::addIndices(grid[level], boundaryCondition, "y", coordinateNormal, startInner, endInner, startOuter, endOuter);
+
+    Side::addIndices(grid[level], boundaryCondition, "y", coordinateNormal, startInner, endInner, startOuter, endOuter, q);
 }
 
 
-void PY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition)
+void PY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q)
 {
     real startInner = grid[level]->getStartX();
     real endInner = grid[level]->getEndX();
@@ -301,11 +301,11 @@ void PY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond
 
     if( coordinateNormal < grid[0]->getEndY() - grid[0]->getDelta() ) return;
 
-    Side::addIndices(grid[level], boundaryCondition, "y", coordinateNormal, startInner, endInner, startOuter, endOuter);
+    Side::addIndices(grid[level], boundaryCondition, "y", coordinateNormal, startInner, endInner, startOuter, endOuter, q);
 }
 
 
-void MZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition)
+void MZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q)
 {
     real startInner = grid[level]->getStartX();
     real endInner = grid[level]->getEndX();
@@ -317,10 +317,10 @@ void MZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond
 
     if( coordinateNormal > grid[0]->getStartZ() + grid[0]->getDelta() ) return;
 
-    Side::addIndices(grid[level], boundaryCondition, "z", coordinateNormal, startInner, endInner, startOuter, endOuter);
+    Side::addIndices(grid[level], boundaryCondition, "z", coordinateNormal, startInner, endInner, startOuter, endOuter, q);
 }
 
-void PZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition)
+void PZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCondition> boundaryCondition, real q)
 {
     real startInner = grid[level]->getStartX();
     real endInner = grid[level]->getEndX();
@@ -331,6 +331,6 @@ void PZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond
     real coordinateNormal = grid[level]->getEndZ() - grid[level]->getDelta();
 
     if( coordinateNormal < grid[0]->getEndZ() - grid[0]->getDelta() ) return;
-    
-    Side::addIndices(grid[level], boundaryCondition, "z", coordinateNormal, startInner, endInner, startOuter, endOuter);
+
+    Side::addIndices(grid[level], boundaryCondition, "z", coordinateNormal, startInner, endInner, startOuter, endOuter, q);
 }
diff --git a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.h b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.h
index 53a763bc562ee978042b28d24856fbcca256c5f9..57a7e4ee6d163b8af8c52e38e3baecd042dba391 100644
--- a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.h
+++ b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.h
@@ -65,7 +65,7 @@ class Side
 {
 public:
     virtual ~Side() = default;
-    virtual void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) = 0;
+    virtual void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) = 0;
 
     virtual int getCoordinate() const = 0;
     virtual int getDirection() const = 0;
@@ -76,13 +76,13 @@ public:
 
 protected:
     void addIndices(SPtr<Grid> grid, SPtr<gg::BoundaryCondition> boundaryCondition, std::string coord, real constant,
-                           real startInner, real endInner, real startOuter, real endOuter);
+                           real startInner, real endInner, real startOuter, real endOuter, real q);
 
     static void setPressureNeighborIndices(SPtr<gg::BoundaryCondition> boundaryCondition, SPtr<Grid> grid, const uint index);
 
     static void setStressSamplingIndices(SPtr<gg::BoundaryCondition> boundaryCondition, SPtr<Grid> grid, const uint index);
 
-    void setQs(SPtr<Grid> grid, SPtr<gg::BoundaryCondition> boundaryCondition, uint index);
+    void setQs(SPtr<Grid> grid, SPtr<gg::BoundaryCondition> boundaryCondition, uint index, real q);
 
 private:
     static uint getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1, real v2);
@@ -91,7 +91,7 @@ private:
 class Geometry : public Side
 {
 public:
-    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override;
+    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override;
 
     int getCoordinate() const override
     {
@@ -112,7 +112,7 @@ public:
 class MX : public Side
 {
 public:
-    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override;
+    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override;
 
     int getCoordinate() const override
     {
@@ -133,7 +133,7 @@ public:
 class PX : public Side
 {
 public:
-    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override;
+    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override;
 
     int getCoordinate() const override
     {
@@ -155,7 +155,7 @@ public:
 class MY : public Side
 {
 public:
-    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override;
+    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override;
 
     int getCoordinate() const override
     {
@@ -176,7 +176,7 @@ public:
 class PY : public Side
 {
 public:
-    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override;
+    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override;
 
     int getCoordinate() const override
     {
@@ -198,7 +198,7 @@ public:
 class MZ : public Side
 {
 public:
-    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override;
+    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override;
 
     int getCoordinate() const override
     {
@@ -219,7 +219,7 @@ public:
 class PZ : public Side
 {
 public:
-    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition) override;
+    void addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<gg::BoundaryCondition> boundaryCondition, real q = 0.5) override;
 
     int getCoordinate() const override
     {
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
index 065665d216e3cf7904530b94c8bb6480bb565c8a..f3d850384816f6690e5ffc158bbdc5e1df0ab328 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -163,4 +163,4 @@ public:
 
 };
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index ff6f4913e4cd8a32c05272ef583f90a2cf226edc..78a1ad88d9b5f11e7e38fbbcbb31440474b7928e 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -1,28 +1,28 @@
 //=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __         
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
-//      \    \  |    |   ________________________________________________________________    
-//       \    \ |    |  |  ______________________________________________________________|   
-//        \    \|    |  |  |         __          __     __     __     ______      _______    
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
 //           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
 //
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can 
+//  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 
+//  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 
+//
+//  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/>.
 //
@@ -105,17 +105,17 @@ void LevelGridBuilder::setSlipGeometryBoundaryCondition(real normalX, real norma
 
     for (uint level = 0; level < getNumberOfGridLevels(); level++)
     {
-		if (boundaryConditions[level]->geometryBoundaryCondition != nullptr)
-		{
-			boundaryConditions[level]->geometryBoundaryCondition->normalX = normalX;
-			boundaryConditions[level]->geometryBoundaryCondition->normalY = normalY;
-			boundaryConditions[level]->geometryBoundaryCondition->normalZ = normalZ;
-			boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition);
+        if (boundaryConditions[level]->geometryBoundaryCondition != nullptr)
+        {
+            boundaryConditions[level]->geometryBoundaryCondition->normalX = normalX;
+            boundaryConditions[level]->geometryBoundaryCondition->normalY = normalY;
+            boundaryConditions[level]->geometryBoundaryCondition->normalZ = normalZ;
+            boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition);
 
             boundaryConditions[level]->geometryBoundaryCondition->fillSlipNormalLists();
 
             *logging::out << logging::Logger::INFO_INTERMEDIATE << "Set Geometry Slip BC on level " << level << " with " << (int)boundaryConditions[level]->geometryBoundaryCondition->indices.size() <<"\n";
-		}
+        }
     }
 }
 
@@ -123,11 +123,11 @@ void LevelGridBuilder::setSlipGeometryBoundaryCondition(real normalX, real norma
 //! \brief Set stress boundary concdition using iMEM
 //! \param samplingOffset number of grid points above boundary where velocity for wall model is sampled
 //! \param z0 roughness length [m]
-//! \param dx dx of level 0 [m] 
+//! \param dx dx of level 0 [m]
 //!
-void LevelGridBuilder::setStressBoundaryCondition(  SideType sideType, 
-                                                    real nomalX, real normalY, real normalZ, 
-                                                    uint samplingOffset, real z0, real dx)
+void LevelGridBuilder::setStressBoundaryCondition(  SideType sideType,
+                                                    real nomalX, real normalY, real normalZ,
+                                                    uint samplingOffset, real z0, real dx, real q)
 {
     for (uint level = 0; level < getNumberOfGridLevels(); level++)
     {
@@ -135,7 +135,7 @@ void LevelGridBuilder::setStressBoundaryCondition(  SideType sideType,
         auto side = SideFactory::make(sideType);
 
         stressBoundaryCondition->side = side;
-        stressBoundaryCondition->side->addIndices(grids, level, stressBoundaryCondition);
+        stressBoundaryCondition->side->addIndices(grids, level, stressBoundaryCondition, q);
 
         stressBoundaryCondition->fillStressNormalLists();
         stressBoundaryCondition->fillSamplingOffsetLists();
@@ -178,17 +178,17 @@ void LevelGridBuilder::setVelocityGeometryBoundaryCondition(real vx, real vy, re
 
     for (uint level = 0; level < getNumberOfGridLevels(); level++)
     {
-		if (boundaryConditions[level]->geometryBoundaryCondition != nullptr)
-		{
-			boundaryConditions[level]->geometryBoundaryCondition->vx = vx;
-			boundaryConditions[level]->geometryBoundaryCondition->vy = vy;
-			boundaryConditions[level]->geometryBoundaryCondition->vz = vz;
-			boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition);
+        if (boundaryConditions[level]->geometryBoundaryCondition != nullptr)
+        {
+            boundaryConditions[level]->geometryBoundaryCondition->vx = vx;
+            boundaryConditions[level]->geometryBoundaryCondition->vy = vy;
+            boundaryConditions[level]->geometryBoundaryCondition->vz = vz;
+            boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition);
 
             boundaryConditions[level]->geometryBoundaryCondition->fillVelocityLists();
 
             *logging::out << logging::Logger::INFO_INTERMEDIATE << "Set Geometry Velocity BC on level " << level << " with " << (int)boundaryConditions[level]->geometryBoundaryCondition->indices.size() <<"\n";
-		}
+        }
     }
 }
 
@@ -230,7 +230,7 @@ void LevelGridBuilder::setNoSlipBoundaryCondition(SideType sideType)
             noSlipBoundaryCondition->fillVelocityLists();
 
             // now effectively just a wrapper for velocityBC with zero velocity. No distinction in Gridgenerator.
-            boundaryConditions[level]->velocityBoundaryConditions.push_back(noSlipBoundaryCondition); 
+            boundaryConditions[level]->velocityBoundaryConditions.push_back(noSlipBoundaryCondition);
         }
     }
 }
@@ -241,23 +241,23 @@ void LevelGridBuilder::setNoSlipGeometryBoundaryCondition()
 
     for (uint level = 0; level < getNumberOfGridLevels(); level++)
     {
-		if (boundaryConditions[level]->geometryBoundaryCondition != nullptr)
-		{
-			boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition);
+        if (boundaryConditions[level]->geometryBoundaryCondition != nullptr)
+        {
+            boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition);
 
             *logging::out << logging::Logger::INFO_INTERMEDIATE << "Set Geometry No-Slip BC on level " << level << " with " << (int)boundaryConditions[level]->geometryBoundaryCondition->indices.size() <<"\n";
-		}
+        }
     }
 }
 
-void LevelGridBuilder::setPrecursorBoundaryCondition(SideType sideType, SPtr<FileCollection> fileCollection, int timeStepsBetweenReads, 
+void LevelGridBuilder::setPrecursorBoundaryCondition(SideType sideType, SPtr<FileCollection> fileCollection, int timeStepsBetweenReads,
                                                         real velocityX, real velocityY, real velocityZ, std::vector<uint> fileLevelToGridLevelMap)
 {
-    if(fileLevelToGridLevelMap.empty())                         
+    if(fileLevelToGridLevelMap.empty())
     {
         *logging::out << logging::Logger::INFO_INTERMEDIATE << "Mapping precursor file levels to the corresponding grid levels" << "\n";
 
-        for (uint level = 0; level < getNumberOfGridLevels(); level++)  
+        for (uint level = 0; level < getNumberOfGridLevels(); level++)
             fileLevelToGridLevelMap.push_back(level);
     }
     else
@@ -413,9 +413,9 @@ std::shared_ptr<Grid> LevelGridBuilder::getGrid(int level, int box)
 void LevelGridBuilder::checkLevel(int level)
 {
     if (level >= (int)grids.size())
-    { 
+    {
         std::cout << "wrong level input... return to caller\n";
-        return; 
+        return;
     }
 }
 
@@ -426,16 +426,16 @@ void LevelGridBuilder::getDimensions(int &nx, int &ny, int &nz, const int level)
     nz = grids[level]->getNumberOfNodesZ();
 }
 
-void LevelGridBuilder::getNodeValues(real *xCoords, real *yCoords, real *zCoords, 
-                                     uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, 
+void LevelGridBuilder::getNodeValues(real *xCoords, real *yCoords, real *zCoords,
+                                     uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative,
                                      uint *geo, const int level) const
 {
     grids[level]->getNodeValues(xCoords, yCoords, zCoords, neighborX, neighborY, neighborZ, neighborNegative, geo);
 }
 
 
-GRIDGENERATOR_EXPORT void LevelGridBuilder::getFluidNodeIndices(uint *fluidNodeIndices, const int level) const 
-{ 
+GRIDGENERATOR_EXPORT void LevelGridBuilder::getFluidNodeIndices(uint *fluidNodeIndices, const int level) const
+{
     grids[level]->getFluidNodeIndices(fluidNodeIndices);
 }
 
@@ -444,9 +444,9 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::getFluidNodeIndicesBorder(uint *flui
     grids[level]->getFluidNodeIndicesBorder(fluidNodeIndices);
 }
 
-uint LevelGridBuilder::getNumberOfFluidNodes(unsigned int level) const 
+uint LevelGridBuilder::getNumberOfFluidNodes(unsigned int level) const
 {
-    return grids[level]->getNumberOfFluidNodes(); 
+    return grids[level]->getNumberOfFluidNodes();
 }
 
 GRIDGENERATOR_EXPORT uint LevelGridBuilder::getNumberOfFluidNodesBorder(unsigned int level) const
@@ -472,7 +472,7 @@ void LevelGridBuilder::getSlipValues(real* normalX, real* normalY, real* normalZ
         for (uint index = 0; index < boundaryCondition->indices.size(); index++)
         {
             indices[allIndicesCounter] = grids[level]->getSparseIndex(boundaryCondition->indices[index]) + 1;
-            
+
             normalX[allIndicesCounter] = boundaryCondition->getNormalx(index);
             normalY[allIndicesCounter] = boundaryCondition->getNormaly(index);
             normalZ[allIndicesCounter] = boundaryCondition->getNormalz(index);
@@ -507,9 +507,9 @@ uint LevelGridBuilder::getStressSize(int level) const
     return size;
 }
 
-void LevelGridBuilder::getStressValues( real* normalX, real* normalY, real* normalZ, 
-                                        real* vx,      real* vy,      real* vz, 
-                                        real* vx1,     real* vy1,     real* vz1, 
+void LevelGridBuilder::getStressValues( real* normalX, real* normalY, real* normalZ,
+                                        real* vx,      real* vy,      real* vz,
+                                        real* vx1,     real* vy1,     real* vz1,
                                         int* indices, int* samplingIndices, int* samplingOffset, real* z0, int level) const
 {
 
@@ -565,7 +565,7 @@ void LevelGridBuilder::getVelocityValues(real* vx, real* vy, real* vz, int* indi
     {
         for (uint i = 0; i < (uint)boundaryCondition->indices.size(); i++)
         {
-            indices[allIndicesCounter] = grids[level]->getSparseIndex(boundaryCondition->indices[i]) +1;  
+            indices[allIndicesCounter] = grids[level]->getSparseIndex(boundaryCondition->indices[i]) +1;
 
             vx[allIndicesCounter] = boundaryCondition->getVx(i);
             vy[allIndicesCounter] = boundaryCondition->getVy(i);
@@ -644,17 +644,17 @@ uint LevelGridBuilder::getPrecursorSize(int level) const
     return size;
 }
 
-void LevelGridBuilder::getPrecursorValues(  uint* neighbor0PP, uint* neighbor0PM, uint* neighbor0MP, uint* neighbor0MM, 
+void LevelGridBuilder::getPrecursorValues(  uint* neighbor0PP, uint* neighbor0PM, uint* neighbor0MP, uint* neighbor0MM,
                                             real* weights0PP, real* weights0PM, real* weights0MP, real* weights0MM,
-                                            int* indices, std::vector<SPtr<TransientBCInputFileReader>>& reader, 
-                                            int& numberOfPrecursorNodes, size_t& numberOfQuantities, uint& timeStepsBetweenReads, 
+                                            int* indices, std::vector<SPtr<TransientBCInputFileReader>>& reader,
+                                            int& numberOfPrecursorNodes, size_t& numberOfQuantities, uint& timeStepsBetweenReads,
                                             real& velocityX, real& velocityY, real& velocityZ, int level) const
 {
     int allIndicesCounter = 0;
     int allNodesCounter = 0;
     uint tmpTimeStepsBetweenReads = 0;
     size_t tmpNumberOfQuantities = 0;
-    
+
     for (auto boundaryCondition : boundaryConditions[level]->precursorBoundaryConditions)
     {
         if( tmpTimeStepsBetweenReads == 0 )
@@ -680,7 +680,7 @@ void LevelGridBuilder::getPrecursorValues(  uint* neighbor0PP, uint* neighbor0PM
         BCreader->getWeights(weights0PP, weights0PM, weights0MP, weights0MM);
         if(tmpNumberOfQuantities == 0)
             tmpNumberOfQuantities = BCreader->getNumberOfQuantities();
-        if(tmpNumberOfQuantities != BCreader->getNumberOfQuantities()) 
+        if(tmpNumberOfQuantities != BCreader->getNumberOfQuantities())
             throw std::runtime_error("All precursor files must have the same quantities.");
         allNodesCounter += BCreader->getNPointsRead();
         velocityX = boundaryCondition->getVelocityX();
@@ -692,7 +692,7 @@ void LevelGridBuilder::getPrecursorValues(  uint* neighbor0PP, uint* neighbor0PM
     if (tmpTimeStepsBetweenReads == 0)
         throw std::runtime_error("timeStepsBetweenReads of precursor needs to be larger than 0.");
     timeStepsBetweenReads = tmpTimeStepsBetweenReads;
-    
+
     if (tmpNumberOfQuantities == 0)
         throw std::runtime_error("Number of quantities in precursor needs to be larger than 0.");
     numberOfQuantities = tmpNumberOfQuantities;
@@ -718,7 +718,7 @@ uint LevelGridBuilder::getGeometrySize(int level) const
 {
     if (boundaryConditions[level]->geometryBoundaryCondition)
         return  (uint)boundaryConditions[level]->geometryBoundaryCondition->indices.size();
-    
+
     return 0;
 }
 
@@ -739,9 +739,9 @@ void LevelGridBuilder::getGeometryValues(real* vx, real* vy, real* vz, int level
 {
     for (uint i = 0; i < boundaryConditions[level]->geometryBoundaryCondition->indices.size(); i++)
     {
-		vx[i] = boundaryConditions[level]->geometryBoundaryCondition->getVx(i);
-		vy[i] = boundaryConditions[level]->geometryBoundaryCondition->getVy(i);
-		vz[i] = boundaryConditions[level]->geometryBoundaryCondition->getVz(i);
+        vx[i] = boundaryConditions[level]->geometryBoundaryCondition->getVx(i);
+        vy[i] = boundaryConditions[level]->geometryBoundaryCondition->getVy(i);
+        vz[i] = boundaryConditions[level]->geometryBoundaryCondition->getVz(i);
     }
 }
 
@@ -756,7 +756,7 @@ void LevelGridBuilder::getGeometryQs(real* qs[27], int level) const
     }
 }
 
-void LevelGridBuilder::writeArrows(std::string fileName) const 
+void LevelGridBuilder::writeArrows(std::string fileName) const
 {
     QLineWriter::writeArrows(fileName, boundaryConditions[getNumberOfGridLevels() - 1]->geometryBoundaryCondition, grids[getNumberOfGridLevels() - 1]);
 }
@@ -797,7 +797,7 @@ void LevelGridBuilder::findFluidNodes(bool splitDomain)
 }
 
 
-void LevelGridBuilder::addFluidNodeIndicesMacroVars(const std::vector<uint>& fluidNodeIndicesMacroVars, uint level) 
+void LevelGridBuilder::addFluidNodeIndicesMacroVars(const std::vector<uint>& fluidNodeIndicesMacroVars, uint level)
 {
     grids[level]->addFluidNodeIndicesMacroVars(fluidNodeIndicesMacroVars);
 }
@@ -827,17 +827,17 @@ void LevelGridBuilder::sortFluidNodeIndicesAllFeatures(uint level)
     grids[level]->sortFluidNodeIndicesAllFeatures();
 }
 
-uint LevelGridBuilder::getNumberOfFluidNodesMacroVars(unsigned int level) const 
+uint LevelGridBuilder::getNumberOfFluidNodesMacroVars(unsigned int level) const
 {
     return grids[level]->getNumberOfFluidNodeIndicesMacroVars();
 }
 
-void LevelGridBuilder::getFluidNodeIndicesMacroVars(uint *fluidNodeIndicesMacroVars, const int level) const 
+void LevelGridBuilder::getFluidNodeIndicesMacroVars(uint *fluidNodeIndicesMacroVars, const int level) const
 {
     grids[level]->getFluidNodeIndicesMacroVars(fluidNodeIndicesMacroVars);
 }
 
-uint LevelGridBuilder::getNumberOfFluidNodesApplyBodyForce(unsigned int level) const 
+uint LevelGridBuilder::getNumberOfFluidNodesApplyBodyForce(unsigned int level) const
 {
     return grids[level]->getNumberOfFluidNodeIndicesApplyBodyForce();
 }
@@ -855,4 +855,4 @@ uint LevelGridBuilder::getNumberOfFluidNodesAllFeatures(unsigned int level) cons
 void LevelGridBuilder::getFluidNodeIndicesAllFeatures(uint *fluidNodeIndicesAllFeatures, const int level) const
 {
     grids[level]->getFluidNodeIndicesAllFeatures(fluidNodeIndicesAllFeatures);
-}
\ No newline at end of file
+}
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index 56ae1e4fce6185591fba97f49ba504ced259aea5..52908de41b5a3df8373815bcdb1acf3fae8f85fd 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -1,28 +1,28 @@
 //=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __         
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
-//      \    \  |    |   ________________________________________________________________    
-//       \    \ |    |  |  ______________________________________________________________|   
-//        \    \|    |  |  |         __          __     __     __     ______      _______    
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
 //           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
 //
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can 
+//  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 
+//  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 
+//
+//  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/>.
 //
@@ -81,13 +81,13 @@ public:
     GRIDGENERATOR_EXPORT  ~LevelGridBuilder() override;
 
     GRIDGENERATOR_EXPORT void setSlipBoundaryCondition(SideType sideType, real nomalX, real normalY, real normalZ);
-    GRIDGENERATOR_EXPORT void setStressBoundaryCondition(SideType sideType, real nomalX, real normalY, real normalZ, uint samplingOffset, real z0, real dx);
+    GRIDGENERATOR_EXPORT void setStressBoundaryCondition(SideType sideType, real nomalX, real normalY, real normalZ, uint samplingOffset, real z0, real dx, real q = 0.5);
     GRIDGENERATOR_EXPORT void setVelocityBoundaryCondition(SideType sideType, real vx, real vy, real vz);
     GRIDGENERATOR_EXPORT void setPressureBoundaryCondition(SideType sideType, real rho);
     GRIDGENERATOR_EXPORT void setPeriodicBoundaryCondition(bool periodic_X, bool periodic_Y, bool periodic_Z);
     GRIDGENERATOR_EXPORT void setNoSlipBoundaryCondition(SideType sideType);
-    GRIDGENERATOR_EXPORT void setPrecursorBoundaryCondition(SideType sideType, SPtr<FileCollection> fileCollection, int timeStepsBetweenReads, 
-                                                            real velocityX=c0o1, real velocityY=c0o1, real velocityZ=c0o1,     
+    GRIDGENERATOR_EXPORT void setPrecursorBoundaryCondition(SideType sideType, SPtr<FileCollection> fileCollection, int timeStepsBetweenReads,
+                                                            real velocityX=c0o1, real velocityY=c0o1, real velocityZ=c0o1,
                                                             std::vector<uint> fileLevelToGridLevelMap = {});
 
     GRIDGENERATOR_EXPORT void setEnableFixRefinementIntoTheWall(bool enableFixRefinementIntoTheWall);
@@ -106,7 +106,7 @@ public:
     GRIDGENERATOR_EXPORT virtual void getFluidNodeIndicesBorder(uint *fluidNodeIndices, const int level) const override;
 
     GRIDGENERATOR_EXPORT virtual void getNodeValues(real *xCoords, real *yCoords, real *zCoords,
-                                         uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, 
+                                         uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative,
                                          uint *geo, const int level) const override;
     GRIDGENERATOR_EXPORT virtual void getDimensions(int &nx, int &ny, int &nz, const int level) const override;
 
@@ -116,12 +116,12 @@ public:
     GRIDGENERATOR_EXPORT virtual void getSlipQs(real* qs[27], int level) const override;
 
     GRIDGENERATOR_EXPORT uint getStressSize(int level) const override;
-    GRIDGENERATOR_EXPORT virtual void getStressValues(  real* normalX, real* normalY, real* normalZ, 
-                                                        real* vx,      real* vy,      real* vz, 
-                                                        real* vx1,     real* vy1,     real* vz1, 
+    GRIDGENERATOR_EXPORT virtual void getStressValues(  real* normalX, real* normalY, real* normalZ,
+                                                        real* vx,      real* vy,      real* vz,
+                                                        real* vx1,     real* vy1,     real* vz1,
                                                         int* indices, int* samplingIndices, int* samplingOffsets, real* z0, int level) const override;
     GRIDGENERATOR_EXPORT virtual void getStressQs(real* qs[27], int level) const override;
-        
+
     GRIDGENERATOR_EXPORT uint getVelocitySize(int level) const override;
     GRIDGENERATOR_EXPORT virtual void getVelocityValues(real* vx, real* vy, real* vz, int* indices, int level) const override;
     GRIDGENERATOR_EXPORT virtual void getVelocityQs(real* qs[27], int level) const override;
@@ -131,9 +131,9 @@ public:
     GRIDGENERATOR_EXPORT virtual void getPressureQs(real* qs[27], int level) const override;
 
     GRIDGENERATOR_EXPORT uint getPrecursorSize(int level) const override;
-    GRIDGENERATOR_EXPORT void getPrecursorValues(   uint* neighbor0PP, uint* neighbor0PM, uint* neighbor0MP, uint* neighbor0MM, 
-                                                    real* weights0PP, real* weights0PM, real* weights0MP, real* weights0MM, 
-                                                    int* indices, std::vector<SPtr<TransientBCInputFileReader>>& reader, 
+    GRIDGENERATOR_EXPORT void getPrecursorValues(   uint* neighbor0PP, uint* neighbor0PM, uint* neighbor0MP, uint* neighbor0MM,
+                                                    real* weights0PP, real* weights0PM, real* weights0MP, real* weights0MM,
+                                                    int* indices, std::vector<SPtr<TransientBCInputFileReader>>& reader,
                                                     int& numberOfPrecursorNodes, size_t& numberOfQuantities, uint& timeStepsBetweenReads,
                                                     real& velocityX, real& velocityY, real& velocityZ, int level) const override;
     GRIDGENERATOR_EXPORT virtual void getPrecursorQs(real* qs[27], int level) const override;
@@ -150,11 +150,11 @@ public:
     GRIDGENERATOR_EXPORT SPtr<GeometryBoundaryCondition> getGeometryBoundaryCondition(uint level) const override;
 
 protected:
-    
+
 
     struct BoundaryConditions
     {
-		BoundaryConditions() = default;
+        BoundaryConditions() = default;
 
         std::vector<SPtr<SlipBoundaryCondition>> slipBoundaryConditions;
 
@@ -174,7 +174,7 @@ protected:
 
     std::vector<std::shared_ptr<Grid> > grids;
     std::vector<SPtr<BoundaryConditions> > boundaryConditions;
-    
+
     std::array<uint, 6> communicationProcesses;
 
     void checkLevel(int level);
@@ -217,7 +217,7 @@ public:
     void addFluidNodeIndicesMacroVars(const std::vector<uint>& fluidNodeIndicesMacroVars, uint level) override;
     void addFluidNodeIndicesApplyBodyForce(const std::vector<uint>& fluidNodeIndicesApplyBodyForce, uint level) override;
     void addFluidNodeIndicesAllFeatures(const std::vector<uint>& fluidNodeIndicesAllFeatures, uint level) override;
-    
+
     void sortFluidNodeIndicesMacroVars(uint level) override;
     void sortFluidNodeIndicesApplyBodyForce(uint level) override;
     void sortFluidNodeIndicesAllFeatures(uint level) override;
@@ -231,4 +231,3 @@ public:
 };
 
 #endif
-
diff --git a/src/gpu/GridGenerator/grid/GridImp.cpp b/src/gpu/GridGenerator/grid/GridImp.cpp
index 24dd169e70288b9ae18a29c23dc0c74b14246e3f..e71e135c664dd3415163b870bc6544ea63e7490d 100644
--- a/src/gpu/GridGenerator/grid/GridImp.cpp
+++ b/src/gpu/GridGenerator/grid/GridImp.cpp
@@ -1,28 +1,28 @@
 //=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __         
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
-//      \    \  |    |   ________________________________________________________________    
-//       \    \ |    |  |  ______________________________________________________________|   
-//        \    \|    |  |  |         __          __     __     __     ______      _______    
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
 //           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
 //
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can 
+//  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 
+//  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 
+//
+//  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/>.
 //
@@ -33,7 +33,6 @@
 #include "GridImp.h"
 
 #include <iostream>
-#include <omp.h>
 #include <sstream>
 # include <algorithm>
 #include <cmath>
@@ -61,8 +60,8 @@ int DIRECTIONS[DIR_END_MAX][DIMENSION];
 
 using namespace vf::gpu;
 
-GridImp::GridImp(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, Distribution distribution, uint level) 
-            : object(object), 
+GridImp::GridImp(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, Distribution distribution, uint level)
+            : object(object),
     startX(startX),
     startY(startY),
     startZ(startZ),
@@ -135,7 +134,7 @@ void GridImp::inital(const SPtr<Grid> fineGrid, uint numberOfLayers)
 #pragma omp parallel for
     for (int index = 0; index < (int)this->size; index++)
         this->initalNodeToOutOfGrid(index);
-    
+
     if( this->innerRegionFromFinerGrid ){
         *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start setInnerBasedOnFinerGrid()\n";
         this->setInnerBasedOnFinerGrid(fineGrid);
@@ -147,12 +146,12 @@ void GridImp::inital(const SPtr<Grid> fineGrid, uint numberOfLayers)
 
     *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start addOverlap()\n";
     this->addOverlap();
-    
+
     *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start fixOddCells()\n";
 #pragma omp parallel for
     for (int index = 0; index < (int)this->size; index++)
         this->fixOddCell(index);
-    
+
     if( enableFixRefinementIntoTheWall )
     {
         *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start fixRefinementIntoWall()\n";
@@ -180,12 +179,12 @@ void GridImp::inital(const SPtr<Grid> fineGrid, uint numberOfLayers)
             }
         }
     }
-    
+
     *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start findEndOfGridStopperNodes()\n";
 #pragma omp parallel for
     for (int index = 0; index < (int)this->size; index++)
         this->findEndOfGridStopperNode(index);
-    
+
     *logging::out << logging::Logger::INFO_INTERMEDIATE
         << "Grid created: " << "from (" << this->startX << ", " << this->startY << ", " << this->startZ << ") to (" << this->endX << ", " << this->endY << ", " << this->endZ << ")\n"
         << "nodes: " << this->nx << " x " << this->ny << " x " << this->nz << " = " << this->size << "\n";
@@ -209,9 +208,9 @@ void GridImp::freeMemory()
     if( this->neighborIndexZ        != nullptr ) { delete[] this->neighborIndexZ;        this->neighborIndexZ        = nullptr; }
     if( this->neighborIndexNegative != nullptr ) { delete[] this->neighborIndexNegative; this->neighborIndexNegative = nullptr; }
     if( this->sparseIndices         != nullptr ) { delete[] this->sparseIndices;         this->sparseIndices         = nullptr; }
-	if( this->qIndices              != nullptr ) { delete[] this->qIndices;              this->qIndices              = nullptr; }
-	if( this->qValues               != nullptr ) { delete[] this->qValues;               this->qValues               = nullptr; }
-	if( this->qPatches              != nullptr ) { delete[] this->qPatches;              this->qPatches              = nullptr; }
+    if( this->qIndices              != nullptr ) { delete[] this->qIndices;              this->qIndices              = nullptr; }
+    if( this->qValues               != nullptr ) { delete[] this->qValues;               this->qValues               = nullptr; }
+    if( this->qPatches              != nullptr ) { delete[] this->qPatches;              this->qPatches              = nullptr; }
 
     field.freeMemory();
 }
@@ -254,7 +253,7 @@ void GridImp::discretize(Object* solidObject, char innerType, char outerType)
         this->sparseIndices[index] = index;
 
         if( this->getFieldEntry(index) == innerType ) continue;
-        
+
         real x, y, z;
         this->transIndexToCoords(index, x, y, z);
 
@@ -279,7 +278,7 @@ bool GridImp::isInside(const Cell& cell) const
 //    |       +-----+-----+-----+           | +-----+-----+-----+
 //    +---------+                           +---------+
 //               0     1     2                   0     1     2
-//              even      even                        even     
+//              even      even                        even
 //                   odd                        odd         odd
 //
 Cell GridImp::getOddCellFromIndex(uint index) const
@@ -349,7 +348,7 @@ void GridImp::addOverlap()
 void GridImp::setOverlapTmp( uint index )
 {
     if( this->field.is( index, INVALID_OUT_OF_GRID ) ){
-        
+
         if( this->hasNeighborOfType(index, FLUID) ){
             this->field.setFieldEntry( index, OVERLAP_TMP );
         }
@@ -380,7 +379,7 @@ void GridImp::fixRefinementIntoWall(uint xIndex, uint yIndex, uint zIndex, int d
     if(  this->xOddStart && ( dir == 1 || dir == -1 ) && ( xIndex % 2 == 0 && xIndex != 0 ) ) return;
     if(  this->yOddStart && ( dir == 2 || dir == -2 ) && ( yIndex % 2 == 0 && yIndex != 0 ) ) return;
     if(  this->zOddStart && ( dir == 3 || dir == -3 ) && ( zIndex % 2 == 0 && zIndex != 0 ) ) return;
-    
+
     //////////////////////////////////////////////////////////////////////////
 
     real dx{ 0.0 }, dy{ 0.0 }, dz{ 0.0 };
@@ -433,31 +432,31 @@ void GridImp::findStopperNode(uint index) // deprecated
 
 void GridImp::findEndOfGridStopperNode(uint index)
 {
-	if (isValidEndOfGridStopper(index)){
+    if (isValidEndOfGridStopper(index)){
         if( this->level != 0 )
-		    this->field.setFieldEntryToStopperOutOfGrid(index);
+            this->field.setFieldEntryToStopperOutOfGrid(index);
         else
             this->field.setFieldEntryToStopperOutOfGridBoundary(index);
     }
-    
-	if (isValidEndOfGridBoundaryStopper(index))
-		this->field.setFieldEntryToStopperOutOfGridBoundary(index);
+
+    if (isValidEndOfGridBoundaryStopper(index))
+        this->field.setFieldEntryToStopperOutOfGridBoundary(index);
 }
 
 void GridImp::findSolidStopperNode(uint index)
 {
-	if (isValidSolidStopper(index))
-		this->field.setFieldEntry(index, STOPPER_SOLID);
+    if (isValidSolidStopper(index))
+        this->field.setFieldEntry(index, STOPPER_SOLID);
 }
 
 void GridImp::findBoundarySolidNode(uint index)
 {
-	if (shouldBeBoundarySolidNode(index)) 
-	{
-		this->field.setFieldEntry(index, BC_SOLID);
-		this->qIndices[index] = this->numberOfSolidBoundaryNodes++;
-		//grid->setNumberOfSolidBoundaryNodes(grid->getNumberOfSolidBoundaryNodes() + 1);
-	}
+    if (shouldBeBoundarySolidNode(index))
+    {
+        this->field.setFieldEntry(index, BC_SOLID);
+        this->qIndices[index] = this->numberOfSolidBoundaryNodes++;
+        //grid->setNumberOfSolidBoundaryNodes(grid->getNumberOfSolidBoundaryNodes() + 1);
+    }
 }
 
 void GridImp::fixOddCell(uint index)
@@ -483,9 +482,9 @@ bool GridImp::isOutSideOfGrid(Cell &cell) const
 bool GridImp::contains(Cell &cell, char type) const
 {
     for (const auto point : cell) {
-		uint index = transCoordToIndex(point.x, point.y, point.z);
-		if (index == INVALID_INDEX)
-			continue;
+        uint index = transCoordToIndex(point.x, point.y, point.z);
+        if (index == INVALID_INDEX)
+            continue;
         if (field.is(index, type))
             return true;
     }
@@ -495,8 +494,8 @@ bool GridImp::contains(Cell &cell, char type) const
 bool GridImp::cellContainsOnly(Cell &cell, char type) const
 {
     for (const auto point : cell) {
-		uint index = transCoordToIndex(point.x, point.y, point.z);
-		if (index == INVALID_INDEX)
+        uint index = transCoordToIndex(point.x, point.y, point.z);
+        if (index == INVALID_INDEX)
             return false;
         if (!field.is(index, type))
             return false;
@@ -507,8 +506,8 @@ bool GridImp::cellContainsOnly(Cell &cell, char type) const
 bool GridImp::cellContainsOnly(Cell &cell, char typeA, char typeB) const
 {
     for (const auto point : cell) {
-		uint index = transCoordToIndex(point.x, point.y, point.z);
-		if (index == INVALID_INDEX)
+        uint index = transCoordToIndex(point.x, point.y, point.z);
+        if (index == INVALID_INDEX)
             return false;
         if (!field.is(index, typeA) && !field.is(index, typeB))
             return false;
@@ -524,91 +523,91 @@ const Object * GridImp::getObject() const
 void GridImp::setNodeTo(Cell &cell, char type)
 {
     for (const auto point : cell) {
-		uint index = transCoordToIndex(point.x, point.y, point.z);
-		if (index == INVALID_INDEX)
-			continue;
-		field.setFieldEntry(index, type);
+        uint index = transCoordToIndex(point.x, point.y, point.z);
+        if (index == INVALID_INDEX)
+            continue;
+        field.setFieldEntry(index, type);
     }
 }
 
 void GridImp::setNodeTo(uint index, char type)
 {
-	if( index != INVALID_INDEX )
-		field.setFieldEntry(index, type);
+    if( index != INVALID_INDEX )
+        field.setFieldEntry(index, type);
 }
 
 bool GridImp::isNode(uint index, char type) const
 {
     if( index != INVALID_INDEX )
-		return field.is(index, type);
+        return field.is(index, type);
 
     throw std::runtime_error("GridImp::isNode() -> index == INVALID_INDEX not supported.");
 }
 
 bool GridImp::isValidEndOfGridStopper(uint index) const
 {
-	// Lenz: also includes corner stopper nodes
-	if (!this->field.is(index, INVALID_OUT_OF_GRID))
-		return false;
+    // Lenz: also includes corner stopper nodes
+    if (!this->field.is(index, INVALID_OUT_OF_GRID))
+        return false;
 
-	return hasNeighborOfType(index, FLUID);
+    return hasNeighborOfType(index, FLUID);
 }
 
 bool GridImp::isValidEndOfGridBoundaryStopper(uint index) const
 {
-	// Lenz: also includes corner stopper nodes
-	if (!this->field.is(index, FLUID))
-		return false;
+    // Lenz: also includes corner stopper nodes
+    if (!this->field.is(index, FLUID))
+        return false;
 
-	return ! hasAllNeighbors(index);
+    return ! hasAllNeighbors(index);
 }
 
 bool GridImp::isValidSolidStopper(uint index) const
 {
-	// Lenz: also includes corner stopper nodes
-	if (!this->field.is(index, INVALID_SOLID))
-		return false;
+    // Lenz: also includes corner stopper nodes
+    if (!this->field.is(index, INVALID_SOLID))
+        return false;
 
-	return hasNeighborOfType(index, FLUID);
+    return hasNeighborOfType(index, FLUID);
 }
 
 bool GridImp::shouldBeBoundarySolidNode(uint index) const
 {
-	if (!this->field.is(index, FLUID))
-		return false;
+    if (!this->field.is(index, FLUID))
+        return false;
 
-	return hasNeighborOfType(index, STOPPER_SOLID);
+    return hasNeighborOfType(index, STOPPER_SOLID);
 }
 
 bool GridImp::hasAllNeighbors(uint index) const
 {
-	// new version by Lenz, utilizes the range based for loop for all directions
-	real x, y, z;
-	this->transIndexToCoords(index, x, y, z);
-	for (const auto dir : this->distribution) {
-		const uint neighborIndex = this->transCoordToIndex(x + dir[0] * this->getDelta(), y + dir[1] * this->getDelta(), z + dir[2] * this->getDelta());
+    // new version by Lenz, utilizes the range based for loop for all directions
+    real x, y, z;
+    this->transIndexToCoords(index, x, y, z);
+    for (const auto dir : this->distribution) {
+        const uint neighborIndex = this->transCoordToIndex(x + dir[0] * this->getDelta(), y + dir[1] * this->getDelta(), z + dir[2] * this->getDelta());
 
-		if (neighborIndex == INVALID_INDEX) return false;
-	}
+        if (neighborIndex == INVALID_INDEX) return false;
+    }
 
-	return true;
+    return true;
 }
 
 bool GridImp::hasNeighborOfType(uint index, char type) const
 {
-	// new version by Lenz, utilizes the range based for loop for all directions
-	real x, y, z;
-	this->transIndexToCoords(index, x, y, z);
-	for (const auto dir : this->distribution) {
-		const uint neighborIndex = this->transCoordToIndex(x + dir[0] * this->getDelta(), y + dir[1] * this->getDelta(), z + dir[2] * this->getDelta());
+    // new version by Lenz, utilizes the range based for loop for all directions
+    real x, y, z;
+    this->transIndexToCoords(index, x, y, z);
+    for (const auto dir : this->distribution) {
+        const uint neighborIndex = this->transCoordToIndex(x + dir[0] * this->getDelta(), y + dir[1] * this->getDelta(), z + dir[2] * this->getDelta());
 
-		if (neighborIndex == INVALID_INDEX) continue;
+        if (neighborIndex == INVALID_INDEX) continue;
 
-		if (this->field.is(neighborIndex, type))
-			return true;
-	}
+        if (this->field.is(neighborIndex, type))
+            return true;
+    }
 
-	return false;
+    return false;
 }
 
 bool GridImp::nodeInNextCellIs(int index, char type) const
@@ -630,13 +629,13 @@ bool GridImp::nodeInNextCellIs(int index, char type) const
 
     const uint indexXYZ = transCoordToIndex(neighborX, neighborY, neighborZ);
 
-	const bool typeX   = indexX   == INVALID_INDEX ? false : this->field.is(indexX, type);
-	const bool typeY   = indexY   == INVALID_INDEX ? false : this->field.is(indexY, type);
-	const bool typeXY  = indexXY  == INVALID_INDEX ? false : this->field.is(indexXY, type);
-	const bool typeZ   = indexZ   == INVALID_INDEX ? false : this->field.is(indexZ, type);
-	const bool typeYZ  = indexYZ  == INVALID_INDEX ? false : this->field.is(indexYZ, type);
-	const bool typeXZ  = indexXZ  == INVALID_INDEX ? false : this->field.is(indexXZ, type);
-	const bool typeXYZ = indexXYZ == INVALID_INDEX ? false : this->field.is(indexXYZ, type);
+    const bool typeX   = indexX   == INVALID_INDEX ? false : this->field.is(indexX, type);
+    const bool typeY   = indexY   == INVALID_INDEX ? false : this->field.is(indexY, type);
+    const bool typeXY  = indexXY  == INVALID_INDEX ? false : this->field.is(indexXY, type);
+    const bool typeZ   = indexZ   == INVALID_INDEX ? false : this->field.is(indexZ, type);
+    const bool typeYZ  = indexYZ  == INVALID_INDEX ? false : this->field.is(indexYZ, type);
+    const bool typeXZ  = indexXZ  == INVALID_INDEX ? false : this->field.is(indexXZ, type);
+    const bool typeXYZ = indexXYZ == INVALID_INDEX ? false : this->field.is(indexXYZ, type);
 
     return typeX || typeY || typeXY || typeZ || typeYZ
         || typeXZ || typeXYZ;
@@ -661,13 +660,13 @@ bool GridImp::nodeInPreviousCellIs(int index, char type) const
 
     const uint indexXYZ = transCoordToIndex(neighborX, neighborY, neighborZ);
 
-	const bool typeX   = indexX   == INVALID_INDEX ? false : this->field.is(indexX  , type);
-	const bool typeY   = indexY   == INVALID_INDEX ? false : this->field.is(indexY  , type);
-	const bool typeXY  = indexXY  == INVALID_INDEX ? false : this->field.is(indexXY , type);
-	const bool typeZ   = indexZ   == INVALID_INDEX ? false : this->field.is(indexZ  , type);
-	const bool typeYZ  = indexYZ  == INVALID_INDEX ? false : this->field.is(indexYZ , type);
-	const bool typeXZ  = indexXZ  == INVALID_INDEX ? false : this->field.is(indexXZ , type);
-	const bool typeXYZ = indexXYZ == INVALID_INDEX ? false : this->field.is(indexXYZ, type);
+    const bool typeX   = indexX   == INVALID_INDEX ? false : this->field.is(indexX  , type);
+    const bool typeY   = indexY   == INVALID_INDEX ? false : this->field.is(indexY  , type);
+    const bool typeXY  = indexXY  == INVALID_INDEX ? false : this->field.is(indexXY , type);
+    const bool typeZ   = indexZ   == INVALID_INDEX ? false : this->field.is(indexZ  , type);
+    const bool typeYZ  = indexYZ  == INVALID_INDEX ? false : this->field.is(indexYZ , type);
+    const bool typeXZ  = indexXZ  == INVALID_INDEX ? false : this->field.is(indexXZ , type);
+    const bool typeXYZ = indexXYZ == INVALID_INDEX ? false : this->field.is(indexXYZ, type);
 
     return typeX || typeY || typeXY || typeZ || typeYZ
         || typeXZ || typeXYZ;
@@ -678,8 +677,8 @@ bool GridImp::nodeInCellIs(Cell& cell, char type) const
     for (const auto node : cell)
     {
         const uint index = transCoordToIndex(node.x, node.y, node.z);
-		if (index == INVALID_INDEX)
-			continue;
+        if (index == INVALID_INDEX)
+            continue;
         if (field.is(index, type))
             return true;
     }
@@ -696,9 +695,9 @@ void GridImp::setCellTo(uint index, char type)
     for (const auto node : cell)
     {
         const uint nodeIndex = transCoordToIndex(node.x, node.y, node.z);
-		if (nodeIndex == INVALID_INDEX)
-			continue;
-		this->field.setFieldEntry(nodeIndex, type);
+        if (nodeIndex == INVALID_INDEX)
+            continue;
+        this->field.setFieldEntry(nodeIndex, type);
     }
 }
 
@@ -712,10 +711,10 @@ void GridImp::setNonStopperOutOfGridCellTo(uint index, char type)
     for (const auto node : cell)
     {
         const uint nodeIndex = transCoordToIndex(node.x, node.y, node.z);
-		if (nodeIndex == INVALID_INDEX)
-			continue;
+        if (nodeIndex == INVALID_INDEX)
+            continue;
 
-        if( this->getFieldEntry( nodeIndex ) != STOPPER_OUT_OF_GRID && 
+        if( this->getFieldEntry( nodeIndex ) != STOPPER_OUT_OF_GRID &&
             this->getFieldEntry( nodeIndex ) != STOPPER_OUT_OF_GRID_BOUNDARY )
             this->field.setFieldEntry(nodeIndex, type);
     }
@@ -770,7 +769,7 @@ uint GridImp::transCoordToIndex(const real &x, const real &y, const real &z) con
     const uint yIndex = getYIndex(y);
     const uint zIndex = getZIndex(z);
 
-	if (xIndex >= nx || yIndex >= ny || zIndex >= nz)
+    if (xIndex >= nx || yIndex >= ny || zIndex >= nz)
         return INVALID_INDEX;
 
     return xIndex + nx * (yIndex + ny * zIndex);
@@ -819,20 +818,20 @@ TriangularMeshDiscretizationStrategy * GridImp::getTriangularMeshDiscretizationS
 
 uint GridImp::getNumberOfSolidBoundaryNodes() const
 {
-	return this->numberOfSolidBoundaryNodes;
+    return this->numberOfSolidBoundaryNodes;
 }
 
 void GridImp::setNumberOfSolidBoundaryNodes(uint numberOfSolidBoundaryNodes)
 {
-	if (numberOfSolidBoundaryNodes < INVALID_INDEX)
-		this->numberOfSolidBoundaryNodes = numberOfSolidBoundaryNodes;
+    if (numberOfSolidBoundaryNodes < INVALID_INDEX)
+        this->numberOfSolidBoundaryNodes = numberOfSolidBoundaryNodes;
 }
 
 real GridImp::getQValue(const uint index, const uint dir) const
 {
-	const int qIndex = dir * this->numberOfSolidBoundaryNodes + this->qIndices[index];
+    const int qIndex = dir * this->numberOfSolidBoundaryNodes + this->qIndices[index];
 
-	return this->qValues[qIndex];
+    return this->qValues[qIndex];
 }
 
 uint GridImp::getQPatch(const uint index) const
@@ -858,7 +857,7 @@ void GridImp::findSparseIndices(SPtr<Grid> finerGrid)
 {
     *logging::out << logging::Logger::INFO_INTERMEDIATE << "Find sparse indices...";
     auto fineGrid = std::static_pointer_cast<GridImp>(finerGrid);
-    
+
     this->updateSparseIndices();
 
 #pragma omp parallel for
@@ -906,7 +905,7 @@ void GridImp::updateSparseIndices()
     sparseSize = size - removedNodes;
 }
 
-void GridImp::findFluidNodeIndices(bool splitDomain) 
+void GridImp::findFluidNodeIndices(bool splitDomain)
 {
     // find sparse index of all fluid nodes
     this->fluidNodeIndices.clear();
@@ -935,7 +934,7 @@ void GridImp::findFluidNodeIndicesBorder() {
     // resize fluidNodeIndicesBorder (for better performance in copy operation)
     size_t newSize = 0;
     for (CommunicationIndices& ci : this->communicationIndices)
-        newSize += ci.sendIndices.size();    
+        newSize += ci.sendIndices.size();
     this->fluidNodeIndicesBorder.reserve(newSize);
 
     // copy all send indices to fluidNodeIndicesBorder
@@ -968,7 +967,7 @@ void GridImp::setNeighborIndices(uint index)
         this->setStopperNeighborCoords(index);
         return;
     }
-     
+
     if (this->sparseIndices[index] == -1)
         return;
 
@@ -1002,9 +1001,9 @@ void GridImp::setStopperNeighborCoords(uint index)
     if (vf::Math::lessEqual(z + delta, endZ + (0.5 * delta)) && !this->field.isInvalidOutOfGrid(this->transCoordToIndex(x, y, z + delta)))
         neighborIndexZ[index] = getSparseIndex(x, y, z + delta);
 
-    if (vf::Math::greaterEqual(x - delta, endX) && 
-        vf::Math::greaterEqual(y - delta, endY) && 
-        vf::Math::greaterEqual(z - delta, endZ) && 
+    if (vf::Math::greaterEqual(x - delta, endX) &&
+        vf::Math::greaterEqual(y - delta, endY) &&
+        vf::Math::greaterEqual(z - delta, endZ) &&
         !this->field.isInvalidOutOfGrid(this->transCoordToIndex(x - delta, y - delta, z - delta)))
     {
         neighborIndexNegative[index] = getSparseIndex(x - delta, y - delta, z - delta);
@@ -1035,7 +1034,7 @@ real GridImp::getNeighborCoord(bool periodicity, real startCoord, real coords[3]
             return coords[direction] + delta;
 
     }
-    
+
     return coords[direction] + delta;
 }
 
@@ -1061,7 +1060,7 @@ real GridImp::getNegativeNeighborCoord(bool periodicity, real startCoord, real c
 
         return getLastFluidNode(coords, direction, startCoord);
     }
-    
+
     return coords[direction] - delta;
 }
 
@@ -1154,15 +1153,15 @@ void GridImp::limitToSubDomain(SPtr<BoundingBox> subDomainBox, LbmOrGks lbmOrGks
             // one layer for receive nodes and one for stoppers
             if( lbmOrGks == LBM )
                 tmpSubDomainBox.extend(this->delta);
-            
-            if (!tmpSubDomainBox.isInside(x, y, z) 
+
+            if (!tmpSubDomainBox.isInside(x, y, z)
                 && ( this->getFieldEntry(index) == FLUID ||
                      this->getFieldEntry(index) == FLUID_CFC ||
                      this->getFieldEntry(index) == FLUID_CFF ||
                      this->getFieldEntry(index) == FLUID_FCC ||
                      this->getFieldEntry(index) == FLUID_FCF ||
                      this->getFieldEntry(index) == BC_SOLID ) )
-            {   
+            {
                 this->setFieldEntry(index, STOPPER_OUT_OF_GRID_BOUNDARY);
             }
         }
@@ -1184,13 +1183,13 @@ void GridImp::limitToSubDomain(SPtr<BoundingBox> subDomainBox, LbmOrGks lbmOrGks
 
 void GridImp::findGridInterfaceCF(uint index, GridImp& finerGrid, LbmOrGks lbmOrGks)
 {
-	if (lbmOrGks == LBM)
-	{
-		gridInterface->findInterfaceCF            (index, this, &finerGrid);
-		gridInterface->findBoundaryGridInterfaceCF(index, this, &finerGrid);
-	}
-	else if (lbmOrGks == GKS)
-		gridInterface->findInterfaceCF_GKS(index, this, &finerGrid);
+    if (lbmOrGks == LBM)
+    {
+        gridInterface->findInterfaceCF            (index, this, &finerGrid);
+        gridInterface->findBoundaryGridInterfaceCF(index, this, &finerGrid);
+    }
+    else if (lbmOrGks == GKS)
+        gridInterface->findInterfaceCF_GKS(index, this, &finerGrid);
 }
 
 void GridImp::findGridInterfaceFC(uint index, GridImp& finerGrid)
@@ -1217,16 +1216,16 @@ void GridImp::mesh(Object* object)
     if (triangularMesh)
         triangularMeshDiscretizationStrategy->discretize(triangularMesh, this, INVALID_SOLID, FLUID);
     else
-		//new method for geometric primitives (not cell based) to be implemented
+        //new method for geometric primitives (not cell based) to be implemented
         this->discretize(object, INVALID_SOLID, FLUID);
 
     this->closeNeedleCells();
 
-	#pragma omp parallel for
+    #pragma omp parallel for
     for (int index = 0; index < (int)this->size; index++)
         this->findSolidStopperNode(index);
 
-	//#pragma omp parallel for
+    //#pragma omp parallel for
     for (int index = 0; index < (int)this->size; index++) {
         this->findBoundarySolidNode(index);
     }
@@ -1359,7 +1358,7 @@ void GridImp::findQs(Object* object) //TODO: enable qs for primitive objects
         findQsPrimitive(object);
 }
 
-void GridImp::allocateQs() 
+void GridImp::allocateQs()
 {
     this->qPatches = new uint[this->getNumberOfSolidBoundaryNodes()];
 
@@ -1379,8 +1378,8 @@ void GridImp::findQs(TriangularMesh &triangularMesh)
 
     if( this->qComputationStage == qComputationStageType::ComputeQs )
         allocateQs();
-    
-    
+
+
 #pragma omp parallel for
     for (int i = 0; i < triangularMesh.size; i++)
         this->findQs(triangularMesh.triangles[i]);
@@ -1406,15 +1405,15 @@ void GridImp::findQs(Triangle &triangle)
                 //if (!field.isFluid(index))
                 //    continue;
 
-				if( index == INVALID_INDEX ) continue;
+                if( index == INVALID_INDEX ) continue;
 
                 const Vertex point(x, y, z);
 
                 if( this->qComputationStage == qComputationStageType::ComputeQs ){
                     if(this->field.is(index, BC_SOLID))
                     {
-					    calculateQs(index, point, triangle);
-				    }
+                        calculateQs(index, point, triangle);
+                    }
                 }
                 else if( this->qComputationStage == qComputationStageType::FindSolidBoundaryNodes )
                 {
@@ -1449,14 +1448,14 @@ void GridImp::findQsPrimitive(Object * object)
         real x,y,z;
 
         this->transIndexToCoords(index,x,y,z);
-        
+
         const Vertex point(x, y, z);
 
         if( this->qComputationStage == qComputationStageType::ComputeQs ){
             if(this->field.is(index, BC_SOLID))
             {
-				calculateQs(index, point, object);
-			}
+                calculateQs(index, point, object);
+            }
         }
         else if( this->qComputationStage == qComputationStageType::FindSolidBoundaryNodes )
         {
@@ -1477,66 +1476,66 @@ void GridImp::calculateQs(const uint index, const Vertex &point, Object* object)
 {
     Vertex pointOnTriangle, direction;
 
-	real subdistance;
-	int error;
-	for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
-	{
-		direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), 
+    real subdistance;
+    int error;
+    for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
+    {
+        direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]),
                             real(distribution.dirs[i * DIMENSION + 1]),
-			                real(distribution.dirs[i * DIMENSION + 2]) );
+                            real(distribution.dirs[i * DIMENSION + 2]) );
 
-		uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
-													    point.y + direction.y * this->delta,
-													    point.z + direction.z * this->delta);
+        uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
+                                                        point.y + direction.y * this->delta,
+                                                        point.z + direction.z * this->delta);
 
-		if (neighborIndex == INVALID_INDEX) continue;
+        if (neighborIndex == INVALID_INDEX) continue;
 
-		error = object->getIntersection(point, direction, pointOnTriangle, subdistance);
+        error = object->getIntersection(point, direction, pointOnTriangle, subdistance);
 
-		subdistance /= this->delta;
+        subdistance /= this->delta;
 
-		if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
-		{
-			if ( -0.5        > this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] ||
+        if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
+        {
+            if ( -0.5        > this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] ||
                     subdistance < this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] )
-			{
+            {
+
+                this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance;
 
-				this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance;
-                    
                 this->qPatches[ this->qIndices[index] ] = 0;
 
-			}
-		}
-	}
+            }
+        }
+    }
 }
 
 bool GridImp::checkIfAtLeastOneValidQ(const uint index, const Vertex &point, Object* object) const
 {
     Vertex pointOnTriangle, direction;
 
-	real subdistance;
-	int error;
-	for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
-	{
-		direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), 
+    real subdistance;
+    int error;
+    for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
+    {
+        direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]),
                             real(distribution.dirs[i * DIMENSION + 1]),
-			                real(distribution.dirs[i * DIMENSION + 2]) );
+                            real(distribution.dirs[i * DIMENSION + 2]) );
 
-		uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
-													 point.y + direction.y * this->delta,
-													 point.z + direction.z * this->delta);
+        uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
+                                                     point.y + direction.y * this->delta,
+                                                     point.z + direction.z * this->delta);
 
-		if (neighborIndex == INVALID_INDEX) continue;
+        if (neighborIndex == INVALID_INDEX) continue;
 
-		error = object->getIntersection(point, direction, pointOnTriangle, subdistance);
+        error = object->getIntersection(point, direction, pointOnTriangle, subdistance);
 
-		subdistance /= this->delta;
+        subdistance /= this->delta;
 
-		if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
-		{
-			return true;
-		}
-	}
+        if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
+        {
+            return true;
+        }
+    }
     return false;
 }
 
@@ -1565,7 +1564,7 @@ void GridImp::calculateQs(const Vertex &point, const Triangle &triangle) const
 
         error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance);
 
-		subdistance /= this->delta;
+        subdistance /= this->delta;
 
         if (error == 0 && subdistance < 1.0 && subdistance > 0.0)
         {
@@ -1577,71 +1576,71 @@ void GridImp::calculateQs(const Vertex &point, const Triangle &triangle) const
 
 void GridImp::calculateQs(const uint index, const Vertex &point, const Triangle &triangle) const
 {
-	Vertex pointOnTriangle, direction;
-	real subdistance;
-	int error;
-	for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
-	{
+    Vertex pointOnTriangle, direction;
+    real subdistance;
+    int error;
+    for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
+    {
 #if defined(__CUDA_ARCH__)
-		direction = Vertex(DIRECTIONS[i][0], DIRECTIONS[i][1], DIRECTIONS[i][2]);
+        direction = Vertex(DIRECTIONS[i][0], DIRECTIONS[i][1], DIRECTIONS[i][2]);
 #else
-		direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), 
+        direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]),
                             real(distribution.dirs[i * DIMENSION + 1]),
-			                real(distribution.dirs[i * DIMENSION + 2]) );
+                            real(distribution.dirs[i * DIMENSION + 2]) );
 #endif
 
-		uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
-													 point.y + direction.y * this->delta,
-													 point.z + direction.z * this->delta);
+        uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
+                                                     point.y + direction.y * this->delta,
+                                                     point.z + direction.z * this->delta);
 
-		if (neighborIndex == INVALID_INDEX) continue;
+        if (neighborIndex == INVALID_INDEX) continue;
 
-		error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance);
+        error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance);
 
-		subdistance /= this->delta;
+        subdistance /= this->delta;
 
-		if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
-		{
-			if ( -0.5        > this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] ||
+        if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
+        {
+            if ( -0.5        > this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] ||
                  subdistance < this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] )
-			{
-				this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance;
+            {
+                this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance;
 
                 this->qPatches[ this->qIndices[index] ] = triangle.patchIndex;
-			}
-		}
-	}
+            }
+        }
+    }
 }
 
 bool GridImp::checkIfAtLeastOneValidQ(const uint index, const Vertex & point, const Triangle & triangle) const
 {
-	Vertex pointOnTriangle, direction;
-	real subdistance;
-	int error;
-	for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
-	{
+    Vertex pointOnTriangle, direction;
+    real subdistance;
+    int error;
+    for (int i = distribution.dir_start; i <= distribution.dir_end; i++)
+    {
 #if defined(__CUDA_ARCH__)
-		direction = Vertex(DIRECTIONS[i][0], DIRECTIONS[i][1], DIRECTIONS[i][2]);
+        direction = Vertex(DIRECTIONS[i][0], DIRECTIONS[i][1], DIRECTIONS[i][2]);
 #else
-		direction = Vertex(real(distribution.dirs[i * DIMENSION + 0]), 
+        direction = Vertex(real(distribution.dirs[i * DIMENSION + 0]),
                            real(distribution.dirs[i * DIMENSION + 1]),
-			               real(distribution.dirs[i * DIMENSION + 2]));
+                           real(distribution.dirs[i * DIMENSION + 2]));
 #endif
 
-		uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
-													 point.y + direction.y * this->delta,
-													 point.z + direction.z * this->delta);
-		if (neighborIndex == INVALID_INDEX) continue;
+        uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta,
+                                                     point.y + direction.y * this->delta,
+                                                     point.z + direction.z * this->delta);
+        if (neighborIndex == INVALID_INDEX) continue;
 
-		error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance);
+        error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance);
 
-		subdistance /= this->delta;
+        subdistance /= this->delta;
 
-		if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
-		{
-			return true;
-		}
-	}
+        if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0))
+        {
+            return true;
+        }
+    }
     return false;
 }
 
@@ -1670,13 +1669,13 @@ void GridImp::findCommunicationIndices(int direction, SPtr<BoundingBox> subDomai
 
 void GridImp::findCommunicationIndex( uint index, real coordinate, real limit, int direction ){
     // negative direction get a negative sign
-    real s = ( direction % 2 == 0 ) ? ( -1.0 ) : ( 1.0 );  
+    real s = ( direction % 2 == 0 ) ? ( -1.0 ) : ( 1.0 );
 
-	if (std::abs(coordinate - (limit + s * 0.5 * this->delta)) < 0.1 * this->delta)
-		this->communicationIndices[direction].receiveIndices.push_back(index);
+    if (std::abs(coordinate - (limit + s * 0.5 * this->delta)) < 0.1 * this->delta)
+        this->communicationIndices[direction].receiveIndices.push_back(index);
 
-	if (std::abs(coordinate - (limit - s * 0.5 * this->delta)) < 0.1 * this->delta) 
-		this->communicationIndices[direction].sendIndices.push_back(index);
+    if (std::abs(coordinate - (limit - s * 0.5 * this->delta)) < 0.1 * this->delta)
+        this->communicationIndices[direction].sendIndices.push_back(index);
 }
 
 bool GridImp::isSendNode(int index) const
@@ -1722,14 +1721,14 @@ uint GridImp::getReceiveIndex(int direction, uint index)
 
 void GridImp::repairCommunicationIndices(int direction)
 {
-    this->communicationIndices[direction].sendIndices.insert( this->communicationIndices[direction].sendIndices.end(), 
-                                                              this->communicationIndices[direction+1].sendIndices.begin(), 
+    this->communicationIndices[direction].sendIndices.insert( this->communicationIndices[direction].sendIndices.end(),
+                                                              this->communicationIndices[direction+1].sendIndices.begin(),
                                                               this->communicationIndices[direction+1].sendIndices.end() );
 
 
 
-    this->communicationIndices[direction+1].receiveIndices.insert( this->communicationIndices[direction+1].receiveIndices.end(), 
-                                                                 this->communicationIndices[direction].receiveIndices.begin(), 
+    this->communicationIndices[direction+1].receiveIndices.insert( this->communicationIndices[direction+1].receiveIndices.end(),
+                                                                 this->communicationIndices[direction].receiveIndices.begin(),
                                                                  this->communicationIndices[direction].receiveIndices.end() );
 
     this->communicationIndices[direction].receiveIndices = this->communicationIndices[direction+1].receiveIndices;
@@ -1834,19 +1833,19 @@ real GridImp::getMaximumOnNodes(const real &maxExact, const real &decimalStart,
     return maxNode;
 }
 
-uint GridImp::getXIndex(real x) const 
-{ 
-    return std::lround((x - startX) / delta); 
+uint GridImp::getXIndex(real x) const
+{
+    return std::lround((x - startX) / delta);
 }
 
 uint GridImp::getYIndex(real y) const
-{ 
-    return std::lround((y - startY) / delta); 
+{
+    return std::lround((y - startY) / delta);
 }
 
 uint GridImp::getZIndex(real z) const
-{ 
-    return std::lround((z - startZ) / delta); 
+{
+    return std::lround((z - startZ) / delta);
 }
 
 real GridImp::getDelta() const
@@ -1861,11 +1860,11 @@ uint GridImp::getSize() const
 
 uint GridImp::getSparseSize() const
 {
-    return this->sparseSize; 
+    return this->sparseSize;
 }
 
-uint GridImp::getNumberOfFluidNodes() const { 
-    return (uint)this->fluidNodeIndices.size(); 
+uint GridImp::getNumberOfFluidNodes() const {
+    return (uint)this->fluidNodeIndices.size();
 }
 
 Field GridImp::getField() const
@@ -2058,18 +2057,18 @@ void GridImp::getNodeValues(real *xCoords, real *yCoords, real *zCoords, uint *n
     }
 }
 
-void GridImp::getFluidNodeIndices(uint *fluidNodeIndices) const 
-{ 
+void GridImp::getFluidNodeIndices(uint *fluidNodeIndices) const
+{
     for (uint nodeNumber = 0; nodeNumber < (uint)this->fluidNodeIndices.size(); nodeNumber++)
         fluidNodeIndices[nodeNumber] = this->fluidNodeIndices[nodeNumber];
 }
 
-uint GridImp::getNumberOfFluidNodesBorder() const 
-{ 
-    return (uint)this->fluidNodeIndicesBorder.size(); 
+uint GridImp::getNumberOfFluidNodesBorder() const
+{
+    return (uint)this->fluidNodeIndicesBorder.size();
 }
 
-void GridImp::getFluidNodeIndicesBorder(uint *fluidNodeIndicesBorder) const 
+void GridImp::getFluidNodeIndicesBorder(uint *fluidNodeIndicesBorder) const
 {
     for (uint nodeNumber = 0; nodeNumber < (uint)this->fluidNodeIndicesBorder.size(); nodeNumber++)
         fluidNodeIndicesBorder[nodeNumber] = this->fluidNodeIndicesBorder[nodeNumber];
@@ -2083,14 +2082,14 @@ void GridImp::addFluidNodeIndicesMacroVars(std::vector<uint> _fluidNodeIndicesMa
 }
 
 void GridImp::addFluidNodeIndicesApplyBodyForce(std::vector<uint> _fluidNodeIndicesApplyBodyForce)
-{    
-    
+{
+
     size_t newSize = this->fluidNodeIndicesApplyBodyForce.size()+_fluidNodeIndicesApplyBodyForce.size();
     this->fluidNodeIndicesApplyBodyForce.reserve(newSize);
     std::copy(_fluidNodeIndicesApplyBodyForce.begin(), _fluidNodeIndicesApplyBodyForce.end(), std::back_inserter(this->fluidNodeIndicesApplyBodyForce));
 }
 
-void GridImp::addFluidNodeIndicesAllFeatures(std::vector<uint> _fluidNodeIndicesAllFeatures) 
+void GridImp::addFluidNodeIndicesAllFeatures(std::vector<uint> _fluidNodeIndicesAllFeatures)
 {
 
     size_t newSize = this->fluidNodeIndicesAllFeatures.size()+_fluidNodeIndicesAllFeatures.size();
@@ -2109,17 +2108,23 @@ void GridImp::sortFluidNodeIndicesMacroVars()
          // Remove indices of fluidNodeIndicesAllFeatures from fluidNodeIndicesMacroVars
         if(this->fluidNodeIndicesAllFeatures.size()>0)
         {
-            this->fluidNodeIndicesMacroVars.erase(   std::remove_if(   this->fluidNodeIndicesMacroVars.begin(), this->fluidNodeIndicesMacroVars.end(), 
-                                                        [&](auto x){return binary_search(fluidNodeIndicesAllFeatures.begin(),fluidNodeIndicesAllFeatures.end(),x);} ),
-                                            this->fluidNodeIndicesMacroVars.end()
-                                        );
+            this->fluidNodeIndicesMacroVars.erase(   std::remove_if(   this->fluidNodeIndicesMacroVars.begin(), this->fluidNodeIndicesMacroVars.end(),
+                                                    [&](auto x){return binary_search(fluidNodeIndicesAllFeatures.begin(),fluidNodeIndicesAllFeatures.end(),x);} ),
+                                                    this->fluidNodeIndicesMacroVars.end() );
+        }
+
+        // Remove all indices in fluidNodeIndicesBorder from fluidNodeIndicesApplyBodyForce
+        if(this->fluidNodeIndicesBorder.size()>0)
+        {
+            this->fluidNodeIndicesMacroVars.erase(  std::remove_if(   this->fluidNodeIndicesMacroVars.begin(), this->fluidNodeIndicesMacroVars.end(),
+                                                    [&](auto x){return binary_search(fluidNodeIndicesBorder.begin(),fluidNodeIndicesBorder.end(),x);} ),
+                                                    this->fluidNodeIndicesMacroVars.end() );
         }
 
         // Remove indices of fluidNodeIndicesMacroVars from fluidNodeIndices
-        this->fluidNodeIndices.erase(   std::remove_if(   this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(), 
+        this->fluidNodeIndices.erase(   std::remove_if(   this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(),
                                                         [&](auto x){return binary_search(fluidNodeIndicesMacroVars.begin(),fluidNodeIndicesMacroVars.end(),x);} ),
-                                        this->fluidNodeIndices.end()
-                                    );
+                                        this->fluidNodeIndices.end() );
     }
 }
 
@@ -2131,20 +2136,26 @@ void GridImp::sortFluidNodeIndicesApplyBodyForce()
         // Remove duplicates
         this->fluidNodeIndicesApplyBodyForce.erase( unique( this->fluidNodeIndicesApplyBodyForce.begin(), this->fluidNodeIndicesApplyBodyForce.end() ), this->fluidNodeIndicesApplyBodyForce.end() );
 
-         // Remove indices of fluidNodeIndicesAllFeatures from fluidNodeIndicesMacroVars
+         // Remove indices of fluidNodeIndicesAllFeatures from fluidNodeIndicesApplyBodyForce
         if(this->fluidNodeIndicesAllFeatures.size()>0)
         {
-            this->fluidNodeIndicesApplyBodyForce.erase(   std::remove_if(   this->fluidNodeIndicesApplyBodyForce.begin(), this->fluidNodeIndicesApplyBodyForce.end(), 
+            this->fluidNodeIndicesApplyBodyForce.erase( std::remove_if(   this->fluidNodeIndicesApplyBodyForce.begin(), this->fluidNodeIndicesApplyBodyForce.end(),
                                                         [&](auto x){return binary_search(fluidNodeIndicesAllFeatures.begin(),fluidNodeIndicesAllFeatures.end(),x);} ),
-                                            this->fluidNodeIndicesApplyBodyForce.end()
-                                        );
+                                                        this->fluidNodeIndicesApplyBodyForce.end() );
+        }
+
+        // Remove all indices in fluidNodeIndicesBorder from fluidNodeIndicesApplyBodyForce
+        if(this->fluidNodeIndicesBorder.size()>0)
+        {
+            this->fluidNodeIndicesApplyBodyForce.erase( std::remove_if(   this->fluidNodeIndicesApplyBodyForce.begin(), this->fluidNodeIndicesApplyBodyForce.end(),
+                                                        [&](auto x){return binary_search(fluidNodeIndicesBorder.begin(),fluidNodeIndicesBorder.end(),x);} ),
+                                                        this->fluidNodeIndicesApplyBodyForce.end() );
         }
 
         // Remove indices of fluidNodeIndicesMacroVars from fluidNodeIndices
-        this->fluidNodeIndices.erase(   std::remove_if(   this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(), 
-                                                        [&](auto x){return binary_search(fluidNodeIndicesApplyBodyForce.begin(),fluidNodeIndicesApplyBodyForce.end(),x);} ),
-                                        this->fluidNodeIndices.end()
-                                    );
+        this->fluidNodeIndices.erase(   std::remove_if(   this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(),
+                                        [&](auto x){return binary_search(fluidNodeIndicesApplyBodyForce.begin(),fluidNodeIndicesApplyBodyForce.end(),x);} ),
+                                        this->fluidNodeIndices.end() );
     }
 }
 
@@ -2155,35 +2166,43 @@ void GridImp::sortFluidNodeIndicesAllFeatures()
         sort(this->fluidNodeIndicesAllFeatures.begin(), this->fluidNodeIndicesAllFeatures.end());
         // Remove duplicates
         this->fluidNodeIndicesAllFeatures.erase( unique( this->fluidNodeIndicesAllFeatures.begin(), this->fluidNodeIndicesAllFeatures.end() ), this->fluidNodeIndicesAllFeatures.end() );
-        // Remove indices of fluidNodeIndicesMacroVars from fluidNodeIndices
-        this->fluidNodeIndices.erase(   std::remove_if(   this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(), 
+
+        // Remove all indices in fluidNodeIndicesBorder from fluidNodeIndicesAllFeatures
+        if(this->fluidNodeIndicesBorder.size()>0)
+        {
+            this->fluidNodeIndicesAllFeatures.erase(    std::remove_if(   this->fluidNodeIndicesAllFeatures.begin(), this->fluidNodeIndicesAllFeatures.end(),
+                                                        [&](auto x){return binary_search(fluidNodeIndicesBorder.begin(),fluidNodeIndicesBorder.end(),x);} ),
+                                                        this->fluidNodeIndicesAllFeatures.end() );
+        }
+
+        // Remove indices of fluidNodeIndicesAllFeatures from fluidNodeIndices
+        this->fluidNodeIndices.erase(   std::remove_if(   this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(),
                                                         [&](auto x){return binary_search(fluidNodeIndicesAllFeatures.begin(),fluidNodeIndicesAllFeatures.end(),x);} ),
-                                        this->fluidNodeIndices.end()
-                                    );
+                                        this->fluidNodeIndices.end() );
     }
 }
 
-uint GridImp::getNumberOfFluidNodeIndicesMacroVars() const { 
-    return (uint)this->fluidNodeIndicesMacroVars.size(); 
+uint GridImp::getNumberOfFluidNodeIndicesMacroVars() const {
+    return (uint)this->fluidNodeIndicesMacroVars.size();
 }
 
-uint GridImp::getNumberOfFluidNodeIndicesApplyBodyForce() const { 
-    return (uint)this->fluidNodeIndicesApplyBodyForce.size(); 
+uint GridImp::getNumberOfFluidNodeIndicesApplyBodyForce() const {
+    return (uint)this->fluidNodeIndicesApplyBodyForce.size();
 }
 
-uint GridImp::getNumberOfFluidNodeIndicesAllFeatures() const { 
-    return (uint)this->fluidNodeIndicesAllFeatures.size(); 
+uint GridImp::getNumberOfFluidNodeIndicesAllFeatures() const {
+    return (uint)this->fluidNodeIndicesAllFeatures.size();
 }
 
-void GridImp::getFluidNodeIndicesMacroVars(uint *_fluidNodeIndicesMacroVars) const 
+void GridImp::getFluidNodeIndicesMacroVars(uint *_fluidNodeIndicesMacroVars) const
 {
-    std::copy(fluidNodeIndicesMacroVars.begin(), fluidNodeIndicesMacroVars.end(), _fluidNodeIndicesMacroVars);       
+    std::copy(fluidNodeIndicesMacroVars.begin(), fluidNodeIndicesMacroVars.end(), _fluidNodeIndicesMacroVars);
 }
-void GridImp::getFluidNodeIndicesApplyBodyForce(uint *_fluidNodeIndicesApplyBodyForce) const 
+void GridImp::getFluidNodeIndicesApplyBodyForce(uint *_fluidNodeIndicesApplyBodyForce) const
 {
     std::copy(fluidNodeIndicesApplyBodyForce.begin(), fluidNodeIndicesApplyBodyForce.end(), _fluidNodeIndicesApplyBodyForce);
 }
-void GridImp::getFluidNodeIndicesAllFeatures(uint *_fluidNodeIndicesAllFeatures) const 
+void GridImp::getFluidNodeIndicesAllFeatures(uint *_fluidNodeIndicesAllFeatures) const
 {
     std::copy(fluidNodeIndicesAllFeatures.begin(), fluidNodeIndicesAllFeatures.end(), _fluidNodeIndicesAllFeatures);
 }
diff --git a/src/gpu/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp b/src/gpu/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
index 23fb0f4e7f3e16702e9cb2459606986af1032e49..0238434dc87b453dc21164577d8abd4ce1819793 100644
--- a/src/gpu/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
+++ b/src/gpu/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
@@ -417,10 +417,10 @@ void SimulationFileWriter::writeGridInterfaceToFile(SPtr<GridBuilder> builder, u
     }
 }
 
-void SimulationFileWriter::writeGridInterfaceToFile(const uint numberOfNodes, std::ofstream& coarseFile, uint* coarse, std::ofstream& fineFile, uint* fine)
+void SimulationFileWriter::writeGridInterfaceToFile(uint numberOfNodes, std::ofstream &coarseFile, uint *coarse,
+                                                    std::ofstream &fineFile, uint *fine)
 {
-    for (uint index = 0; index < numberOfNodes; index++)
-    {
+    for (uint index = 0; index < numberOfNodes; index++) {
         coarseFile << coarse[index] << " \n";
         fineFile << fine[index] << " \n";
     }
@@ -428,17 +428,15 @@ void SimulationFileWriter::writeGridInterfaceToFile(const uint numberOfNodes, st
     fineFile << "\n";
 }
 
-void SimulationFileWriter::writeGridInterfaceOffsetToFile(uint numberOfNodes, std::ofstream & offsetFile, real* offset_X, real* offset_Y, real* offset_Z)
+void SimulationFileWriter::writeGridInterfaceOffsetToFile(uint numberOfNodes, std::ofstream &offsetFile, real *offset_X,
+                                                          real *offset_Y, real *offset_Z)
 {
-    for (uint index = 0; index < numberOfNodes; index++)
-    {
+    for (uint index = 0; index < numberOfNodes; index++) {
         offsetFile << offset_X[index] << " " << offset_Y[index] << " " << offset_Z[index] << " \n";
     }
     offsetFile << "\n";
 }
 
-
-
 /*#################################################################################*/
 /*---------------------------------private methods---------------------------------*/
 /*---------------------------------------------------------------------------------*/
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/Calc2ndMoments.cpp b/src/gpu/VirtualFluids_GPU/Calculation/Calc2ndMoments.cpp
index f8f5c42b835a1a4ba55e378e624230bbb43dc05a..e3f344231dc9d5e19c09f7ce1fde7d31f1770232 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/Calc2ndMoments.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/Calc2ndMoments.cpp
@@ -17,11 +17,11 @@ void alloc2ndMoments(Parameter* para, CudaMemoryManager* cudaMemoryManager)
 
 void init2ndMoments(Parameter* para)
 {
-	for (int lev=para->getCoarse(); lev <= para->getFine(); lev++)
+	for (int lev = para->getCoarse(); lev <= para->getFine(); lev++)
 	{
 		//////////////////////////////////////////////////////////////////////////
 		//init host arrays
-		for (unsigned int pos=0;pos<para->getParH(lev)->numberOfNodes;pos++)
+		for (size_t pos = 0; pos < para->getParH(lev)->numberOfNodes; pos++)
 		{
 			para->getParH(lev)->kxyFromfcNEQ[pos]    = 0.0;
 			para->getParH(lev)->kyzFromfcNEQ[pos]    = 0.0;
@@ -116,7 +116,7 @@ void init3rdMoments(Parameter* para)
 	{
 		//////////////////////////////////////////////////////////////////////////
 		//init host arrays
-		for (unsigned int pos=0;pos<para->getParH(lev)->numberOfNodes;pos++)
+		for (size_t pos = 0; pos < para->getParH(lev)->numberOfNodes; pos++)
 		{
 			para->getParH(lev)->CUMbbb[pos] = 0.0;
 			para->getParH(lev)->CUMabc[pos] = 0.0;
@@ -198,7 +198,7 @@ void calc3rdMoments(Parameter* para, CudaMemoryManager* cudaMemoryManager)
 
 void allocHigherOrderMoments(Parameter* para, CudaMemoryManager* cudaMemoryManager)
 {
-	for (int lev=para->getCoarse(); lev <= para->getFine(); lev++)
+	for (int lev = para->getCoarse(); lev <= para->getFine(); lev++)
 	{
 		//////////////////////////////////////////////////////////////////////////
 		//allocation (device-memory + host-memory)
@@ -211,11 +211,11 @@ void allocHigherOrderMoments(Parameter* para, CudaMemoryManager* cudaMemoryManag
 
 void initHigherOrderMoments(Parameter* para)
 {
-	for (int lev=para->getCoarse(); lev <= para->getFine(); lev++)
+	for (int lev = para->getCoarse(); lev <= para->getFine(); lev++)
 	{
 		//////////////////////////////////////////////////////////////////////////
 		//init host arrays
-		for (unsigned int pos=0;pos<para->getParH(lev)->numberOfNodes;pos++)
+		for (size_t pos = 0; pos < para->getParH(lev)->numberOfNodes; pos++)
 		{
 			para->getParH(lev)->CUMcbb[pos] = 0.0;
 			para->getParH(lev)->CUMbcb[pos] = 0.0;
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/CalcMedian.cpp b/src/gpu/VirtualFluids_GPU/Calculation/CalcMedian.cpp
index 77db571f7f10e0ea0bff827400270dd074d4e666..80a667f91976b745b619fed5d5763b5429a6559c 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/CalcMedian.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/CalcMedian.cpp
@@ -11,16 +11,16 @@
 
 void allocMedian(Parameter* para, CudaMemoryManager* cudaMemoryManager)
 {
-	for (int lev=para->getCoarse(); lev <= para->getFine(); lev++)
+	for (int lev = para->getCoarse(); lev <= para->getFine(); lev++)
 	{
 		cudaMemoryManager->cudaAllocMedianOut(lev);
-		for (unsigned int i = 0; i < para->getParH(lev)->numberOfNodes; i++)
+		for (size_t pos = 0; pos < para->getParH(lev)->numberOfNodes; pos++)
 		{
-			para->getParH(lev)->vx_SP_Med_Out[i]    = (real)0.0;
-			para->getParH(lev)->vy_SP_Med_Out[i]    = (real)0.0;
-			para->getParH(lev)->vz_SP_Med_Out[i]    = (real)0.0;
-			para->getParH(lev)->rho_SP_Med_Out[i]   = (real)0.0;
-			para->getParH(lev)->press_SP_Med_Out[i] = (real)0.0;
+			para->getParH(lev)->vx_SP_Med_Out[pos]    = (real)0.0;
+			para->getParH(lev)->vy_SP_Med_Out[pos]    = (real)0.0;
+			para->getParH(lev)->vz_SP_Med_Out[pos]    = (real)0.0;
+			para->getParH(lev)->rho_SP_Med_Out[pos]   = (real)0.0;
+			para->getParH(lev)->press_SP_Med_Out[pos] = (real)0.0;
 		}
 	}
 }
@@ -31,15 +31,15 @@ void allocMedian(Parameter* para, CudaMemoryManager* cudaMemoryManager)
 
 void calcMedian(Parameter* para, uint tdiff)
 {
-	for (int lev=para->getCoarse(); lev <= para->getFine(); lev++)
+	for (int lev = para->getCoarse(); lev <= para->getFine(); lev++)
 	{
-		for (uint i = 0; i < para->getParH(lev)->numberOfNodes; i++)
+        for (size_t pos = 0; pos < para->getParH(lev)->numberOfNodes; pos++)
 		{
-			para->getParH(lev)->vx_SP_Med_Out[i]    = para->getParH(lev)->vx_SP_Med[i]   / (real)tdiff;
-			para->getParH(lev)->vy_SP_Med_Out[i]    = para->getParH(lev)->vy_SP_Med[i]   / (real)tdiff;
-			para->getParH(lev)->vz_SP_Med_Out[i]    = para->getParH(lev)->vz_SP_Med[i]   / (real)tdiff;
-			para->getParH(lev)->rho_SP_Med_Out[i]   = para->getParH(lev)->rho_SP_Med[i]  / (real)tdiff;
-			para->getParH(lev)->press_SP_Med_Out[i] = para->getParH(lev)->press_SP_Med[i]/ (real)tdiff;
+			para->getParH(lev)->vx_SP_Med_Out[pos]    = para->getParH(lev)->vx_SP_Med[pos]   / (real)tdiff;
+			para->getParH(lev)->vy_SP_Med_Out[pos]    = para->getParH(lev)->vy_SP_Med[pos]   / (real)tdiff;
+			para->getParH(lev)->vz_SP_Med_Out[pos]    = para->getParH(lev)->vz_SP_Med[pos]   / (real)tdiff;
+			para->getParH(lev)->rho_SP_Med_Out[pos]   = para->getParH(lev)->rho_SP_Med[pos]  / (real)tdiff;
+			para->getParH(lev)->press_SP_Med_Out[pos] = para->getParH(lev)->press_SP_Med[pos]/ (real)tdiff;
 		}
 	}
 }
@@ -75,14 +75,14 @@ void allocMedianAD(Parameter* para, CudaMemoryManager* cudaMemoryManager)
 	for (int lev = para->getCoarse(); lev <= para->getFine(); lev++)
 	{
         cudaMemoryManager->cudaAllocMedianOutAD(lev);
-		for (unsigned int i = 0; i < para->getParH(lev)->numberOfNodes; i++)
+		for (size_t pos = 0; pos < para->getParH(lev)->numberOfNodes; pos++)
 		{
-			para->getParH(lev)->vx_SP_Med_Out[i]    = (real)0.0;
-			para->getParH(lev)->vy_SP_Med_Out[i]    = (real)0.0;
-			para->getParH(lev)->vz_SP_Med_Out[i]    = (real)0.0;
-			para->getParH(lev)->rho_SP_Med_Out[i]   = (real)0.0;
-			para->getParH(lev)->press_SP_Med_Out[i] = (real)0.0;
-			para->getParH(lev)->Conc_Med_Out[i]     = (real)0.0;
+			para->getParH(lev)->vx_SP_Med_Out[pos]    = (real)0.0;
+			para->getParH(lev)->vy_SP_Med_Out[pos]    = (real)0.0;
+			para->getParH(lev)->vz_SP_Med_Out[pos]    = (real)0.0;
+			para->getParH(lev)->rho_SP_Med_Out[pos]   = (real)0.0;
+			para->getParH(lev)->press_SP_Med_Out[pos] = (real)0.0;
+			para->getParH(lev)->Conc_Med_Out[pos]     = (real)0.0;
 		}
 	}
 }
@@ -95,14 +95,14 @@ void calcMedianAD(Parameter* para, uint tdiff)
 {
 	for (int lev = para->getCoarse(); lev <= para->getFine(); lev++)
 	{
-		for (uint i = 0; i < para->getParH(lev)->numberOfNodes; i++)
+		for (size_t pos = 0; pos < para->getParH(lev)->numberOfNodes; pos++)
 		{
-			para->getParH(lev)->vx_SP_Med_Out[i]    = para->getParH(lev)->vx_SP_Med[i]    / (real)tdiff;
-			para->getParH(lev)->vy_SP_Med_Out[i]    = para->getParH(lev)->vy_SP_Med[i]    / (real)tdiff;
-			para->getParH(lev)->vz_SP_Med_Out[i]    = para->getParH(lev)->vz_SP_Med[i]    / (real)tdiff;
-			para->getParH(lev)->rho_SP_Med_Out[i]   = para->getParH(lev)->rho_SP_Med[i]   / (real)tdiff;
-			para->getParH(lev)->press_SP_Med_Out[i] = para->getParH(lev)->press_SP_Med[i] / (real)tdiff;
-			para->getParH(lev)->Conc_Med_Out[i]     = para->getParH(lev)->Conc_Med[i]     / (real)tdiff;
+			para->getParH(lev)->vx_SP_Med_Out[pos]    = para->getParH(lev)->vx_SP_Med[pos]    / (real)tdiff;
+			para->getParH(lev)->vy_SP_Med_Out[pos]    = para->getParH(lev)->vy_SP_Med[pos]    / (real)tdiff;
+			para->getParH(lev)->vz_SP_Med_Out[pos]    = para->getParH(lev)->vz_SP_Med[pos]    / (real)tdiff;
+			para->getParH(lev)->rho_SP_Med_Out[pos]   = para->getParH(lev)->rho_SP_Med[pos]   / (real)tdiff;
+			para->getParH(lev)->press_SP_Med_Out[pos] = para->getParH(lev)->press_SP_Med[pos] / (real)tdiff;
+			para->getParH(lev)->Conc_Med_Out[pos]     = para->getParH(lev)->Conc_Med[pos]     / (real)tdiff;
 		}
 	}
 }
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/CalcTurbulenceIntensity.cpp b/src/gpu/VirtualFluids_GPU/Calculation/CalcTurbulenceIntensity.cpp
index e91fb6f5c232bd98073a1c930149693f8af4b078..9572252965e1c619702370f8b9a3756bf035035e 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/CalcTurbulenceIntensity.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/CalcTurbulenceIntensity.cpp
@@ -25,32 +25,32 @@ void calcVelocityAndFluctuations(Parameter *para, CudaMemoryManager *cudaMemoryM
     for (int lev = para->getCoarse(); lev <= para->getFine(); lev++) {
         cudaMemoryManager->cudaCopyTurbulenceIntensityDH(lev, para->getParH(lev)->numberOfNodes);
 
-        for (uint i = 0; i < para->getParH(lev)->numberOfNodes; i++) {
+        for (size_t pos = 0; pos < para->getParH(lev)->numberOfNodes; pos++) {
             // mean velocity
-            para->getParH(lev)->vx_mean[i] = para->getParH(lev)->vx_mean[i] / (real)tdiff;
-            para->getParH(lev)->vy_mean[i] = para->getParH(lev)->vy_mean[i] / (real)tdiff;
-            para->getParH(lev)->vz_mean[i] = para->getParH(lev)->vz_mean[i] / (real)tdiff;
+            para->getParH(lev)->vx_mean[pos] = para->getParH(lev)->vx_mean[pos] / (real)tdiff;
+            para->getParH(lev)->vy_mean[pos] = para->getParH(lev)->vy_mean[pos] / (real)tdiff;
+            para->getParH(lev)->vz_mean[pos] = para->getParH(lev)->vz_mean[pos] / (real)tdiff;
 
             // fluctuations
-            para->getParH(lev)->vxx[i] = para->getParH(lev)->vxx[i] / (real)tdiff;
-            para->getParH(lev)->vyy[i] = para->getParH(lev)->vyy[i] / (real)tdiff;
-            para->getParH(lev)->vzz[i] = para->getParH(lev)->vzz[i] / (real)tdiff;
-            para->getParH(lev)->vxy[i] = para->getParH(lev)->vxy[i] / (real)tdiff;
-            para->getParH(lev)->vxz[i] = para->getParH(lev)->vxz[i] / (real)tdiff;
-            para->getParH(lev)->vyz[i] = para->getParH(lev)->vyz[i] / (real)tdiff;
-
-            para->getParH(lev)->vxx[i] =
-                para->getParH(lev)->vxx[i] - para->getParH(lev)->vx_mean[i] * para->getParH(lev)->vx_mean[i];
-            para->getParH(lev)->vyy[i] =
-                para->getParH(lev)->vyy[i] - para->getParH(lev)->vy_mean[i] * para->getParH(lev)->vy_mean[i];
-            para->getParH(lev)->vzz[i] =
-                para->getParH(lev)->vzz[i] - para->getParH(lev)->vz_mean[i] * para->getParH(lev)->vz_mean[i];
-            para->getParH(lev)->vxy[i] =
-                para->getParH(lev)->vxy[i] - para->getParH(lev)->vx_mean[i] * para->getParH(lev)->vy_mean[i];
-            para->getParH(lev)->vxz[i] =
-                para->getParH(lev)->vxz[i] - para->getParH(lev)->vx_mean[i] * para->getParH(lev)->vz_mean[i];
-            para->getParH(lev)->vyz[i] =
-                para->getParH(lev)->vyz[i] - para->getParH(lev)->vy_mean[i] * para->getParH(lev)->vz_mean[i];
+            para->getParH(lev)->vxx[pos] = para->getParH(lev)->vxx[pos] / (real)tdiff;
+            para->getParH(lev)->vyy[pos] = para->getParH(lev)->vyy[pos] / (real)tdiff;
+            para->getParH(lev)->vzz[pos] = para->getParH(lev)->vzz[pos] / (real)tdiff;
+            para->getParH(lev)->vxy[pos] = para->getParH(lev)->vxy[pos] / (real)tdiff;
+            para->getParH(lev)->vxz[pos] = para->getParH(lev)->vxz[pos] / (real)tdiff;
+            para->getParH(lev)->vyz[pos] = para->getParH(lev)->vyz[pos] / (real)tdiff;
+
+            para->getParH(lev)->vxx[pos] =
+                para->getParH(lev)->vxx[pos] - para->getParH(lev)->vx_mean[pos] * para->getParH(lev)->vx_mean[pos];
+            para->getParH(lev)->vyy[pos] =
+                para->getParH(lev)->vyy[pos] - para->getParH(lev)->vy_mean[pos] * para->getParH(lev)->vy_mean[pos];
+            para->getParH(lev)->vzz[pos] =
+                para->getParH(lev)->vzz[pos] - para->getParH(lev)->vz_mean[pos] * para->getParH(lev)->vz_mean[pos];
+            para->getParH(lev)->vxy[pos] =
+                para->getParH(lev)->vxy[pos] - para->getParH(lev)->vx_mean[pos] * para->getParH(lev)->vy_mean[pos];
+            para->getParH(lev)->vxz[pos] =
+                para->getParH(lev)->vxz[pos] - para->getParH(lev)->vx_mean[pos] * para->getParH(lev)->vz_mean[pos];
+            para->getParH(lev)->vyz[pos] =
+                para->getParH(lev)->vyz[pos] - para->getParH(lev)->vy_mean[pos] * para->getParH(lev)->vz_mean[pos];
         }
     }
 }
@@ -146,7 +146,7 @@ void writeAllTiDatafToFile(Parameter *para, uint timestep)
     }
 }
 
-void writeTiStuffToFile(Parameter *para, uint timestep, int sizeOfTiArray, std::vector<real *> &data,
+void writeTiStuffToFile(Parameter *para, uint timestep, unsigned long long sizeOfTiArray, std::vector<real *> &data,
                         std::vector<std::string> &datanames)
 {
     ////////////////////////////////////////////////////////////////////////
@@ -169,10 +169,10 @@ void writeTiStuffToFile(Parameter *para, uint timestep, int sizeOfTiArray, std::
     ostr << std::endl;
     ////////////////////////////////////////////////////////////////////////
     // fill file with data
-    for (int i = 0; i < sizeOfTiArray; i++) {
-        ostr << i;
+    for (size_t pos = 0; pos < sizeOfTiArray; pos++) {
+        ostr << pos;
         for (auto dataset : data)
-            ostr << "\t" << dataset[i];
+            ostr << "\t" << dataset[pos];
         ostr << std::endl;
     }
     ////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/CalcTurbulenceIntensity.h b/src/gpu/VirtualFluids_GPU/Calculation/CalcTurbulenceIntensity.h
index f70973eb5921a17c3229a026623de2a0ef9f3ce4..a76c2d0dde99ad9fb3fd38137b6c72e5c3f5a6c3 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/CalcTurbulenceIntensity.h
+++ b/src/gpu/VirtualFluids_GPU/Calculation/CalcTurbulenceIntensity.h
@@ -18,7 +18,7 @@ void writeVeloFluctuationToFile(Parameter *para, uint timeste);
 void writeVeloMeansToFile(Parameter *para, uint timestep);
 void writeAllTiDatafToFile(Parameter *para, uint timestep);
 
-void writeTiStuffToFile(Parameter *para, uint timestep, int sizeOfTiArray, std::vector<real *> &data,
+void writeTiStuffToFile(Parameter *para, uint timestep, unsigned long long sizeOfTiArray, std::vector<real *> &data,
                   std::vector<std::string> &datanames);
 
 #endif
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp b/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp
index d62e8fee24dad1cde7ccd2044a5a5f9573f7ff82..cc1d2eb748b01835b46f5fc69f47ed3ddc17a28d 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp
@@ -53,7 +53,7 @@ void ForceCalculations::calcPIDControllerForForce(Parameter* para, CudaMemoryMan
 	 {
 		 //////////////////////////////////////////////////////////////////////
 		 //measure the velocity
-		 int numberOfElements = para->getParH(lev)->numberOfNodes;
+		 unsigned long long numberOfElements = para->getParH(lev)->numberOfNodes;
 		 if (numberOfElements > 0)
 		 {
 			 CalcMacCompSP27(para->getParD(lev)->velocityX,
@@ -74,11 +74,11 @@ void ForceCalculations::calcPIDControllerForForce(Parameter* para, CudaMemoryMan
 			 cudaMemoryManager->cudaCopyPrint(lev);
 //			 para->cudaCopyForceVelo(i,numberOfElements);
 			 //////////////////////////////////////////////////////////////////
-			 for (int j = 0; j < numberOfElements; j++)
+			 for (size_t pos = 0; pos < numberOfElements; pos++)
 			 {
-				 tempVeloX += (double)para->getParH(lev)->velocityX[j];
-				 tempVeloY += (double)para->getParH(lev)->velocityY[j];
-				 tempVeloZ += (double)para->getParH(lev)->velocityZ[j];
+				 tempVeloX += (double)para->getParH(lev)->velocityX[pos];
+				 tempVeloY += (double)para->getParH(lev)->velocityY[pos];
+				 tempVeloZ += (double)para->getParH(lev)->velocityZ[pos];
 			 }
 			 tempVeloX /= (double)numberOfElements;
 			 tempVeloY /= (double)numberOfElements;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
index c996525ee78e6ba87fe0972df084aedccfefd39a..3b511264e9c7edc80bbe367cac4a9b6d8725674b 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
@@ -19,29 +19,29 @@ std::shared_ptr<GridProvider> GridProvider::makeGridReader(FILEFORMAT format, st
     return std::shared_ptr<GridProvider>(new GridReader(format, para, cudaMemoryManager));
 }
 
-void GridProvider::setNumberOfNodes(const int numberOfNodes, const int level) const
+void GridProvider::setNumberOfNodes(uint numberOfNodes, int level) const
 {
-    para->getParH(level)->numberOfNodes = numberOfNodes;
-    para->getParD(level)->numberOfNodes = numberOfNodes;
-    para->getParH(level)->mem_size_real_SP = sizeof(real) * para->getParH(level)->numberOfNodes;
-    para->getParH(level)->mem_size_int_SP = sizeof(uint) * para->getParH(level)->numberOfNodes;
-    para->getParD(level)->mem_size_real_SP = sizeof(real) * para->getParD(level)->numberOfNodes;
-    para->getParD(level)->mem_size_int_SP = sizeof(uint) * para->getParD(level)->numberOfNodes;
+    para->getParH(level)->numberOfNodes          = (unsigned long long)numberOfNodes;
+    para->getParD(level)->numberOfNodes          = (unsigned long long)numberOfNodes;
+    para->getParH(level)->memSizeRealLBnodes     = sizeof(real) * para->getParH(level)->numberOfNodes;
+    para->getParD(level)->memSizeRealLBnodes     = sizeof(real) * para->getParD(level)->numberOfNodes;
+    para->getParH(level)->memSizeLonglongLBnodes = sizeof(unsigned long long) * para->getParH(level)->numberOfNodes;
+    para->getParD(level)->memSizeLonglongLBnodes = sizeof(unsigned long long) * para->getParD(level)->numberOfNodes;
 }
 
-void GridProvider::setNumberOfTaggedFluidNodes(const int numberOfNodes, CollisionTemplate tag, const int level) const
+void GridProvider::setNumberOfTaggedFluidNodes(uint numberOfNodes, CollisionTemplate tag, int level) const
 {
     para->getParH(level)->numberOfTaggedFluidNodes[tag] = numberOfNodes;
     para->getParD(level)->numberOfTaggedFluidNodes[tag] = numberOfNodes;
 }
 
-void GridProvider::setInitalNodeValues(const int numberOfNodes, const int level) const
+void GridProvider::setInitalNodeValues(uint numberOfNodes, int level) const
 {
-    for (int j = 1; j <= numberOfNodes; j++)
+    for (uint pos = 1; pos <= numberOfNodes; pos++)
     {
-        const real coordX = para->getParH(level)->coordinateX[j];
-        const real coordY = para->getParH(level)->coordinateY[j];
-        const real coordZ = para->getParH(level)->coordinateZ[j];
+        const real coordX = para->getParH(level)->coordinateX[pos];
+        const real coordY = para->getParH(level)->coordinateY[pos];
+        const real coordZ = para->getParH(level)->coordinateZ[pos];
 
         real rho, vx, vy, vz;
 
@@ -58,40 +58,40 @@ void GridProvider::setInitalNodeValues(const int numberOfNodes, const int level)
             vz  = real(0.0);
         }
 
-        para->getParH(level)->rho[j] = rho; 
-        para->getParH(level)->velocityX[j]  = vx; 
-        para->getParH(level)->velocityY[j]  = vy;
-        para->getParH(level)->velocityZ[j]  = vz; 
+        para->getParH(level)->rho[pos] = rho; 
+        para->getParH(level)->velocityX[pos]  = vx; 
+        para->getParH(level)->velocityY[pos]  = vy;
+        para->getParH(level)->velocityZ[pos]  = vz; 
 
         //////////////////////////////////////////////////////////////////////////
 
         if (para->getCalcMedian()) {
-            para->getParH(level)->vx_SP_Med[j] = 0.0f;
-            para->getParH(level)->vy_SP_Med[j] = 0.0f;
-            para->getParH(level)->vz_SP_Med[j] = 0.0f;
-            para->getParH(level)->rho_SP_Med[j] = 0.0f;
-            para->getParH(level)->press_SP_Med[j] = 0.0f;
+            para->getParH(level)->vx_SP_Med[pos] = 0.0f;
+            para->getParH(level)->vy_SP_Med[pos] = 0.0f;
+            para->getParH(level)->vz_SP_Med[pos] = 0.0f;
+            para->getParH(level)->rho_SP_Med[pos] = 0.0f;
+            para->getParH(level)->press_SP_Med[pos] = 0.0f;
         }
         if (para->getUseWale()) {
-            para->getParH(level)->turbViscosity[j] = 0.0f;
+            para->getParH(level)->turbViscosity[pos] = 0.0f;
             //Debug
-            para->getParH(level)->gSij[j] = 0.0f;
-            para->getParH(level)->gSDij[j] = 0.0f;
-            para->getParH(level)->gDxvx[j] = 0.0f;
-            para->getParH(level)->gDyvx[j] = 0.0f;
-            para->getParH(level)->gDzvx[j] = 0.0f;
-            para->getParH(level)->gDxvy[j] = 0.0f;
-            para->getParH(level)->gDyvy[j] = 0.0f;
-            para->getParH(level)->gDzvy[j] = 0.0f;
-            para->getParH(level)->gDxvz[j] = 0.0f;
-            para->getParH(level)->gDyvz[j] = 0.0f;
-            para->getParH(level)->gDzvz[j] = 0.0f;
+            para->getParH(level)->gSij[pos] = 0.0f;
+            para->getParH(level)->gSDij[pos] = 0.0f;
+            para->getParH(level)->gDxvx[pos] = 0.0f;
+            para->getParH(level)->gDyvx[pos] = 0.0f;
+            para->getParH(level)->gDzvx[pos] = 0.0f;
+            para->getParH(level)->gDxvy[pos] = 0.0f;
+            para->getParH(level)->gDyvy[pos] = 0.0f;
+            para->getParH(level)->gDzvy[pos] = 0.0f;
+            para->getParH(level)->gDxvz[pos] = 0.0f;
+            para->getParH(level)->gDyvz[pos] = 0.0f;
+            para->getParH(level)->gDzvz[pos] = 0.0f;
         }
 
         if (para->getIsBodyForce()) {
-            para->getParH(level)->forceX_SP[j] = 0.0f;
-            para->getParH(level)->forceY_SP[j] = 0.0f;
-            para->getParH(level)->forceZ_SP[j] = 0.0f;
+            para->getParH(level)->forceX_SP[pos] = 0.0f;
+            para->getParH(level)->forceY_SP[pos] = 0.0f;
+            para->getParH(level)->forceZ_SP[pos] = 0.0f;
         }
     }
 
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h
index 42ba7a464a6e76fd747cc6d11a01e3957c865765..007db1e0d8e27b3810aa38c089bae8069bbe5813 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h
@@ -24,35 +24,35 @@ public:
     static std::shared_ptr<GridProvider> makeGridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::Communicator& communicator);
     static std::shared_ptr<GridProvider> makeGridReader(FILEFORMAT format, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager);
 
-	virtual void allocArrays_CoordNeighborGeo() = 0;
-	virtual void allocArrays_BoundaryValues() = 0;
-	virtual void allocArrays_BoundaryQs() = 0;
+    virtual void allocArrays_CoordNeighborGeo() = 0;
+    virtual void allocArrays_BoundaryValues() = 0;
+    virtual void allocArrays_BoundaryQs() = 0;
     virtual void allocArrays_OffsetScale() = 0;
     virtual void allocArrays_taggedFluidNodes() = 0;
 
-    virtual void tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level) = 0;
+    virtual void tagFluidNodeIndices(const std::vector<uint>& taggedFluidNodeIndices, CollisionTemplate tag, uint level) = 0;
     virtual void sortFluidNodeTags() = 0;
 
-	virtual void setDimensions() = 0;
-	virtual void setBoundingBox() = 0;
-	virtual void initPeriodicNeigh(std::vector<std::vector<std::vector<unsigned int> > > periodV, std::vector<std::vector<unsigned int> > periodIndex, std::string way) = 0;
+    virtual void setDimensions() = 0;
+    virtual void setBoundingBox() = 0;
+    virtual void initPeriodicNeigh(std::vector<std::vector<std::vector<unsigned int> > > periodV, std::vector<std::vector<unsigned int> > periodIndex, std::string way) = 0;
 
     virtual void allocAndCopyForcing();
     virtual void allocAndCopyQuadricLimiters();
     virtual void freeMemoryOnHost();
     virtual void cudaCopyDataToHost(int level);
 
-	virtual ~GridProvider() = default;
+    virtual ~GridProvider() = default;
     virtual void initalGridInformations() = 0;
 
 protected:
-	void setNumberOfNodes(const int numberOfNodes, const int level) const;
-    void setNumberOfTaggedFluidNodes(const int numberOfNodes, CollisionTemplate tag, const int level) const;
-    virtual void setInitalNodeValues(const int numberOfNodes, const int level) const;
+    void setNumberOfNodes(uint numberOfNodes, int level) const;
+    void setNumberOfTaggedFluidNodes(uint numberOfNodes, CollisionTemplate tag, int level) const;
+    virtual void setInitalNodeValues(uint numberOfNodes, int level) const;
 
-	void setPressSizePerLevel(int level, int sizePerLevel) const;
-	void setVelocitySizePerLevel(int level, int sizePerLevel) const;
-	void setOutflowSizePerLevel(int level, int sizePerLevel) const;
+    void setPressSizePerLevel(int level, int sizePerLevel) const;
+    void setVelocitySizePerLevel(int level, int sizePerLevel) const;
+    void setOutflowSizePerLevel(int level, int sizePerLevel) const;
 
     std::shared_ptr<Parameter> para;
     std::shared_ptr<CudaMemoryManager> cudaMemoryManager;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp
index 793400869dd29fe12be357ffcf87c0238ea70eb9..a1c8554cc4e262e9f1eca4204aed4ffcfd4c3a87 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp
@@ -47,7 +47,7 @@ bool GridReader::getBinaer()
 
 void rearrangeGeometry(Parameter* para, int lev)
 {
-    for (uint index = 0; index < para->getParH(lev)->numberOfNodes; index++)
+    for (size_t index = 0; index < para->getParH(lev)->numberOfNodes; index++)
     {
         if (para->getParH(lev)->typeOfGridNode[index] == GEO_FLUID_OLD)
         {
@@ -74,11 +74,11 @@ void GridReader::allocArrays_CoordNeighborGeo()
 	uint numberOfNodesGlobal = 0;
 	std::cout << "Number of Nodes: " << std::endl;
 
-	for (uint level = 0; level <= maxLevel; level++) 
-	{		
-		int numberOfNodesPerLevel = coordX.getSize(level) + 1;
-		numberOfNodesGlobal += numberOfNodesPerLevel;
-		std::cout << "Level " << level << " = " << numberOfNodesPerLevel << " Nodes" << std::endl;
+    for (uint level = 0; level <= maxLevel; level++)
+    {
+        const uint numberOfNodesPerLevel = coordX.getSize(level) + 1;
+        numberOfNodesGlobal += numberOfNodesPerLevel;
+        std::cout << "Level " << level << " = " << numberOfNodesPerLevel << " Nodes" << std::endl;
 
 		setNumberOfNodes(numberOfNodesPerLevel, level);
 
@@ -130,9 +130,9 @@ void GridReader::allocArrays_BoundaryValues()
 
     for (uint i = 0; i < channelBoundaryConditions.size(); i++)
     {
-        if (     this->channelBoundaryConditions[i] == "velocity") { fillVelocityVectors(i); } 
-		else if (this->channelBoundaryConditions[i] == "pressure") { setPressureValues(i); } 
-		else if (this->channelBoundaryConditions[i] == "outflow")  { setOutflowValues(i);  }
+        if (     this->channelBoundaryConditions[i] == "velocity") { fillVelocityVectors(i); }
+        else if (this->channelBoundaryConditions[i] == "pressure") { setPressureValues(i); }
+        else if (this->channelBoundaryConditions[i] == "outflow")  { setOutflowValues(i);  }
     }
 
 	setVelocityValues();
@@ -223,13 +223,13 @@ void GridReader::allocArrays_taggedFluidNodes() {
 	// TODO
 }
 
-void GridReader::tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level){
-	std::cout << "GridReader::tagFluidNodeIndices not implemented" << std::endl;
+void GridReader::tagFluidNodeIndices(const std::vector<uint>& taggedFluidNodeIndices, CollisionTemplate tag, uint level){
+    std::cout << "GridReader::tagFluidNodeIndices not implemented" << std::endl;
     // TODO
 }
 
 void GridReader::sortFluidNodeTags(){
-	std::cout << "GridReader::sortFluidNodeTags not implemented" << std::endl;
+    std::cout << "GridReader::sortFluidNodeTags not implemented" << std::endl;
     // TODO
 }
 
@@ -285,23 +285,23 @@ void GridReader::fillVelocityVectors(int channelSide)
 			delete[] veloX_ValuesPerSide;
             delete[] veloY_ValuesPerSide;
             delete[] veloZ_ValuesPerSide;
-        }        
-	}
+        }
+    }
 
 
 }
 
-void GridReader::setVelocityValues() { 
+void GridReader::setVelocityValues() {
     for (int level = 0; level < (int)(velocityX_BCvalues.size()); level++) {
-        
-		int sizePerLevel = (int) velocityX_BCvalues[level].size();
+
+        int sizePerLevel = (int) velocityX_BCvalues[level].size();
         std::cout << "complete size velocity level " << level << " : " << sizePerLevel << std::endl;
         setVelocitySizePerLevel(level, sizePerLevel);
-        
-		if (sizePerLevel > 1) {
+
+        if (sizePerLevel > 1) {
             cudaMemoryManager->cudaAllocVeloBC(level);
             setVelocity(level, sizePerLevel);
-			cudaMemoryManager->cudaCopyVeloBC(level);
+            cudaMemoryManager->cudaCopyVeloBC(level);
         }
     }
 }
@@ -672,8 +672,8 @@ void GridReader::modifyQElement(std::shared_ptr<BoundaryQs> boundaryQ, unsigned
 /*------------------------------------------------------------------------------------------------*/
 /*---------------------------------------private q methods----------------------------------------*/
 /*------------------------------------------------------------------------------------------------*/
-void GridReader::initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index, 
-										std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const
+void GridReader::initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index,
+                                        std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const
 {
     boundaryQ->setValuesInVector(Qs, level);
     boundaryQ->setIndexInVector(index, level);
@@ -689,7 +689,7 @@ void GridReader::copyVectorsToQStruct(std::vector<std::vector<real>> &Qs,
 
 	for (int direction = 0; direction < para->getD3Qxx(); direction++) {
         for (size_t indexQ = 0; indexQ < sizeOfValues; indexQ++) {
-            qTemp.q27[direction][indexQ] = Qs[direction][indexQ]; 
+            qTemp.q27[direction][indexQ] = Qs[direction][indexQ];
         }
     }
 
@@ -851,46 +851,46 @@ void GridReader::setBoundingBox()
 
 void GridReader::initPeriodicNeigh(std::vector<std::vector<std::vector<unsigned int> > > periodV, std::vector<std::vector<unsigned int> > periodIndex,  std::string boundaryCondition)
 {
-	std::vector<unsigned int>neighVec;
-	std::vector<unsigned int>indexVec;
-	
-	int counter = 0;
-
-	for(unsigned int i=0; i<neighX->getLevel();i++) {
-		if(boundaryCondition =="periodic_y"){
-			neighVec = neighY->getVec(i);
-		} 
-		else if(boundaryCondition =="periodic_x"){
-			neighVec = neighX->getVec(i);
-		}
-		else if(boundaryCondition =="periodic_z"){
-			neighVec = neighZ->getVec(i);
-		}
-		else {
-			std::cout << "wrong String in periodicValue" << std::endl;
-			exit(1);
-		}
+    std::vector<unsigned int>neighVec;
+    std::vector<unsigned int>indexVec;
 
-		for (std::vector<unsigned int>::iterator it = periodIndex[i].begin(); it != periodIndex[i].end(); it++) {
-			if(periodV[i][0][counter] != 0) {
-				neighVec[*it]=periodV[i][0][counter];
-			}
+    int counter = 0;
 
-			counter++;
-		}
+    for(unsigned int i=0; i<neighX->getLevel();i++) {
+        if(boundaryCondition =="periodic_y"){
+            neighVec = neighY->getVec(i);
+        }
+        else if(boundaryCondition =="periodic_x"){
+            neighVec = neighX->getVec(i);
+        }
+        else if(boundaryCondition =="periodic_z"){
+            neighVec = neighZ->getVec(i);
+        }
+        else {
+            std::cout << "wrong String in periodicValue" << std::endl;
+            exit(1);
+        }
 
+        for (std::vector<unsigned int>::iterator it = periodIndex[i].begin(); it != periodIndex[i].end(); it++) {
+            if(periodV[i][0][counter] != 0) {
+                neighVec[*it]=periodV[i][0][counter];
+            }
 
-		if(boundaryCondition =="periodic_y"){
-			neighY->setVec(i, neighVec);
-		} 
-		else if(boundaryCondition =="periodic_x"){
-			neighX->setVec(i, neighVec);
-		}
-		else if(boundaryCondition =="periodic_z"){
-			neighZ->setVec(i, neighVec);
-		}
+            counter++;
+        }
 
-	}
+
+        if(boundaryCondition =="periodic_y"){
+            neighY->setVec(i, neighVec);
+        }
+        else if(boundaryCondition =="periodic_x"){
+            neighX->setVec(i, neighVec);
+        }
+        else if(boundaryCondition =="periodic_z"){
+            neighZ->setVec(i, neighVec);
+        }
+
+    }
 }
 
 void GridReader::makeReader(std::shared_ptr<Parameter> para)
@@ -921,9 +921,9 @@ void GridReader::makeReader(std::vector<std::shared_ptr<BoundaryQs> > &BC_Qs, st
 
 void GridReader::setChannelBoundaryCondition()
 {
-	for (std::size_t i = 0; i < channelDirections.size(); i++)
-	{
-		this->channelBoundaryConditions[i] = BC_Values[i]->getBoundaryCondition();
-		std::cout << this->channelDirections[i] << " Boundary: " << channelBoundaryConditions[i] << std::endl;
-	}
-}
\ No newline at end of file
+    for (std::size_t i = 0; i < channelDirections.size(); i++)
+    {
+        this->channelBoundaryConditions[i] = BC_Values[i]->getBoundaryCondition();
+        std::cout << this->channelDirections[i] << " Boundary: " << channelBoundaryConditions[i] << std::endl;
+    }
+}
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h
index 2c17c28022d88a65e922e23d1c89f5166f5a1716..041d2c3ce94592f792c5a850eebd14c07f4db1b4 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h
@@ -3,9 +3,9 @@
 
 #include "../GridProvider.h"
 
-#include <vector>
-#include <string>
 #include <memory>
+#include <string>
+#include <vector>
 
 #include "LBM/LB.h"
 
@@ -16,15 +16,14 @@ class BoundaryValues;
 class BoundaryQs;
 class CoordNeighborGeoV;
 
-class VIRTUALFLUIDS_GPU_EXPORT GridReader
-	: public GridProvider
+class VIRTUALFLUIDS_GPU_EXPORT GridReader : public GridProvider
 {
 private:
-	bool binaer;
-	std::vector<std::string> channelDirections;
-	std::vector<std::string> channelBoundaryConditions;
-	std::shared_ptr<CoordNeighborGeoV> neighX, neighY, neighZ, neighWSB;
-	std::vector<std::shared_ptr<BoundaryValues> > BC_Values;
+    bool binaer;
+    std::vector<std::string> channelDirections;
+    std::vector<std::string> channelBoundaryConditions;
+    std::shared_ptr<CoordNeighborGeoV> neighX, neighY, neighZ, neighWSB;
+    std::vector<std::shared_ptr<BoundaryValues>> BC_Values;
 
     std::vector<std::vector<real>> velocityX_BCvalues, velocityY_BCvalues, velocityZ_BCvalues;
     std::vector<std::vector<std::vector<real>>> velocityQs;
@@ -34,59 +33,62 @@ private:
     std::vector<std::vector<real>> outflowBCvalues;
 
 public:
-	GridReader(FILEFORMAT format, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager);
-    ~GridReader();
-	void allocArrays_CoordNeighborGeo() override;
-	void allocArrays_BoundaryValues() override;
+    GridReader(FILEFORMAT format, std::shared_ptr<Parameter> para,
+               std::shared_ptr<CudaMemoryManager> cudaMemoryManager);
+    ~GridReader() override;
+    void allocArrays_CoordNeighborGeo() override;
+    void allocArrays_BoundaryValues() override;
     void allocArrays_OffsetScale() override;
     void allocArrays_taggedFluidNodes() override;
 
-	void tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level) override;
-	void sortFluidNodeTags() override;
+    void tagFluidNodeIndices(const std::vector<uint> &taggedFluidNodeIndices, CollisionTemplate tag, uint level) override;
 
-	void initalValuesDomainDecompostion(int level);
+    void sortFluidNodeTags() override;
 
-	void setChannelBoundaryCondition();
+    void initalValuesDomainDecompostion(int level);
 
-	void allocArrays_BoundaryQs() override;
-	bool getBinaer();
-	void setDimensions() override;
-	void setBoundingBox() override;
-	void initPeriodicNeigh(std::vector<std::vector<std::vector<unsigned int> > > periodV, std::vector<std::vector<unsigned int> > periodIndex, std::string way) override;
+    void setChannelBoundaryCondition();
+
+    void allocArrays_BoundaryQs() override;
+    bool getBinaer();
+    void setDimensions() override;
+    void setBoundingBox() override;
+    void initPeriodicNeigh(std::vector<std::vector<std::vector<unsigned int>>> periodV,
+                           std::vector<std::vector<unsigned int>> periodIndex, std::string way) override;
 
 private:
-	void makeReader(std::shared_ptr<Parameter> para);
-	void makeReader(std::vector<std::shared_ptr<BoundaryQs> > &BC_Qs, std::shared_ptr<Parameter> para);
+    void makeReader(std::shared_ptr<Parameter> para);
+    void makeReader(std::vector<std::shared_ptr<BoundaryQs>> &BC_Qs, std::shared_ptr<Parameter> para);
 
-	void setPressureValues(int channelSide) const;
-	void setPressRhoBC(int sizePerLevel, int level, int channelSide) const;
+    void setPressureValues(int channelSide) const;
+    void setPressRhoBC(int sizePerLevel, int level, int channelSide) const;
 
-	void fillVelocityVectors(int channelSide);
+    void fillVelocityVectors(int channelSide);
     void setVelocityValues();
-	void setVelocity(int level, int sizePerLevel) const;
-
-	void setOutflowValues(int channelSide) const;
-	void setOutflow(int level, int sizePerLevel, int channelSide) const;
+    void setVelocity(int level, int sizePerLevel) const;
 
+    void setOutflowValues(int channelSide) const;
+    void setOutflow(int level, int sizePerLevel, int channelSide) const;
 
-	//void fillVelocityQVectors(int channelSide);
+    // void fillVelocityQVectors(int channelSide);
     void setPressQs(std::shared_ptr<BoundaryQs> boundaryQ) const;
-	void setVelocityQs(std::shared_ptr<BoundaryQs> boundaryQ);
-	void setOutflowQs(std::shared_ptr<BoundaryQs> boundaryQ) const;
-	void setNoSlipQs(std::shared_ptr<BoundaryQs> boundaryQ) const;
-	void setGeoQs(std::shared_ptr<BoundaryQs> boundaryQ) const;
-	void modifyQElement(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
+    void setVelocityQs(std::shared_ptr<BoundaryQs> boundaryQ);
+    void setOutflowQs(std::shared_ptr<BoundaryQs> boundaryQ) const;
+    void setNoSlipQs(std::shared_ptr<BoundaryQs> boundaryQ) const;
+    void setGeoQs(std::shared_ptr<BoundaryQs> boundaryQ) const;
+    void modifyQElement(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
 
-	void initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index,
+    void initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index,
                                 std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
     void copyVectorsToQStruct(std::vector<std::vector<real>> &Qs, std::vector<int> &index,
                               QforBoundaryConditions &Q) const;
     void initalQStruct(QforBoundaryConditions &Q, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
-	void printQSize(std::string bc, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
-	void setSizeNoSlip(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
-	void setSizeGeoQs(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
-	void setQ27Size(QforBoundaryConditions &Q, real* QQ, unsigned int sizeQ) const;
-	bool hasQs(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
+    void printQSize(std::string bc, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
+    void setSizeNoSlip(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
+    void setSizeGeoQs(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
+    void setQ27Size(QforBoundaryConditions &Q, real *QQ, unsigned int sizeQ) const;
+    bool hasQs(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const;
+
 public:
     void initalGridInformations() override;
 };
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
index d89f4cd85985694b4529d338ab5e4c5a86cd3a38..6f885190d25eeccf7bf4792f46be0f84880f7947 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
@@ -20,13 +20,15 @@
 
 using namespace vf::lbm::dir;
 
-GridGenerator::GridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::Communicator& communicator):
-    mpiProcessID(communicator.getPID()), builder(builder)
+GridGenerator::GridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para,
+                             std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::Communicator &communicator)
+    : mpiProcessID(communicator.getPID()), builder(builder)
 {
     this->para = para;
     this->cudaMemoryManager = cudaMemoryManager;
     this->indexRearrangement = std::make_unique<IndexRearrangementForStreams>(para, builder, communicator);
-    this->interpolationGrouper = std::make_unique<InterpolationCellGrouper>(para->getParHallLevels(), para->getParDallLevels(), builder);
+    this->interpolationGrouper =
+        std::make_unique<InterpolationCellGrouper>(para->getParHallLevels(), para->getParDallLevels(), builder);
 }
 
 GridGenerator::~GridGenerator() = default;
@@ -59,15 +61,15 @@ void GridGenerator::allocArrays_CoordNeighborGeo()
     std::cout << "Number of Level: " << numberOfLevels << std::endl;
     int numberOfNodesGlobal = 0;
     std::cout << "Number of Nodes: " << std::endl;
-    
-    for (uint level = 0; level < numberOfLevels; level++) 
+
+    for (uint level = 0; level < numberOfLevels; level++)
     {
-        const int numberOfNodesPerLevel = builder->getNumberOfNodes(level) + 1;
+        const uint numberOfNodesPerLevel = builder->getNumberOfNodes(level) + 1;
         numberOfNodesGlobal += numberOfNodesPerLevel;
         std::cout << "Level " << level << " = " << numberOfNodesPerLevel << " Nodes" << std::endl;
-    
+
         setNumberOfNodes(numberOfNodesPerLevel, level);
-    
+
         cudaMemoryManager->cudaAllocCoord(level);
         cudaMemoryManager->cudaAllocSP(level);
         //cudaMemoryManager->cudaAllocF3SP(level);
@@ -75,7 +77,7 @@ void GridGenerator::allocArrays_CoordNeighborGeo()
 
         if(para->getUseTurbulentViscosity())
             cudaMemoryManager->cudaAllocTurbulentViscosity(level);
-        
+
         if(para->getIsBodyForce())
             cudaMemoryManager->cudaAllocBodyForce(level);
 
@@ -106,7 +108,7 @@ void GridGenerator::allocArrays_CoordNeighborGeo()
 
 void GridGenerator::allocArrays_taggedFluidNodes() {
 
-    for (uint level = 0; level < builder->getNumberOfGridLevels(); level++) 
+    for (uint level = 0; level < builder->getNumberOfGridLevels(); level++)
     {
         for ( CollisionTemplate tag: all_CollisionTemplate )
         {   //TODO: Need to add CollisionTemplate to GridBuilder to allow as argument and get rid of indivual get funtions for fluid node indices... and clean up this mess
@@ -155,16 +157,16 @@ void GridGenerator::allocArrays_taggedFluidNodes() {
             }
         }
         VF_LOG_INFO("Number of tagged nodes on level {}:", level);
-        VF_LOG_INFO("Default: {}, Border: {}, WriteMacroVars: {}, ApplyBodyForce: {}, AllFeatures: {}", 
+        VF_LOG_INFO("Default: {}, Border: {}, WriteMacroVars: {}, ApplyBodyForce: {}, AllFeatures: {}",
                     para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::Default],
                     para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::SubDomainBorder],
                     para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::WriteMacroVars],
                     para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::ApplyBodyForce],
-                    para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::AllFeatures]    );        
+                    para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::AllFeatures]    );
     }
 }
 
-void GridGenerator::tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level) {
+void GridGenerator::tagFluidNodeIndices(const std::vector<uint>& taggedFluidNodeIndices, CollisionTemplate tag, uint level) {
     switch(tag)
     {
         case CollisionTemplate::WriteMacroVars:
@@ -184,7 +186,7 @@ void GridGenerator::tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices
             break;
 
     }
-    
+
 }
 
 void GridGenerator::sortFluidNodeTags() {
@@ -201,7 +203,7 @@ void GridGenerator::sortFluidNodeTags() {
 void GridGenerator::allocArrays_BoundaryValues()
 {
     std::cout << "------read BoundaryValues------" << std::endl;
-    int blocks = 0;
+    int blocks;
 
     for (uint level = 0; level < builder->getNumberOfGridLevels(); level++) {
         const auto numberOfPressureValues = int(builder->getPressureSize(level));
@@ -229,12 +231,12 @@ void GridGenerator::allocArrays_BoundaryValues()
 
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         para->getParH(level)->slipBC.numberOfBCnodes = 0;
-        if (numberOfSlipValues > 1)
-        {
+        if (numberOfSlipValues > 1) {
             blocks = (numberOfSlipValues / para->getParH(level)->numberofthreads) + 1;
             para->getParH(level)->slipBC.numberOfBCnodes = blocks * para->getParH(level)->numberofthreads;
             cudaMemoryManager->cudaAllocSlipBC(level);
-            builder->getSlipValues(para->getParH(level)->slipBC.normalX, para->getParH(level)->slipBC.normalY, para->getParH(level)->slipBC.normalZ, para->getParH(level)->slipBC.k, level);
+            builder->getSlipValues(para->getParH(level)->slipBC.normalX, para->getParH(level)->slipBC.normalY,
+                                   para->getParH(level)->slipBC.normalZ, para->getParH(level)->slipBC.k, level);
             cudaMemoryManager->cudaCopySlipBC(level);
         }
         para->getParD(level)->slipBC.numberOfBCnodes = para->getParH(level)->slipBC.numberOfBCnodes;
@@ -254,11 +256,11 @@ void GridGenerator::allocArrays_BoundaryValues()
             para->getParH(level)->stressBC.numberOfBCnodes = blocks * para->getParH(level)->numberofthreads;
             cudaMemoryManager->cudaAllocStressBC(level);
             cudaMemoryManager->cudaAllocWallModel(level, para->getHasWallModelMonitor());
-            builder->getStressValues(   para->getParH(level)->stressBC.normalX,  para->getParH(level)->stressBC.normalY,  para->getParH(level)->stressBC.normalZ, 
+            builder->getStressValues(   para->getParH(level)->stressBC.normalX,  para->getParH(level)->stressBC.normalY,  para->getParH(level)->stressBC.normalZ,
                                         para->getParH(level)->stressBC.Vx,       para->getParH(level)->stressBC.Vy,       para->getParH(level)->stressBC.Vz,
                                         para->getParH(level)->stressBC.Vx1,      para->getParH(level)->stressBC.Vy1,      para->getParH(level)->stressBC.Vz1,
-                                        para->getParH(level)->stressBC.k,        para->getParH(level)->stressBC.kN,       
-                                        para->getParH(level)->wallModel.samplingOffset, para->getParH(level)->wallModel.z0, 
+                                        para->getParH(level)->stressBC.k,        para->getParH(level)->stressBC.kN,
+                                        para->getParH(level)->wallModel.samplingOffset, para->getParH(level)->wallModel.z0,
                                         level);
 
             cudaMemoryManager->cudaCopyStressBC(level);
@@ -268,7 +270,7 @@ void GridGenerator::allocArrays_BoundaryValues()
         para->getParH(level)->numberOfStressBCnodesRead = para->getParH(level)->stressBC.numberOfBCnodes * para->getD3Qxx();
         para->getParD(level)->numberOfStressBCnodesRead = para->getParH(level)->stressBC.numberOfBCnodes * para->getD3Qxx();
     }
-    
+
 
     for (uint level = 0; level < builder->getNumberOfGridLevels(); level++) {
         const auto numberOfVelocityValues = int(builder->getVelocitySize(level));
@@ -285,7 +287,8 @@ void GridGenerator::allocArrays_BoundaryValues()
             cudaMemoryManager->cudaAllocVeloBC(level);
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-            builder->getVelocityValues(para->getParH(level)->velocityBC.Vx, para->getParH(level)->velocityBC.Vy, para->getParH(level)->velocityBC.Vz, para->getParH(level)->velocityBC.k, level);
+            builder->getVelocityValues(para->getParH(level)->velocityBC.Vx, para->getParH(level)->velocityBC.Vy,
+                                       para->getParH(level)->velocityBC.Vz, para->getParH(level)->velocityBC.k, level);
 
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -327,7 +330,7 @@ void GridGenerator::allocArrays_BoundaryValues()
         const auto numberOfPrecursorValues = int(builder->getPrecursorSize(level));
         *logging::out << logging::Logger::INFO_INTERMEDIATE << "size precursor level " << level << " : " << numberOfPrecursorValues << "\n";
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        int blocks = (numberOfPrecursorValues / para->getParH(level)->numberofthreads) + 1;
+        blocks = (numberOfPrecursorValues / para->getParH(level)->numberofthreads) + 1;
         para->getParH(level)->precursorBC.sizeQ = blocks * para->getParH(level)->numberofthreads;
         para->getParD(level)->precursorBC.sizeQ = para->getParH(level)->precursorBC.sizeQ;
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -335,19 +338,19 @@ void GridGenerator::allocArrays_BoundaryValues()
         para->getParD(level)->precursorBC.numberOfBCnodes = numberOfPrecursorValues;
         para->getParH(level)->numberOfPrecursorBCnodesRead = numberOfPrecursorValues * para->getD3Qxx();
         para->getParD(level)->numberOfPrecursorBCnodesRead = numberOfPrecursorValues * para->getD3Qxx();
-        
+
         if (numberOfPrecursorValues > 1)
         {
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
             cudaMemoryManager->cudaAllocPrecursorBC(level);
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
             builder->getPrecursorValues(
-                    para->getParH(level)->precursorBC.planeNeighbor0PP, para->getParH(level)->precursorBC.planeNeighbor0PM, 
-                    para->getParH(level)->precursorBC.planeNeighbor0MP, para->getParH(level)->precursorBC.planeNeighbor0MM, 
-                    para->getParH(level)->precursorBC.weights0PP, para->getParH(level)->precursorBC.weights0PM, 
-                    para->getParH(level)->precursorBC.weights0MP, para->getParH(level)->precursorBC.weights0MM, 
-                    para->getParH(level)->precursorBC.k, para->getParH(level)->transientBCInputFileReader, para->getParH(level)->precursorBC.numberOfPrecursorNodes, 
-                    para->getParH(level)->precursorBC.numberOfQuantities, para->getParH(level)->precursorBC.timeStepsBetweenReads, 
+                    para->getParH(level)->precursorBC.planeNeighbor0PP, para->getParH(level)->precursorBC.planeNeighbor0PM,
+                    para->getParH(level)->precursorBC.planeNeighbor0MP, para->getParH(level)->precursorBC.planeNeighbor0MM,
+                    para->getParH(level)->precursorBC.weights0PP, para->getParH(level)->precursorBC.weights0PM,
+                    para->getParH(level)->precursorBC.weights0MP, para->getParH(level)->precursorBC.weights0MM,
+                    para->getParH(level)->precursorBC.k, para->getParH(level)->transientBCInputFileReader, para->getParH(level)->precursorBC.numberOfPrecursorNodes,
+                    para->getParH(level)->precursorBC.numberOfQuantities, para->getParH(level)->precursorBC.timeStepsBetweenReads,
                     para->getParH(level)->precursorBC.velocityX, para->getParH(level)->precursorBC.velocityY, para->getParH(level)->precursorBC.velocityZ,
                     level);
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -360,7 +363,9 @@ void GridGenerator::allocArrays_BoundaryValues()
 
             for(auto reader : para->getParH(level)->transientBCInputFileReader)
             {
-                if(reader->getNumberOfQuantities() != para->getParD(level)->precursorBC.numberOfQuantities) throw std::runtime_error("Number of quantities in reader and number of quantities needed for precursor don't match!");
+                if(reader->getNumberOfQuantities() != para->getParD(level)->precursorBC.numberOfQuantities)
+                    throw std::runtime_error(
+                        "Number of quantities in reader and number of quantities needed for precursor don't match!");
             }
 
             cudaMemoryManager->cudaCopyPrecursorBC(level);
@@ -368,7 +373,7 @@ void GridGenerator::allocArrays_BoundaryValues()
 
             // read first timestep of precursor into next and copy to next on device
             for(auto reader : para->getParH(level)->transientBCInputFileReader)
-            {   
+            {
                 reader->getNextData(para->getParH(level)->precursorBC.next, para->getParH(level)->precursorBC.numberOfPrecursorNodes, 0);
             }
 
@@ -382,7 +387,7 @@ void GridGenerator::allocArrays_BoundaryValues()
             //read second timestep of precursor into next and copy next to device
             real nextTime = para->getParD(level)->precursorBC.timeStepsBetweenReads*pow(2,-((real)level))*para->getTimeRatio();
             for(auto reader : para->getParH(level)->transientBCInputFileReader)
-            {   
+            {
                 reader->getNextData(para->getParH(level)->precursorBC.next, para->getParH(level)->precursorBC.numberOfPrecursorNodes, nextTime);
             }
 
@@ -398,7 +403,7 @@ void GridGenerator::allocArrays_BoundaryValues()
 
             //start usual cycle of loading, i.e. read velocities of timestep after current and copy asynchronously to device
             for(auto reader : para->getParH(level)->transientBCInputFileReader)
-            {   
+            {
                 reader->getNextData(para->getParH(level)->precursorBC.next, para->getParH(level)->precursorBC.numberOfPrecursorNodes, 2*nextTime);
             }
 
@@ -476,7 +481,7 @@ void GridGenerator::initalValuesDomainDecompostion()
     if (para->getNumprocs() < 2)
         return;
     if ((para->getNumprocs() > 1) /*&& (procNeighborsSendX.size() == procNeighborsRecvX.size())*/) {
-        
+
         // direction has to be changed in case of periodic BCs and multiple sub domains
         std::vector<int> fillOrder = { 0, 1, 2, 3, 4, 5 };
 
@@ -556,7 +561,7 @@ void GridGenerator::initalValuesDomainDecompostion()
                         builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborX[indexProcessNeighbor].index, direction,
                                                    level);
                         if (level != builder->getNumberOfGridLevels() - 1 && para->useReducedCommunicationAfterFtoC)
-                            indexRearrangement->initCommunicationArraysForCommAfterFinetoCoarseX(level, indexProcessNeighbor, direction);             
+                            indexRearrangement->initCommunicationArraysForCommAfterFinetoCoarseX(level, indexProcessNeighbor, direction);
                         ////////////////////////////////////////////////////////////////////////////////////////
                         cudaMemoryManager->cudaCopyProcessNeighborXIndex(level, indexProcessNeighbor);
                         ////////////////////////////////////////////////////////////////////////////////////////
@@ -619,7 +624,7 @@ void GridGenerator::initalValuesDomainDecompostion()
                         ////////////////////////////////////////////////////////////////////////////////////////
                         // malloc on host and device
                         cudaMemoryManager->cudaAllocProcessNeighborY(level, indexProcessNeighbor);
-                        ////////////////////////////////////////////////////////////////////////////////////////                        
+                        ////////////////////////////////////////////////////////////////////////////////////////
                         // init index arrays
                         builder->getSendIndices(para->getParH(level)->sendProcessNeighborY[indexProcessNeighbor].index, direction, level);
                         builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborY[indexProcessNeighbor].index, direction,
@@ -638,7 +643,7 @@ void GridGenerator::initalValuesDomainDecompostion()
 
                     if (tempSend > 0) {
                         int indexProcessNeighbor = (int)para->getParH(level)->sendProcessNeighborZ.size();
-    
+
                         para->getParH(level)->sendProcessNeighborZ.emplace_back();
                         para->getParD(level)->sendProcessNeighborZ.emplace_back();
                         para->getParH(level)->recvProcessNeighborZ.emplace_back();
@@ -930,7 +935,7 @@ void GridGenerator::allocArrays_BoundaryQs()
             unsigned int sizeQ = para->getParH(i)->pressureBC.numberOfBCnodes;
             QforBoundaryConditions Q;
             getPointersToBoundaryConditions(Q, QQ, sizeQ);
-            
+
             builder->getPressureQs(Q.q27, i);
 
 
@@ -977,7 +982,7 @@ void GridGenerator::allocArrays_BoundaryQs()
             unsigned int sizeQ = para->getParH(i)->slipBC.numberOfBCnodes;
             QforBoundaryConditions Q;
             getPointersToBoundaryConditions(Q, QQ, sizeQ);
-            
+
             builder->getSlipQs(Q.q27, i);
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
             cudaMemoryManager->cudaCopySlipBC(i);
@@ -997,7 +1002,7 @@ void GridGenerator::allocArrays_BoundaryQs()
             unsigned int sizeQ = para->getParH(i)->stressBC.numberOfBCnodes;
             QforBoundaryConditions Q;
             getPointersToBoundaryConditions(Q, QQ, sizeQ);
-            
+
             builder->getStressQs(Q.q27, i);
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
             cudaMemoryManager->cudaCopyStressBC(i);
@@ -1165,7 +1170,7 @@ void GridGenerator::allocArrays_BoundaryQs()
 
 void GridGenerator::allocArrays_OffsetScale()
 {
-    for (uint level = 0; level < builder->getNumberOfGridLevels() - 1; level++) 
+    for (uint level = 0; level < builder->getNumberOfGridLevels() - 1; level++)
     {
         const uint numberOfNodesPerLevelCF = builder->getNumberOfNodesCF(level);
         const uint numberOfNodesPerLevelFC = builder->getNumberOfNodesFC(level);
@@ -1204,7 +1209,7 @@ void GridGenerator::allocArrays_OffsetScale()
         builder->getOffsetCF(para->getParH(level)->offCF.xOffCF, para->getParH(level)->offCF.yOffCF, para->getParH(level)->offCF.zOffCF, level);
         builder->getOffsetFC(para->getParH(level)->offFC.xOffFC, para->getParH(level)->offFC.yOffFC, para->getParH(level)->offFC.zOffFC, level);
         builder->getGridInterfaceIndices(para->getParH(level)->intCF.ICellCFC, para->getParH(level)->intCF.ICellCFF, para->getParH(level)->intFC.ICellFCC, para->getParH(level)->intFC.ICellFCF, level);
-        
+
         if (para->getUseStreams() || para->getNumprocs() > 1) {
             // split fine-to-coarse indices into border and bulk
             interpolationGrouper->splitFineToCoarseIntoBorderAndBulk(level);
@@ -1277,8 +1282,8 @@ std::string GridGenerator::verifyNeighborIndices(int level) const
     int wrongNeighbors = 0;
     int stopperNodes = 0;
 
-    for (uint index = 0; index < para->getParH(level)->numberOfNodes; index++)
-        oss << verifyNeighborIndex(level, index, invalidNodes, stopperNodes, wrongNeighbors);
+    for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++)
+        oss << verifyNeighborIndex(level, (int)index, invalidNodes, stopperNodes, wrongNeighbors);
 
 
     oss << "invalid nodes found: " << invalidNodes << "\n";
@@ -1307,7 +1312,7 @@ std::string GridGenerator::verifyNeighborIndex(int level, int index , int &inval
 
     //std::cout << para->getParH(level)->coordinateX[1] << ", " << para->getParH(level)->coordinateY[1] << ", " << para->getParH(level)->coordinateZ[1] << std::endl;
     //std::cout << para->getParH(level)->coordinateX[para->getParH(level)->numberOfNodes - 1] << ", " << para->getParH(level)->coordinateY[para->getParH(level)->numberOfNodes - 1] << ", " << para->getParH(level)->coordinateZ[para->getParH(level)->numberOfNodes - 1] << std::endl;
-    
+
     real maxX = para->getParH(level)->coordinateX[para->getParH(level)->numberOfNodes - 1] - delta;
     real maxY = para->getParH(level)->coordinateY[para->getParH(level)->numberOfNodes - 1] - delta;
     real maxZ = para->getParH(level)->coordinateZ[para->getParH(level)->numberOfNodes - 1] - delta;
@@ -1348,8 +1353,8 @@ std::string GridGenerator::checkNeighbor(int level, real x, real y, real z, int
 
     if (!neighborValid) {
         oss << "NeighborX invalid from: (" << x << ", " << y << ", " << z << "), index: " << index << ", "
-            << direction << " neighborIndex: " << neighborIndex << 
-            ", actual neighborCoords : (" << neighborCoordX << ", " << neighborCoordY << ", " << neighborCoordZ << 
+            << direction << " neighborIndex: " << neighborIndex <<
+            ", actual neighborCoords : (" << neighborCoordX << ", " << neighborCoordY << ", " << neighborCoordZ <<
             "), expected neighborCoords : (" << neighborX << ", " << neighborY << ", " << neighborZ << ")\n";
         numberOfWrongNeihgbors++;
     }
@@ -1384,4 +1389,4 @@ void GridGenerator::getPointersToBoundaryConditions(QforBoundaryConditions& boun
     boundaryConditionStruct.q27[DIR_MMM] =  &subgridDistances[DIR_MMM * numberOfBCnodes];
     boundaryConditionStruct.q27[DIR_PMM] =  &subgridDistances[DIR_PMM * numberOfBCnodes];
     boundaryConditionStruct.q27[DIR_MPM] =  &subgridDistances[DIR_MPM * numberOfBCnodes];
-}
\ No newline at end of file
+}
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
index cee661a0c1092e7a3d334018133fd2f963ada991..c97ed02a64da1d5fafa18150c75d149f96484d44 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h
@@ -78,7 +78,7 @@ public:
     void allocArrays_OffsetScale() override;
     void allocArrays_taggedFluidNodes() override;
 
-    void tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level) override;
+    void tagFluidNodeIndices(const std::vector<uint>& taggedFluidNodeIndices, CollisionTemplate tag, uint level) override;
     void sortFluidNodeTags() override;
 
     virtual void setDimensions() override;
diff --git a/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.cpp b/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.cpp
index 00a4c79574ce9d8ae372bfe9f7e546c05175bb10..49a6887ef2e462aba190023d334caa0012e2254e 100644
--- a/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.cpp
+++ b/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.cpp
@@ -6,7 +6,7 @@ void GridScalingFactory::setScalingFactory(const GridScalingFactory::GridScaling
     this->gridScaling = gridScalingType;
 }
 
-gridScalingFC GridScalingFactory::getGridScalingFC() const
+gridScalingFC GridScalingFactory::getGridScalingFC(bool hasTurbulentViscosity) const
 {
     // for descriptions of the scaling types refer to the header
     switch (gridScaling) {
@@ -14,14 +14,15 @@ gridScalingFC GridScalingFactory::getGridScalingFC() const
             return ScaleFC_RhoSq_comp_27;
             break;
         case GridScaling::ScaleCompressible:
-            return ScaleFC_compressible;
+            if(hasTurbulentViscosity)   return ScaleFC_compressible<true>;
+            else                        return ScaleFC_compressible<false>;
             break;
         default:
             return nullptr;
     }
 }
 
-gridScalingCF GridScalingFactory::getGridScalingCF() const
+gridScalingCF GridScalingFactory::getGridScalingCF(bool hasTurbulentViscosity) const
 {
     // for descriptions of the scaling types refer to the header
     switch (gridScaling) {
@@ -29,8 +30,11 @@ gridScalingCF GridScalingFactory::getGridScalingCF() const
             return ScaleCF_RhoSq_comp_27;
             break;
         case GridScaling::ScaleCompressible:
-            return ScaleCF_compressible;
-            break;
+            {
+                if(hasTurbulentViscosity)   return ScaleCF_compressible<true>;
+                else                        return ScaleCF_compressible<false>;
+                break;
+            }
         default:
             return nullptr;
     }
diff --git a/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h b/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h
index 7d7c20c63a01e2dba6a5578c6520c0ab06894b3c..d760240c2c5ed429799cd89e57704464515a92f5 100644
--- a/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h
+++ b/src/gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h
@@ -59,8 +59,8 @@ public:
 
     void setScalingFactory(const GridScalingFactory::GridScaling gridScalingType);
 
-    [[nodiscard]] gridScalingFC getGridScalingFC() const;
-    [[nodiscard]] gridScalingCF getGridScalingCF() const;
+    [[nodiscard]] gridScalingFC getGridScalingFC(bool hasTurbulentViscosity) const;
+    [[nodiscard]] gridScalingCF getGridScalingCF(bool hasTurbulentViscosity) const;
 
 private:
     GridScaling gridScaling = GridScaling::NotSpecified;
diff --git a/src/gpu/VirtualFluids_GPU/GPU/AdvectionDiffusion27chim.cu b/src/gpu/VirtualFluids_GPU/GPU/AdvectionDiffusion27chim.cu
index 8f54358e04063c9063c873caf02a86e76bb7f936..04f6afe4cf9ebd99dc293ded16f55a56f0d77036 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/AdvectionDiffusion27chim.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/AdvectionDiffusion27chim.cu
@@ -74,7 +74,7 @@ __global__ void Factorized_Central_Moments_Advection_Diffusion_Device_Kernel(
 	uint* neighborZ,
 	real* distributions,
 	real* distributionsAD,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	real* forces,
 	bool isEvenTimestep)
 {
@@ -100,7 +100,7 @@ __global__ void Factorized_Central_Moments_Advection_Diffusion_Device_Kernel(
 
 	//////////////////////////////////////////////////////////////////////////
 	// run for all indices in size_Mat and fluid nodes
-	if ((k < size_Mat) && (typeOfGridNode[k] == GEO_FLUID))
+	if ((k < numberOfLBnodes) && (typeOfGridNode[k] == GEO_FLUID))
 	{
 		//////////////////////////////////////////////////////////////////////////
 		//! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref
@@ -109,125 +109,125 @@ __global__ void Factorized_Central_Moments_Advection_Diffusion_Device_Kernel(
 		Distributions27 dist;
 		if (isEvenTimestep)
 		{
-			dist.f[DIR_P00   ] = &distributions[DIR_P00   *size_Mat];
-			dist.f[DIR_M00   ] = &distributions[DIR_M00   *size_Mat];
-			dist.f[DIR_0P0   ] = &distributions[DIR_0P0   *size_Mat];
-			dist.f[DIR_0M0   ] = &distributions[DIR_0M0   *size_Mat];
-			dist.f[DIR_00P   ] = &distributions[DIR_00P   *size_Mat];
-			dist.f[DIR_00M   ] = &distributions[DIR_00M   *size_Mat];
-			dist.f[DIR_PP0  ] = &distributions[DIR_PP0  *size_Mat];
-			dist.f[DIR_MM0  ] = &distributions[DIR_MM0  *size_Mat];
-			dist.f[DIR_PM0  ] = &distributions[DIR_PM0  *size_Mat];
-			dist.f[DIR_MP0  ] = &distributions[DIR_MP0  *size_Mat];
-			dist.f[DIR_P0P  ] = &distributions[DIR_P0P  *size_Mat];
-			dist.f[DIR_M0M  ] = &distributions[DIR_M0M  *size_Mat];
-			dist.f[DIR_P0M  ] = &distributions[DIR_P0M  *size_Mat];
-			dist.f[DIR_M0P  ] = &distributions[DIR_M0P  *size_Mat];
-			dist.f[DIR_0PP  ] = &distributions[DIR_0PP  *size_Mat];
-			dist.f[DIR_0MM  ] = &distributions[DIR_0MM  *size_Mat];
-			dist.f[DIR_0PM  ] = &distributions[DIR_0PM  *size_Mat];
-			dist.f[DIR_0MP  ] = &distributions[DIR_0MP  *size_Mat];
-			dist.f[DIR_000] = &distributions[DIR_000*size_Mat];
-			dist.f[DIR_PPP ] = &distributions[DIR_PPP *size_Mat];
-			dist.f[DIR_MMP ] = &distributions[DIR_MMP *size_Mat];
-			dist.f[DIR_PMP ] = &distributions[DIR_PMP *size_Mat];
-			dist.f[DIR_MPP ] = &distributions[DIR_MPP *size_Mat];
-			dist.f[DIR_PPM ] = &distributions[DIR_PPM *size_Mat];
-			dist.f[DIR_MMM ] = &distributions[DIR_MMM *size_Mat];
-			dist.f[DIR_PMM ] = &distributions[DIR_PMM *size_Mat];
-			dist.f[DIR_MPM ] = &distributions[DIR_MPM *size_Mat];
+			dist.f[DIR_P00] = &distributions[DIR_P00 * numberOfLBnodes];
+			dist.f[DIR_M00] = &distributions[DIR_M00 * numberOfLBnodes];
+			dist.f[DIR_0P0] = &distributions[DIR_0P0 * numberOfLBnodes];
+			dist.f[DIR_0M0] = &distributions[DIR_0M0 * numberOfLBnodes];
+			dist.f[DIR_00P] = &distributions[DIR_00P * numberOfLBnodes];
+			dist.f[DIR_00M] = &distributions[DIR_00M * numberOfLBnodes];
+			dist.f[DIR_PP0] = &distributions[DIR_PP0 * numberOfLBnodes];
+			dist.f[DIR_MM0] = &distributions[DIR_MM0 * numberOfLBnodes];
+			dist.f[DIR_PM0] = &distributions[DIR_PM0 * numberOfLBnodes];
+			dist.f[DIR_MP0] = &distributions[DIR_MP0 * numberOfLBnodes];
+			dist.f[DIR_P0P] = &distributions[DIR_P0P * numberOfLBnodes];
+			dist.f[DIR_M0M] = &distributions[DIR_M0M * numberOfLBnodes];
+			dist.f[DIR_P0M] = &distributions[DIR_P0M * numberOfLBnodes];
+			dist.f[DIR_M0P] = &distributions[DIR_M0P * numberOfLBnodes];
+			dist.f[DIR_0PP] = &distributions[DIR_0PP * numberOfLBnodes];
+			dist.f[DIR_0MM] = &distributions[DIR_0MM * numberOfLBnodes];
+			dist.f[DIR_0PM] = &distributions[DIR_0PM * numberOfLBnodes];
+			dist.f[DIR_0MP] = &distributions[DIR_0MP * numberOfLBnodes];
+			dist.f[DIR_000] = &distributions[DIR_000 * numberOfLBnodes];
+			dist.f[DIR_PPP] = &distributions[DIR_PPP * numberOfLBnodes];
+			dist.f[DIR_MMP] = &distributions[DIR_MMP * numberOfLBnodes];
+			dist.f[DIR_PMP] = &distributions[DIR_PMP * numberOfLBnodes];
+			dist.f[DIR_MPP] = &distributions[DIR_MPP * numberOfLBnodes];
+			dist.f[DIR_PPM] = &distributions[DIR_PPM * numberOfLBnodes];
+			dist.f[DIR_MMM] = &distributions[DIR_MMM * numberOfLBnodes];
+			dist.f[DIR_PMM] = &distributions[DIR_PMM * numberOfLBnodes];
+			dist.f[DIR_MPM] = &distributions[DIR_MPM * numberOfLBnodes];
 		}
 		else
 		{
-			dist.f[DIR_M00   ] = &distributions[DIR_P00   *size_Mat];
-			dist.f[DIR_P00   ] = &distributions[DIR_M00   *size_Mat];
-			dist.f[DIR_0M0   ] = &distributions[DIR_0P0   *size_Mat];
-			dist.f[DIR_0P0   ] = &distributions[DIR_0M0   *size_Mat];
-			dist.f[DIR_00M   ] = &distributions[DIR_00P   *size_Mat];
-			dist.f[DIR_00P   ] = &distributions[DIR_00M   *size_Mat];
-			dist.f[DIR_MM0  ] = &distributions[DIR_PP0  *size_Mat];
-			dist.f[DIR_PP0  ] = &distributions[DIR_MM0  *size_Mat];
-			dist.f[DIR_MP0  ] = &distributions[DIR_PM0  *size_Mat];
-			dist.f[DIR_PM0  ] = &distributions[DIR_MP0  *size_Mat];
-			dist.f[DIR_M0M  ] = &distributions[DIR_P0P  *size_Mat];
-			dist.f[DIR_P0P  ] = &distributions[DIR_M0M  *size_Mat];
-			dist.f[DIR_M0P  ] = &distributions[DIR_P0M  *size_Mat];
-			dist.f[DIR_P0M  ] = &distributions[DIR_M0P  *size_Mat];
-			dist.f[DIR_0MM  ] = &distributions[DIR_0PP  *size_Mat];
-			dist.f[DIR_0PP  ] = &distributions[DIR_0MM  *size_Mat];
-			dist.f[DIR_0MP  ] = &distributions[DIR_0PM  *size_Mat];
-			dist.f[DIR_0PM  ] = &distributions[DIR_0MP  *size_Mat];
-			dist.f[DIR_000] = &distributions[DIR_000*size_Mat];
-			dist.f[DIR_MMM ] = &distributions[DIR_PPP *size_Mat];
-			dist.f[DIR_PPM ] = &distributions[DIR_MMP *size_Mat];
-			dist.f[DIR_MPM ] = &distributions[DIR_PMP *size_Mat];
-			dist.f[DIR_PMM ] = &distributions[DIR_MPP *size_Mat];
-			dist.f[DIR_MMP ] = &distributions[DIR_PPM *size_Mat];
-			dist.f[DIR_PPP ] = &distributions[DIR_MMM *size_Mat];
-			dist.f[DIR_MPP ] = &distributions[DIR_PMM *size_Mat];
-			dist.f[DIR_PMP ] = &distributions[DIR_MPM *size_Mat];
+			dist.f[DIR_M00] = &distributions[DIR_P00 * numberOfLBnodes];
+			dist.f[DIR_P00] = &distributions[DIR_M00 * numberOfLBnodes];
+			dist.f[DIR_0M0] = &distributions[DIR_0P0 * numberOfLBnodes];
+			dist.f[DIR_0P0] = &distributions[DIR_0M0 * numberOfLBnodes];
+			dist.f[DIR_00M] = &distributions[DIR_00P * numberOfLBnodes];
+			dist.f[DIR_00P] = &distributions[DIR_00M * numberOfLBnodes];
+			dist.f[DIR_MM0] = &distributions[DIR_PP0 * numberOfLBnodes];
+			dist.f[DIR_PP0] = &distributions[DIR_MM0 * numberOfLBnodes];
+			dist.f[DIR_MP0] = &distributions[DIR_PM0 * numberOfLBnodes];
+			dist.f[DIR_PM0] = &distributions[DIR_MP0 * numberOfLBnodes];
+			dist.f[DIR_M0M] = &distributions[DIR_P0P * numberOfLBnodes];
+			dist.f[DIR_P0P] = &distributions[DIR_M0M * numberOfLBnodes];
+			dist.f[DIR_M0P] = &distributions[DIR_P0M * numberOfLBnodes];
+			dist.f[DIR_P0M] = &distributions[DIR_M0P * numberOfLBnodes];
+			dist.f[DIR_0MM] = &distributions[DIR_0PP * numberOfLBnodes];
+			dist.f[DIR_0PP] = &distributions[DIR_0MM * numberOfLBnodes];
+			dist.f[DIR_0MP] = &distributions[DIR_0PM * numberOfLBnodes];
+			dist.f[DIR_0PM] = &distributions[DIR_0MP * numberOfLBnodes];
+			dist.f[DIR_000] = &distributions[DIR_000 * numberOfLBnodes];
+			dist.f[DIR_MMM] = &distributions[DIR_PPP * numberOfLBnodes];
+			dist.f[DIR_PPM] = &distributions[DIR_MMP * numberOfLBnodes];
+			dist.f[DIR_MPM] = &distributions[DIR_PMP * numberOfLBnodes];
+			dist.f[DIR_PMM] = &distributions[DIR_MPP * numberOfLBnodes];
+			dist.f[DIR_MMP] = &distributions[DIR_PPM * numberOfLBnodes];
+			dist.f[DIR_PPP] = &distributions[DIR_MMM * numberOfLBnodes];
+			dist.f[DIR_MPP] = &distributions[DIR_PMM * numberOfLBnodes];
+			dist.f[DIR_PMP] = &distributions[DIR_MPM * numberOfLBnodes];
 		}
 		////////////////////////////////////////////////////////////////////////////////
 		Distributions27 distAD;
 		if (isEvenTimestep)
 		{
-			distAD.f[DIR_P00   ] = &distributionsAD[DIR_P00   *size_Mat];
-			distAD.f[DIR_M00   ] = &distributionsAD[DIR_M00   *size_Mat];
-			distAD.f[DIR_0P0   ] = &distributionsAD[DIR_0P0   *size_Mat];
-			distAD.f[DIR_0M0   ] = &distributionsAD[DIR_0M0   *size_Mat];
-			distAD.f[DIR_00P   ] = &distributionsAD[DIR_00P   *size_Mat];
-			distAD.f[DIR_00M   ] = &distributionsAD[DIR_00M   *size_Mat];
-			distAD.f[DIR_PP0  ] = &distributionsAD[DIR_PP0  *size_Mat];
-			distAD.f[DIR_MM0  ] = &distributionsAD[DIR_MM0  *size_Mat];
-			distAD.f[DIR_PM0  ] = &distributionsAD[DIR_PM0  *size_Mat];
-			distAD.f[DIR_MP0  ] = &distributionsAD[DIR_MP0  *size_Mat];
-			distAD.f[DIR_P0P  ] = &distributionsAD[DIR_P0P  *size_Mat];
-			distAD.f[DIR_M0M  ] = &distributionsAD[DIR_M0M  *size_Mat];
-			distAD.f[DIR_P0M  ] = &distributionsAD[DIR_P0M  *size_Mat];
-			distAD.f[DIR_M0P  ] = &distributionsAD[DIR_M0P  *size_Mat];
-			distAD.f[DIR_0PP  ] = &distributionsAD[DIR_0PP  *size_Mat];
-			distAD.f[DIR_0MM  ] = &distributionsAD[DIR_0MM  *size_Mat];
-			distAD.f[DIR_0PM  ] = &distributionsAD[DIR_0PM  *size_Mat];
-			distAD.f[DIR_0MP  ] = &distributionsAD[DIR_0MP  *size_Mat];
-			distAD.f[DIR_000] = &distributionsAD[DIR_000*size_Mat];
-			distAD.f[DIR_PPP ] = &distributionsAD[DIR_PPP *size_Mat];
-			distAD.f[DIR_MMP ] = &distributionsAD[DIR_MMP *size_Mat];
-			distAD.f[DIR_PMP ] = &distributionsAD[DIR_PMP *size_Mat];
-			distAD.f[DIR_MPP ] = &distributionsAD[DIR_MPP *size_Mat];
-			distAD.f[DIR_PPM ] = &distributionsAD[DIR_PPM *size_Mat];
-			distAD.f[DIR_MMM ] = &distributionsAD[DIR_MMM *size_Mat];
-			distAD.f[DIR_PMM ] = &distributionsAD[DIR_PMM *size_Mat];
-			distAD.f[DIR_MPM ] = &distributionsAD[DIR_MPM *size_Mat];
+			distAD.f[DIR_P00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+			distAD.f[DIR_M00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+			distAD.f[DIR_0P0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+			distAD.f[DIR_0M0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+			distAD.f[DIR_00P] = &distributionsAD[DIR_00P * numberOfLBnodes];
+			distAD.f[DIR_00M] = &distributionsAD[DIR_00M * numberOfLBnodes];
+			distAD.f[DIR_PP0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+			distAD.f[DIR_MM0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+			distAD.f[DIR_PM0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+			distAD.f[DIR_MP0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+			distAD.f[DIR_P0P] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+			distAD.f[DIR_M0M] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+			distAD.f[DIR_P0M] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+			distAD.f[DIR_M0P] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+			distAD.f[DIR_0PP] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+			distAD.f[DIR_0MM] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+			distAD.f[DIR_0PM] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+			distAD.f[DIR_0MP] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+			distAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+			distAD.f[DIR_PPP] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+			distAD.f[DIR_MMP] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+			distAD.f[DIR_PMP] = &distributionsAD[DIR_PMP * numberOfLBnodes];
+			distAD.f[DIR_MPP] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+			distAD.f[DIR_PPM] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+			distAD.f[DIR_MMM] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+			distAD.f[DIR_PMM] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+			distAD.f[DIR_MPM] = &distributionsAD[DIR_MPM * numberOfLBnodes];
 		}
 		else
 		{
-			distAD.f[DIR_M00   ] = &distributionsAD[DIR_P00   *size_Mat];
-			distAD.f[DIR_P00   ] = &distributionsAD[DIR_M00   *size_Mat];
-			distAD.f[DIR_0M0   ] = &distributionsAD[DIR_0P0   *size_Mat];
-			distAD.f[DIR_0P0   ] = &distributionsAD[DIR_0M0   *size_Mat];
-			distAD.f[DIR_00M   ] = &distributionsAD[DIR_00P   *size_Mat];
-			distAD.f[DIR_00P   ] = &distributionsAD[DIR_00M   *size_Mat];
-			distAD.f[DIR_MM0  ] = &distributionsAD[DIR_PP0  *size_Mat];
-			distAD.f[DIR_PP0  ] = &distributionsAD[DIR_MM0  *size_Mat];
-			distAD.f[DIR_MP0  ] = &distributionsAD[DIR_PM0  *size_Mat];
-			distAD.f[DIR_PM0  ] = &distributionsAD[DIR_MP0  *size_Mat];
-			distAD.f[DIR_M0M  ] = &distributionsAD[DIR_P0P  *size_Mat];
-			distAD.f[DIR_P0P  ] = &distributionsAD[DIR_M0M  *size_Mat];
-			distAD.f[DIR_M0P  ] = &distributionsAD[DIR_P0M  *size_Mat];
-			distAD.f[DIR_P0M  ] = &distributionsAD[DIR_M0P  *size_Mat];
-			distAD.f[DIR_0MM  ] = &distributionsAD[DIR_0PP  *size_Mat];
-			distAD.f[DIR_0PP  ] = &distributionsAD[DIR_0MM  *size_Mat];
-			distAD.f[DIR_0MP  ] = &distributionsAD[DIR_0PM  *size_Mat];
-			distAD.f[DIR_0PM  ] = &distributionsAD[DIR_0MP  *size_Mat];
-			distAD.f[DIR_000] = &distributionsAD[DIR_000*size_Mat];
-			distAD.f[DIR_MMM ] = &distributionsAD[DIR_PPP *size_Mat];
-			distAD.f[DIR_PPM ] = &distributionsAD[DIR_MMP *size_Mat];
-			distAD.f[DIR_MPM ] = &distributionsAD[DIR_PMP *size_Mat];
-			distAD.f[DIR_PMM ] = &distributionsAD[DIR_MPP *size_Mat];
-			distAD.f[DIR_MMP ] = &distributionsAD[DIR_PPM *size_Mat];
-			distAD.f[DIR_PPP ] = &distributionsAD[DIR_MMM *size_Mat];
-			distAD.f[DIR_MPP ] = &distributionsAD[DIR_PMM *size_Mat];
-			distAD.f[DIR_PMP ] = &distributionsAD[DIR_MPM *size_Mat];
+			distAD.f[DIR_M00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+			distAD.f[DIR_P00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+			distAD.f[DIR_0M0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+			distAD.f[DIR_0P0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+			distAD.f[DIR_00M] = &distributionsAD[DIR_00P * numberOfLBnodes];
+			distAD.f[DIR_00P] = &distributionsAD[DIR_00M * numberOfLBnodes];
+			distAD.f[DIR_MM0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+			distAD.f[DIR_PP0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+			distAD.f[DIR_MP0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+			distAD.f[DIR_PM0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+			distAD.f[DIR_M0M] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+			distAD.f[DIR_P0P] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+			distAD.f[DIR_M0P] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+			distAD.f[DIR_P0M] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+			distAD.f[DIR_0MM] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+			distAD.f[DIR_0PP] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+			distAD.f[DIR_0MP] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+			distAD.f[DIR_0PM] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+			distAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+			distAD.f[DIR_MMM] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+			distAD.f[DIR_PPM] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+			distAD.f[DIR_MPM] = &distributionsAD[DIR_PMP * numberOfLBnodes];
+			distAD.f[DIR_PMM] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+			distAD.f[DIR_MMP] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+			distAD.f[DIR_PPP] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+			distAD.f[DIR_MPP] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+			distAD.f[DIR_PMP] = &distributionsAD[DIR_MPM * numberOfLBnodes];
 		}
 		////////////////////////////////////////////////////////////////////////////////
 		//! - Set neighbor indices (necessary for indirect addressing)
@@ -241,63 +241,63 @@ __global__ void Factorized_Central_Moments_Advection_Diffusion_Device_Kernel(
 		////////////////////////////////////////////////////////////////////////////////////
 		//! - Set local distributions Fluid
 		//!
-		real fcbb = (dist.f[DIR_P00   ])[k];
-		real fabb = (dist.f[DIR_M00   ])[kw];
-		real fbcb = (dist.f[DIR_0P0   ])[k];
-		real fbab = (dist.f[DIR_0M0   ])[ks];
-		real fbbc = (dist.f[DIR_00P   ])[k];
-		real fbba = (dist.f[DIR_00M   ])[kb];
-		real fccb = (dist.f[DIR_PP0  ])[k];
-		real faab = (dist.f[DIR_MM0  ])[ksw];
-		real fcab = (dist.f[DIR_PM0  ])[ks];
-		real facb = (dist.f[DIR_MP0  ])[kw];
-		real fcbc = (dist.f[DIR_P0P  ])[k];
-		real faba = (dist.f[DIR_M0M  ])[kbw];
-		real fcba = (dist.f[DIR_P0M  ])[kb];
-		real fabc = (dist.f[DIR_M0P  ])[kw];
-		real fbcc = (dist.f[DIR_0PP  ])[k];
-		real fbaa = (dist.f[DIR_0MM  ])[kbs];
-		real fbca = (dist.f[DIR_0PM  ])[kb];
-		real fbac = (dist.f[DIR_0MP  ])[ks];
+		real fcbb = (dist.f[DIR_P00])[k];
+		real fabb = (dist.f[DIR_M00])[kw];
+		real fbcb = (dist.f[DIR_0P0])[k];
+		real fbab = (dist.f[DIR_0M0])[ks];
+		real fbbc = (dist.f[DIR_00P])[k];
+		real fbba = (dist.f[DIR_00M])[kb];
+		real fccb = (dist.f[DIR_PP0])[k];
+		real faab = (dist.f[DIR_MM0])[ksw];
+		real fcab = (dist.f[DIR_PM0])[ks];
+		real facb = (dist.f[DIR_MP0])[kw];
+		real fcbc = (dist.f[DIR_P0P])[k];
+		real faba = (dist.f[DIR_M0M])[kbw];
+		real fcba = (dist.f[DIR_P0M])[kb];
+		real fabc = (dist.f[DIR_M0P])[kw];
+		real fbcc = (dist.f[DIR_0PP])[k];
+		real fbaa = (dist.f[DIR_0MM])[kbs];
+		real fbca = (dist.f[DIR_0PM])[kb];
+		real fbac = (dist.f[DIR_0MP])[ks];
 		real fbbb = (dist.f[DIR_000])[k];
-		real fccc = (dist.f[DIR_PPP ])[k];
-		real faac = (dist.f[DIR_MMP ])[ksw];
-		real fcac = (dist.f[DIR_PMP ])[ks];
-		real facc = (dist.f[DIR_MPP ])[kw];
-		real fcca = (dist.f[DIR_PPM ])[kb];
-		real faaa = (dist.f[DIR_MMM ])[kbsw];
-		real fcaa = (dist.f[DIR_PMM ])[kbs];
-		real faca = (dist.f[DIR_MPM ])[kbw];
+		real fccc = (dist.f[DIR_PPP])[k];
+		real faac = (dist.f[DIR_MMP])[ksw];
+		real fcac = (dist.f[DIR_PMP])[ks];
+		real facc = (dist.f[DIR_MPP])[kw];
+		real fcca = (dist.f[DIR_PPM])[kb];
+		real faaa = (dist.f[DIR_MMM])[kbsw];
+		real fcaa = (dist.f[DIR_PMM])[kbs];
+		real faca = (dist.f[DIR_MPM])[kbw];
 		////////////////////////////////////////////////////////////////////////////////////
 		//! - Set local distributions Advection Diffusion
 		//!
-		real mfcbb = (distAD.f[DIR_P00   ])[k];
-		real mfabb = (distAD.f[DIR_M00   ])[kw];
-		real mfbcb = (distAD.f[DIR_0P0   ])[k];
-		real mfbab = (distAD.f[DIR_0M0   ])[ks];
-		real mfbbc = (distAD.f[DIR_00P   ])[k];
-		real mfbba = (distAD.f[DIR_00M   ])[kb];
-		real mfccb = (distAD.f[DIR_PP0  ])[k];
-		real mfaab = (distAD.f[DIR_MM0  ])[ksw];
-		real mfcab = (distAD.f[DIR_PM0  ])[ks];
-		real mfacb = (distAD.f[DIR_MP0  ])[kw];
-		real mfcbc = (distAD.f[DIR_P0P  ])[k];
-		real mfaba = (distAD.f[DIR_M0M  ])[kbw];
-		real mfcba = (distAD.f[DIR_P0M  ])[kb];
-		real mfabc = (distAD.f[DIR_M0P  ])[kw];
-		real mfbcc = (distAD.f[DIR_0PP  ])[k];
-		real mfbaa = (distAD.f[DIR_0MM  ])[kbs];
-		real mfbca = (distAD.f[DIR_0PM  ])[kb];
-		real mfbac = (distAD.f[DIR_0MP  ])[ks];
+		real mfcbb = (distAD.f[DIR_P00])[k];
+		real mfabb = (distAD.f[DIR_M00])[kw];
+		real mfbcb = (distAD.f[DIR_0P0])[k];
+		real mfbab = (distAD.f[DIR_0M0])[ks];
+		real mfbbc = (distAD.f[DIR_00P])[k];
+		real mfbba = (distAD.f[DIR_00M])[kb];
+		real mfccb = (distAD.f[DIR_PP0])[k];
+		real mfaab = (distAD.f[DIR_MM0])[ksw];
+		real mfcab = (distAD.f[DIR_PM0])[ks];
+		real mfacb = (distAD.f[DIR_MP0])[kw];
+		real mfcbc = (distAD.f[DIR_P0P])[k];
+		real mfaba = (distAD.f[DIR_M0M])[kbw];
+		real mfcba = (distAD.f[DIR_P0M])[kb];
+		real mfabc = (distAD.f[DIR_M0P])[kw];
+		real mfbcc = (distAD.f[DIR_0PP])[k];
+		real mfbaa = (distAD.f[DIR_0MM])[kbs];
+		real mfbca = (distAD.f[DIR_0PM])[kb];
+		real mfbac = (distAD.f[DIR_0MP])[ks];
 		real mfbbb = (distAD.f[DIR_000])[k];
-		real mfccc = (distAD.f[DIR_PPP ])[k];
-		real mfaac = (distAD.f[DIR_MMP ])[ksw];
-		real mfcac = (distAD.f[DIR_PMP ])[ks];
-		real mfacc = (distAD.f[DIR_MPP ])[kw];
-		real mfcca = (distAD.f[DIR_PPM ])[kb];
-		real mfaaa = (distAD.f[DIR_MMM ])[kbsw];
-		real mfcaa = (distAD.f[DIR_PMM ])[kbs];
-		real mfaca = (distAD.f[DIR_MPM ])[kbw];
+		real mfccc = (distAD.f[DIR_PPP])[k];
+		real mfaac = (distAD.f[DIR_MMP])[ksw];
+		real mfcac = (distAD.f[DIR_PMP])[ks];
+		real mfacc = (distAD.f[DIR_MPP])[kw];
+		real mfcca = (distAD.f[DIR_PPM])[kb];
+		real mfaaa = (distAD.f[DIR_MMM])[kbsw];
+		real mfcaa = (distAD.f[DIR_PMM])[kbs];
+		real mfaca = (distAD.f[DIR_MPM])[kbw];
 		////////////////////////////////////////////////////////////////////////////////////
 		//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
 		//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
@@ -503,33 +503,33 @@ __global__ void Factorized_Central_Moments_Advection_Diffusion_Device_Kernel(
 		//! stored arrays dependent on timestep is based on the esoteric twist algorithm
 		//! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a>
 		//!
-		(distAD.f[DIR_P00   ])[k   ] = mfabb;
-		(distAD.f[DIR_M00   ])[kw  ] = mfcbb;
-		(distAD.f[DIR_0P0   ])[k   ] = mfbab;
-		(distAD.f[DIR_0M0   ])[ks  ] = mfbcb;
-		(distAD.f[DIR_00P   ])[k   ] = mfbba;
-		(distAD.f[DIR_00M   ])[kb  ] = mfbbc;
-		(distAD.f[DIR_PP0  ])[k   ] = mfaab;
-		(distAD.f[DIR_MM0  ])[ksw ] = mfccb;
-		(distAD.f[DIR_PM0  ])[ks  ] = mfacb;
-		(distAD.f[DIR_MP0  ])[kw  ] = mfcab;
-		(distAD.f[DIR_P0P  ])[k   ] = mfaba;
-		(distAD.f[DIR_M0M  ])[kbw ] = mfcbc;
-		(distAD.f[DIR_P0M  ])[kb  ] = mfabc;
-		(distAD.f[DIR_M0P  ])[kw  ] = mfcba;
-		(distAD.f[DIR_0PP  ])[k   ] = mfbaa;
-		(distAD.f[DIR_0MM  ])[kbs ] = mfbcc;
-		(distAD.f[DIR_0PM  ])[kb  ] = mfbac;
-		(distAD.f[DIR_0MP  ])[ks  ] = mfbca;
+		(distAD.f[DIR_P00])[k   ] = mfabb;
+		(distAD.f[DIR_M00])[kw  ] = mfcbb;
+		(distAD.f[DIR_0P0])[k   ] = mfbab;
+		(distAD.f[DIR_0M0])[ks  ] = mfbcb;
+		(distAD.f[DIR_00P])[k   ] = mfbba;
+		(distAD.f[DIR_00M])[kb  ] = mfbbc;
+		(distAD.f[DIR_PP0])[k   ] = mfaab;
+		(distAD.f[DIR_MM0])[ksw ] = mfccb;
+		(distAD.f[DIR_PM0])[ks  ] = mfacb;
+		(distAD.f[DIR_MP0])[kw  ] = mfcab;
+		(distAD.f[DIR_P0P])[k   ] = mfaba;
+		(distAD.f[DIR_M0M])[kbw ] = mfcbc;
+		(distAD.f[DIR_P0M])[kb  ] = mfabc;
+		(distAD.f[DIR_M0P])[kw  ] = mfcba;
+		(distAD.f[DIR_0PP])[k   ] = mfbaa;
+		(distAD.f[DIR_0MM])[kbs ] = mfbcc;
+		(distAD.f[DIR_0PM])[kb  ] = mfbac;
+		(distAD.f[DIR_0MP])[ks  ] = mfbca;
 		(distAD.f[DIR_000])[k   ] = mfbbb;
-		(distAD.f[DIR_PPP ])[k   ] = mfaaa;
-		(distAD.f[DIR_PMP ])[ks  ] = mfaca;
-		(distAD.f[DIR_PPM ])[kb  ] = mfaac;
-		(distAD.f[DIR_PMM ])[kbs ] = mfacc;
-		(distAD.f[DIR_MPP ])[kw  ] = mfcaa;
-		(distAD.f[DIR_MMP ])[ksw ] = mfcca;
-		(distAD.f[DIR_MPM ])[kbw ] = mfcac;
-		(distAD.f[DIR_MMM ])[kbsw] = mfccc;
+		(distAD.f[DIR_PPP])[k   ] = mfaaa;
+		(distAD.f[DIR_PMP])[ks  ] = mfaca;
+		(distAD.f[DIR_PPM])[kb  ] = mfaac;
+		(distAD.f[DIR_PMM])[kbs ] = mfacc;
+		(distAD.f[DIR_MPP])[kw  ] = mfcaa;
+		(distAD.f[DIR_MMP])[ksw ] = mfcca;
+		(distAD.f[DIR_MPM])[kbw ] = mfcac;
+		(distAD.f[DIR_MMM])[kbsw] = mfccc;
 	}
 }
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/GPU/AdvectionDiffusionBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/AdvectionDiffusionBCs27.cu
index ecf98a7494a0a5e1c81c1040917e941f066605e6..116ce20389985e0efa650598108224b2e3e25221 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/AdvectionDiffusionBCs27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/AdvectionDiffusionBCs27.cu
@@ -20,91 +20,91 @@ __global__ void QADPress7(  real* DD,
                                        unsigned int* neighborX,
                                        unsigned int* neighborY,
                                        unsigned int* neighborZ,
-                                       unsigned int size_Mat, 
+                                       unsigned long long numberOfLBnodes, 
                                        bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
 
    Distributions7 D7;
    if (isEvenTimestep==true)
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[1] = &DD7[1*size_Mat];
-      D7.f[2] = &DD7[2*size_Mat];
-      D7.f[3] = &DD7[3*size_Mat];
-      D7.f[4] = &DD7[4*size_Mat];
-      D7.f[5] = &DD7[5*size_Mat];
-      D7.f[6] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[1] = &DD7[1*numberOfLBnodes];
+      D7.f[2] = &DD7[2*numberOfLBnodes];
+      D7.f[3] = &DD7[3*numberOfLBnodes];
+      D7.f[4] = &DD7[4*numberOfLBnodes];
+      D7.f[5] = &DD7[5*numberOfLBnodes];
+      D7.f[6] = &DD7[6*numberOfLBnodes];
    }
    else
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[2] = &DD7[1*size_Mat];
-      D7.f[1] = &DD7[2*size_Mat];
-      D7.f[4] = &DD7[3*size_Mat];
-      D7.f[3] = &DD7[4*size_Mat];
-      D7.f[6] = &DD7[5*size_Mat];
-      D7.f[5] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[2] = &DD7[1*numberOfLBnodes];
+      D7.f[1] = &DD7[2*numberOfLBnodes];
+      D7.f[4] = &DD7[3*numberOfLBnodes];
+      D7.f[3] = &DD7[4*numberOfLBnodes];
+      D7.f[6] = &DD7[5*numberOfLBnodes];
+      D7.f[5] = &DD7[6*numberOfLBnodes];
    }
 
 
@@ -128,24 +128,24 @@ __global__ void QADPress7(  real* DD,
       //         *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW,
       //         *q_dirBSE, *q_dirBNW;
 
-      q_dirE   = &QQ[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      //q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      //q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      //q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      //q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      //q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      //q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      //q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      //q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      //q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      //q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      //q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      //q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      //q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      //q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      //q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      //q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      //q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      //q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      //q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      //q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      //q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      //q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      //q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      //q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       //q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       //q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       //q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -188,32 +188,32 @@ __global__ void QADPress7(  real* DD,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       /*real drho*/;
       //real vx1_Inflow   = zero;
@@ -293,23 +293,23 @@ __global__ void QADPress7(  real* DD,
       //pointertausch
       if (isEvenTimestep==false)
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[1] = &DD7[1*size_Mat];
-         D7.f[2] = &DD7[2*size_Mat];
-         D7.f[3] = &DD7[3*size_Mat];
-         D7.f[4] = &DD7[4*size_Mat];
-         D7.f[5] = &DD7[5*size_Mat];
-         D7.f[6] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[1] = &DD7[1*numberOfLBnodes];
+         D7.f[2] = &DD7[2*numberOfLBnodes];
+         D7.f[3] = &DD7[3*numberOfLBnodes];
+         D7.f[4] = &DD7[4*numberOfLBnodes];
+         D7.f[5] = &DD7[5*numberOfLBnodes];
+         D7.f[6] = &DD7[6*numberOfLBnodes];
       }
       else
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[2] = &DD7[1*size_Mat];
-         D7.f[1] = &DD7[2*size_Mat];
-         D7.f[4] = &DD7[3*size_Mat];
-         D7.f[3] = &DD7[4*size_Mat];
-         D7.f[6] = &DD7[5*size_Mat];
-         D7.f[5] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[2] = &DD7[1*numberOfLBnodes];
+         D7.f[1] = &DD7[2*numberOfLBnodes];
+         D7.f[4] = &DD7[3*numberOfLBnodes];
+         D7.f[3] = &DD7[4*numberOfLBnodes];
+         D7.f[6] = &DD7[5*numberOfLBnodes];
+         D7.f[5] = &DD7[6*numberOfLBnodes];
       }
 
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -461,131 +461,131 @@ __global__ void QADPress27( real* DD,
                                        unsigned int* neighborX,
                                        unsigned int* neighborY,
                                        unsigned int* neighborZ,
-                                       unsigned int size_Mat, 
+                                       unsigned long long numberOfLBnodes, 
                                        bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
 
    Distributions27 D27;
    if (isEvenTimestep==true)
    {
-      D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+      D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+      D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -606,24 +606,24 @@ __global__ void QADPress27( real* DD,
          *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -663,33 +663,33 @@ __global__ void QADPress27( real* DD,
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
       real f_ZERO = (D.f[DIR_000])[kzero];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[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 +
@@ -715,33 +715,33 @@ __global__ void QADPress27( real* DD,
       vx2            =  OORho*((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_BNW-f_TSE)+(f_TNW-f_BSE) +(f_NE-f_SW)+(f_NW-f_SE)+(f_TN-f_BS)+(f_BN-f_TS)+(f_N-f_S));
       vx3            =  OORho*((f_TNE-f_BSW)+(f_TSW-f_BNE)+(f_TSE-f_BNW)+(f_TNW-f_BSE) +(f_TE-f_BW)+(f_TW-f_BE)+(f_TN-f_BS)+(f_TS-f_BN)+(f_T-f_B));
       ////////////////////////////////////////////////////////////////////////////////
-      real f27_W    = (D27.f[DIR_P00   ])[ke   ];
-      real f27_E    = (D27.f[DIR_M00   ])[kw   ];
-      real f27_S    = (D27.f[DIR_0P0   ])[kn   ];
-      real f27_N    = (D27.f[DIR_0M0   ])[ks   ];
-      real f27_B    = (D27.f[DIR_00P   ])[kt   ];
-      real f27_T    = (D27.f[DIR_00M   ])[kb   ];
-      real f27_SW   = (D27.f[DIR_PP0  ])[kne  ];
-      real f27_NE   = (D27.f[DIR_MM0  ])[ksw  ];
-      real f27_NW   = (D27.f[DIR_PM0  ])[kse  ];
-      real f27_SE   = (D27.f[DIR_MP0  ])[knw  ];
-      real f27_BW   = (D27.f[DIR_P0P  ])[kte  ];
-      real f27_TE   = (D27.f[DIR_M0M  ])[kbw  ];
-      real f27_TW   = (D27.f[DIR_P0M  ])[kbe  ];
-      real f27_BE   = (D27.f[DIR_M0P  ])[ktw  ];
-      real f27_BS   = (D27.f[DIR_0PP  ])[ktn  ];
-      real f27_TN   = (D27.f[DIR_0MM  ])[kbs  ];
-      real f27_TS   = (D27.f[DIR_0PM  ])[kbn  ];
-      real f27_BN   = (D27.f[DIR_0MP  ])[kts  ];
+      real f27_W    = (D27.f[DIR_P00])[ke   ];
+      real f27_E    = (D27.f[DIR_M00])[kw   ];
+      real f27_S    = (D27.f[DIR_0P0])[kn   ];
+      real f27_N    = (D27.f[DIR_0M0])[ks   ];
+      real f27_B    = (D27.f[DIR_00P])[kt   ];
+      real f27_T    = (D27.f[DIR_00M])[kb   ];
+      real f27_SW   = (D27.f[DIR_PP0])[kne  ];
+      real f27_NE   = (D27.f[DIR_MM0])[ksw  ];
+      real f27_NW   = (D27.f[DIR_PM0])[kse  ];
+      real f27_SE   = (D27.f[DIR_MP0])[knw  ];
+      real f27_BW   = (D27.f[DIR_P0P])[kte  ];
+      real f27_TE   = (D27.f[DIR_M0M])[kbw  ];
+      real f27_TW   = (D27.f[DIR_P0M])[kbe  ];
+      real f27_BE   = (D27.f[DIR_M0P])[ktw  ];
+      real f27_BS   = (D27.f[DIR_0PP])[ktn  ];
+      real f27_TN   = (D27.f[DIR_0MM])[kbs  ];
+      real f27_TS   = (D27.f[DIR_0PM])[kbn  ];
+      real f27_BN   = (D27.f[DIR_0MP])[kts  ];
       real f27_ZERO = (D27.f[DIR_000])[kzero];
-      real f27_BSW  = (D27.f[DIR_PPP ])[ktne ];
-      real f27_BNE  = (D27.f[DIR_MMP ])[ktsw ];
-      real f27_BNW  = (D27.f[DIR_PMP ])[ktse ];
-      real f27_BSE  = (D27.f[DIR_MPP ])[ktnw ];
-      real f27_TSW  = (D27.f[DIR_PPM ])[kbne ];
-      real f27_TNE  = (D27.f[DIR_MMM ])[kbsw ];
-      real f27_TNW  = (D27.f[DIR_PMM ])[kbse ];
-      real f27_TSE  = (D27.f[DIR_MPM ])[kbnw ];
+      real f27_BSW  = (D27.f[DIR_PPP])[ktne ];
+      real f27_BNE  = (D27.f[DIR_MMP])[ktsw ];
+      real f27_BNW  = (D27.f[DIR_PMP])[ktse ];
+      real f27_BSE  = (D27.f[DIR_MPP])[ktnw ];
+      real f27_TSW  = (D27.f[DIR_PPM])[kbne ];
+      real f27_TNE  = (D27.f[DIR_MMM])[kbsw ];
+      real f27_TNW  = (D27.f[DIR_PMM])[kbse ];
+      real f27_TSE  = (D27.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       ////////////////////////////////////////////////////////////////////////////////
@@ -849,86 +849,86 @@ __global__ void QADPress27( real* DD,
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+         D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+         D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
       //(D.f[DIR_000])[k]=c1o10;
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00  ])[kw  ]=(c2o1*feqW27_W  -(f27_E  *(q*omegaD-c1o1)-omegaD*feq27_E  *(q-c1o1))/(omegaD-c1o1)+f27_W  *q)/(q+c1o1);
-      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00  ])[ke  ]=(c2o1*feqW27_E  -(f27_W  *(q*omegaD-c1o1)-omegaD*feq27_W  *(q-c1o1))/(omegaD-c1o1)+f27_E  *q)/(q+c1o1);
-      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0  ])[ks  ]=(c2o1*feqW27_S  -(f27_N  *(q*omegaD-c1o1)-omegaD*feq27_N  *(q-c1o1))/(omegaD-c1o1)+f27_S  *q)/(q+c1o1);
-      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0  ])[kn  ]=(c2o1*feqW27_N  -(f27_S  *(q*omegaD-c1o1)-omegaD*feq27_S  *(q-c1o1))/(omegaD-c1o1)+f27_N  *q)/(q+c1o1);
-      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M  ])[kb  ]=(c2o1*feqW27_B  -(f27_T  *(q*omegaD-c1o1)-omegaD*feq27_T  *(q-c1o1))/(omegaD-c1o1)+f27_B  *q)/(q+c1o1);
-      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P  ])[kt  ]=(c2o1*feqW27_T  -(f27_B  *(q*omegaD-c1o1)-omegaD*feq27_B  *(q-c1o1))/(omegaD-c1o1)+f27_T  *q)/(q+c1o1);
-      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0 ])[ksw ]=(c2o1*feqW27_SW -(f27_NE *(q*omegaD-c1o1)-omegaD*feq27_NE *(q-c1o1))/(omegaD-c1o1)+f27_SW *q)/(q+c1o1);
-      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0 ])[kne ]=(c2o1*feqW27_NE -(f27_SW *(q*omegaD-c1o1)-omegaD*feq27_SW *(q-c1o1))/(omegaD-c1o1)+f27_NE *q)/(q+c1o1);
-      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0 ])[knw ]=(c2o1*feqW27_NW -(f27_SE *(q*omegaD-c1o1)-omegaD*feq27_SE *(q-c1o1))/(omegaD-c1o1)+f27_NW *q)/(q+c1o1);
-      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0 ])[kse ]=(c2o1*feqW27_SE -(f27_NW *(q*omegaD-c1o1)-omegaD*feq27_NW *(q-c1o1))/(omegaD-c1o1)+f27_SE *q)/(q+c1o1);
-      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M ])[kbw ]=(c2o1*feqW27_BW -(f27_TE *(q*omegaD-c1o1)-omegaD*feq27_TE *(q-c1o1))/(omegaD-c1o1)+f27_BW *q)/(q+c1o1);
-      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P ])[kte ]=(c2o1*feqW27_TE -(f27_BW *(q*omegaD-c1o1)-omegaD*feq27_BW *(q-c1o1))/(omegaD-c1o1)+f27_TE *q)/(q+c1o1);
-      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P ])[ktw ]=(c2o1*feqW27_TW -(f27_BE *(q*omegaD-c1o1)-omegaD*feq27_BE *(q-c1o1))/(omegaD-c1o1)+f27_TW *q)/(q+c1o1);
-      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M ])[kbe ]=(c2o1*feqW27_BE -(f27_TW *(q*omegaD-c1o1)-omegaD*feq27_TW *(q-c1o1))/(omegaD-c1o1)+f27_BE *q)/(q+c1o1);
-      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM ])[kbs ]=(c2o1*feqW27_BS -(f27_TN *(q*omegaD-c1o1)-omegaD*feq27_TN *(q-c1o1))/(omegaD-c1o1)+f27_BS *q)/(q+c1o1);
-      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP ])[ktn ]=(c2o1*feqW27_TN -(f27_BS *(q*omegaD-c1o1)-omegaD*feq27_BS *(q-c1o1))/(omegaD-c1o1)+f27_TN *q)/(q+c1o1);
-      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP ])[kts ]=(c2o1*feqW27_TS -(f27_BN *(q*omegaD-c1o1)-omegaD*feq27_BN *(q-c1o1))/(omegaD-c1o1)+f27_TS *q)/(q+c1o1);
-      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM ])[kbn ]=(c2o1*feqW27_BN -(f27_TS *(q*omegaD-c1o1)-omegaD*feq27_TS *(q-c1o1))/(omegaD-c1o1)+f27_BN *q)/(q+c1o1);
+      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00])[kw  ]=(c2o1*feqW27_W  -(f27_E  *(q*omegaD-c1o1)-omegaD*feq27_E  *(q-c1o1))/(omegaD-c1o1)+f27_W  *q)/(q+c1o1);
+      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00])[ke  ]=(c2o1*feqW27_E  -(f27_W  *(q*omegaD-c1o1)-omegaD*feq27_W  *(q-c1o1))/(omegaD-c1o1)+f27_E  *q)/(q+c1o1);
+      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0])[ks  ]=(c2o1*feqW27_S  -(f27_N  *(q*omegaD-c1o1)-omegaD*feq27_N  *(q-c1o1))/(omegaD-c1o1)+f27_S  *q)/(q+c1o1);
+      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0])[kn  ]=(c2o1*feqW27_N  -(f27_S  *(q*omegaD-c1o1)-omegaD*feq27_S  *(q-c1o1))/(omegaD-c1o1)+f27_N  *q)/(q+c1o1);
+      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M])[kb  ]=(c2o1*feqW27_B  -(f27_T  *(q*omegaD-c1o1)-omegaD*feq27_T  *(q-c1o1))/(omegaD-c1o1)+f27_B  *q)/(q+c1o1);
+      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P])[kt  ]=(c2o1*feqW27_T  -(f27_B  *(q*omegaD-c1o1)-omegaD*feq27_B  *(q-c1o1))/(omegaD-c1o1)+f27_T  *q)/(q+c1o1);
+      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0])[ksw ]=(c2o1*feqW27_SW -(f27_NE *(q*omegaD-c1o1)-omegaD*feq27_NE *(q-c1o1))/(omegaD-c1o1)+f27_SW *q)/(q+c1o1);
+      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0])[kne ]=(c2o1*feqW27_NE -(f27_SW *(q*omegaD-c1o1)-omegaD*feq27_SW *(q-c1o1))/(omegaD-c1o1)+f27_NE *q)/(q+c1o1);
+      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0])[knw ]=(c2o1*feqW27_NW -(f27_SE *(q*omegaD-c1o1)-omegaD*feq27_SE *(q-c1o1))/(omegaD-c1o1)+f27_NW *q)/(q+c1o1);
+      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0])[kse ]=(c2o1*feqW27_SE -(f27_NW *(q*omegaD-c1o1)-omegaD*feq27_NW *(q-c1o1))/(omegaD-c1o1)+f27_SE *q)/(q+c1o1);
+      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M])[kbw ]=(c2o1*feqW27_BW -(f27_TE *(q*omegaD-c1o1)-omegaD*feq27_TE *(q-c1o1))/(omegaD-c1o1)+f27_BW *q)/(q+c1o1);
+      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P])[kte ]=(c2o1*feqW27_TE -(f27_BW *(q*omegaD-c1o1)-omegaD*feq27_BW *(q-c1o1))/(omegaD-c1o1)+f27_TE *q)/(q+c1o1);
+      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P])[ktw ]=(c2o1*feqW27_TW -(f27_BE *(q*omegaD-c1o1)-omegaD*feq27_BE *(q-c1o1))/(omegaD-c1o1)+f27_TW *q)/(q+c1o1);
+      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M])[kbe ]=(c2o1*feqW27_BE -(f27_TW *(q*omegaD-c1o1)-omegaD*feq27_TW *(q-c1o1))/(omegaD-c1o1)+f27_BE *q)/(q+c1o1);
+      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM])[kbs ]=(c2o1*feqW27_BS -(f27_TN *(q*omegaD-c1o1)-omegaD*feq27_TN *(q-c1o1))/(omegaD-c1o1)+f27_BS *q)/(q+c1o1);
+      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP])[ktn ]=(c2o1*feqW27_TN -(f27_BS *(q*omegaD-c1o1)-omegaD*feq27_BS *(q-c1o1))/(omegaD-c1o1)+f27_TN *q)/(q+c1o1);
+      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP])[kts ]=(c2o1*feqW27_TS -(f27_BN *(q*omegaD-c1o1)-omegaD*feq27_BN *(q-c1o1))/(omegaD-c1o1)+f27_TS *q)/(q+c1o1);
+      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM])[kbn ]=(c2o1*feqW27_BN -(f27_TS *(q*omegaD-c1o1)-omegaD*feq27_TS *(q-c1o1))/(omegaD-c1o1)+f27_BN *q)/(q+c1o1);
       q = q_dirTNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMM])[kbsw]=(c2o1*feqW27_BSW-(f27_TNE*(q*omegaD-c1o1)-omegaD*feq27_TNE*(q-c1o1))/(omegaD-c1o1)+f27_BSW*q)/(q+c1o1);
       q = q_dirBSW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PPP])[ktne]=(c2o1*feqW27_TNE-(f27_BSW*(q*omegaD-c1o1)-omegaD*feq27_BSW*(q-c1o1))/(omegaD-c1o1)+f27_TNE*q)/(q+c1o1);
       q = q_dirBNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMP])[ktsw]=(c2o1*feqW27_TSW-(f27_BNE*(q*omegaD-c1o1)-omegaD*feq27_BNE*(q-c1o1))/(omegaD-c1o1)+f27_TSW*q)/(q+c1o1);
@@ -989,132 +989,132 @@ __global__ void QADPressNEQNeighbor27(
 													unsigned int* neighborX,
 													unsigned int* neighborY,
 													unsigned int* neighborZ,
-													unsigned int size_Mat,
+													unsigned long long numberOfLBnodes,
 													bool isEvenTimestep
 												)
 {
 	Distributions27 D;
 	if (isEvenTimestep == true)
 	{
-		D.f[DIR_P00] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM] = &DD[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	}
 	else
 	{
-		D.f[DIR_M00] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM] = &DD[DIR_PMP *size_Mat];
+		D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	}
 
 	Distributions27 D27;
 	if (isEvenTimestep == true)
 	{
-		D27.f[DIR_P00] = &DD27[DIR_P00   *size_Mat];
-		D27.f[DIR_M00] = &DD27[DIR_M00   *size_Mat];
-		D27.f[DIR_0P0] = &DD27[DIR_0P0   *size_Mat];
-		D27.f[DIR_0M0] = &DD27[DIR_0M0   *size_Mat];
-		D27.f[DIR_00P] = &DD27[DIR_00P   *size_Mat];
-		D27.f[DIR_00M] = &DD27[DIR_00M   *size_Mat];
-		D27.f[DIR_PP0] = &DD27[DIR_PP0  *size_Mat];
-		D27.f[DIR_MM0] = &DD27[DIR_MM0  *size_Mat];
-		D27.f[DIR_PM0] = &DD27[DIR_PM0  *size_Mat];
-		D27.f[DIR_MP0] = &DD27[DIR_MP0  *size_Mat];
-		D27.f[DIR_P0P] = &DD27[DIR_P0P  *size_Mat];
-		D27.f[DIR_M0M] = &DD27[DIR_M0M  *size_Mat];
-		D27.f[DIR_P0M] = &DD27[DIR_P0M  *size_Mat];
-		D27.f[DIR_M0P] = &DD27[DIR_M0P  *size_Mat];
-		D27.f[DIR_0PP] = &DD27[DIR_0PP  *size_Mat];
-		D27.f[DIR_0MM] = &DD27[DIR_0MM  *size_Mat];
-		D27.f[DIR_0PM] = &DD27[DIR_0PM  *size_Mat];
-		D27.f[DIR_0MP] = &DD27[DIR_0MP  *size_Mat];
-		D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-		D27.f[DIR_PPP] = &DD27[DIR_PPP *size_Mat];
-		D27.f[DIR_MMP] = &DD27[DIR_MMP *size_Mat];
-		D27.f[DIR_PMP] = &DD27[DIR_PMP *size_Mat];
-		D27.f[DIR_MPP] = &DD27[DIR_MPP *size_Mat];
-		D27.f[DIR_PPM] = &DD27[DIR_PPM *size_Mat];
-		D27.f[DIR_MMM] = &DD27[DIR_MMM *size_Mat];
-		D27.f[DIR_PMM] = &DD27[DIR_PMM *size_Mat];
-		D27.f[DIR_MPM] = &DD27[DIR_MPM *size_Mat];
+		D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+		D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+		D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+		D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+		D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+		D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+		D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+		D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+		D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+		D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+		D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+		D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+		D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+		D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+		D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+		D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+		D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+		D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+		D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+		D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+		D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+		D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+		D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+		D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+		D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+		D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+		D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
 	}
 	else
 	{
-		D27.f[DIR_M00] = &DD27[DIR_P00   *size_Mat];
-		D27.f[DIR_P00] = &DD27[DIR_M00   *size_Mat];
-		D27.f[DIR_0M0] = &DD27[DIR_0P0   *size_Mat];
-		D27.f[DIR_0P0] = &DD27[DIR_0M0   *size_Mat];
-		D27.f[DIR_00M] = &DD27[DIR_00P   *size_Mat];
-		D27.f[DIR_00P] = &DD27[DIR_00M   *size_Mat];
-		D27.f[DIR_MM0] = &DD27[DIR_PP0  *size_Mat];
-		D27.f[DIR_PP0] = &DD27[DIR_MM0  *size_Mat];
-		D27.f[DIR_MP0] = &DD27[DIR_PM0  *size_Mat];
-		D27.f[DIR_PM0] = &DD27[DIR_MP0  *size_Mat];
-		D27.f[DIR_M0M] = &DD27[DIR_P0P  *size_Mat];
-		D27.f[DIR_P0P] = &DD27[DIR_M0M  *size_Mat];
-		D27.f[DIR_M0P] = &DD27[DIR_P0M  *size_Mat];
-		D27.f[DIR_P0M] = &DD27[DIR_M0P  *size_Mat];
-		D27.f[DIR_0MM] = &DD27[DIR_0PP  *size_Mat];
-		D27.f[DIR_0PP] = &DD27[DIR_0MM  *size_Mat];
-		D27.f[DIR_0MP] = &DD27[DIR_0PM  *size_Mat];
-		D27.f[DIR_0PM] = &DD27[DIR_0MP  *size_Mat];
-		D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-		D27.f[DIR_PPP] = &DD27[DIR_MMM *size_Mat];
-		D27.f[DIR_MMP] = &DD27[DIR_PPM *size_Mat];
-		D27.f[DIR_PMP] = &DD27[DIR_MPM *size_Mat];
-		D27.f[DIR_MPP] = &DD27[DIR_PMM *size_Mat];
-		D27.f[DIR_PPM] = &DD27[DIR_MMP *size_Mat];
-		D27.f[DIR_MMM] = &DD27[DIR_PPP *size_Mat];
-		D27.f[DIR_PMM] = &DD27[DIR_MPP *size_Mat];
-		D27.f[DIR_MPM] = &DD27[DIR_PMP *size_Mat];
+		D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+		D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+		D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+		D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+		D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+		D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+		D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+		D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+		D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+		D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+		D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+		D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+		D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+		D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+		D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+		D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+		D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+		D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+		D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+		D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+		D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+		D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+		D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+		D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+		D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+		D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+		D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -1345,33 +1345,33 @@ __global__ void QADPressNEQNeighbor27(
 		unsigned int kNbsw = neighborZ[kNsw];
 		////////////////////////////////////////////////////////////////////////////////
 		//update distributions at neighbor nodes
-        (D27.f[DIR_P00   ])[kNe   ] = f27_W   ;  
-        (D27.f[DIR_M00   ])[kNw   ] = f27_E   ;	
-        (D27.f[DIR_0P0   ])[kNn   ] = f27_S   ;	
-        (D27.f[DIR_0M0   ])[kNs   ] = f27_N   ;	
-        (D27.f[DIR_00P   ])[kNt   ] = f27_B   ;	
-        (D27.f[DIR_00M   ])[kNb   ] = f27_T   ;	
-        (D27.f[DIR_PP0  ])[kNne  ] = f27_SW  ;	
-        (D27.f[DIR_MM0  ])[kNsw  ] = f27_NE  ;	
-        (D27.f[DIR_PM0  ])[kNse  ] = f27_NW  ;	
-        (D27.f[DIR_MP0  ])[kNnw  ] = f27_SE  ;	
-        (D27.f[DIR_P0P  ])[kNte  ] = f27_BW  ;	
-        (D27.f[DIR_M0M  ])[kNbw  ] = f27_TE  ;	
-        (D27.f[DIR_P0M  ])[kNbe  ] = f27_TW  ;	
-        (D27.f[DIR_M0P  ])[kNtw  ] = f27_BE  ;	
-        (D27.f[DIR_0PP  ])[kNtn  ] = f27_BS  ;	
-        (D27.f[DIR_0MM  ])[kNbs  ] = f27_TN  ;	
-        (D27.f[DIR_0PM  ])[kNbn  ] = f27_TS  ;	
-        (D27.f[DIR_0MP  ])[kNts  ] = f27_BN  ;	
+        (D27.f[DIR_P00])[kNe   ] = f27_W   ;  
+        (D27.f[DIR_M00])[kNw   ] = f27_E   ;	
+        (D27.f[DIR_0P0])[kNn   ] = f27_S   ;	
+        (D27.f[DIR_0M0])[kNs   ] = f27_N   ;	
+        (D27.f[DIR_00P])[kNt   ] = f27_B   ;	
+        (D27.f[DIR_00M])[kNb   ] = f27_T   ;	
+        (D27.f[DIR_PP0])[kNne  ] = f27_SW  ;	
+        (D27.f[DIR_MM0])[kNsw  ] = f27_NE  ;	
+        (D27.f[DIR_PM0])[kNse  ] = f27_NW  ;	
+        (D27.f[DIR_MP0])[kNnw  ] = f27_SE  ;	
+        (D27.f[DIR_P0P])[kNte  ] = f27_BW  ;	
+        (D27.f[DIR_M0M])[kNbw  ] = f27_TE  ;	
+        (D27.f[DIR_P0M])[kNbe  ] = f27_TW  ;	
+        (D27.f[DIR_M0P])[kNtw  ] = f27_BE  ;	
+        (D27.f[DIR_0PP])[kNtn  ] = f27_BS  ;	
+        (D27.f[DIR_0MM])[kNbs  ] = f27_TN  ;	
+        (D27.f[DIR_0PM])[kNbn  ] = f27_TS  ;	
+        (D27.f[DIR_0MP])[kNts  ] = f27_BN  ;	
         (D27.f[DIR_000])[kNzero] = f27_ZERO;	
-        (D27.f[DIR_PPP ])[kNtne ] = f27_BSW ;	
-        (D27.f[DIR_MMP ])[kNtsw ] = f27_BNE ;	
-        (D27.f[DIR_PMP ])[kNtse ] = f27_BNW ;	
-        (D27.f[DIR_MPP ])[kNtnw ] = f27_BSE ;	
-        (D27.f[DIR_PPM ])[kNbne ] = f27_TSW ;	
-        (D27.f[DIR_MMM ])[kNbsw ] = f27_TNE ;	
-        (D27.f[DIR_PMM ])[kNbse ] = f27_TNW ;	
-        (D27.f[DIR_MPM ])[kNbnw ] = f27_TSE ;       
+        (D27.f[DIR_PPP])[kNtne ] = f27_BSW ;	
+        (D27.f[DIR_MMP])[kNtsw ] = f27_BNE ;	
+        (D27.f[DIR_PMP])[kNtse ] = f27_BNW ;	
+        (D27.f[DIR_MPP])[kNtnw ] = f27_BSE ;	
+        (D27.f[DIR_PPM])[kNbne ] = f27_TSW ;	
+        (D27.f[DIR_MMM])[kNbsw ] = f27_TNE ;	
+        (D27.f[DIR_PMM])[kNbse ] = f27_TNW ;	
+        (D27.f[DIR_MPM])[kNbnw ] = f27_TSE ;       
 	}
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1427,91 +1427,91 @@ __global__ void QADVel7( real* DD,
                                     unsigned int* neighborX,
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
-                                    unsigned int size_Mat, 
+                                    unsigned long long numberOfLBnodes, 
                                     bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
 
    Distributions7 D7;
    if (isEvenTimestep==true)
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[1] = &DD7[1*size_Mat];
-      D7.f[2] = &DD7[2*size_Mat];
-      D7.f[3] = &DD7[3*size_Mat];
-      D7.f[4] = &DD7[4*size_Mat];
-      D7.f[5] = &DD7[5*size_Mat];
-      D7.f[6] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[1] = &DD7[1*numberOfLBnodes];
+      D7.f[2] = &DD7[2*numberOfLBnodes];
+      D7.f[3] = &DD7[3*numberOfLBnodes];
+      D7.f[4] = &DD7[4*numberOfLBnodes];
+      D7.f[5] = &DD7[5*numberOfLBnodes];
+      D7.f[6] = &DD7[6*numberOfLBnodes];
    }
    else
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[2] = &DD7[1*size_Mat];
-      D7.f[1] = &DD7[2*size_Mat];
-      D7.f[4] = &DD7[3*size_Mat];
-      D7.f[3] = &DD7[4*size_Mat];
-      D7.f[6] = &DD7[5*size_Mat];
-      D7.f[5] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[2] = &DD7[1*numberOfLBnodes];
+      D7.f[1] = &DD7[2*numberOfLBnodes];
+      D7.f[4] = &DD7[3*numberOfLBnodes];
+      D7.f[3] = &DD7[4*numberOfLBnodes];
+      D7.f[6] = &DD7[5*numberOfLBnodes];
+      D7.f[5] = &DD7[6*numberOfLBnodes];
    }
 
 
@@ -1531,12 +1531,12 @@ __global__ void QADVel7( real* DD,
       //////////////////////////////////////////////////////////////////////////////////
       real  *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB;//, 
 
-      q_dirE   = &QQ[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
       //////////////////////////////////////////////////////////////////////////////////
       //index
       unsigned int KQK  = k_Q[k];
@@ -1571,32 +1571,32 @@ __global__ void QADVel7( real* DD,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       /*real drho*/;
       real vx1_Inflow   = c0o1;
@@ -1676,23 +1676,23 @@ __global__ void QADVel7( real* DD,
       //pointertausch
       if (isEvenTimestep==false)
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[1] = &DD7[1*size_Mat];
-         D7.f[2] = &DD7[2*size_Mat];
-         D7.f[3] = &DD7[3*size_Mat];
-         D7.f[4] = &DD7[4*size_Mat];
-         D7.f[5] = &DD7[5*size_Mat];
-         D7.f[6] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[1] = &DD7[1*numberOfLBnodes];
+         D7.f[2] = &DD7[2*numberOfLBnodes];
+         D7.f[3] = &DD7[3*numberOfLBnodes];
+         D7.f[4] = &DD7[4*numberOfLBnodes];
+         D7.f[5] = &DD7[5*numberOfLBnodes];
+         D7.f[6] = &DD7[6*numberOfLBnodes];
       }
       else
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[2] = &DD7[1*size_Mat];
-         D7.f[1] = &DD7[2*size_Mat];
-         D7.f[4] = &DD7[3*size_Mat];
-         D7.f[3] = &DD7[4*size_Mat];
-         D7.f[6] = &DD7[5*size_Mat];
-         D7.f[5] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[2] = &DD7[1*numberOfLBnodes];
+         D7.f[1] = &DD7[2*numberOfLBnodes];
+         D7.f[4] = &DD7[3*numberOfLBnodes];
+         D7.f[3] = &DD7[4*numberOfLBnodes];
+         D7.f[6] = &DD7[5*numberOfLBnodes];
+         D7.f[5] = &DD7[6*numberOfLBnodes];
       }
 
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1844,131 +1844,131 @@ __global__ void QADVel27(real* DD,
                                     unsigned int* neighborX,
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
-                                    unsigned int size_Mat, 
+                                    unsigned long long numberOfLBnodes, 
                                     bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
 
    Distributions27 D27;
    if (isEvenTimestep==true)
    {
-      D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+      D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+      D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -1989,24 +1989,24 @@ __global__ void QADVel27(real* DD,
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -2046,33 +2046,33 @@ __global__ void QADVel27(real* DD,
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
       real f_ZERO = (D.f[DIR_000])[kzero];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[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 +
@@ -2098,33 +2098,33 @@ __global__ void QADVel27(real* DD,
       vx2     =  OORho*((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_BNW-f_TSE)+(f_TNW-f_BSE) +(f_NE-f_SW)+(f_NW-f_SE)+(f_TN-f_BS)+(f_BN-f_TS)+(f_N-f_S));
       vx3     =  OORho*((f_TNE-f_BSW)+(f_TSW-f_BNE)+(f_TSE-f_BNW)+(f_TNW-f_BSE) +(f_TE-f_BW)+(f_TW-f_BE)+(f_TN-f_BS)+(f_TS-f_BN)+(f_T-f_B));
       ////////////////////////////////////////////////////////////////////////////////
-      //real f27_W    = (D27.f[DIR_P00   ])[ke   ];
-      //real f27_E    = (D27.f[DIR_M00   ])[kw   ];
-      //real f27_S    = (D27.f[DIR_0P0   ])[kn   ];
-      //real f27_N    = (D27.f[DIR_0M0   ])[ks   ];
-      //real f27_B    = (D27.f[DIR_00P   ])[kt   ];
-      //real f27_T    = (D27.f[DIR_00M   ])[kb   ];
-      //real f27_SW   = (D27.f[DIR_PP0  ])[kne  ];
-      //real f27_NE   = (D27.f[DIR_MM0  ])[ksw  ];
-      //real f27_NW   = (D27.f[DIR_PM0  ])[kse  ];
-      //real f27_SE   = (D27.f[DIR_MP0  ])[knw  ];
-      //real f27_BW   = (D27.f[DIR_P0P  ])[kte  ];
-      //real f27_TE   = (D27.f[DIR_M0M  ])[kbw  ];
-      //real f27_TW   = (D27.f[DIR_P0M  ])[kbe  ];
-      //real f27_BE   = (D27.f[DIR_M0P  ])[ktw  ];
-      //real f27_BS   = (D27.f[DIR_0PP  ])[ktn  ];
-      //real f27_TN   = (D27.f[DIR_0MM  ])[kbs  ];
-      //real f27_TS   = (D27.f[DIR_0PM  ])[kbn  ];
-      //real f27_BN   = (D27.f[DIR_0MP  ])[kts  ];
+      //real f27_W    = (D27.f[DIR_P00])[ke   ];
+      //real f27_E    = (D27.f[DIR_M00])[kw   ];
+      //real f27_S    = (D27.f[DIR_0P0])[kn   ];
+      //real f27_N    = (D27.f[DIR_0M0])[ks   ];
+      //real f27_B    = (D27.f[DIR_00P])[kt   ];
+      //real f27_T    = (D27.f[DIR_00M])[kb   ];
+      //real f27_SW   = (D27.f[DIR_PP0])[kne  ];
+      //real f27_NE   = (D27.f[DIR_MM0])[ksw  ];
+      //real f27_NW   = (D27.f[DIR_PM0])[kse  ];
+      //real f27_SE   = (D27.f[DIR_MP0])[knw  ];
+      //real f27_BW   = (D27.f[DIR_P0P])[kte  ];
+      //real f27_TE   = (D27.f[DIR_M0M])[kbw  ];
+      //real f27_TW   = (D27.f[DIR_P0M])[kbe  ];
+      //real f27_BE   = (D27.f[DIR_M0P])[ktw  ];
+      //real f27_BS   = (D27.f[DIR_0PP])[ktn  ];
+      //real f27_TN   = (D27.f[DIR_0MM])[kbs  ];
+      //real f27_TS   = (D27.f[DIR_0PM])[kbn  ];
+      //real f27_BN   = (D27.f[DIR_0MP])[kts  ];
       //real f27_ZERO = (D27.f[DIR_000])[kzero];
-      //real f27_BSW  = (D27.f[DIR_PPP ])[ktne ];
-      //real f27_BNE  = (D27.f[DIR_MMP ])[ktsw ];
-      //real f27_BNW  = (D27.f[DIR_PMP ])[ktse ];
-      //real f27_BSE  = (D27.f[DIR_MPP ])[ktnw ];
-      //real f27_TSW  = (D27.f[DIR_PPM ])[kbne ];
-      //real f27_TNE  = (D27.f[DIR_MMM ])[kbsw ];
-      //real f27_TNW  = (D27.f[DIR_PMM ])[kbse ];
-      //real f27_TSE  = (D27.f[DIR_MPM ])[kbnw ];
+      //real f27_BSW  = (D27.f[DIR_PPP])[ktne ];
+      //real f27_BNE  = (D27.f[DIR_MMP])[ktsw ];
+      //real f27_BNW  = (D27.f[DIR_PMP])[ktse ];
+      //real f27_BSE  = (D27.f[DIR_MPP])[ktnw ];
+      //real f27_TSW  = (D27.f[DIR_PPM])[kbne ];
+      //real f27_TNE  = (D27.f[DIR_MMM])[kbsw ];
+      //real f27_TNW  = (D27.f[DIR_PMM])[kbse ];
+      //real f27_TSE  = (D27.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       ////////////////////////////////////////////////////////////////////////////////
@@ -2233,63 +2233,63 @@ __global__ void QADVel27(real* DD,
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+         D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+         D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -2299,24 +2299,24 @@ __global__ void QADVel27(real* DD,
       //Test
       //(D.f[DIR_000])[k]=c1o10;
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      //(D27.f[DIR_M00  ])[kw  ]= four;
-      //(D27.f[DIR_P00  ])[ke  ]= four;
-      //(D27.f[DIR_0M0  ])[ks  ]= four;
-      //(D27.f[DIR_0P0  ])[kn  ]= four;
-      //(D27.f[DIR_00M  ])[kb  ]= four;
-      //(D27.f[DIR_00P  ])[kt  ]= four;
-      //(D27.f[DIR_MM0 ])[ksw ]= four;
-      //(D27.f[DIR_PP0 ])[kne ]= four;
-      //(D27.f[DIR_MP0 ])[knw ]= four;
-      //(D27.f[DIR_PM0 ])[kse ]= four;
-      //(D27.f[DIR_M0M ])[kbw ]= four;
-      //(D27.f[DIR_P0P ])[kte ]= four;
-      //(D27.f[DIR_M0P ])[ktw ]= four;
-      //(D27.f[DIR_P0M ])[kbe ]= four;
-      //(D27.f[DIR_0MM ])[kbs ]= four;
-      //(D27.f[DIR_0PP ])[ktn ]= four;
-      //(D27.f[DIR_0MP ])[kts ]= four;
-      //(D27.f[DIR_0PM ])[kbn ]= four;
+      //(D27.f[DIR_M00])[kw  ]= four;
+      //(D27.f[DIR_P00])[ke  ]= four;
+      //(D27.f[DIR_0M0])[ks  ]= four;
+      //(D27.f[DIR_0P0])[kn  ]= four;
+      //(D27.f[DIR_00M])[kb  ]= four;
+      //(D27.f[DIR_00P])[kt  ]= four;
+      //(D27.f[DIR_MM0])[ksw ]= four;
+      //(D27.f[DIR_PP0])[kne ]= four;
+      //(D27.f[DIR_MP0])[knw ]= four;
+      //(D27.f[DIR_PM0])[kse ]= four;
+      //(D27.f[DIR_M0M])[kbw ]= four;
+      //(D27.f[DIR_P0P])[kte ]= four;
+      //(D27.f[DIR_M0P])[ktw ]= four;
+      //(D27.f[DIR_P0M])[kbe ]= four;
+      //(D27.f[DIR_0MM])[kbs ]= four;
+      //(D27.f[DIR_0PP])[ktn ]= four;
+      //(D27.f[DIR_0MP])[kts ]= four;
+      //(D27.f[DIR_0PM])[kbn ]= four;
       //(D27.f[DIR_MMM])[kbsw]= four;
       //(D27.f[DIR_PPP])[ktne]= four;
       //(D27.f[DIR_MMP])[ktsw]= four;
@@ -2325,24 +2325,24 @@ __global__ void QADVel27(real* DD,
       //(D27.f[DIR_PMP])[ktse]= four;
       //(D27.f[DIR_MPP])[ktnw]= four;
       //(D27.f[DIR_PMM])[kbse]= four;
-      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00  ])[kw  ]= -feqW27_W  + c2o1 * c2o27  * TempD;
-      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00  ])[ke  ]= -feqW27_E  + c2o1 * c2o27  * TempD;
-      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0  ])[ks  ]= -feqW27_S  + c2o1 * c2o27  * TempD;
-      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0  ])[kn  ]= -feqW27_N  + c2o1 * c2o27  * TempD;
-      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M  ])[kb  ]= -feqW27_B  + c2o1 * c2o27  * TempD;
-      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P  ])[kt  ]= -feqW27_T  + c2o1 * c2o27  * TempD;
-      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0 ])[ksw ]= -feqW27_SW + c2o1 * c1o54  * TempD;
-      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0 ])[kne ]= -feqW27_NE + c2o1 * c1o54  * TempD;
-      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0 ])[knw ]= -feqW27_NW + c2o1 * c1o54  * TempD;
-      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0 ])[kse ]= -feqW27_SE + c2o1 * c1o54  * TempD;
-      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M ])[kbw ]= -feqW27_BW + c2o1 * c1o54  * TempD;
-      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P ])[kte ]= -feqW27_TE + c2o1 * c1o54  * TempD;
-      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P ])[ktw ]= -feqW27_TW + c2o1 * c1o54  * TempD;
-      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M ])[kbe ]= -feqW27_BE + c2o1 * c1o54  * TempD;
-      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM ])[kbs ]= -feqW27_BS + c2o1 * c1o54  * TempD;
-      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP ])[ktn ]= -feqW27_TN + c2o1 * c1o54  * TempD;
-      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP ])[kts ]= -feqW27_TS + c2o1 * c1o54  * TempD;
-      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM ])[kbn ]= -feqW27_BN + c2o1 * c1o54  * TempD;
+      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00])[kw  ]= -feqW27_W  + c2o1 * c2o27  * TempD;
+      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00])[ke  ]= -feqW27_E  + c2o1 * c2o27  * TempD;
+      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0])[ks  ]= -feqW27_S  + c2o1 * c2o27  * TempD;
+      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0])[kn  ]= -feqW27_N  + c2o1 * c2o27  * TempD;
+      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M])[kb  ]= -feqW27_B  + c2o1 * c2o27  * TempD;
+      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P])[kt  ]= -feqW27_T  + c2o1 * c2o27  * TempD;
+      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0])[ksw ]= -feqW27_SW + c2o1 * c1o54  * TempD;
+      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0])[kne ]= -feqW27_NE + c2o1 * c1o54  * TempD;
+      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0])[knw ]= -feqW27_NW + c2o1 * c1o54  * TempD;
+      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0])[kse ]= -feqW27_SE + c2o1 * c1o54  * TempD;
+      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M])[kbw ]= -feqW27_BW + c2o1 * c1o54  * TempD;
+      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P])[kte ]= -feqW27_TE + c2o1 * c1o54  * TempD;
+      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P])[ktw ]= -feqW27_TW + c2o1 * c1o54  * TempD;
+      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M])[kbe ]= -feqW27_BE + c2o1 * c1o54  * TempD;
+      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM])[kbs ]= -feqW27_BS + c2o1 * c1o54  * TempD;
+      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP])[ktn ]= -feqW27_TN + c2o1 * c1o54  * TempD;
+      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP])[kts ]= -feqW27_TS + c2o1 * c1o54  * TempD;
+      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM])[kbn ]= -feqW27_BN + c2o1 * c1o54  * TempD;
       q = q_dirTNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMM])[kbsw]= -feqW27_BSW+ c2o1 * c1o216 * TempD;
       q = q_dirBSW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PPP])[ktne]= -feqW27_TNE+ c2o1 * c1o216 * TempD;
       q = q_dirBNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMP])[ktsw]= -feqW27_TSW+ c2o1 * c1o216 * TempD;
@@ -2351,24 +2351,24 @@ __global__ void QADVel27(real* DD,
       q = q_dirBNW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PMP])[ktse]= -feqW27_TSE+ c2o1 * c1o216 * TempD;
       q = q_dirBSE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MPP])[ktnw]= -feqW27_TNW+ c2o1 * c1o216 * TempD;
       q = q_dirTNW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PMM])[kbse]= -feqW27_BSE+ c2o1 * c1o216 * TempD;
-      //q = q_dirE[k];   if (q>=zero && q<=one) (D27.f[DIR_M00  ])[kw  ]=(two*feqW27_W  -(f27_E  *(q*omegaD-one)-omegaD*feq27_E  *(q-one))/(omegaD-one)+f27_W  *q)/(q+one);
-      //q = q_dirW[k];   if (q>=zero && q<=one) (D27.f[DIR_P00  ])[ke  ]=(two*feqW27_E  -(f27_W  *(q*omegaD-one)-omegaD*feq27_W  *(q-one))/(omegaD-one)+f27_E  *q)/(q+one);
-      //q = q_dirN[k];   if (q>=zero && q<=one) (D27.f[DIR_0M0  ])[ks  ]=(two*feqW27_S  -(f27_N  *(q*omegaD-one)-omegaD*feq27_N  *(q-one))/(omegaD-one)+f27_S  *q)/(q+one);
-      //q = q_dirS[k];   if (q>=zero && q<=one) (D27.f[DIR_0P0  ])[kn  ]=(two*feqW27_N  -(f27_S  *(q*omegaD-one)-omegaD*feq27_S  *(q-one))/(omegaD-one)+f27_N  *q)/(q+one);
-      //q = q_dirT[k];   if (q>=zero && q<=one) (D27.f[DIR_00M  ])[kb  ]=(two*feqW27_B  -(f27_T  *(q*omegaD-one)-omegaD*feq27_T  *(q-one))/(omegaD-one)+f27_B  *q)/(q+one);
-      //q = q_dirB[k];   if (q>=zero && q<=one) (D27.f[DIR_00P  ])[kt  ]=(two*feqW27_T  -(f27_B  *(q*omegaD-one)-omegaD*feq27_B  *(q-one))/(omegaD-one)+f27_T  *q)/(q+one);
-      //q = q_dirNE[k];  if (q>=zero && q<=one) (D27.f[DIR_MM0 ])[ksw ]=(two*feqW27_SW -(f27_NE *(q*omegaD-one)-omegaD*feq27_NE *(q-one))/(omegaD-one)+f27_SW *q)/(q+one);
-      //q = q_dirSW[k];  if (q>=zero && q<=one) (D27.f[DIR_PP0 ])[kne ]=(two*feqW27_NE -(f27_SW *(q*omegaD-one)-omegaD*feq27_SW *(q-one))/(omegaD-one)+f27_NE *q)/(q+one);
-      //q = q_dirSE[k];  if (q>=zero && q<=one) (D27.f[DIR_MP0 ])[knw ]=(two*feqW27_NW -(f27_SE *(q*omegaD-one)-omegaD*feq27_SE *(q-one))/(omegaD-one)+f27_NW *q)/(q+one);
-      //q = q_dirNW[k];  if (q>=zero && q<=one) (D27.f[DIR_PM0 ])[kse ]=(two*feqW27_SE -(f27_NW *(q*omegaD-one)-omegaD*feq27_NW *(q-one))/(omegaD-one)+f27_SE *q)/(q+one);
-      //q = q_dirTE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0M ])[kbw ]=(two*feqW27_BW -(f27_TE *(q*omegaD-one)-omegaD*feq27_TE *(q-one))/(omegaD-one)+f27_BW *q)/(q+one);
-      //q = q_dirBW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0P ])[kte ]=(two*feqW27_TE -(f27_BW *(q*omegaD-one)-omegaD*feq27_BW *(q-one))/(omegaD-one)+f27_TE *q)/(q+one);
-      //q = q_dirBE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0P ])[ktw ]=(two*feqW27_TW -(f27_BE *(q*omegaD-one)-omegaD*feq27_BE *(q-one))/(omegaD-one)+f27_TW *q)/(q+one);
-      //q = q_dirTW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0M ])[kbe ]=(two*feqW27_BE -(f27_TW *(q*omegaD-one)-omegaD*feq27_TW *(q-one))/(omegaD-one)+f27_BE *q)/(q+one);
-      //q = q_dirTN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MM ])[kbs ]=(two*feqW27_BS -(f27_TN *(q*omegaD-one)-omegaD*feq27_TN *(q-one))/(omegaD-one)+f27_BS *q)/(q+one);
-      //q = q_dirBS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PP ])[ktn ]=(two*feqW27_TN -(f27_BS *(q*omegaD-one)-omegaD*feq27_BS *(q-one))/(omegaD-one)+f27_TN *q)/(q+one);
-      //q = q_dirBN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MP ])[kts ]=(two*feqW27_TS -(f27_BN *(q*omegaD-one)-omegaD*feq27_BN *(q-one))/(omegaD-one)+f27_TS *q)/(q+one);
-      //q = q_dirTS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PM ])[kbn ]=(two*feqW27_BN -(f27_TS *(q*omegaD-one)-omegaD*feq27_TS *(q-one))/(omegaD-one)+f27_BN *q)/(q+one);
+      //q = q_dirE[k];   if (q>=zero && q<=one) (D27.f[DIR_M00])[kw  ]=(two*feqW27_W  -(f27_E  *(q*omegaD-one)-omegaD*feq27_E  *(q-one))/(omegaD-one)+f27_W  *q)/(q+one);
+      //q = q_dirW[k];   if (q>=zero && q<=one) (D27.f[DIR_P00])[ke  ]=(two*feqW27_E  -(f27_W  *(q*omegaD-one)-omegaD*feq27_W  *(q-one))/(omegaD-one)+f27_E  *q)/(q+one);
+      //q = q_dirN[k];   if (q>=zero && q<=one) (D27.f[DIR_0M0])[ks  ]=(two*feqW27_S  -(f27_N  *(q*omegaD-one)-omegaD*feq27_N  *(q-one))/(omegaD-one)+f27_S  *q)/(q+one);
+      //q = q_dirS[k];   if (q>=zero && q<=one) (D27.f[DIR_0P0])[kn  ]=(two*feqW27_N  -(f27_S  *(q*omegaD-one)-omegaD*feq27_S  *(q-one))/(omegaD-one)+f27_N  *q)/(q+one);
+      //q = q_dirT[k];   if (q>=zero && q<=one) (D27.f[DIR_00M])[kb  ]=(two*feqW27_B  -(f27_T  *(q*omegaD-one)-omegaD*feq27_T  *(q-one))/(omegaD-one)+f27_B  *q)/(q+one);
+      //q = q_dirB[k];   if (q>=zero && q<=one) (D27.f[DIR_00P])[kt  ]=(two*feqW27_T  -(f27_B  *(q*omegaD-one)-omegaD*feq27_B  *(q-one))/(omegaD-one)+f27_T  *q)/(q+one);
+      //q = q_dirNE[k];  if (q>=zero && q<=one) (D27.f[DIR_MM0])[ksw ]=(two*feqW27_SW -(f27_NE *(q*omegaD-one)-omegaD*feq27_NE *(q-one))/(omegaD-one)+f27_SW *q)/(q+one);
+      //q = q_dirSW[k];  if (q>=zero && q<=one) (D27.f[DIR_PP0])[kne ]=(two*feqW27_NE -(f27_SW *(q*omegaD-one)-omegaD*feq27_SW *(q-one))/(omegaD-one)+f27_NE *q)/(q+one);
+      //q = q_dirSE[k];  if (q>=zero && q<=one) (D27.f[DIR_MP0])[knw ]=(two*feqW27_NW -(f27_SE *(q*omegaD-one)-omegaD*feq27_SE *(q-one))/(omegaD-one)+f27_NW *q)/(q+one);
+      //q = q_dirNW[k];  if (q>=zero && q<=one) (D27.f[DIR_PM0])[kse ]=(two*feqW27_SE -(f27_NW *(q*omegaD-one)-omegaD*feq27_NW *(q-one))/(omegaD-one)+f27_SE *q)/(q+one);
+      //q = q_dirTE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0M])[kbw ]=(two*feqW27_BW -(f27_TE *(q*omegaD-one)-omegaD*feq27_TE *(q-one))/(omegaD-one)+f27_BW *q)/(q+one);
+      //q = q_dirBW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0P])[kte ]=(two*feqW27_TE -(f27_BW *(q*omegaD-one)-omegaD*feq27_BW *(q-one))/(omegaD-one)+f27_TE *q)/(q+one);
+      //q = q_dirBE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0P])[ktw ]=(two*feqW27_TW -(f27_BE *(q*omegaD-one)-omegaD*feq27_BE *(q-one))/(omegaD-one)+f27_TW *q)/(q+one);
+      //q = q_dirTW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0M])[kbe ]=(two*feqW27_BE -(f27_TW *(q*omegaD-one)-omegaD*feq27_TW *(q-one))/(omegaD-one)+f27_BE *q)/(q+one);
+      //q = q_dirTN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MM])[kbs ]=(two*feqW27_BS -(f27_TN *(q*omegaD-one)-omegaD*feq27_TN *(q-one))/(omegaD-one)+f27_BS *q)/(q+one);
+      //q = q_dirBS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PP])[ktn ]=(two*feqW27_TN -(f27_BS *(q*omegaD-one)-omegaD*feq27_BS *(q-one))/(omegaD-one)+f27_TN *q)/(q+one);
+      //q = q_dirBN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MP])[kts ]=(two*feqW27_TS -(f27_BN *(q*omegaD-one)-omegaD*feq27_BN *(q-one))/(omegaD-one)+f27_TS *q)/(q+one);
+      //q = q_dirTS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PM])[kbn ]=(two*feqW27_BN -(f27_TS *(q*omegaD-one)-omegaD*feq27_TS *(q-one))/(omegaD-one)+f27_BN *q)/(q+one);
       //q = q_dirTNE[k]; if (q>=zero && q<=one) (D27.f[DIR_MMM])[kbsw]=(two*feqW27_BSW-(f27_TNE*(q*omegaD-one)-omegaD*feq27_TNE*(q-one))/(omegaD-one)+f27_BSW*q)/(q+one);
       //q = q_dirBSW[k]; if (q>=zero && q<=one) (D27.f[DIR_PPP])[ktne]=(two*feqW27_TNE-(f27_BSW*(q*omegaD-one)-omegaD*feq27_BSW*(q-one))/(omegaD-one)+f27_TNE*q)/(q+one);
       //q = q_dirBNE[k]; if (q>=zero && q<=one) (D27.f[DIR_MMP])[ktsw]=(two*feqW27_TSW-(f27_BNE*(q*omegaD-one)-omegaD*feq27_BNE*(q-one))/(omegaD-one)+f27_TSW*q)/(q+one);
@@ -2431,91 +2431,91 @@ __global__ void QAD7( real* DD,
                                  unsigned int* neighborX,
                                  unsigned int* neighborY,
                                  unsigned int* neighborZ,
-                                 unsigned int size_Mat, 
+                                 unsigned long long numberOfLBnodes, 
                                  bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
 
    Distributions7 D7;
    if (isEvenTimestep==true)
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[1] = &DD7[1*size_Mat];
-      D7.f[2] = &DD7[2*size_Mat];
-      D7.f[3] = &DD7[3*size_Mat];
-      D7.f[4] = &DD7[4*size_Mat];
-      D7.f[5] = &DD7[5*size_Mat];
-      D7.f[6] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[1] = &DD7[1*numberOfLBnodes];
+      D7.f[2] = &DD7[2*numberOfLBnodes];
+      D7.f[3] = &DD7[3*numberOfLBnodes];
+      D7.f[4] = &DD7[4*numberOfLBnodes];
+      D7.f[5] = &DD7[5*numberOfLBnodes];
+      D7.f[6] = &DD7[6*numberOfLBnodes];
    }
    else
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[2] = &DD7[1*size_Mat];
-      D7.f[1] = &DD7[2*size_Mat];
-      D7.f[4] = &DD7[3*size_Mat];
-      D7.f[3] = &DD7[4*size_Mat];
-      D7.f[6] = &DD7[5*size_Mat];
-      D7.f[5] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[2] = &DD7[1*numberOfLBnodes];
+      D7.f[1] = &DD7[2*numberOfLBnodes];
+      D7.f[4] = &DD7[3*numberOfLBnodes];
+      D7.f[3] = &DD7[4*numberOfLBnodes];
+      D7.f[6] = &DD7[5*numberOfLBnodes];
+      D7.f[5] = &DD7[6*numberOfLBnodes];
    }
 
 
@@ -2539,24 +2539,24 @@ __global__ void QAD7( real* DD,
       //         *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW,
       //         *q_dirBSE, *q_dirBNW;
 
-      q_dirE   = &QQ[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      //q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      //q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      //q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      //q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      //q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      //q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      //q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      //q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      //q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      //q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      //q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      //q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      //q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      //q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      //q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      //q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      //q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      //q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      //q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      //q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      //q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      //q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      //q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      //q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       //q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       //q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       //q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -2599,32 +2599,32 @@ __global__ void QAD7( real* DD,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real vx1, vx2, vx3/*, drho*/;
       //drho   =    f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
@@ -2696,23 +2696,23 @@ __global__ void QAD7( real* DD,
       //pointertausch
       if (isEvenTimestep==false)
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[1] = &DD7[1*size_Mat];
-         D7.f[2] = &DD7[2*size_Mat];
-         D7.f[3] = &DD7[3*size_Mat];
-         D7.f[4] = &DD7[4*size_Mat];
-         D7.f[5] = &DD7[5*size_Mat];
-         D7.f[6] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[1] = &DD7[1*numberOfLBnodes];
+         D7.f[2] = &DD7[2*numberOfLBnodes];
+         D7.f[3] = &DD7[3*numberOfLBnodes];
+         D7.f[4] = &DD7[4*numberOfLBnodes];
+         D7.f[5] = &DD7[5*numberOfLBnodes];
+         D7.f[6] = &DD7[6*numberOfLBnodes];
       }
       else
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[2] = &DD7[1*size_Mat];
-         D7.f[1] = &DD7[2*size_Mat];
-         D7.f[4] = &DD7[3*size_Mat];
-         D7.f[3] = &DD7[4*size_Mat];
-         D7.f[6] = &DD7[5*size_Mat];
-         D7.f[5] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[2] = &DD7[1*numberOfLBnodes];
+         D7.f[1] = &DD7[2*numberOfLBnodes];
+         D7.f[4] = &DD7[3*numberOfLBnodes];
+         D7.f[3] = &DD7[4*numberOfLBnodes];
+         D7.f[6] = &DD7[5*numberOfLBnodes];
+         D7.f[5] = &DD7[6*numberOfLBnodes];
       }
 
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -2864,131 +2864,131 @@ __global__ void QADDirichlet27(
 											 unsigned int* neighborX,
 											 unsigned int* neighborY,
 											 unsigned int* neighborZ,
-											 unsigned int size_Mat, 
+											 unsigned long long numberOfLBnodes, 
 											 bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
 
    Distributions27 D27;
    if (isEvenTimestep==true)
    {
-      D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+      D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+      D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -3009,24 +3009,24 @@ __global__ void QADDirichlet27(
          *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -3066,33 +3066,33 @@ __global__ void QADDirichlet27(
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
       real f_ZERO = (D.f[DIR_000])[kzero];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[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 +
@@ -3118,33 +3118,33 @@ __global__ void QADDirichlet27(
       vx2     =  OORho*((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_BNW-f_TSE)+(f_TNW-f_BSE) +(f_NE-f_SW)+(f_NW-f_SE)+(f_TN-f_BS)+(f_BN-f_TS)+(f_N-f_S));
       vx3     =  OORho*((f_TNE-f_BSW)+(f_TSW-f_BNE)+(f_TSE-f_BNW)+(f_TNW-f_BSE) +(f_TE-f_BW)+(f_TW-f_BE)+(f_TN-f_BS)+(f_TS-f_BN)+(f_T-f_B));
       ////////////////////////////////////////////////////////////////////////////////
-      real f27_W    = (D27.f[DIR_P00   ])[ke   ];
-      real f27_E    = (D27.f[DIR_M00   ])[kw   ];
-      real f27_S    = (D27.f[DIR_0P0   ])[kn   ];
-      real f27_N    = (D27.f[DIR_0M0   ])[ks   ];
-      real f27_B    = (D27.f[DIR_00P   ])[kt   ];
-      real f27_T    = (D27.f[DIR_00M   ])[kb   ];
-      real f27_SW   = (D27.f[DIR_PP0  ])[kne  ];
-      real f27_NE   = (D27.f[DIR_MM0  ])[ksw  ];
-      real f27_NW   = (D27.f[DIR_PM0  ])[kse  ];
-      real f27_SE   = (D27.f[DIR_MP0  ])[knw  ];
-      real f27_BW   = (D27.f[DIR_P0P  ])[kte  ];
-      real f27_TE   = (D27.f[DIR_M0M  ])[kbw  ];
-      real f27_TW   = (D27.f[DIR_P0M  ])[kbe  ];
-      real f27_BE   = (D27.f[DIR_M0P  ])[ktw  ];
-      real f27_BS   = (D27.f[DIR_0PP  ])[ktn  ];
-      real f27_TN   = (D27.f[DIR_0MM  ])[kbs  ];
-      real f27_TS   = (D27.f[DIR_0PM  ])[kbn  ];
-      real f27_BN   = (D27.f[DIR_0MP  ])[kts  ];
+      real f27_W    = (D27.f[DIR_P00])[ke   ];
+      real f27_E    = (D27.f[DIR_M00])[kw   ];
+      real f27_S    = (D27.f[DIR_0P0])[kn   ];
+      real f27_N    = (D27.f[DIR_0M0])[ks   ];
+      real f27_B    = (D27.f[DIR_00P])[kt   ];
+      real f27_T    = (D27.f[DIR_00M])[kb   ];
+      real f27_SW   = (D27.f[DIR_PP0])[kne  ];
+      real f27_NE   = (D27.f[DIR_MM0])[ksw  ];
+      real f27_NW   = (D27.f[DIR_PM0])[kse  ];
+      real f27_SE   = (D27.f[DIR_MP0])[knw  ];
+      real f27_BW   = (D27.f[DIR_P0P])[kte  ];
+      real f27_TE   = (D27.f[DIR_M0M])[kbw  ];
+      real f27_TW   = (D27.f[DIR_P0M])[kbe  ];
+      real f27_BE   = (D27.f[DIR_M0P])[ktw  ];
+      real f27_BS   = (D27.f[DIR_0PP])[ktn  ];
+      real f27_TN   = (D27.f[DIR_0MM])[kbs  ];
+      real f27_TS   = (D27.f[DIR_0PM])[kbn  ];
+      real f27_BN   = (D27.f[DIR_0MP])[kts  ];
       real f27_ZERO = (D27.f[DIR_000])[kzero];
-      real f27_BSW  = (D27.f[DIR_PPP ])[ktne ];
-      real f27_BNE  = (D27.f[DIR_MMP ])[ktsw ];
-      real f27_BNW  = (D27.f[DIR_PMP ])[ktse ];
-      real f27_BSE  = (D27.f[DIR_MPP ])[ktnw ];
-      real f27_TSW  = (D27.f[DIR_PPM ])[kbne ];
-      real f27_TNE  = (D27.f[DIR_MMM ])[kbsw ];
-      real f27_TNW  = (D27.f[DIR_PMM ])[kbse ];
-      real f27_TSE  = (D27.f[DIR_MPM ])[kbnw ];
+      real f27_BSW  = (D27.f[DIR_PPP])[ktne ];
+      real f27_BNE  = (D27.f[DIR_MMP])[ktsw ];
+      real f27_BNW  = (D27.f[DIR_PMP])[ktse ];
+      real f27_BSE  = (D27.f[DIR_MPP])[ktnw ];
+      real f27_TSW  = (D27.f[DIR_PPM])[kbne ];
+      real f27_TNE  = (D27.f[DIR_MMM])[kbsw ];
+      real f27_TNW  = (D27.f[DIR_PMM])[kbse ];
+      real f27_TSE  = (D27.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       ////////////////////////////////////////////////////////////////////////////////
@@ -3220,86 +3220,86 @@ __global__ void QADDirichlet27(
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+         D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+         D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
       //(D.f[DIR_000])[k]=0.1f;
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      q = q_dirE[  ke   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00  ])[kw  ]=(c2o1*feqW27_W  -(f27_E  *(q*omegaD-c1o1)-omegaD*feq27_E  *(q-c1o1))/(omegaD-c1o1)+f27_W  *q)/(q+c1o1);
-      q = q_dirW[  kw   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00  ])[ke  ]=(c2o1*feqW27_E  -(f27_W  *(q*omegaD-c1o1)-omegaD*feq27_W  *(q-c1o1))/(omegaD-c1o1)+f27_E  *q)/(q+c1o1);
-      q = q_dirN[  kn   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0  ])[ks  ]=(c2o1*feqW27_S  -(f27_N  *(q*omegaD-c1o1)-omegaD*feq27_N  *(q-c1o1))/(omegaD-c1o1)+f27_S  *q)/(q+c1o1);
-      q = q_dirS[  ks   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0  ])[kn  ]=(c2o1*feqW27_N  -(f27_S  *(q*omegaD-c1o1)-omegaD*feq27_S  *(q-c1o1))/(omegaD-c1o1)+f27_N  *q)/(q+c1o1);
-      q = q_dirT[  kt   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M  ])[kb  ]=(c2o1*feqW27_B  -(f27_T  *(q*omegaD-c1o1)-omegaD*feq27_T  *(q-c1o1))/(omegaD-c1o1)+f27_B  *q)/(q+c1o1);
-      q = q_dirB[  kb   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P  ])[kt  ]=(c2o1*feqW27_T  -(f27_B  *(q*omegaD-c1o1)-omegaD*feq27_B  *(q-c1o1))/(omegaD-c1o1)+f27_T  *q)/(q+c1o1);
-      q = q_dirNE[ kne  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0 ])[ksw ]=(c2o1*feqW27_SW -(f27_NE *(q*omegaD-c1o1)-omegaD*feq27_NE *(q-c1o1))/(omegaD-c1o1)+f27_SW *q)/(q+c1o1);
-      q = q_dirSW[ ksw  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0 ])[kne ]=(c2o1*feqW27_NE -(f27_SW *(q*omegaD-c1o1)-omegaD*feq27_SW *(q-c1o1))/(omegaD-c1o1)+f27_NE *q)/(q+c1o1);
-      q = q_dirSE[ kse  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0 ])[knw ]=(c2o1*feqW27_NW -(f27_SE *(q*omegaD-c1o1)-omegaD*feq27_SE *(q-c1o1))/(omegaD-c1o1)+f27_NW *q)/(q+c1o1);
-      q = q_dirNW[ knw  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0 ])[kse ]=(c2o1*feqW27_SE -(f27_NW *(q*omegaD-c1o1)-omegaD*feq27_NW *(q-c1o1))/(omegaD-c1o1)+f27_SE *q)/(q+c1o1);
-      q = q_dirTE[ kte  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M ])[kbw ]=(c2o1*feqW27_BW -(f27_TE *(q*omegaD-c1o1)-omegaD*feq27_TE *(q-c1o1))/(omegaD-c1o1)+f27_BW *q)/(q+c1o1);
-      q = q_dirBW[ kbw  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P ])[kte ]=(c2o1*feqW27_TE -(f27_BW *(q*omegaD-c1o1)-omegaD*feq27_BW *(q-c1o1))/(omegaD-c1o1)+f27_TE *q)/(q+c1o1);
-      q = q_dirBE[ kbe  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P ])[ktw ]=(c2o1*feqW27_TW -(f27_BE *(q*omegaD-c1o1)-omegaD*feq27_BE *(q-c1o1))/(omegaD-c1o1)+f27_TW *q)/(q+c1o1);
-      q = q_dirTW[ ktw  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M ])[kbe ]=(c2o1*feqW27_BE -(f27_TW *(q*omegaD-c1o1)-omegaD*feq27_TW *(q-c1o1))/(omegaD-c1o1)+f27_BE *q)/(q+c1o1);
-      q = q_dirTN[ ktn  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM ])[kbs ]=(c2o1*feqW27_BS -(f27_TN *(q*omegaD-c1o1)-omegaD*feq27_TN *(q-c1o1))/(omegaD-c1o1)+f27_BS *q)/(q+c1o1);
-      q = q_dirBS[ kbs  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP ])[ktn ]=(c2o1*feqW27_TN -(f27_BS *(q*omegaD-c1o1)-omegaD*feq27_BS *(q-c1o1))/(omegaD-c1o1)+f27_TN *q)/(q+c1o1);
-      q = q_dirBN[ kbn  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP ])[kts ]=(c2o1*feqW27_TS -(f27_BN *(q*omegaD-c1o1)-omegaD*feq27_BN *(q-c1o1))/(omegaD-c1o1)+f27_TS *q)/(q+c1o1);
-      q = q_dirTS[ kts  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM ])[kbn ]=(c2o1*feqW27_BN -(f27_TS *(q*omegaD-c1o1)-omegaD*feq27_TS *(q-c1o1))/(omegaD-c1o1)+f27_BN *q)/(q+c1o1);
+      q = q_dirE[  ke   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00])[kw  ]=(c2o1*feqW27_W  -(f27_E  *(q*omegaD-c1o1)-omegaD*feq27_E  *(q-c1o1))/(omegaD-c1o1)+f27_W  *q)/(q+c1o1);
+      q = q_dirW[  kw   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00])[ke  ]=(c2o1*feqW27_E  -(f27_W  *(q*omegaD-c1o1)-omegaD*feq27_W  *(q-c1o1))/(omegaD-c1o1)+f27_E  *q)/(q+c1o1);
+      q = q_dirN[  kn   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0])[ks  ]=(c2o1*feqW27_S  -(f27_N  *(q*omegaD-c1o1)-omegaD*feq27_N  *(q-c1o1))/(omegaD-c1o1)+f27_S  *q)/(q+c1o1);
+      q = q_dirS[  ks   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0])[kn  ]=(c2o1*feqW27_N  -(f27_S  *(q*omegaD-c1o1)-omegaD*feq27_S  *(q-c1o1))/(omegaD-c1o1)+f27_N  *q)/(q+c1o1);
+      q = q_dirT[  kt   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M])[kb  ]=(c2o1*feqW27_B  -(f27_T  *(q*omegaD-c1o1)-omegaD*feq27_T  *(q-c1o1))/(omegaD-c1o1)+f27_B  *q)/(q+c1o1);
+      q = q_dirB[  kb   ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P])[kt  ]=(c2o1*feqW27_T  -(f27_B  *(q*omegaD-c1o1)-omegaD*feq27_B  *(q-c1o1))/(omegaD-c1o1)+f27_T  *q)/(q+c1o1);
+      q = q_dirNE[ kne  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0])[ksw ]=(c2o1*feqW27_SW -(f27_NE *(q*omegaD-c1o1)-omegaD*feq27_NE *(q-c1o1))/(omegaD-c1o1)+f27_SW *q)/(q+c1o1);
+      q = q_dirSW[ ksw  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0])[kne ]=(c2o1*feqW27_NE -(f27_SW *(q*omegaD-c1o1)-omegaD*feq27_SW *(q-c1o1))/(omegaD-c1o1)+f27_NE *q)/(q+c1o1);
+      q = q_dirSE[ kse  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0])[knw ]=(c2o1*feqW27_NW -(f27_SE *(q*omegaD-c1o1)-omegaD*feq27_SE *(q-c1o1))/(omegaD-c1o1)+f27_NW *q)/(q+c1o1);
+      q = q_dirNW[ knw  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0])[kse ]=(c2o1*feqW27_SE -(f27_NW *(q*omegaD-c1o1)-omegaD*feq27_NW *(q-c1o1))/(omegaD-c1o1)+f27_SE *q)/(q+c1o1);
+      q = q_dirTE[ kte  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M])[kbw ]=(c2o1*feqW27_BW -(f27_TE *(q*omegaD-c1o1)-omegaD*feq27_TE *(q-c1o1))/(omegaD-c1o1)+f27_BW *q)/(q+c1o1);
+      q = q_dirBW[ kbw  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P])[kte ]=(c2o1*feqW27_TE -(f27_BW *(q*omegaD-c1o1)-omegaD*feq27_BW *(q-c1o1))/(omegaD-c1o1)+f27_TE *q)/(q+c1o1);
+      q = q_dirBE[ kbe  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P])[ktw ]=(c2o1*feqW27_TW -(f27_BE *(q*omegaD-c1o1)-omegaD*feq27_BE *(q-c1o1))/(omegaD-c1o1)+f27_TW *q)/(q+c1o1);
+      q = q_dirTW[ ktw  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M])[kbe ]=(c2o1*feqW27_BE -(f27_TW *(q*omegaD-c1o1)-omegaD*feq27_TW *(q-c1o1))/(omegaD-c1o1)+f27_BE *q)/(q+c1o1);
+      q = q_dirTN[ ktn  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM])[kbs ]=(c2o1*feqW27_BS -(f27_TN *(q*omegaD-c1o1)-omegaD*feq27_TN *(q-c1o1))/(omegaD-c1o1)+f27_BS *q)/(q+c1o1);
+      q = q_dirBS[ kbs  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP])[ktn ]=(c2o1*feqW27_TN -(f27_BS *(q*omegaD-c1o1)-omegaD*feq27_BS *(q-c1o1))/(omegaD-c1o1)+f27_TN *q)/(q+c1o1);
+      q = q_dirBN[ kbn  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP])[kts ]=(c2o1*feqW27_TS -(f27_BN *(q*omegaD-c1o1)-omegaD*feq27_BN *(q-c1o1))/(omegaD-c1o1)+f27_TS *q)/(q+c1o1);
+      q = q_dirTS[ kts  ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM])[kbn ]=(c2o1*feqW27_BN -(f27_TS *(q*omegaD-c1o1)-omegaD*feq27_TS *(q-c1o1))/(omegaD-c1o1)+f27_BN *q)/(q+c1o1);
       q = q_dirTNE[ktne ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMM])[kbsw]=(c2o1*feqW27_BSW-(f27_TNE*(q*omegaD-c1o1)-omegaD*feq27_TNE*(q-c1o1))/(omegaD-c1o1)+f27_BSW*q)/(q+c1o1);
       q = q_dirBSW[kbsw ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PPP])[ktne]=(c2o1*feqW27_TNE-(f27_BSW*(q*omegaD-c1o1)-omegaD*feq27_BSW*(q-c1o1))/(omegaD-c1o1)+f27_TNE*q)/(q+c1o1);
       q = q_dirBNE[kbne ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMP])[ktsw]=(c2o1*feqW27_TSW-(f27_BNE*(q*omegaD-c1o1)-omegaD*feq27_BNE*(q-c1o1))/(omegaD-c1o1)+f27_TSW*q)/(q+c1o1);
@@ -3308,24 +3308,24 @@ __global__ void QADDirichlet27(
       q = q_dirBNW[kbnw ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PMP])[ktse]=(c2o1*feqW27_TSE-(f27_BNW*(q*omegaD-c1o1)-omegaD*feq27_BNW*(q-c1o1))/(omegaD-c1o1)+f27_TSE*q)/(q+c1o1);
       q = q_dirBSE[kbse ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MPP])[ktnw]=(c2o1*feqW27_TNW-(f27_BSE*(q*omegaD-c1o1)-omegaD*feq27_BSE*(q-c1o1))/(omegaD-c1o1)+f27_TNW*q)/(q+c1o1);
       q = q_dirTNW[ktnw ]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PMM])[kbse]=(c2o1*feqW27_BSE-(f27_TNW*(q*omegaD-c1o1)-omegaD*feq27_TNW*(q-c1o1))/(omegaD-c1o1)+f27_BSE*q)/(q+c1o1);
-      //q = q_dirE[k];   if (q>=zero && q<=one) (D27.f[DIR_M00  ])[kw  ]=(two*feqW27_W  -(f27_E  *(q*omegaD-one)-omegaD*feq27_E  *(q-one))/(omegaD-one)+f27_W  *q)/(q+one);
-      //q = q_dirW[k];   if (q>=zero && q<=one) (D27.f[DIR_P00  ])[ke  ]=(two*feqW27_E  -(f27_W  *(q*omegaD-one)-omegaD*feq27_W  *(q-one))/(omegaD-one)+f27_E  *q)/(q+one);
-      //q = q_dirN[k];   if (q>=zero && q<=one) (D27.f[DIR_0M0  ])[ks  ]=(two*feqW27_S  -(f27_N  *(q*omegaD-one)-omegaD*feq27_N  *(q-one))/(omegaD-one)+f27_S  *q)/(q+one);
-      //q = q_dirS[k];   if (q>=zero && q<=one) (D27.f[DIR_0P0  ])[kn  ]=(two*feqW27_N  -(f27_S  *(q*omegaD-one)-omegaD*feq27_S  *(q-one))/(omegaD-one)+f27_N  *q)/(q+one);
-      //q = q_dirT[k];   if (q>=zero && q<=one) (D27.f[DIR_00M  ])[kb  ]=(two*feqW27_B  -(f27_T  *(q*omegaD-one)-omegaD*feq27_T  *(q-one))/(omegaD-one)+f27_B  *q)/(q+one);
-      //q = q_dirB[k];   if (q>=zero && q<=one) (D27.f[DIR_00P  ])[kt  ]=(two*feqW27_T  -(f27_B  *(q*omegaD-one)-omegaD*feq27_B  *(q-one))/(omegaD-one)+f27_T  *q)/(q+one);
-      //q = q_dirNE[k];  if (q>=zero && q<=one) (D27.f[DIR_MM0 ])[ksw ]=(two*feqW27_SW -(f27_NE *(q*omegaD-one)-omegaD*feq27_NE *(q-one))/(omegaD-one)+f27_SW *q)/(q+one);
-      //q = q_dirSW[k];  if (q>=zero && q<=one) (D27.f[DIR_PP0 ])[kne ]=(two*feqW27_NE -(f27_SW *(q*omegaD-one)-omegaD*feq27_SW *(q-one))/(omegaD-one)+f27_NE *q)/(q+one);
-      //q = q_dirSE[k];  if (q>=zero && q<=one) (D27.f[DIR_MP0 ])[knw ]=(two*feqW27_NW -(f27_SE *(q*omegaD-one)-omegaD*feq27_SE *(q-one))/(omegaD-one)+f27_NW *q)/(q+one);
-      //q = q_dirNW[k];  if (q>=zero && q<=one) (D27.f[DIR_PM0 ])[kse ]=(two*feqW27_SE -(f27_NW *(q*omegaD-one)-omegaD*feq27_NW *(q-one))/(omegaD-one)+f27_SE *q)/(q+one);
-      //q = q_dirTE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0M ])[kbw ]=(two*feqW27_BW -(f27_TE *(q*omegaD-one)-omegaD*feq27_TE *(q-one))/(omegaD-one)+f27_BW *q)/(q+one);
-      //q = q_dirBW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0P ])[kte ]=(two*feqW27_TE -(f27_BW *(q*omegaD-one)-omegaD*feq27_BW *(q-one))/(omegaD-one)+f27_TE *q)/(q+one);
-      //q = q_dirBE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0P ])[ktw ]=(two*feqW27_TW -(f27_BE *(q*omegaD-one)-omegaD*feq27_BE *(q-one))/(omegaD-one)+f27_TW *q)/(q+one);
-      //q = q_dirTW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0M ])[kbe ]=(two*feqW27_BE -(f27_TW *(q*omegaD-one)-omegaD*feq27_TW *(q-one))/(omegaD-one)+f27_BE *q)/(q+one);
-      //q = q_dirTN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MM ])[kbs ]=(two*feqW27_BS -(f27_TN *(q*omegaD-one)-omegaD*feq27_TN *(q-one))/(omegaD-one)+f27_BS *q)/(q+one);
-      //q = q_dirBS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PP ])[ktn ]=(two*feqW27_TN -(f27_BS *(q*omegaD-one)-omegaD*feq27_BS *(q-one))/(omegaD-one)+f27_TN *q)/(q+one);
-      //q = q_dirBN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MP ])[kts ]=(two*feqW27_TS -(f27_BN *(q*omegaD-one)-omegaD*feq27_BN *(q-one))/(omegaD-one)+f27_TS *q)/(q+one);
-      //q = q_dirTS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PM ])[kbn ]=(two*feqW27_BN -(f27_TS *(q*omegaD-one)-omegaD*feq27_TS *(q-one))/(omegaD-one)+f27_BN *q)/(q+one);
+      //q = q_dirE[k];   if (q>=zero && q<=one) (D27.f[DIR_M00])[kw  ]=(two*feqW27_W  -(f27_E  *(q*omegaD-one)-omegaD*feq27_E  *(q-one))/(omegaD-one)+f27_W  *q)/(q+one);
+      //q = q_dirW[k];   if (q>=zero && q<=one) (D27.f[DIR_P00])[ke  ]=(two*feqW27_E  -(f27_W  *(q*omegaD-one)-omegaD*feq27_W  *(q-one))/(omegaD-one)+f27_E  *q)/(q+one);
+      //q = q_dirN[k];   if (q>=zero && q<=one) (D27.f[DIR_0M0])[ks  ]=(two*feqW27_S  -(f27_N  *(q*omegaD-one)-omegaD*feq27_N  *(q-one))/(omegaD-one)+f27_S  *q)/(q+one);
+      //q = q_dirS[k];   if (q>=zero && q<=one) (D27.f[DIR_0P0])[kn  ]=(two*feqW27_N  -(f27_S  *(q*omegaD-one)-omegaD*feq27_S  *(q-one))/(omegaD-one)+f27_N  *q)/(q+one);
+      //q = q_dirT[k];   if (q>=zero && q<=one) (D27.f[DIR_00M])[kb  ]=(two*feqW27_B  -(f27_T  *(q*omegaD-one)-omegaD*feq27_T  *(q-one))/(omegaD-one)+f27_B  *q)/(q+one);
+      //q = q_dirB[k];   if (q>=zero && q<=one) (D27.f[DIR_00P])[kt  ]=(two*feqW27_T  -(f27_B  *(q*omegaD-one)-omegaD*feq27_B  *(q-one))/(omegaD-one)+f27_T  *q)/(q+one);
+      //q = q_dirNE[k];  if (q>=zero && q<=one) (D27.f[DIR_MM0])[ksw ]=(two*feqW27_SW -(f27_NE *(q*omegaD-one)-omegaD*feq27_NE *(q-one))/(omegaD-one)+f27_SW *q)/(q+one);
+      //q = q_dirSW[k];  if (q>=zero && q<=one) (D27.f[DIR_PP0])[kne ]=(two*feqW27_NE -(f27_SW *(q*omegaD-one)-omegaD*feq27_SW *(q-one))/(omegaD-one)+f27_NE *q)/(q+one);
+      //q = q_dirSE[k];  if (q>=zero && q<=one) (D27.f[DIR_MP0])[knw ]=(two*feqW27_NW -(f27_SE *(q*omegaD-one)-omegaD*feq27_SE *(q-one))/(omegaD-one)+f27_NW *q)/(q+one);
+      //q = q_dirNW[k];  if (q>=zero && q<=one) (D27.f[DIR_PM0])[kse ]=(two*feqW27_SE -(f27_NW *(q*omegaD-one)-omegaD*feq27_NW *(q-one))/(omegaD-one)+f27_SE *q)/(q+one);
+      //q = q_dirTE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0M])[kbw ]=(two*feqW27_BW -(f27_TE *(q*omegaD-one)-omegaD*feq27_TE *(q-one))/(omegaD-one)+f27_BW *q)/(q+one);
+      //q = q_dirBW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0P])[kte ]=(two*feqW27_TE -(f27_BW *(q*omegaD-one)-omegaD*feq27_BW *(q-one))/(omegaD-one)+f27_TE *q)/(q+one);
+      //q = q_dirBE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0P])[ktw ]=(two*feqW27_TW -(f27_BE *(q*omegaD-one)-omegaD*feq27_BE *(q-one))/(omegaD-one)+f27_TW *q)/(q+one);
+      //q = q_dirTW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0M])[kbe ]=(two*feqW27_BE -(f27_TW *(q*omegaD-one)-omegaD*feq27_TW *(q-one))/(omegaD-one)+f27_BE *q)/(q+one);
+      //q = q_dirTN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MM])[kbs ]=(two*feqW27_BS -(f27_TN *(q*omegaD-one)-omegaD*feq27_TN *(q-one))/(omegaD-one)+f27_BS *q)/(q+one);
+      //q = q_dirBS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PP])[ktn ]=(two*feqW27_TN -(f27_BS *(q*omegaD-one)-omegaD*feq27_BS *(q-one))/(omegaD-one)+f27_TN *q)/(q+one);
+      //q = q_dirBN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MP])[kts ]=(two*feqW27_TS -(f27_BN *(q*omegaD-one)-omegaD*feq27_BN *(q-one))/(omegaD-one)+f27_TS *q)/(q+one);
+      //q = q_dirTS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PM])[kbn ]=(two*feqW27_BN -(f27_TS *(q*omegaD-one)-omegaD*feq27_TS *(q-one))/(omegaD-one)+f27_BN *q)/(q+one);
       //q = q_dirTNE[k]; if (q>=zero && q<=one) (D27.f[DIR_MMM])[kbsw]=(two*feqW27_BSW-(f27_TNE*(q*omegaD-one)-omegaD*feq27_TNE*(q-one))/(omegaD-one)+f27_BSW*q)/(q+one);
       //q = q_dirBSW[k]; if (q>=zero && q<=one) (D27.f[DIR_PPP])[ktne]=(two*feqW27_TNE-(f27_BSW*(q*omegaD-one)-omegaD*feq27_BSW*(q-one))/(omegaD-one)+f27_TNE*q)/(q+one);
       //q = q_dirBNE[k]; if (q>=zero && q<=one) (D27.f[DIR_MMP])[ktsw]=(two*feqW27_TSW-(f27_BNE*(q*omegaD-one)-omegaD*feq27_BNE*(q-one))/(omegaD-one)+f27_TSW*q)/(q+one);
@@ -3389,131 +3389,131 @@ __global__ void QADBB27( real* DD,
                                    unsigned int* neighborX,
                                    unsigned int* neighborY,
                                    unsigned int* neighborZ,
-                                   unsigned int size_Mat, 
+                                   unsigned long long numberOfLBnodes, 
                                    bool isEvenTimestep)
 {
    //Distributions27 D;
    //if (isEvenTimestep==true)
    //{
-   //   D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-   //   D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-   //   D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-   //   D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-   //   D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-   //   D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-   //   D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-   //   D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-   //   D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-   //   D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-   //   D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-   //   D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-   //   D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-   //   D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-   //   D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-   //   D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-   //   D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-   //   D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-   //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //   D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-   //   D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-   //   D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-   //   D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-   //   D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-   //   D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-   //   D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-   //   D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+   //   D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+   //   D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+   //   D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+   //   D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+   //   D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+   //   D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+   //   D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+   //   D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+   //   D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+   //   D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+   //   D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+   //   D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+   //   D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+   //   D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+   //   D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+   //   D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+   //   D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+   //   D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+   //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //   D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+   //   D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+   //   D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+   //   D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+   //   D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+   //   D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+   //   D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+   //   D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
    //} 
    //else
    //{
-   //   D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-   //   D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-   //   D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-   //   D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-   //   D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-   //   D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-   //   D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-   //   D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-   //   D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-   //   D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-   //   D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-   //   D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-   //   D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-   //   D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-   //   D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-   //   D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-   //   D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-   //   D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-   //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //   D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-   //   D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-   //   D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-   //   D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-   //   D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-   //   D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-   //   D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-   //   D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+   //   D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+   //   D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+   //   D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+   //   D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+   //   D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+   //   D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+   //   D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+   //   D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+   //   D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+   //   D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+   //   D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+   //   D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+   //   D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+   //   D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+   //   D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+   //   D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+   //   D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+   //   D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+   //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //   D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+   //   D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+   //   D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+   //   D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+   //   D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+   //   D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+   //   D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+   //   D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
    //}
 
    Distributions27 D27;
    if (isEvenTimestep==true)
    {
-      D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+      D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+      D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -3534,24 +3534,24 @@ __global__ void QADBB27( real* DD,
          *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -3591,33 +3591,33 @@ __global__ void QADBB27( real* DD,
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      //real f_W    = (D.f[DIR_P00   ])[ke   ];
-      //real f_E    = (D.f[DIR_M00   ])[kw   ];
-      //real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      //real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      //real f_B    = (D.f[DIR_00P   ])[kt   ];
-      //real f_T    = (D.f[DIR_00M   ])[kb   ];
-      //real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      //real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      //real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      //real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      //real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      //real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      //real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      //real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      //real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      //real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      //real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      //real f_BN   = (D.f[DIR_0MP  ])[kts  ];
+      //real f_W    = (D.f[DIR_P00])[ke   ];
+      //real f_E    = (D.f[DIR_M00])[kw   ];
+      //real f_S    = (D.f[DIR_0P0])[kn   ];
+      //real f_N    = (D.f[DIR_0M0])[ks   ];
+      //real f_B    = (D.f[DIR_00P])[kt   ];
+      //real f_T    = (D.f[DIR_00M])[kb   ];
+      //real f_SW   = (D.f[DIR_PP0])[kne  ];
+      //real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      //real f_NW   = (D.f[DIR_PM0])[kse  ];
+      //real f_SE   = (D.f[DIR_MP0])[knw  ];
+      //real f_BW   = (D.f[DIR_P0P])[kte  ];
+      //real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      //real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      //real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      //real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      //real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      //real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      //real f_BN   = (D.f[DIR_0MP])[kts  ];
       //real f_ZERO = (D.f[DIR_000])[kzero];
-      //real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      //real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      //real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      //real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      //real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      //real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      //real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      //real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      //real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      //real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      //real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      //real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      //real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      //real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      //real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      //real f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       //real vx1, vx2, vx3, /*drho, feq,*/ q;
       real q;
@@ -3644,33 +3644,33 @@ __global__ void QADBB27( real* DD,
       //vx2     =  OORho*((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_BNW-f_TSE)+(f_TNW-f_BSE) +(f_NE-f_SW)+(f_NW-f_SE)+(f_TN-f_BS)+(f_BN-f_TS)+(f_N-f_S));
       //vx3     =  OORho*((f_TNE-f_BSW)+(f_TSW-f_BNE)+(f_TSE-f_BNW)+(f_TNW-f_BSE) +(f_TE-f_BW)+(f_TW-f_BE)+(f_TN-f_BS)+(f_TS-f_BN)+(f_T-f_B));
       ////////////////////////////////////////////////////////////////////////////////
-      real f27_W    = (D27.f[DIR_P00   ])[ke   ];
-      real f27_E    = (D27.f[DIR_M00   ])[kw   ];
-      real f27_S    = (D27.f[DIR_0P0   ])[kn   ];
-      real f27_N    = (D27.f[DIR_0M0   ])[ks   ];
-      real f27_B    = (D27.f[DIR_00P   ])[kt   ];
-      real f27_T    = (D27.f[DIR_00M   ])[kb   ];
-      real f27_SW   = (D27.f[DIR_PP0  ])[kne  ];
-      real f27_NE   = (D27.f[DIR_MM0  ])[ksw  ];
-      real f27_NW   = (D27.f[DIR_PM0  ])[kse  ];
-      real f27_SE   = (D27.f[DIR_MP0  ])[knw  ];
-      real f27_BW   = (D27.f[DIR_P0P  ])[kte  ];
-      real f27_TE   = (D27.f[DIR_M0M  ])[kbw  ];
-      real f27_TW   = (D27.f[DIR_P0M  ])[kbe  ];
-      real f27_BE   = (D27.f[DIR_M0P  ])[ktw  ];
-      real f27_BS   = (D27.f[DIR_0PP  ])[ktn  ];
-      real f27_TN   = (D27.f[DIR_0MM  ])[kbs  ];
-      real f27_TS   = (D27.f[DIR_0PM  ])[kbn  ];
-      real f27_BN   = (D27.f[DIR_0MP  ])[kts  ];
+      real f27_W    = (D27.f[DIR_P00])[ke   ];
+      real f27_E    = (D27.f[DIR_M00])[kw   ];
+      real f27_S    = (D27.f[DIR_0P0])[kn   ];
+      real f27_N    = (D27.f[DIR_0M0])[ks   ];
+      real f27_B    = (D27.f[DIR_00P])[kt   ];
+      real f27_T    = (D27.f[DIR_00M])[kb   ];
+      real f27_SW   = (D27.f[DIR_PP0])[kne  ];
+      real f27_NE   = (D27.f[DIR_MM0])[ksw  ];
+      real f27_NW   = (D27.f[DIR_PM0])[kse  ];
+      real f27_SE   = (D27.f[DIR_MP0])[knw  ];
+      real f27_BW   = (D27.f[DIR_P0P])[kte  ];
+      real f27_TE   = (D27.f[DIR_M0M])[kbw  ];
+      real f27_TW   = (D27.f[DIR_P0M])[kbe  ];
+      real f27_BE   = (D27.f[DIR_M0P])[ktw  ];
+      real f27_BS   = (D27.f[DIR_0PP])[ktn  ];
+      real f27_TN   = (D27.f[DIR_0MM])[kbs  ];
+      real f27_TS   = (D27.f[DIR_0PM])[kbn  ];
+      real f27_BN   = (D27.f[DIR_0MP])[kts  ];
       //real f27_ZERO = (D27.f[DIR_000])[kzero];
-      real f27_BSW  = (D27.f[DIR_PPP ])[ktne ];
-      real f27_BNE  = (D27.f[DIR_MMP ])[ktsw ];
-      real f27_BNW  = (D27.f[DIR_PMP ])[ktse ];
-      real f27_BSE  = (D27.f[DIR_MPP ])[ktnw ];
-      real f27_TSW  = (D27.f[DIR_PPM ])[kbne ];
-      real f27_TNE  = (D27.f[DIR_MMM ])[kbsw ];
-      real f27_TNW  = (D27.f[DIR_PMM ])[kbse ];
-      real f27_TSE  = (D27.f[DIR_MPM ])[kbnw ];
+      real f27_BSW  = (D27.f[DIR_PPP])[ktne ];
+      real f27_BNE  = (D27.f[DIR_MMP])[ktsw ];
+      real f27_BNW  = (D27.f[DIR_PMP])[ktse ];
+      real f27_BSE  = (D27.f[DIR_MPP])[ktnw ];
+      real f27_TSW  = (D27.f[DIR_PPM])[kbne ];
+      real f27_TNE  = (D27.f[DIR_MMM])[kbsw ];
+      real f27_TNW  = (D27.f[DIR_PMM])[kbse ];
+      real f27_TSE  = (D27.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       //real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       ////////////////////////////////////////////////////////////////////////////////
@@ -3746,86 +3746,86 @@ __global__ void QADBB27( real* DD,
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+         D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+         D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
       //(D.f[DIR_000])[k]=0.1f;
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00  ])[kw  ]=f27_E  ;
-      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00  ])[ke  ]=f27_W  ;
-      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0  ])[ks  ]=f27_N  ;
-      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0  ])[kn  ]=f27_S  ;
-      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M  ])[kb  ]=f27_T  ;
-      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P  ])[kt  ]=f27_B  ;
-      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0 ])[ksw ]=f27_NE ;
-      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0 ])[kne ]=f27_SW ;
-      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0 ])[knw ]=f27_SE ;
-      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0 ])[kse ]=f27_NW ;
-      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M ])[kbw ]=f27_TE ;
-      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P ])[kte ]=f27_BW ;
-      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P ])[ktw ]=f27_BE ;
-      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M ])[kbe ]=f27_TW ;
-      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM ])[kbs ]=f27_TN ;
-      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP ])[ktn ]=f27_BS ;
-      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP ])[kts ]=f27_BN ;
-      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM ])[kbn ]=f27_TS ;
+      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00])[kw  ]=f27_E  ;
+      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00])[ke  ]=f27_W  ;
+      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0])[ks  ]=f27_N  ;
+      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0])[kn  ]=f27_S  ;
+      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M])[kb  ]=f27_T  ;
+      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P])[kt  ]=f27_B  ;
+      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0])[ksw ]=f27_NE ;
+      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0])[kne ]=f27_SW ;
+      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0])[knw ]=f27_SE ;
+      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0])[kse ]=f27_NW ;
+      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M])[kbw ]=f27_TE ;
+      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P])[kte ]=f27_BW ;
+      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P])[ktw ]=f27_BE ;
+      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M])[kbe ]=f27_TW ;
+      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM])[kbs ]=f27_TN ;
+      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP])[ktn ]=f27_BS ;
+      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP])[kts ]=f27_BN ;
+      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM])[kbn ]=f27_TS ;
       q = q_dirTNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMM])[kbsw]=f27_TNE;
       q = q_dirBSW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PPP])[ktne]=f27_BSW;
       q = q_dirBNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMP])[ktsw]=f27_BNE;
@@ -3905,91 +3905,91 @@ __global__ void QNoSlipADincomp7(
 											 unsigned int* neighborX,
 											 unsigned int* neighborY,
 											 unsigned int* neighborZ,
-											 unsigned int size_Mat, 
+											 unsigned long long numberOfLBnodes, 
 											 bool isEvenTimestep)
 {
    //Distributions27 D;
    //if (isEvenTimestep==true)
    //{
-   //   D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-   //   D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-   //   D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-   //   D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-   //   D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-   //   D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-   //   D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-   //   D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-   //   D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-   //   D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-   //   D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-   //   D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-   //   D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-   //   D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-   //   D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-   //   D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-   //   D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-   //   D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-   //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //   D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-   //   D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-   //   D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-   //   D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-   //   D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-   //   D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-   //   D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-   //   D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+   //   D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+   //   D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+   //   D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+   //   D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+   //   D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+   //   D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+   //   D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+   //   D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+   //   D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+   //   D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+   //   D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+   //   D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+   //   D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+   //   D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+   //   D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+   //   D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+   //   D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+   //   D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+   //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //   D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+   //   D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+   //   D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+   //   D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+   //   D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+   //   D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+   //   D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+   //   D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
    //} 
    //else
    //{
-   //   D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-   //   D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-   //   D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-   //   D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-   //   D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-   //   D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-   //   D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-   //   D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-   //   D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-   //   D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-   //   D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-   //   D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-   //   D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-   //   D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-   //   D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-   //   D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-   //   D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-   //   D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-   //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //   D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-   //   D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-   //   D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-   //   D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-   //   D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-   //   D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-   //   D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-   //   D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+   //   D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+   //   D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+   //   D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+   //   D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+   //   D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+   //   D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+   //   D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+   //   D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+   //   D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+   //   D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+   //   D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+   //   D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+   //   D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+   //   D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+   //   D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+   //   D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+   //   D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+   //   D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+   //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //   D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+   //   D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+   //   D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+   //   D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+   //   D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+   //   D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+   //   D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+   //   D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
    //}
 
    Distributions7 D7;
    if (isEvenTimestep==true)
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[1] = &DD7[1*size_Mat];
-      D7.f[2] = &DD7[2*size_Mat];
-      D7.f[3] = &DD7[3*size_Mat];
-      D7.f[4] = &DD7[4*size_Mat];
-      D7.f[5] = &DD7[5*size_Mat];
-      D7.f[6] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[1] = &DD7[1*numberOfLBnodes];
+      D7.f[2] = &DD7[2*numberOfLBnodes];
+      D7.f[3] = &DD7[3*numberOfLBnodes];
+      D7.f[4] = &DD7[4*numberOfLBnodes];
+      D7.f[5] = &DD7[5*numberOfLBnodes];
+      D7.f[6] = &DD7[6*numberOfLBnodes];
    }
    else
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[2] = &DD7[1*size_Mat];
-      D7.f[1] = &DD7[2*size_Mat];
-      D7.f[4] = &DD7[3*size_Mat];
-      D7.f[3] = &DD7[4*size_Mat];
-      D7.f[6] = &DD7[5*size_Mat];
-      D7.f[5] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[2] = &DD7[1*numberOfLBnodes];
+      D7.f[1] = &DD7[2*numberOfLBnodes];
+      D7.f[4] = &DD7[3*numberOfLBnodes];
+      D7.f[3] = &DD7[4*numberOfLBnodes];
+      D7.f[6] = &DD7[5*numberOfLBnodes];
+      D7.f[5] = &DD7[6*numberOfLBnodes];
    }
 
 
@@ -4009,12 +4009,12 @@ __global__ void QNoSlipADincomp7(
       //////////////////////////////////////////////////////////////////////////////////
       real  *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB;
 
-      q_dirE   = &QQ[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
       //////////////////////////////////////////////////////////////////////////////////
       //index
       unsigned int KQK  = k_Q[k];
@@ -4046,32 +4046,32 @@ __global__ void QNoSlipADincomp7(
       //unsigned int ktne = KQK;
       //unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      //real f_W    = (D.f[DIR_P00   ])[ke   ];
-      //real f_E    = (D.f[DIR_M00   ])[kw   ];
-      //real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      //real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      //real f_B    = (D.f[DIR_00P   ])[kt   ];
-      //real f_T    = (D.f[DIR_00M   ])[kb   ];
-      //real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      //real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      //real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      //real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      //real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      //real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      //real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      //real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      //real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      //real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      //real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      //real f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      //real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      //real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      //real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      //real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      //real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      //real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      //real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      //real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      //real f_W    = (D.f[DIR_P00])[ke   ];
+      //real f_E    = (D.f[DIR_M00])[kw   ];
+      //real f_S    = (D.f[DIR_0P0])[kn   ];
+      //real f_N    = (D.f[DIR_0M0])[ks   ];
+      //real f_B    = (D.f[DIR_00P])[kt   ];
+      //real f_T    = (D.f[DIR_00M])[kb   ];
+      //real f_SW   = (D.f[DIR_PP0])[kne  ];
+      //real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      //real f_NW   = (D.f[DIR_PM0])[kse  ];
+      //real f_SE   = (D.f[DIR_MP0])[knw  ];
+      //real f_BW   = (D.f[DIR_P0P])[kte  ];
+      //real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      //real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      //real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      //real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      //real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      //real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      //real f_BN   = (D.f[DIR_0MP])[kts  ];
+      //real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      //real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      //real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      //real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      //real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      //real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      //real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      //real f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       //real vx1 =  ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_TSE-f_BNW)+(f_BSE-f_TNW) +(f_NE-f_SW)+(f_SE-f_NW)+(f_TE-f_BW)+(f_BE-f_TW)+(f_E-f_W));
       //real vx2 =  ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_BNW-f_TSE)+(f_TNW-f_BSE) +(f_NE-f_SW)+(f_NW-f_SE)+(f_TN-f_BS)+(f_BN-f_TS)+(f_N-f_S));
@@ -4131,23 +4131,23 @@ __global__ void QNoSlipADincomp7(
       //pointertausch
       if (isEvenTimestep==false)
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[1] = &DD7[1*size_Mat];
-         D7.f[2] = &DD7[2*size_Mat];
-         D7.f[3] = &DD7[3*size_Mat];
-         D7.f[4] = &DD7[4*size_Mat];
-         D7.f[5] = &DD7[5*size_Mat];
-         D7.f[6] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[1] = &DD7[1*numberOfLBnodes];
+         D7.f[2] = &DD7[2*numberOfLBnodes];
+         D7.f[3] = &DD7[3*numberOfLBnodes];
+         D7.f[4] = &DD7[4*numberOfLBnodes];
+         D7.f[5] = &DD7[5*numberOfLBnodes];
+         D7.f[6] = &DD7[6*numberOfLBnodes];
       }
       else
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[2] = &DD7[1*size_Mat];
-         D7.f[1] = &DD7[2*size_Mat];
-         D7.f[4] = &DD7[3*size_Mat];
-         D7.f[3] = &DD7[4*size_Mat];
-         D7.f[6] = &DD7[5*size_Mat];
-         D7.f[5] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[2] = &DD7[1*numberOfLBnodes];
+         D7.f[1] = &DD7[2*numberOfLBnodes];
+         D7.f[4] = &DD7[3*numberOfLBnodes];
+         D7.f[3] = &DD7[4*numberOfLBnodes];
+         D7.f[6] = &DD7[5*numberOfLBnodes];
+         D7.f[5] = &DD7[6*numberOfLBnodes];
       }
 
       ////////////////////////////////////////////////////////////////////////////
@@ -4329,131 +4329,131 @@ __global__ void QNoSlipADincomp27(
 											 unsigned int* neighborX,
 											 unsigned int* neighborY,
 											 unsigned int* neighborZ,
-											 unsigned int size_Mat, 
+											 unsigned long long numberOfLBnodes, 
 											 bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
 
    Distributions27 D27;
    if (isEvenTimestep==true)
    {
-      D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+      D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+      D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -4474,24 +4474,24 @@ __global__ void QNoSlipADincomp27(
          *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -4531,65 +4531,65 @@ __global__ void QNoSlipADincomp27(
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
       //real f_ZERO = (D.f[DIR_000])[kzero];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real vx1 =  ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_TSE-f_BNW)+(f_BSE-f_TNW) +(f_NE-f_SW)+(f_SE-f_NW)+(f_TE-f_BW)+(f_BE-f_TW)+(f_E-f_W));
       real vx2 =  ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_BNW-f_TSE)+(f_TNW-f_BSE) +(f_NE-f_SW)+(f_NW-f_SE)+(f_TN-f_BS)+(f_BN-f_TS)+(f_N-f_S));
       real vx3 =  ((f_TNE-f_BSW)+(f_TSW-f_BNE)+(f_TSE-f_BNW)+(f_TNW-f_BSE) +(f_TE-f_BW)+(f_TW-f_BE)+(f_TN-f_BS)+(f_TS-f_BN)+(f_T-f_B));
       ////////////////////////////////////////////////////////////////////////////////
-      real f27_W    = (D27.f[DIR_P00   ])[ke   ];
-      real f27_E    = (D27.f[DIR_M00   ])[kw   ];
-      real f27_S    = (D27.f[DIR_0P0   ])[kn   ];
-      real f27_N    = (D27.f[DIR_0M0   ])[ks   ];
-      real f27_B    = (D27.f[DIR_00P   ])[kt   ];
-      real f27_T    = (D27.f[DIR_00M   ])[kb   ];
-      real f27_SW   = (D27.f[DIR_PP0  ])[kne  ];
-      real f27_NE   = (D27.f[DIR_MM0  ])[ksw  ];
-      real f27_NW   = (D27.f[DIR_PM0  ])[kse  ];
-      real f27_SE   = (D27.f[DIR_MP0  ])[knw  ];
-      real f27_BW   = (D27.f[DIR_P0P  ])[kte  ];
-      real f27_TE   = (D27.f[DIR_M0M  ])[kbw  ];
-      real f27_TW   = (D27.f[DIR_P0M  ])[kbe  ];
-      real f27_BE   = (D27.f[DIR_M0P  ])[ktw  ];
-      real f27_BS   = (D27.f[DIR_0PP  ])[ktn  ];
-      real f27_TN   = (D27.f[DIR_0MM  ])[kbs  ];
-      real f27_TS   = (D27.f[DIR_0PM  ])[kbn  ];
-      real f27_BN   = (D27.f[DIR_0MP  ])[kts  ];
+      real f27_W    = (D27.f[DIR_P00])[ke   ];
+      real f27_E    = (D27.f[DIR_M00])[kw   ];
+      real f27_S    = (D27.f[DIR_0P0])[kn   ];
+      real f27_N    = (D27.f[DIR_0M0])[ks   ];
+      real f27_B    = (D27.f[DIR_00P])[kt   ];
+      real f27_T    = (D27.f[DIR_00M])[kb   ];
+      real f27_SW   = (D27.f[DIR_PP0])[kne  ];
+      real f27_NE   = (D27.f[DIR_MM0])[ksw  ];
+      real f27_NW   = (D27.f[DIR_PM0])[kse  ];
+      real f27_SE   = (D27.f[DIR_MP0])[knw  ];
+      real f27_BW   = (D27.f[DIR_P0P])[kte  ];
+      real f27_TE   = (D27.f[DIR_M0M])[kbw  ];
+      real f27_TW   = (D27.f[DIR_P0M])[kbe  ];
+      real f27_BE   = (D27.f[DIR_M0P])[ktw  ];
+      real f27_BS   = (D27.f[DIR_0PP])[ktn  ];
+      real f27_TN   = (D27.f[DIR_0MM])[kbs  ];
+      real f27_TS   = (D27.f[DIR_0PM])[kbn  ];
+      real f27_BN   = (D27.f[DIR_0MP])[kts  ];
       real f27_ZERO = (D27.f[DIR_000])[kzero];
-      real f27_BSW  = (D27.f[DIR_PPP ])[ktne ];
-      real f27_BNE  = (D27.f[DIR_MMP ])[ktsw ];
-      real f27_BNW  = (D27.f[DIR_PMP ])[ktse ];
-      real f27_BSE  = (D27.f[DIR_MPP ])[ktnw ];
-      real f27_TSW  = (D27.f[DIR_PPM ])[kbne ];
-      real f27_TNE  = (D27.f[DIR_MMM ])[kbsw ];
-      real f27_TNW  = (D27.f[DIR_PMM ])[kbse ];
-      real f27_TSE  = (D27.f[DIR_MPM ])[kbnw ];
+      real f27_BSW  = (D27.f[DIR_PPP])[ktne ];
+      real f27_BNE  = (D27.f[DIR_MMP])[ktsw ];
+      real f27_BNW  = (D27.f[DIR_PMP])[ktse ];
+      real f27_BSE  = (D27.f[DIR_MPP])[ktnw ];
+      real f27_TSW  = (D27.f[DIR_PPM])[kbne ];
+      real f27_TNE  = (D27.f[DIR_MMM])[kbsw ];
+      real f27_TNW  = (D27.f[DIR_PMM])[kbse ];
+      real f27_TSE  = (D27.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       ////////////////////////////////////////////////////////////////////////////////
@@ -4665,63 +4665,63 @@ __global__ void QNoSlipADincomp27(
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+         D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+         D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -4729,24 +4729,24 @@ __global__ void QNoSlipADincomp27(
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  real q;
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00  ])[kw  ]=(c2o1*feqW27_W  -(f27_E  *(q*omegaD-c1o1)-omegaD*feq27_E  *(q-c1o1))/(omegaD-c1o1)+f27_W  *q)/(q+c1o1);
-      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00  ])[ke  ]=(c2o1*feqW27_E  -(f27_W  *(q*omegaD-c1o1)-omegaD*feq27_W  *(q-c1o1))/(omegaD-c1o1)+f27_E  *q)/(q+c1o1);
-      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0  ])[ks  ]=(c2o1*feqW27_S  -(f27_N  *(q*omegaD-c1o1)-omegaD*feq27_N  *(q-c1o1))/(omegaD-c1o1)+f27_S  *q)/(q+c1o1);
-      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0  ])[kn  ]=(c2o1*feqW27_N  -(f27_S  *(q*omegaD-c1o1)-omegaD*feq27_S  *(q-c1o1))/(omegaD-c1o1)+f27_N  *q)/(q+c1o1);
-      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M  ])[kb  ]=(c2o1*feqW27_B  -(f27_T  *(q*omegaD-c1o1)-omegaD*feq27_T  *(q-c1o1))/(omegaD-c1o1)+f27_B  *q)/(q+c1o1);
-      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P  ])[kt  ]=(c2o1*feqW27_T  -(f27_B  *(q*omegaD-c1o1)-omegaD*feq27_B  *(q-c1o1))/(omegaD-c1o1)+f27_T  *q)/(q+c1o1);
-      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0 ])[ksw ]=(c2o1*feqW27_SW -(f27_NE *(q*omegaD-c1o1)-omegaD*feq27_NE *(q-c1o1))/(omegaD-c1o1)+f27_SW *q)/(q+c1o1);
-      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0 ])[kne ]=(c2o1*feqW27_NE -(f27_SW *(q*omegaD-c1o1)-omegaD*feq27_SW *(q-c1o1))/(omegaD-c1o1)+f27_NE *q)/(q+c1o1);
-      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0 ])[knw ]=(c2o1*feqW27_NW -(f27_SE *(q*omegaD-c1o1)-omegaD*feq27_SE *(q-c1o1))/(omegaD-c1o1)+f27_NW *q)/(q+c1o1);
-      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0 ])[kse ]=(c2o1*feqW27_SE -(f27_NW *(q*omegaD-c1o1)-omegaD*feq27_NW *(q-c1o1))/(omegaD-c1o1)+f27_SE *q)/(q+c1o1);
-      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M ])[kbw ]=(c2o1*feqW27_BW -(f27_TE *(q*omegaD-c1o1)-omegaD*feq27_TE *(q-c1o1))/(omegaD-c1o1)+f27_BW *q)/(q+c1o1);
-      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P ])[kte ]=(c2o1*feqW27_TE -(f27_BW *(q*omegaD-c1o1)-omegaD*feq27_BW *(q-c1o1))/(omegaD-c1o1)+f27_TE *q)/(q+c1o1);
-      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P ])[ktw ]=(c2o1*feqW27_TW -(f27_BE *(q*omegaD-c1o1)-omegaD*feq27_BE *(q-c1o1))/(omegaD-c1o1)+f27_TW *q)/(q+c1o1);
-      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M ])[kbe ]=(c2o1*feqW27_BE -(f27_TW *(q*omegaD-c1o1)-omegaD*feq27_TW *(q-c1o1))/(omegaD-c1o1)+f27_BE *q)/(q+c1o1);
-      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM ])[kbs ]=(c2o1*feqW27_BS -(f27_TN *(q*omegaD-c1o1)-omegaD*feq27_TN *(q-c1o1))/(omegaD-c1o1)+f27_BS *q)/(q+c1o1);
-      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP ])[ktn ]=(c2o1*feqW27_TN -(f27_BS *(q*omegaD-c1o1)-omegaD*feq27_BS *(q-c1o1))/(omegaD-c1o1)+f27_TN *q)/(q+c1o1);
-      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP ])[kts ]=(c2o1*feqW27_TS -(f27_BN *(q*omegaD-c1o1)-omegaD*feq27_BN *(q-c1o1))/(omegaD-c1o1)+f27_TS *q)/(q+c1o1);
-      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM ])[kbn ]=(c2o1*feqW27_BN -(f27_TS *(q*omegaD-c1o1)-omegaD*feq27_TS *(q-c1o1))/(omegaD-c1o1)+f27_BN *q)/(q+c1o1);
+      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00])[kw  ]=(c2o1*feqW27_W  -(f27_E  *(q*omegaD-c1o1)-omegaD*feq27_E  *(q-c1o1))/(omegaD-c1o1)+f27_W  *q)/(q+c1o1);
+      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00])[ke  ]=(c2o1*feqW27_E  -(f27_W  *(q*omegaD-c1o1)-omegaD*feq27_W  *(q-c1o1))/(omegaD-c1o1)+f27_E  *q)/(q+c1o1);
+      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0])[ks  ]=(c2o1*feqW27_S  -(f27_N  *(q*omegaD-c1o1)-omegaD*feq27_N  *(q-c1o1))/(omegaD-c1o1)+f27_S  *q)/(q+c1o1);
+      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0])[kn  ]=(c2o1*feqW27_N  -(f27_S  *(q*omegaD-c1o1)-omegaD*feq27_S  *(q-c1o1))/(omegaD-c1o1)+f27_N  *q)/(q+c1o1);
+      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M])[kb  ]=(c2o1*feqW27_B  -(f27_T  *(q*omegaD-c1o1)-omegaD*feq27_T  *(q-c1o1))/(omegaD-c1o1)+f27_B  *q)/(q+c1o1);
+      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P])[kt  ]=(c2o1*feqW27_T  -(f27_B  *(q*omegaD-c1o1)-omegaD*feq27_B  *(q-c1o1))/(omegaD-c1o1)+f27_T  *q)/(q+c1o1);
+      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0])[ksw ]=(c2o1*feqW27_SW -(f27_NE *(q*omegaD-c1o1)-omegaD*feq27_NE *(q-c1o1))/(omegaD-c1o1)+f27_SW *q)/(q+c1o1);
+      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0])[kne ]=(c2o1*feqW27_NE -(f27_SW *(q*omegaD-c1o1)-omegaD*feq27_SW *(q-c1o1))/(omegaD-c1o1)+f27_NE *q)/(q+c1o1);
+      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0])[knw ]=(c2o1*feqW27_NW -(f27_SE *(q*omegaD-c1o1)-omegaD*feq27_SE *(q-c1o1))/(omegaD-c1o1)+f27_NW *q)/(q+c1o1);
+      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0])[kse ]=(c2o1*feqW27_SE -(f27_NW *(q*omegaD-c1o1)-omegaD*feq27_NW *(q-c1o1))/(omegaD-c1o1)+f27_SE *q)/(q+c1o1);
+      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M])[kbw ]=(c2o1*feqW27_BW -(f27_TE *(q*omegaD-c1o1)-omegaD*feq27_TE *(q-c1o1))/(omegaD-c1o1)+f27_BW *q)/(q+c1o1);
+      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P])[kte ]=(c2o1*feqW27_TE -(f27_BW *(q*omegaD-c1o1)-omegaD*feq27_BW *(q-c1o1))/(omegaD-c1o1)+f27_TE *q)/(q+c1o1);
+      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P])[ktw ]=(c2o1*feqW27_TW -(f27_BE *(q*omegaD-c1o1)-omegaD*feq27_BE *(q-c1o1))/(omegaD-c1o1)+f27_TW *q)/(q+c1o1);
+      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M])[kbe ]=(c2o1*feqW27_BE -(f27_TW *(q*omegaD-c1o1)-omegaD*feq27_TW *(q-c1o1))/(omegaD-c1o1)+f27_BE *q)/(q+c1o1);
+      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM])[kbs ]=(c2o1*feqW27_BS -(f27_TN *(q*omegaD-c1o1)-omegaD*feq27_TN *(q-c1o1))/(omegaD-c1o1)+f27_BS *q)/(q+c1o1);
+      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP])[ktn ]=(c2o1*feqW27_TN -(f27_BS *(q*omegaD-c1o1)-omegaD*feq27_BS *(q-c1o1))/(omegaD-c1o1)+f27_TN *q)/(q+c1o1);
+      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP])[kts ]=(c2o1*feqW27_TS -(f27_BN *(q*omegaD-c1o1)-omegaD*feq27_BN *(q-c1o1))/(omegaD-c1o1)+f27_TS *q)/(q+c1o1);
+      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM])[kbn ]=(c2o1*feqW27_BN -(f27_TS *(q*omegaD-c1o1)-omegaD*feq27_TS *(q-c1o1))/(omegaD-c1o1)+f27_BN *q)/(q+c1o1);
       q = q_dirTNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMM])[kbsw]=(c2o1*feqW27_BSW-(f27_TNE*(q*omegaD-c1o1)-omegaD*feq27_TNE*(q-c1o1))/(omegaD-c1o1)+f27_BSW*q)/(q+c1o1);
       q = q_dirBSW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PPP])[ktne]=(c2o1*feqW27_TNE-(f27_BSW*(q*omegaD-c1o1)-omegaD*feq27_BSW*(q-c1o1))/(omegaD-c1o1)+f27_TNE*q)/(q+c1o1);
       q = q_dirBNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMP])[ktsw]=(c2o1*feqW27_TSW-(f27_BNE*(q*omegaD-c1o1)-omegaD*feq27_BNE*(q-c1o1))/(omegaD-c1o1)+f27_TSW*q)/(q+c1o1);
@@ -4811,91 +4811,91 @@ __global__ void QADVeloIncomp7(
 											unsigned int* neighborX,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
-											unsigned int size_Mat, 
+											unsigned long long numberOfLBnodes, 
 											bool isEvenTimestep)
 {
    //Distributions27 D;
    //if (isEvenTimestep==true)
    //{
-   //   D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-   //   D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-   //   D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-   //   D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-   //   D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-   //   D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-   //   D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-   //   D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-   //   D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-   //   D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-   //   D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-   //   D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-   //   D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-   //   D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-   //   D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-   //   D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-   //   D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-   //   D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-   //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //   D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-   //   D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-   //   D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-   //   D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-   //   D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-   //   D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-   //   D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-   //   D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+   //   D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+   //   D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+   //   D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+   //   D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+   //   D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+   //   D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+   //   D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+   //   D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+   //   D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+   //   D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+   //   D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+   //   D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+   //   D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+   //   D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+   //   D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+   //   D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+   //   D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+   //   D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+   //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //   D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+   //   D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+   //   D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+   //   D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+   //   D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+   //   D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+   //   D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+   //   D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
    //} 
    //else
    //{
-   //   D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-   //   D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-   //   D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-   //   D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-   //   D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-   //   D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-   //   D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-   //   D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-   //   D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-   //   D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-   //   D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-   //   D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-   //   D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-   //   D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-   //   D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-   //   D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-   //   D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-   //   D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-   //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //   D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-   //   D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-   //   D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-   //   D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-   //   D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-   //   D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-   //   D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-   //   D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+   //   D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+   //   D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+   //   D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+   //   D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+   //   D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+   //   D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+   //   D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+   //   D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+   //   D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+   //   D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+   //   D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+   //   D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+   //   D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+   //   D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+   //   D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+   //   D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+   //   D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+   //   D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+   //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //   D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+   //   D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+   //   D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+   //   D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+   //   D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+   //   D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+   //   D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+   //   D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
    //}
 
    Distributions7 D7;
    if (isEvenTimestep==true)
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[1] = &DD7[1*size_Mat];
-      D7.f[2] = &DD7[2*size_Mat];
-      D7.f[3] = &DD7[3*size_Mat];
-      D7.f[4] = &DD7[4*size_Mat];
-      D7.f[5] = &DD7[5*size_Mat];
-      D7.f[6] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[1] = &DD7[1*numberOfLBnodes];
+      D7.f[2] = &DD7[2*numberOfLBnodes];
+      D7.f[3] = &DD7[3*numberOfLBnodes];
+      D7.f[4] = &DD7[4*numberOfLBnodes];
+      D7.f[5] = &DD7[5*numberOfLBnodes];
+      D7.f[6] = &DD7[6*numberOfLBnodes];
    }
    else
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[2] = &DD7[1*size_Mat];
-      D7.f[1] = &DD7[2*size_Mat];
-      D7.f[4] = &DD7[3*size_Mat];
-      D7.f[3] = &DD7[4*size_Mat];
-      D7.f[6] = &DD7[5*size_Mat];
-      D7.f[5] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[2] = &DD7[1*numberOfLBnodes];
+      D7.f[1] = &DD7[2*numberOfLBnodes];
+      D7.f[4] = &DD7[3*numberOfLBnodes];
+      D7.f[3] = &DD7[4*numberOfLBnodes];
+      D7.f[6] = &DD7[5*numberOfLBnodes];
+      D7.f[5] = &DD7[6*numberOfLBnodes];
    }
 
 
@@ -4915,12 +4915,12 @@ __global__ void QADVeloIncomp7(
       //////////////////////////////////////////////////////////////////////////////////
       real  *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB; 
 
-      q_dirE   = &QQ[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
       //////////////////////////////////////////////////////////////////////////////////
       //index
       unsigned int KQK  = k_Q[k];
@@ -4952,32 +4952,32 @@ __global__ void QADVeloIncomp7(
       //unsigned int ktne = KQK;
       //unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      //real f_W    = (D.f[DIR_P00   ])[ke   ];
-      //real f_E    = (D.f[DIR_M00   ])[kw   ];
-      //real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      //real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      //real f_B    = (D.f[DIR_00P   ])[kt   ];
-      //real f_T    = (D.f[DIR_00M   ])[kb   ];
-      //real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      //real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      //real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      //real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      //real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      //real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      //real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      //real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      //real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      //real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      //real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      //real f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      //real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      //real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      //real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      //real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      //real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      //real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      //real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      //real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      //real f_W    = (D.f[DIR_P00])[ke   ];
+      //real f_E    = (D.f[DIR_M00])[kw   ];
+      //real f_S    = (D.f[DIR_0P0])[kn   ];
+      //real f_N    = (D.f[DIR_0M0])[ks   ];
+      //real f_B    = (D.f[DIR_00P])[kt   ];
+      //real f_T    = (D.f[DIR_00M])[kb   ];
+      //real f_SW   = (D.f[DIR_PP0])[kne  ];
+      //real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      //real f_NW   = (D.f[DIR_PM0])[kse  ];
+      //real f_SE   = (D.f[DIR_MP0])[knw  ];
+      //real f_BW   = (D.f[DIR_P0P])[kte  ];
+      //real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      //real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      //real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      //real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      //real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      //real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      //real f_BN   = (D.f[DIR_0MP])[kts  ];
+      //real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      //real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      //real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      //real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      //real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      //real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      //real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      //real f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       //real vx1_Inflow   = c0o1;
       //real vx2_Inflow   = velo[k];
@@ -5091,23 +5091,23 @@ __global__ void QADVeloIncomp7(
       //pointertausch
       if (isEvenTimestep==false)
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[1] = &DD7[1*size_Mat];
-         D7.f[2] = &DD7[2*size_Mat];
-         D7.f[3] = &DD7[3*size_Mat];
-         D7.f[4] = &DD7[4*size_Mat];
-         D7.f[5] = &DD7[5*size_Mat];
-         D7.f[6] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[1] = &DD7[1*numberOfLBnodes];
+         D7.f[2] = &DD7[2*numberOfLBnodes];
+         D7.f[3] = &DD7[3*numberOfLBnodes];
+         D7.f[4] = &DD7[4*numberOfLBnodes];
+         D7.f[5] = &DD7[5*numberOfLBnodes];
+         D7.f[6] = &DD7[6*numberOfLBnodes];
       }
       else
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[2] = &DD7[1*size_Mat];
-         D7.f[1] = &DD7[2*size_Mat];
-         D7.f[4] = &DD7[3*size_Mat];
-         D7.f[3] = &DD7[4*size_Mat];
-         D7.f[6] = &DD7[5*size_Mat];
-         D7.f[5] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[2] = &DD7[1*numberOfLBnodes];
+         D7.f[1] = &DD7[2*numberOfLBnodes];
+         D7.f[4] = &DD7[3*numberOfLBnodes];
+         D7.f[3] = &DD7[4*numberOfLBnodes];
+         D7.f[6] = &DD7[5*numberOfLBnodes];
+         D7.f[5] = &DD7[6*numberOfLBnodes];
       }
 
       ////////////////////////////////////////////////////////////////////////////
@@ -5289,131 +5289,131 @@ __global__ void QADVeloIncomp27(
 											unsigned int* neighborX,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
-											unsigned int size_Mat, 
+											unsigned long long numberOfLBnodes, 
 											bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
 
    Distributions27 D27;
    if (isEvenTimestep==true)
    {
-      D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+      D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+      D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -5434,24 +5434,24 @@ __global__ void QADVeloIncomp27(
          *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -5491,65 +5491,65 @@ __global__ void QADVeloIncomp27(
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
       //real f_ZERO = (D.f[DIR_000])[kzero];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real vx1 = ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_TSE-f_BNW)+(f_BSE-f_TNW) +(f_NE-f_SW)+(f_SE-f_NW)+(f_TE-f_BW)+(f_BE-f_TW)+(f_E-f_W));
       real vx2 = ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_BNW-f_TSE)+(f_TNW-f_BSE) +(f_NE-f_SW)+(f_NW-f_SE)+(f_TN-f_BS)+(f_BN-f_TS)+(f_N-f_S));
       real vx3 = ((f_TNE-f_BSW)+(f_TSW-f_BNE)+(f_TSE-f_BNW)+(f_TNW-f_BSE) +(f_TE-f_BW)+(f_TW-f_BE)+(f_TN-f_BS)+(f_TS-f_BN)+(f_T-f_B));
       ////////////////////////////////////////////////////////////////////////////////
-      //real f27_W    = (D27.f[DIR_P00   ])[ke   ];
-      //real f27_E    = (D27.f[DIR_M00   ])[kw   ];
-      //real f27_S    = (D27.f[DIR_0P0   ])[kn   ];
-      //real f27_N    = (D27.f[DIR_0M0   ])[ks   ];
-      //real f27_B    = (D27.f[DIR_00P   ])[kt   ];
-      //real f27_T    = (D27.f[DIR_00M   ])[kb   ];
-      //real f27_SW   = (D27.f[DIR_PP0  ])[kne  ];
-      //real f27_NE   = (D27.f[DIR_MM0  ])[ksw  ];
-      //real f27_NW   = (D27.f[DIR_PM0  ])[kse  ];
-      //real f27_SE   = (D27.f[DIR_MP0  ])[knw  ];
-      //real f27_BW   = (D27.f[DIR_P0P  ])[kte  ];
-      //real f27_TE   = (D27.f[DIR_M0M  ])[kbw  ];
-      //real f27_TW   = (D27.f[DIR_P0M  ])[kbe  ];
-      //real f27_BE   = (D27.f[DIR_M0P  ])[ktw  ];
-      //real f27_BS   = (D27.f[DIR_0PP  ])[ktn  ];
-      //real f27_TN   = (D27.f[DIR_0MM  ])[kbs  ];
-      //real f27_TS   = (D27.f[DIR_0PM  ])[kbn  ];
-      //real f27_BN   = (D27.f[DIR_0MP  ])[kts  ];
+      //real f27_W    = (D27.f[DIR_P00])[ke   ];
+      //real f27_E    = (D27.f[DIR_M00])[kw   ];
+      //real f27_S    = (D27.f[DIR_0P0])[kn   ];
+      //real f27_N    = (D27.f[DIR_0M0])[ks   ];
+      //real f27_B    = (D27.f[DIR_00P])[kt   ];
+      //real f27_T    = (D27.f[DIR_00M])[kb   ];
+      //real f27_SW   = (D27.f[DIR_PP0])[kne  ];
+      //real f27_NE   = (D27.f[DIR_MM0])[ksw  ];
+      //real f27_NW   = (D27.f[DIR_PM0])[kse  ];
+      //real f27_SE   = (D27.f[DIR_MP0])[knw  ];
+      //real f27_BW   = (D27.f[DIR_P0P])[kte  ];
+      //real f27_TE   = (D27.f[DIR_M0M])[kbw  ];
+      //real f27_TW   = (D27.f[DIR_P0M])[kbe  ];
+      //real f27_BE   = (D27.f[DIR_M0P])[ktw  ];
+      //real f27_BS   = (D27.f[DIR_0PP])[ktn  ];
+      //real f27_TN   = (D27.f[DIR_0MM])[kbs  ];
+      //real f27_TS   = (D27.f[DIR_0PM])[kbn  ];
+      //real f27_BN   = (D27.f[DIR_0MP])[kts  ];
       //real f27_ZERO = (D27.f[DIR_000])[kzero];
-      //real f27_BSW  = (D27.f[DIR_PPP ])[ktne ];
-      //real f27_BNE  = (D27.f[DIR_MMP ])[ktsw ];
-      //real f27_BNW  = (D27.f[DIR_PMP ])[ktse ];
-      //real f27_BSE  = (D27.f[DIR_MPP ])[ktnw ];
-      //real f27_TSW  = (D27.f[DIR_PPM ])[kbne ];
-      //real f27_TNE  = (D27.f[DIR_MMM ])[kbsw ];
-      //real f27_TNW  = (D27.f[DIR_PMM ])[kbse ];
-      //real f27_TSE  = (D27.f[DIR_MPM ])[kbnw ];
+      //real f27_BSW  = (D27.f[DIR_PPP])[ktne ];
+      //real f27_BNE  = (D27.f[DIR_MMP])[ktsw ];
+      //real f27_BNW  = (D27.f[DIR_PMP])[ktse ];
+      //real f27_BSE  = (D27.f[DIR_MPP])[ktnw ];
+      //real f27_TSW  = (D27.f[DIR_PPM])[kbne ];
+      //real f27_TNE  = (D27.f[DIR_MMM])[kbsw ];
+      //real f27_TNW  = (D27.f[DIR_PMM])[kbse ];
+      //real f27_TSE  = (D27.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       ////////////////////////////////////////////////////////////////////////////////
@@ -5630,63 +5630,63 @@ __global__ void QADVeloIncomp27(
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+         D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+         D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -5694,24 +5694,24 @@ __global__ void QADVeloIncomp27(
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real q;
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00  ])[kw  ]= -feqW27_W  + c2o1 * c2o27  * TempD;
-      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00  ])[ke  ]= -feqW27_E  + c2o1 * c2o27  * TempD;
-      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0  ])[ks  ]= -feqW27_S  + c2o1 * c2o27  * TempD;
-      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0  ])[kn  ]= -feqW27_N  + c2o1 * c2o27  * TempD;
-      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M  ])[kb  ]= -feqW27_B  + c2o1 * c2o27  * TempD;
-      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P  ])[kt  ]= -feqW27_T  + c2o1 * c2o27  * TempD;
-      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0 ])[ksw ]= -feqW27_SW + c2o1 * c1o54  * TempD;
-      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0 ])[kne ]= -feqW27_NE + c2o1 * c1o54  * TempD;
-      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0 ])[knw ]= -feqW27_NW + c2o1 * c1o54  * TempD;
-      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0 ])[kse ]= -feqW27_SE + c2o1 * c1o54  * TempD;
-      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M ])[kbw ]= -feqW27_BW + c2o1 * c1o54  * TempD;
-      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P ])[kte ]= -feqW27_TE + c2o1 * c1o54  * TempD;
-      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P ])[ktw ]= -feqW27_TW + c2o1 * c1o54  * TempD;
-      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M ])[kbe ]= -feqW27_BE + c2o1 * c1o54  * TempD;
-      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM ])[kbs ]= -feqW27_BS + c2o1 * c1o54  * TempD;
-      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP ])[ktn ]= -feqW27_TN + c2o1 * c1o54  * TempD;
-      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP ])[kts ]= -feqW27_TS + c2o1 * c1o54  * TempD;
-      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM ])[kbn ]= -feqW27_BN + c2o1 * c1o54  * TempD;
+      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00])[kw  ]= -feqW27_W  + c2o1 * c2o27  * TempD;
+      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00])[ke  ]= -feqW27_E  + c2o1 * c2o27  * TempD;
+      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0])[ks  ]= -feqW27_S  + c2o1 * c2o27  * TempD;
+      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0])[kn  ]= -feqW27_N  + c2o1 * c2o27  * TempD;
+      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M])[kb  ]= -feqW27_B  + c2o1 * c2o27  * TempD;
+      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P])[kt  ]= -feqW27_T  + c2o1 * c2o27  * TempD;
+      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0])[ksw ]= -feqW27_SW + c2o1 * c1o54  * TempD;
+      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0])[kne ]= -feqW27_NE + c2o1 * c1o54  * TempD;
+      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0])[knw ]= -feqW27_NW + c2o1 * c1o54  * TempD;
+      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0])[kse ]= -feqW27_SE + c2o1 * c1o54  * TempD;
+      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M])[kbw ]= -feqW27_BW + c2o1 * c1o54  * TempD;
+      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P])[kte ]= -feqW27_TE + c2o1 * c1o54  * TempD;
+      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P])[ktw ]= -feqW27_TW + c2o1 * c1o54  * TempD;
+      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M])[kbe ]= -feqW27_BE + c2o1 * c1o54  * TempD;
+      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM])[kbs ]= -feqW27_BS + c2o1 * c1o54  * TempD;
+      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP])[ktn ]= -feqW27_TN + c2o1 * c1o54  * TempD;
+      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP])[kts ]= -feqW27_TS + c2o1 * c1o54  * TempD;
+      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM])[kbn ]= -feqW27_BN + c2o1 * c1o54  * TempD;
       q = q_dirTNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMM])[kbsw]= -feqW27_BSW+ c2o1 * c1o216 * TempD;
       q = q_dirBSW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PPP])[ktne]= -feqW27_TNE+ c2o1 * c1o216 * TempD;
       q = q_dirBNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMP])[ktsw]= -feqW27_TSW+ c2o1 * c1o216 * TempD;
@@ -5720,24 +5720,24 @@ __global__ void QADVeloIncomp27(
       q = q_dirBNW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PMP])[ktse]= -feqW27_TSE+ c2o1 * c1o216 * TempD;
       q = q_dirBSE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MPP])[ktnw]= -feqW27_TNW+ c2o1 * c1o216 * TempD;
       q = q_dirTNW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PMM])[kbse]= -feqW27_BSE+ c2o1 * c1o216 * TempD;
-      //q = q_dirE[k];   if (q>=zero && q<=one) (D27.f[DIR_M00  ])[kw  ]=(two*feqW27_W  -(f27_E  *(q*omegaD-one)-omegaD*feq27_E  *(q-one))/(omegaD-one)+f27_W  *q)/(q+one);
-      //q = q_dirW[k];   if (q>=zero && q<=one) (D27.f[DIR_P00  ])[ke  ]=(two*feqW27_E  -(f27_W  *(q*omegaD-one)-omegaD*feq27_W  *(q-one))/(omegaD-one)+f27_E  *q)/(q+one);
-      //q = q_dirN[k];   if (q>=zero && q<=one) (D27.f[DIR_0M0  ])[ks  ]=(two*feqW27_S  -(f27_N  *(q*omegaD-one)-omegaD*feq27_N  *(q-one))/(omegaD-one)+f27_S  *q)/(q+one);
-      //q = q_dirS[k];   if (q>=zero && q<=one) (D27.f[DIR_0P0  ])[kn  ]=(two*feqW27_N  -(f27_S  *(q*omegaD-one)-omegaD*feq27_S  *(q-one))/(omegaD-one)+f27_N  *q)/(q+one);
-      //q = q_dirT[k];   if (q>=zero && q<=one) (D27.f[DIR_00M  ])[kb  ]=(two*feqW27_B  -(f27_T  *(q*omegaD-one)-omegaD*feq27_T  *(q-one))/(omegaD-one)+f27_B  *q)/(q+one);
-      //q = q_dirB[k];   if (q>=zero && q<=one) (D27.f[DIR_00P  ])[kt  ]=(two*feqW27_T  -(f27_B  *(q*omegaD-one)-omegaD*feq27_B  *(q-one))/(omegaD-one)+f27_T  *q)/(q+one);
-      //q = q_dirNE[k];  if (q>=zero && q<=one) (D27.f[DIR_MM0 ])[ksw ]=(two*feqW27_SW -(f27_NE *(q*omegaD-one)-omegaD*feq27_NE *(q-one))/(omegaD-one)+f27_SW *q)/(q+one);
-      //q = q_dirSW[k];  if (q>=zero && q<=one) (D27.f[DIR_PP0 ])[kne ]=(two*feqW27_NE -(f27_SW *(q*omegaD-one)-omegaD*feq27_SW *(q-one))/(omegaD-one)+f27_NE *q)/(q+one);
-      //q = q_dirSE[k];  if (q>=zero && q<=one) (D27.f[DIR_MP0 ])[knw ]=(two*feqW27_NW -(f27_SE *(q*omegaD-one)-omegaD*feq27_SE *(q-one))/(omegaD-one)+f27_NW *q)/(q+one);
-      //q = q_dirNW[k];  if (q>=zero && q<=one) (D27.f[DIR_PM0 ])[kse ]=(two*feqW27_SE -(f27_NW *(q*omegaD-one)-omegaD*feq27_NW *(q-one))/(omegaD-one)+f27_SE *q)/(q+one);
-      //q = q_dirTE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0M ])[kbw ]=(two*feqW27_BW -(f27_TE *(q*omegaD-one)-omegaD*feq27_TE *(q-one))/(omegaD-one)+f27_BW *q)/(q+one);
-      //q = q_dirBW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0P ])[kte ]=(two*feqW27_TE -(f27_BW *(q*omegaD-one)-omegaD*feq27_BW *(q-one))/(omegaD-one)+f27_TE *q)/(q+one);
-      //q = q_dirBE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0P ])[ktw ]=(two*feqW27_TW -(f27_BE *(q*omegaD-one)-omegaD*feq27_BE *(q-one))/(omegaD-one)+f27_TW *q)/(q+one);
-      //q = q_dirTW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0M ])[kbe ]=(two*feqW27_BE -(f27_TW *(q*omegaD-one)-omegaD*feq27_TW *(q-one))/(omegaD-one)+f27_BE *q)/(q+one);
-      //q = q_dirTN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MM ])[kbs ]=(two*feqW27_BS -(f27_TN *(q*omegaD-one)-omegaD*feq27_TN *(q-one))/(omegaD-one)+f27_BS *q)/(q+one);
-      //q = q_dirBS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PP ])[ktn ]=(two*feqW27_TN -(f27_BS *(q*omegaD-one)-omegaD*feq27_BS *(q-one))/(omegaD-one)+f27_TN *q)/(q+one);
-      //q = q_dirBN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MP ])[kts ]=(two*feqW27_TS -(f27_BN *(q*omegaD-one)-omegaD*feq27_BN *(q-one))/(omegaD-one)+f27_TS *q)/(q+one);
-      //q = q_dirTS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PM ])[kbn ]=(two*feqW27_BN -(f27_TS *(q*omegaD-one)-omegaD*feq27_TS *(q-one))/(omegaD-one)+f27_BN *q)/(q+one);
+      //q = q_dirE[k];   if (q>=zero && q<=one) (D27.f[DIR_M00])[kw  ]=(two*feqW27_W  -(f27_E  *(q*omegaD-one)-omegaD*feq27_E  *(q-one))/(omegaD-one)+f27_W  *q)/(q+one);
+      //q = q_dirW[k];   if (q>=zero && q<=one) (D27.f[DIR_P00])[ke  ]=(two*feqW27_E  -(f27_W  *(q*omegaD-one)-omegaD*feq27_W  *(q-one))/(omegaD-one)+f27_E  *q)/(q+one);
+      //q = q_dirN[k];   if (q>=zero && q<=one) (D27.f[DIR_0M0])[ks  ]=(two*feqW27_S  -(f27_N  *(q*omegaD-one)-omegaD*feq27_N  *(q-one))/(omegaD-one)+f27_S  *q)/(q+one);
+      //q = q_dirS[k];   if (q>=zero && q<=one) (D27.f[DIR_0P0])[kn  ]=(two*feqW27_N  -(f27_S  *(q*omegaD-one)-omegaD*feq27_S  *(q-one))/(omegaD-one)+f27_N  *q)/(q+one);
+      //q = q_dirT[k];   if (q>=zero && q<=one) (D27.f[DIR_00M])[kb  ]=(two*feqW27_B  -(f27_T  *(q*omegaD-one)-omegaD*feq27_T  *(q-one))/(omegaD-one)+f27_B  *q)/(q+one);
+      //q = q_dirB[k];   if (q>=zero && q<=one) (D27.f[DIR_00P])[kt  ]=(two*feqW27_T  -(f27_B  *(q*omegaD-one)-omegaD*feq27_B  *(q-one))/(omegaD-one)+f27_T  *q)/(q+one);
+      //q = q_dirNE[k];  if (q>=zero && q<=one) (D27.f[DIR_MM0])[ksw ]=(two*feqW27_SW -(f27_NE *(q*omegaD-one)-omegaD*feq27_NE *(q-one))/(omegaD-one)+f27_SW *q)/(q+one);
+      //q = q_dirSW[k];  if (q>=zero && q<=one) (D27.f[DIR_PP0])[kne ]=(two*feqW27_NE -(f27_SW *(q*omegaD-one)-omegaD*feq27_SW *(q-one))/(omegaD-one)+f27_NE *q)/(q+one);
+      //q = q_dirSE[k];  if (q>=zero && q<=one) (D27.f[DIR_MP0])[knw ]=(two*feqW27_NW -(f27_SE *(q*omegaD-one)-omegaD*feq27_SE *(q-one))/(omegaD-one)+f27_NW *q)/(q+one);
+      //q = q_dirNW[k];  if (q>=zero && q<=one) (D27.f[DIR_PM0])[kse ]=(two*feqW27_SE -(f27_NW *(q*omegaD-one)-omegaD*feq27_NW *(q-one))/(omegaD-one)+f27_SE *q)/(q+one);
+      //q = q_dirTE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0M])[kbw ]=(two*feqW27_BW -(f27_TE *(q*omegaD-one)-omegaD*feq27_TE *(q-one))/(omegaD-one)+f27_BW *q)/(q+one);
+      //q = q_dirBW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0P])[kte ]=(two*feqW27_TE -(f27_BW *(q*omegaD-one)-omegaD*feq27_BW *(q-one))/(omegaD-one)+f27_TE *q)/(q+one);
+      //q = q_dirBE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0P])[ktw ]=(two*feqW27_TW -(f27_BE *(q*omegaD-one)-omegaD*feq27_BE *(q-one))/(omegaD-one)+f27_TW *q)/(q+one);
+      //q = q_dirTW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0M])[kbe ]=(two*feqW27_BE -(f27_TW *(q*omegaD-one)-omegaD*feq27_TW *(q-one))/(omegaD-one)+f27_BE *q)/(q+one);
+      //q = q_dirTN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MM])[kbs ]=(two*feqW27_BS -(f27_TN *(q*omegaD-one)-omegaD*feq27_TN *(q-one))/(omegaD-one)+f27_BS *q)/(q+one);
+      //q = q_dirBS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PP])[ktn ]=(two*feqW27_TN -(f27_BS *(q*omegaD-one)-omegaD*feq27_BS *(q-one))/(omegaD-one)+f27_TN *q)/(q+one);
+      //q = q_dirBN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MP])[kts ]=(two*feqW27_TS -(f27_BN *(q*omegaD-one)-omegaD*feq27_BN *(q-one))/(omegaD-one)+f27_TS *q)/(q+one);
+      //q = q_dirTS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PM])[kbn ]=(two*feqW27_BN -(f27_TS *(q*omegaD-one)-omegaD*feq27_TS *(q-one))/(omegaD-one)+f27_BN *q)/(q+one);
       //q = q_dirTNE[k]; if (q>=zero && q<=one) (D27.f[DIR_MMM])[kbsw]=(two*feqW27_BSW-(f27_TNE*(q*omegaD-one)-omegaD*feq27_TNE*(q-one))/(omegaD-one)+f27_BSW*q)/(q+one);
       //q = q_dirBSW[k]; if (q>=zero && q<=one) (D27.f[DIR_PPP])[ktne]=(two*feqW27_TNE-(f27_BSW*(q*omegaD-one)-omegaD*feq27_BSW*(q-one))/(omegaD-one)+f27_TNE*q)/(q+one);
       //q = q_dirBNE[k]; if (q>=zero && q<=one) (D27.f[DIR_MMP])[ktsw]=(two*feqW27_TSW-(f27_BNE*(q*omegaD-one)-omegaD*feq27_BNE*(q-one))/(omegaD-one)+f27_TSW*q)/(q+one);
@@ -5801,91 +5801,91 @@ __global__ void QADPressIncomp7( real* DD,
 										   unsigned int* neighborX,
 										   unsigned int* neighborY,
 										   unsigned int* neighborZ,
-										   unsigned int size_Mat, 
+										   unsigned long long numberOfLBnodes, 
 										   bool isEvenTimestep)
 {
   /* Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+      D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+      D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+      D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+      D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+      D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+      D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+      D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+      D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+      D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+      D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+      D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+      D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+      D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+      D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+      D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+      D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+      D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+      D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+      D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+      D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+      D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+      D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+      D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+      D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+      D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+      D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+      D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+      D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+      D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+      D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+      D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+      D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+      D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+      D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+      D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+      D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+      D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+      D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+      D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+      D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
    }*/
 
    Distributions7 D7;
    if (isEvenTimestep==true)
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[1] = &DD7[1*size_Mat];
-      D7.f[2] = &DD7[2*size_Mat];
-      D7.f[3] = &DD7[3*size_Mat];
-      D7.f[4] = &DD7[4*size_Mat];
-      D7.f[5] = &DD7[5*size_Mat];
-      D7.f[6] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[1] = &DD7[1*numberOfLBnodes];
+      D7.f[2] = &DD7[2*numberOfLBnodes];
+      D7.f[3] = &DD7[3*numberOfLBnodes];
+      D7.f[4] = &DD7[4*numberOfLBnodes];
+      D7.f[5] = &DD7[5*numberOfLBnodes];
+      D7.f[6] = &DD7[6*numberOfLBnodes];
    }
    else
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[2] = &DD7[1*size_Mat];
-      D7.f[1] = &DD7[2*size_Mat];
-      D7.f[4] = &DD7[3*size_Mat];
-      D7.f[3] = &DD7[4*size_Mat];
-      D7.f[6] = &DD7[5*size_Mat];
-      D7.f[5] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[2] = &DD7[1*numberOfLBnodes];
+      D7.f[1] = &DD7[2*numberOfLBnodes];
+      D7.f[4] = &DD7[3*numberOfLBnodes];
+      D7.f[3] = &DD7[4*numberOfLBnodes];
+      D7.f[6] = &DD7[5*numberOfLBnodes];
+      D7.f[5] = &DD7[6*numberOfLBnodes];
    }
 
 
@@ -5905,12 +5905,12 @@ __global__ void QADPressIncomp7( real* DD,
       //////////////////////////////////////////////////////////////////////////////////
       real  *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB; 
 
-      q_dirE   = &QQ[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
       //////////////////////////////////////////////////////////////////////////////////
       //index
       unsigned int KQK  = k_Q[k];
@@ -5945,32 +5945,32 @@ __global__ void QADPressIncomp7( real* DD,
     /*  real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];*/
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];*/
       ////////////////////////////////////////////////////////////////////////////////
       //real vx1 = ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_TSE-f_BNW)+(f_BSE-f_TNW) +(f_NE-f_SW)+(f_SE-f_NW)+(f_TE-f_BW)+(f_BE-f_TW)+(f_E-f_W));
       //real vx2 = ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_BNW-f_TSE)+(f_TNW-f_BSE) +(f_NE-f_SW)+(f_NW-f_SE)+(f_TN-f_BS)+(f_BN-f_TS)+(f_N-f_S));
@@ -6035,23 +6035,23 @@ __global__ void QADPressIncomp7( real* DD,
       //pointertausch
       if (isEvenTimestep==false)
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[1] = &DD7[1*size_Mat];
-         D7.f[2] = &DD7[2*size_Mat];
-         D7.f[3] = &DD7[3*size_Mat];
-         D7.f[4] = &DD7[4*size_Mat];
-         D7.f[5] = &DD7[5*size_Mat];
-         D7.f[6] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[1] = &DD7[1*numberOfLBnodes];
+         D7.f[2] = &DD7[2*numberOfLBnodes];
+         D7.f[3] = &DD7[3*numberOfLBnodes];
+         D7.f[4] = &DD7[4*numberOfLBnodes];
+         D7.f[5] = &DD7[5*numberOfLBnodes];
+         D7.f[6] = &DD7[6*numberOfLBnodes];
       }
       else
       {
-         D7.f[0] = &DD7[0*size_Mat];
-         D7.f[2] = &DD7[1*size_Mat];
-         D7.f[1] = &DD7[2*size_Mat];
-         D7.f[4] = &DD7[3*size_Mat];
-         D7.f[3] = &DD7[4*size_Mat];
-         D7.f[6] = &DD7[5*size_Mat];
-         D7.f[5] = &DD7[6*size_Mat];
+         D7.f[0] = &DD7[0*numberOfLBnodes];
+         D7.f[2] = &DD7[1*numberOfLBnodes];
+         D7.f[1] = &DD7[2*numberOfLBnodes];
+         D7.f[4] = &DD7[3*numberOfLBnodes];
+         D7.f[3] = &DD7[4*numberOfLBnodes];
+         D7.f[6] = &DD7[5*numberOfLBnodes];
+         D7.f[5] = &DD7[6*numberOfLBnodes];
       }
 
       ////////////////////////////////////////////////////////////////////////////
@@ -6240,131 +6240,131 @@ __global__ void QADPressIncomp27(
 											   unsigned int* neighborX,
 											   unsigned int* neighborY,
 											   unsigned int* neighborZ,
-											   unsigned int size_Mat, 
+											   unsigned long long numberOfLBnodes, 
 											   bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
 
    Distributions27 D27;
    if (isEvenTimestep==true)
    {
-      D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+      D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+      D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -6385,24 +6385,24 @@ __global__ void QADPressIncomp27(
          *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -6442,65 +6442,65 @@ __global__ void QADPressIncomp27(
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
       //real f_ZERO = (D.f[DIR_000])[kzero];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real vx1      = ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_TSE-f_BNW)+(f_BSE-f_TNW) +(f_NE-f_SW)+(f_SE-f_NW)+(f_TE-f_BW)+(f_BE-f_TW)+(f_E-f_W));
       real vx2      = ((f_TNE-f_BSW)+(f_BNE-f_TSW)+(f_BNW-f_TSE)+(f_TNW-f_BSE) +(f_NE-f_SW)+(f_NW-f_SE)+(f_TN-f_BS)+(f_BN-f_TS)+(f_N-f_S));
       real vx3      = ((f_TNE-f_BSW)+(f_TSW-f_BNE)+(f_TSE-f_BNW)+(f_TNW-f_BSE) +(f_TE-f_BW)+(f_TW-f_BE)+(f_TN-f_BS)+(f_TS-f_BN)+(f_T-f_B));
       ////////////////////////////////////////////////////////////////////////////////
-      //real f27_W    = (D27.f[DIR_P00   ])[ke   ];
-      //real f27_E    = (D27.f[DIR_M00   ])[kw   ];
-      //real f27_S    = (D27.f[DIR_0P0   ])[kn   ];
-      //real f27_N    = (D27.f[DIR_0M0   ])[ks   ];
-      //real f27_B    = (D27.f[DIR_00P   ])[kt   ];
-      //real f27_T    = (D27.f[DIR_00M   ])[kb   ];
-      //real f27_SW   = (D27.f[DIR_PP0  ])[kne  ];
-      //real f27_NE   = (D27.f[DIR_MM0  ])[ksw  ];
-      //real f27_NW   = (D27.f[DIR_PM0  ])[kse  ];
-      //real f27_SE   = (D27.f[DIR_MP0  ])[knw  ];
-      //real f27_BW   = (D27.f[DIR_P0P  ])[kte  ];
-      //real f27_TE   = (D27.f[DIR_M0M  ])[kbw  ];
-      //real f27_TW   = (D27.f[DIR_P0M  ])[kbe  ];
-      //real f27_BE   = (D27.f[DIR_M0P  ])[ktw  ];
-      //real f27_BS   = (D27.f[DIR_0PP  ])[ktn  ];
-      //real f27_TN   = (D27.f[DIR_0MM  ])[kbs  ];
-      //real f27_TS   = (D27.f[DIR_0PM  ])[kbn  ];
-      //real f27_BN   = (D27.f[DIR_0MP  ])[kts  ];
+      //real f27_W    = (D27.f[DIR_P00])[ke   ];
+      //real f27_E    = (D27.f[DIR_M00])[kw   ];
+      //real f27_S    = (D27.f[DIR_0P0])[kn   ];
+      //real f27_N    = (D27.f[DIR_0M0])[ks   ];
+      //real f27_B    = (D27.f[DIR_00P])[kt   ];
+      //real f27_T    = (D27.f[DIR_00M])[kb   ];
+      //real f27_SW   = (D27.f[DIR_PP0])[kne  ];
+      //real f27_NE   = (D27.f[DIR_MM0])[ksw  ];
+      //real f27_NW   = (D27.f[DIR_PM0])[kse  ];
+      //real f27_SE   = (D27.f[DIR_MP0])[knw  ];
+      //real f27_BW   = (D27.f[DIR_P0P])[kte  ];
+      //real f27_TE   = (D27.f[DIR_M0M])[kbw  ];
+      //real f27_TW   = (D27.f[DIR_P0M])[kbe  ];
+      //real f27_BE   = (D27.f[DIR_M0P])[ktw  ];
+      //real f27_BS   = (D27.f[DIR_0PP])[ktn  ];
+      //real f27_TN   = (D27.f[DIR_0MM])[kbs  ];
+      //real f27_TS   = (D27.f[DIR_0PM])[kbn  ];
+      //real f27_BN   = (D27.f[DIR_0MP])[kts  ];
       //real f27_ZERO = (D27.f[DIR_000])[kzero];
-      //real f27_BSW  = (D27.f[DIR_PPP ])[ktne ];
-      //real f27_BNE  = (D27.f[DIR_MMP ])[ktsw ];
-      //real f27_BNW  = (D27.f[DIR_PMP ])[ktse ];
-      //real f27_BSE  = (D27.f[DIR_MPP ])[ktnw ];
-      //real f27_TSW  = (D27.f[DIR_PPM ])[kbne ];
-      //real f27_TNE  = (D27.f[DIR_MMM ])[kbsw ];
-      //real f27_TNW  = (D27.f[DIR_PMM ])[kbse ];
-      //real f27_TSE  = (D27.f[DIR_MPM ])[kbnw ];
+      //real f27_BSW  = (D27.f[DIR_PPP])[ktne ];
+      //real f27_BNE  = (D27.f[DIR_MMP])[ktsw ];
+      //real f27_BNW  = (D27.f[DIR_PMP])[ktse ];
+      //real f27_BSE  = (D27.f[DIR_MPP])[ktnw ];
+      //real f27_TSW  = (D27.f[DIR_PPM])[kbne ];
+      //real f27_TNE  = (D27.f[DIR_MMM])[kbsw ];
+      //real f27_TNW  = (D27.f[DIR_PMM])[kbse ];
+      //real f27_TSE  = (D27.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       ////////////////////////////////////////////////////////////////////////////////
@@ -6581,63 +6581,63 @@ __global__ void QADPressIncomp27(
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+         D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-         D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-         D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-         D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-         D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-         D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-         D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-         D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-         D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-         D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-         D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-         D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-         D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-         D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-         D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-         D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-         D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-         D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-         D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-         D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-         D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-         D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
-         D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-         D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-         D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-         D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-         D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
+         D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+         D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+         D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+         D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+         D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+         D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+         D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+         D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+         D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+         D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+         D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+         D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+         D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+         D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+         D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+         D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+         D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+         D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+         D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+         D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+         D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+         D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
+         D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+         D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+         D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+         D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+         D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -6645,24 +6645,24 @@ __global__ void QADPressIncomp27(
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real q;
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00  ])[kw  ]= -feqW27_W  + c2o1 * c2o27  * TempD;
-      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00  ])[ke  ]= -feqW27_E  + c2o1 * c2o27  * TempD;
-      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0  ])[ks  ]= -feqW27_S  + c2o1 * c2o27  * TempD;
-      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0  ])[kn  ]= -feqW27_N  + c2o1 * c2o27  * TempD;
-      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M  ])[kb  ]= -feqW27_B  + c2o1 * c2o27  * TempD;
-      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P  ])[kt  ]= -feqW27_T  + c2o1 * c2o27  * TempD;
-      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0 ])[ksw ]= -feqW27_SW + c2o1 * c1o54  * TempD;
-      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0 ])[kne ]= -feqW27_NE + c2o1 * c1o54  * TempD;
-      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0 ])[knw ]= -feqW27_NW + c2o1 * c1o54  * TempD;
-      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0 ])[kse ]= -feqW27_SE + c2o1 * c1o54  * TempD;
-      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M ])[kbw ]= -feqW27_BW + c2o1 * c1o54  * TempD;
-      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P ])[kte ]= -feqW27_TE + c2o1 * c1o54  * TempD;
-      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P ])[ktw ]= -feqW27_TW + c2o1 * c1o54  * TempD;
-      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M ])[kbe ]= -feqW27_BE + c2o1 * c1o54  * TempD;
-      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM ])[kbs ]= -feqW27_BS + c2o1 * c1o54  * TempD;
-      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP ])[ktn ]= -feqW27_TN + c2o1 * c1o54  * TempD;
-      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP ])[kts ]= -feqW27_TS + c2o1 * c1o54  * TempD;
-      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM ])[kbn ]= -feqW27_BN + c2o1 * c1o54  * TempD;
+      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M00])[kw  ]= -feqW27_W  + c2o1 * c2o27  * TempD;
+      q = q_dirW[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P00])[ke  ]= -feqW27_E  + c2o1 * c2o27  * TempD;
+      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0M0])[ks  ]= -feqW27_S  + c2o1 * c2o27  * TempD;
+      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0P0])[kn  ]= -feqW27_N  + c2o1 * c2o27  * TempD;
+      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00M])[kb  ]= -feqW27_B  + c2o1 * c2o27  * TempD;
+      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1) (D27.f[DIR_00P])[kt  ]= -feqW27_T  + c2o1 * c2o27  * TempD;
+      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MM0])[ksw ]= -feqW27_SW + c2o1 * c1o54  * TempD;
+      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PP0])[kne ]= -feqW27_NE + c2o1 * c1o54  * TempD;
+      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MP0])[knw ]= -feqW27_NW + c2o1 * c1o54  * TempD;
+      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PM0])[kse ]= -feqW27_SE + c2o1 * c1o54  * TempD;
+      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0M])[kbw ]= -feqW27_BW + c2o1 * c1o54  * TempD;
+      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0P])[kte ]= -feqW27_TE + c2o1 * c1o54  * TempD;
+      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_M0P])[ktw ]= -feqW27_TW + c2o1 * c1o54  * TempD;
+      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_P0M])[kbe ]= -feqW27_BE + c2o1 * c1o54  * TempD;
+      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MM])[kbs ]= -feqW27_BS + c2o1 * c1o54  * TempD;
+      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PP])[ktn ]= -feqW27_TN + c2o1 * c1o54  * TempD;
+      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0MP])[kts ]= -feqW27_TS + c2o1 * c1o54  * TempD;
+      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1) (D27.f[DIR_0PM])[kbn ]= -feqW27_BN + c2o1 * c1o54  * TempD;
       q = q_dirTNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMM])[kbsw]= -feqW27_BSW+ c2o1 * c1o216 * TempD;
       q = q_dirBSW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PPP])[ktne]= -feqW27_TNE+ c2o1 * c1o216 * TempD;
       q = q_dirBNE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MMP])[ktsw]= -feqW27_TSW+ c2o1 * c1o216 * TempD;
@@ -6671,24 +6671,24 @@ __global__ void QADPressIncomp27(
       q = q_dirBNW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PMP])[ktse]= -feqW27_TSE+ c2o1 * c1o216 * TempD;
       q = q_dirBSE[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_MPP])[ktnw]= -feqW27_TNW+ c2o1 * c1o216 * TempD;
       q = q_dirTNW[k]; if (q>=c0o1 && q<=c1o1) (D27.f[DIR_PMM])[kbse]= -feqW27_BSE+ c2o1 * c1o216 * TempD;
-      //q = q_dirE[k];   if (q>=zero && q<=one) (D27.f[DIR_M00  ])[kw  ]=(two*feqW27_W  -(f27_E  *(q*omegaD-one)-omegaD*feq27_E  *(q-one))/(omegaD-one)+f27_W  *q)/(q+one);
-      //q = q_dirW[k];   if (q>=zero && q<=one) (D27.f[DIR_P00  ])[ke  ]=(two*feqW27_E  -(f27_W  *(q*omegaD-one)-omegaD*feq27_W  *(q-one))/(omegaD-one)+f27_E  *q)/(q+one);
-      //q = q_dirN[k];   if (q>=zero && q<=one) (D27.f[DIR_0M0  ])[ks  ]=(two*feqW27_S  -(f27_N  *(q*omegaD-one)-omegaD*feq27_N  *(q-one))/(omegaD-one)+f27_S  *q)/(q+one);
-      //q = q_dirS[k];   if (q>=zero && q<=one) (D27.f[DIR_0P0  ])[kn  ]=(two*feqW27_N  -(f27_S  *(q*omegaD-one)-omegaD*feq27_S  *(q-one))/(omegaD-one)+f27_N  *q)/(q+one);
-      //q = q_dirT[k];   if (q>=zero && q<=one) (D27.f[DIR_00M  ])[kb  ]=(two*feqW27_B  -(f27_T  *(q*omegaD-one)-omegaD*feq27_T  *(q-one))/(omegaD-one)+f27_B  *q)/(q+one);
-      //q = q_dirB[k];   if (q>=zero && q<=one) (D27.f[DIR_00P  ])[kt  ]=(two*feqW27_T  -(f27_B  *(q*omegaD-one)-omegaD*feq27_B  *(q-one))/(omegaD-one)+f27_T  *q)/(q+one);
-      //q = q_dirNE[k];  if (q>=zero && q<=one) (D27.f[DIR_MM0 ])[ksw ]=(two*feqW27_SW -(f27_NE *(q*omegaD-one)-omegaD*feq27_NE *(q-one))/(omegaD-one)+f27_SW *q)/(q+one);
-      //q = q_dirSW[k];  if (q>=zero && q<=one) (D27.f[DIR_PP0 ])[kne ]=(two*feqW27_NE -(f27_SW *(q*omegaD-one)-omegaD*feq27_SW *(q-one))/(omegaD-one)+f27_NE *q)/(q+one);
-      //q = q_dirSE[k];  if (q>=zero && q<=one) (D27.f[DIR_MP0 ])[knw ]=(two*feqW27_NW -(f27_SE *(q*omegaD-one)-omegaD*feq27_SE *(q-one))/(omegaD-one)+f27_NW *q)/(q+one);
-      //q = q_dirNW[k];  if (q>=zero && q<=one) (D27.f[DIR_PM0 ])[kse ]=(two*feqW27_SE -(f27_NW *(q*omegaD-one)-omegaD*feq27_NW *(q-one))/(omegaD-one)+f27_SE *q)/(q+one);
-      //q = q_dirTE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0M ])[kbw ]=(two*feqW27_BW -(f27_TE *(q*omegaD-one)-omegaD*feq27_TE *(q-one))/(omegaD-one)+f27_BW *q)/(q+one);
-      //q = q_dirBW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0P ])[kte ]=(two*feqW27_TE -(f27_BW *(q*omegaD-one)-omegaD*feq27_BW *(q-one))/(omegaD-one)+f27_TE *q)/(q+one);
-      //q = q_dirBE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0P ])[ktw ]=(two*feqW27_TW -(f27_BE *(q*omegaD-one)-omegaD*feq27_BE *(q-one))/(omegaD-one)+f27_TW *q)/(q+one);
-      //q = q_dirTW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0M ])[kbe ]=(two*feqW27_BE -(f27_TW *(q*omegaD-one)-omegaD*feq27_TW *(q-one))/(omegaD-one)+f27_BE *q)/(q+one);
-      //q = q_dirTN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MM ])[kbs ]=(two*feqW27_BS -(f27_TN *(q*omegaD-one)-omegaD*feq27_TN *(q-one))/(omegaD-one)+f27_BS *q)/(q+one);
-      //q = q_dirBS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PP ])[ktn ]=(two*feqW27_TN -(f27_BS *(q*omegaD-one)-omegaD*feq27_BS *(q-one))/(omegaD-one)+f27_TN *q)/(q+one);
-      //q = q_dirBN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MP ])[kts ]=(two*feqW27_TS -(f27_BN *(q*omegaD-one)-omegaD*feq27_BN *(q-one))/(omegaD-one)+f27_TS *q)/(q+one);
-      //q = q_dirTS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PM ])[kbn ]=(two*feqW27_BN -(f27_TS *(q*omegaD-one)-omegaD*feq27_TS *(q-one))/(omegaD-one)+f27_BN *q)/(q+one);
+      //q = q_dirE[k];   if (q>=zero && q<=one) (D27.f[DIR_M00])[kw  ]=(two*feqW27_W  -(f27_E  *(q*omegaD-one)-omegaD*feq27_E  *(q-one))/(omegaD-one)+f27_W  *q)/(q+one);
+      //q = q_dirW[k];   if (q>=zero && q<=one) (D27.f[DIR_P00])[ke  ]=(two*feqW27_E  -(f27_W  *(q*omegaD-one)-omegaD*feq27_W  *(q-one))/(omegaD-one)+f27_E  *q)/(q+one);
+      //q = q_dirN[k];   if (q>=zero && q<=one) (D27.f[DIR_0M0])[ks  ]=(two*feqW27_S  -(f27_N  *(q*omegaD-one)-omegaD*feq27_N  *(q-one))/(omegaD-one)+f27_S  *q)/(q+one);
+      //q = q_dirS[k];   if (q>=zero && q<=one) (D27.f[DIR_0P0])[kn  ]=(two*feqW27_N  -(f27_S  *(q*omegaD-one)-omegaD*feq27_S  *(q-one))/(omegaD-one)+f27_N  *q)/(q+one);
+      //q = q_dirT[k];   if (q>=zero && q<=one) (D27.f[DIR_00M])[kb  ]=(two*feqW27_B  -(f27_T  *(q*omegaD-one)-omegaD*feq27_T  *(q-one))/(omegaD-one)+f27_B  *q)/(q+one);
+      //q = q_dirB[k];   if (q>=zero && q<=one) (D27.f[DIR_00P])[kt  ]=(two*feqW27_T  -(f27_B  *(q*omegaD-one)-omegaD*feq27_B  *(q-one))/(omegaD-one)+f27_T  *q)/(q+one);
+      //q = q_dirNE[k];  if (q>=zero && q<=one) (D27.f[DIR_MM0])[ksw ]=(two*feqW27_SW -(f27_NE *(q*omegaD-one)-omegaD*feq27_NE *(q-one))/(omegaD-one)+f27_SW *q)/(q+one);
+      //q = q_dirSW[k];  if (q>=zero && q<=one) (D27.f[DIR_PP0])[kne ]=(two*feqW27_NE -(f27_SW *(q*omegaD-one)-omegaD*feq27_SW *(q-one))/(omegaD-one)+f27_NE *q)/(q+one);
+      //q = q_dirSE[k];  if (q>=zero && q<=one) (D27.f[DIR_MP0])[knw ]=(two*feqW27_NW -(f27_SE *(q*omegaD-one)-omegaD*feq27_SE *(q-one))/(omegaD-one)+f27_NW *q)/(q+one);
+      //q = q_dirNW[k];  if (q>=zero && q<=one) (D27.f[DIR_PM0])[kse ]=(two*feqW27_SE -(f27_NW *(q*omegaD-one)-omegaD*feq27_NW *(q-one))/(omegaD-one)+f27_SE *q)/(q+one);
+      //q = q_dirTE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0M])[kbw ]=(two*feqW27_BW -(f27_TE *(q*omegaD-one)-omegaD*feq27_TE *(q-one))/(omegaD-one)+f27_BW *q)/(q+one);
+      //q = q_dirBW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0P])[kte ]=(two*feqW27_TE -(f27_BW *(q*omegaD-one)-omegaD*feq27_BW *(q-one))/(omegaD-one)+f27_TE *q)/(q+one);
+      //q = q_dirBE[k];  if (q>=zero && q<=one) (D27.f[DIR_M0P])[ktw ]=(two*feqW27_TW -(f27_BE *(q*omegaD-one)-omegaD*feq27_BE *(q-one))/(omegaD-one)+f27_TW *q)/(q+one);
+      //q = q_dirTW[k];  if (q>=zero && q<=one) (D27.f[DIR_P0M])[kbe ]=(two*feqW27_BE -(f27_TW *(q*omegaD-one)-omegaD*feq27_TW *(q-one))/(omegaD-one)+f27_BE *q)/(q+one);
+      //q = q_dirTN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MM])[kbs ]=(two*feqW27_BS -(f27_TN *(q*omegaD-one)-omegaD*feq27_TN *(q-one))/(omegaD-one)+f27_BS *q)/(q+one);
+      //q = q_dirBS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PP])[ktn ]=(two*feqW27_TN -(f27_BS *(q*omegaD-one)-omegaD*feq27_BS *(q-one))/(omegaD-one)+f27_TN *q)/(q+one);
+      //q = q_dirBN[k];  if (q>=zero && q<=one) (D27.f[DIR_0MP])[kts ]=(two*feqW27_TS -(f27_BN *(q*omegaD-one)-omegaD*feq27_BN *(q-one))/(omegaD-one)+f27_TS *q)/(q+one);
+      //q = q_dirTS[k];  if (q>=zero && q<=one) (D27.f[DIR_0PM])[kbn ]=(two*feqW27_BN -(f27_TS *(q*omegaD-one)-omegaD*feq27_TS *(q-one))/(omegaD-one)+f27_BN *q)/(q+one);
       //q = q_dirTNE[k]; if (q>=zero && q<=one) (D27.f[DIR_MMM])[kbsw]=(two*feqW27_BSW-(f27_TNE*(q*omegaD-one)-omegaD*feq27_TNE*(q-one))/(omegaD-one)+f27_BSW*q)/(q+one);
       //q = q_dirBSW[k]; if (q>=zero && q<=one) (D27.f[DIR_PPP])[ktne]=(two*feqW27_TNE-(f27_BSW*(q*omegaD-one)-omegaD*feq27_BSW*(q-one))/(omegaD-one)+f27_TNE*q)/(q+one);
       //q = q_dirBNE[k]; if (q>=zero && q<=one) (D27.f[DIR_MMP])[ktsw]=(two*feqW27_TSW-(f27_BNE*(q*omegaD-one)-omegaD*feq27_BNE*(q-one))/(omegaD-one)+f27_TSW*q)/(q+one);
@@ -6739,131 +6739,131 @@ __global__ void AD_SlipVelDeviceComp(
     uint* neighborX,
     uint* neighborY,
     uint* neighborZ,
-    uint size_Mat,
+    unsigned long long numberOfLBnodes,
     bool isEvenTimestep)
 {
     Distributions27 D;
     if (isEvenTimestep)
     {
-        D.f[DIR_P00   ] = &distributions[DIR_P00    * size_Mat];
-        D.f[DIR_M00   ] = &distributions[DIR_M00    * size_Mat];
-        D.f[DIR_0P0   ] = &distributions[DIR_0P0    * size_Mat];
-        D.f[DIR_0M0   ] = &distributions[DIR_0M0    * size_Mat];
-        D.f[DIR_00P   ] = &distributions[DIR_00P    * size_Mat];
-        D.f[DIR_00M   ] = &distributions[DIR_00M    * size_Mat];
-        D.f[DIR_PP0  ] = &distributions[DIR_PP0   * size_Mat];
-        D.f[DIR_MM0  ] = &distributions[DIR_MM0   * size_Mat];
-        D.f[DIR_PM0  ] = &distributions[DIR_PM0   * size_Mat];
-        D.f[DIR_MP0  ] = &distributions[DIR_MP0   * size_Mat];
-        D.f[DIR_P0P  ] = &distributions[DIR_P0P   * size_Mat];
-        D.f[DIR_M0M  ] = &distributions[DIR_M0M   * size_Mat];
-        D.f[DIR_P0M  ] = &distributions[DIR_P0M   * size_Mat];
-        D.f[DIR_M0P  ] = &distributions[DIR_M0P   * size_Mat];
-        D.f[DIR_0PP  ] = &distributions[DIR_0PP   * size_Mat];
-        D.f[DIR_0MM  ] = &distributions[DIR_0MM   * size_Mat];
-        D.f[DIR_0PM  ] = &distributions[DIR_0PM   * size_Mat];
-        D.f[DIR_0MP  ] = &distributions[DIR_0MP   * size_Mat];
-        D.f[DIR_000] = &distributions[DIR_000 * size_Mat];
-        D.f[DIR_PPP ] = &distributions[DIR_PPP  * size_Mat];
-        D.f[DIR_MMP ] = &distributions[DIR_MMP  * size_Mat];
-        D.f[DIR_PMP ] = &distributions[DIR_PMP  * size_Mat];
-        D.f[DIR_MPP ] = &distributions[DIR_MPP  * size_Mat];
-        D.f[DIR_PPM ] = &distributions[DIR_PPM  * size_Mat];
-        D.f[DIR_MMM ] = &distributions[DIR_MMM  * size_Mat];
-        D.f[DIR_PMM ] = &distributions[DIR_PMM  * size_Mat];
-        D.f[DIR_MPM ] = &distributions[DIR_MPM  * size_Mat];
+        D.f[DIR_P00] = &distributions[DIR_P00 * numberOfLBnodes];
+        D.f[DIR_M00] = &distributions[DIR_M00 * numberOfLBnodes];
+        D.f[DIR_0P0] = &distributions[DIR_0P0 * numberOfLBnodes];
+        D.f[DIR_0M0] = &distributions[DIR_0M0 * numberOfLBnodes];
+        D.f[DIR_00P] = &distributions[DIR_00P * numberOfLBnodes];
+        D.f[DIR_00M] = &distributions[DIR_00M * numberOfLBnodes];
+        D.f[DIR_PP0] = &distributions[DIR_PP0 * numberOfLBnodes];
+        D.f[DIR_MM0] = &distributions[DIR_MM0 * numberOfLBnodes];
+        D.f[DIR_PM0] = &distributions[DIR_PM0 * numberOfLBnodes];
+        D.f[DIR_MP0] = &distributions[DIR_MP0 * numberOfLBnodes];
+        D.f[DIR_P0P] = &distributions[DIR_P0P * numberOfLBnodes];
+        D.f[DIR_M0M] = &distributions[DIR_M0M * numberOfLBnodes];
+        D.f[DIR_P0M] = &distributions[DIR_P0M * numberOfLBnodes];
+        D.f[DIR_M0P] = &distributions[DIR_M0P * numberOfLBnodes];
+        D.f[DIR_0PP] = &distributions[DIR_0PP * numberOfLBnodes];
+        D.f[DIR_0MM] = &distributions[DIR_0MM * numberOfLBnodes];
+        D.f[DIR_0PM] = &distributions[DIR_0PM * numberOfLBnodes];
+        D.f[DIR_0MP] = &distributions[DIR_0MP * numberOfLBnodes];
+        D.f[DIR_000] = &distributions[DIR_000 * numberOfLBnodes];
+        D.f[DIR_PPP] = &distributions[DIR_PPP * numberOfLBnodes];
+        D.f[DIR_MMP] = &distributions[DIR_MMP * numberOfLBnodes];
+        D.f[DIR_PMP] = &distributions[DIR_PMP * numberOfLBnodes];
+        D.f[DIR_MPP] = &distributions[DIR_MPP * numberOfLBnodes];
+        D.f[DIR_PPM] = &distributions[DIR_PPM * numberOfLBnodes];
+        D.f[DIR_MMM] = &distributions[DIR_MMM * numberOfLBnodes];
+        D.f[DIR_PMM] = &distributions[DIR_PMM * numberOfLBnodes];
+        D.f[DIR_MPM] = &distributions[DIR_MPM * numberOfLBnodes];
     }
     else
     {
-        D.f[DIR_M00   ] = &distributions[DIR_P00    * size_Mat];
-        D.f[DIR_P00   ] = &distributions[DIR_M00    * size_Mat];
-        D.f[DIR_0M0   ] = &distributions[DIR_0P0    * size_Mat];
-        D.f[DIR_0P0   ] = &distributions[DIR_0M0    * size_Mat];
-        D.f[DIR_00M   ] = &distributions[DIR_00P    * size_Mat];
-        D.f[DIR_00P   ] = &distributions[DIR_00M    * size_Mat];
-        D.f[DIR_MM0  ] = &distributions[DIR_PP0   * size_Mat];
-        D.f[DIR_PP0  ] = &distributions[DIR_MM0   * size_Mat];
-        D.f[DIR_MP0  ] = &distributions[DIR_PM0   * size_Mat];
-        D.f[DIR_PM0  ] = &distributions[DIR_MP0   * size_Mat];
-        D.f[DIR_M0M  ] = &distributions[DIR_P0P   * size_Mat];
-        D.f[DIR_P0P  ] = &distributions[DIR_M0M   * size_Mat];
-        D.f[DIR_M0P  ] = &distributions[DIR_P0M   * size_Mat];
-        D.f[DIR_P0M  ] = &distributions[DIR_M0P   * size_Mat];
-        D.f[DIR_0MM  ] = &distributions[DIR_0PP   * size_Mat];
-        D.f[DIR_0PP  ] = &distributions[DIR_0MM   * size_Mat];
-        D.f[DIR_0MP  ] = &distributions[DIR_0PM   * size_Mat];
-        D.f[DIR_0PM  ] = &distributions[DIR_0MP   * size_Mat];
-        D.f[DIR_000] = &distributions[DIR_000 * size_Mat];
-        D.f[DIR_PPP ] = &distributions[DIR_MMM  * size_Mat];
-        D.f[DIR_MMP ] = &distributions[DIR_PPM  * size_Mat];
-        D.f[DIR_PMP ] = &distributions[DIR_MPM  * size_Mat];
-        D.f[DIR_MPP ] = &distributions[DIR_PMM  * size_Mat];
-        D.f[DIR_PPM ] = &distributions[DIR_MMP  * size_Mat];
-        D.f[DIR_MMM ] = &distributions[DIR_PPP  * size_Mat];
-        D.f[DIR_PMM ] = &distributions[DIR_MPP  * size_Mat];
-        D.f[DIR_MPM ] = &distributions[DIR_PMP  * size_Mat];
+        D.f[DIR_M00] = &distributions[DIR_P00 * numberOfLBnodes];
+        D.f[DIR_P00] = &distributions[DIR_M00 * numberOfLBnodes];
+        D.f[DIR_0M0] = &distributions[DIR_0P0 * numberOfLBnodes];
+        D.f[DIR_0P0] = &distributions[DIR_0M0 * numberOfLBnodes];
+        D.f[DIR_00M] = &distributions[DIR_00P * numberOfLBnodes];
+        D.f[DIR_00P] = &distributions[DIR_00M * numberOfLBnodes];
+        D.f[DIR_MM0] = &distributions[DIR_PP0 * numberOfLBnodes];
+        D.f[DIR_PP0] = &distributions[DIR_MM0 * numberOfLBnodes];
+        D.f[DIR_MP0] = &distributions[DIR_PM0 * numberOfLBnodes];
+        D.f[DIR_PM0] = &distributions[DIR_MP0 * numberOfLBnodes];
+        D.f[DIR_M0M] = &distributions[DIR_P0P * numberOfLBnodes];
+        D.f[DIR_P0P] = &distributions[DIR_M0M * numberOfLBnodes];
+        D.f[DIR_M0P] = &distributions[DIR_P0M * numberOfLBnodes];
+        D.f[DIR_P0M] = &distributions[DIR_M0P * numberOfLBnodes];
+        D.f[DIR_0MM] = &distributions[DIR_0PP * numberOfLBnodes];
+        D.f[DIR_0PP] = &distributions[DIR_0MM * numberOfLBnodes];
+        D.f[DIR_0MP] = &distributions[DIR_0PM * numberOfLBnodes];
+        D.f[DIR_0PM] = &distributions[DIR_0MP * numberOfLBnodes];
+        D.f[DIR_000] = &distributions[DIR_000 * numberOfLBnodes];
+        D.f[DIR_PPP] = &distributions[DIR_MMM * numberOfLBnodes];
+        D.f[DIR_MMP] = &distributions[DIR_PPM * numberOfLBnodes];
+        D.f[DIR_PMP] = &distributions[DIR_MPM * numberOfLBnodes];
+        D.f[DIR_MPP] = &distributions[DIR_PMM * numberOfLBnodes];
+        D.f[DIR_PPM] = &distributions[DIR_MMP * numberOfLBnodes];
+        D.f[DIR_MMM] = &distributions[DIR_PPP * numberOfLBnodes];
+        D.f[DIR_PMM] = &distributions[DIR_MPP * numberOfLBnodes];
+        D.f[DIR_MPM] = &distributions[DIR_PMP * numberOfLBnodes];
     }
     ////////////////////////////////////////////////////////////////////////////////
     Distributions27 DAD;
     if (isEvenTimestep)
     {
-        DAD.f[DIR_P00   ] = &distributionsAD[DIR_P00    * size_Mat];
-        DAD.f[DIR_M00   ] = &distributionsAD[DIR_M00    * size_Mat];
-        DAD.f[DIR_0P0   ] = &distributionsAD[DIR_0P0    * size_Mat];
-        DAD.f[DIR_0M0   ] = &distributionsAD[DIR_0M0    * size_Mat];
-        DAD.f[DIR_00P   ] = &distributionsAD[DIR_00P    * size_Mat];
-        DAD.f[DIR_00M   ] = &distributionsAD[DIR_00M    * size_Mat];
-        DAD.f[DIR_PP0  ] = &distributionsAD[DIR_PP0   * size_Mat];
-        DAD.f[DIR_MM0  ] = &distributionsAD[DIR_MM0   * size_Mat];
-        DAD.f[DIR_PM0  ] = &distributionsAD[DIR_PM0   * size_Mat];
-        DAD.f[DIR_MP0  ] = &distributionsAD[DIR_MP0   * size_Mat];
-        DAD.f[DIR_P0P  ] = &distributionsAD[DIR_P0P   * size_Mat];
-        DAD.f[DIR_M0M  ] = &distributionsAD[DIR_M0M   * size_Mat];
-        DAD.f[DIR_P0M  ] = &distributionsAD[DIR_P0M   * size_Mat];
-        DAD.f[DIR_M0P  ] = &distributionsAD[DIR_M0P   * size_Mat];
-        DAD.f[DIR_0PP  ] = &distributionsAD[DIR_0PP   * size_Mat];
-        DAD.f[DIR_0MM  ] = &distributionsAD[DIR_0MM   * size_Mat];
-        DAD.f[DIR_0PM  ] = &distributionsAD[DIR_0PM   * size_Mat];
-        DAD.f[DIR_0MP  ] = &distributionsAD[DIR_0MP   * size_Mat];
-        DAD.f[DIR_000] = &distributionsAD[DIR_000 * size_Mat];
-        DAD.f[DIR_PPP ] = &distributionsAD[DIR_PPP  * size_Mat];
-        DAD.f[DIR_MMP ] = &distributionsAD[DIR_MMP  * size_Mat];
-        DAD.f[DIR_PMP ] = &distributionsAD[DIR_PMP  * size_Mat];
-        DAD.f[DIR_MPP ] = &distributionsAD[DIR_MPP  * size_Mat];
-        DAD.f[DIR_PPM ] = &distributionsAD[DIR_PPM  * size_Mat];
-        DAD.f[DIR_MMM ] = &distributionsAD[DIR_MMM  * size_Mat];
-        DAD.f[DIR_PMM ] = &distributionsAD[DIR_PMM  * size_Mat];
-        DAD.f[DIR_MPM ] = &distributionsAD[DIR_MPM  * size_Mat];
+        DAD.f[DIR_P00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+        DAD.f[DIR_M00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+        DAD.f[DIR_0P0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+        DAD.f[DIR_0M0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+        DAD.f[DIR_00P] = &distributionsAD[DIR_00P * numberOfLBnodes];
+        DAD.f[DIR_00M] = &distributionsAD[DIR_00M * numberOfLBnodes];
+        DAD.f[DIR_PP0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+        DAD.f[DIR_MM0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+        DAD.f[DIR_PM0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+        DAD.f[DIR_MP0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+        DAD.f[DIR_P0P] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+        DAD.f[DIR_M0M] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+        DAD.f[DIR_P0M] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+        DAD.f[DIR_M0P] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+        DAD.f[DIR_0PP] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+        DAD.f[DIR_0MM] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+        DAD.f[DIR_0PM] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+        DAD.f[DIR_0MP] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+        DAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+        DAD.f[DIR_PPP] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+        DAD.f[DIR_MMP] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+        DAD.f[DIR_PMP] = &distributionsAD[DIR_PMP * numberOfLBnodes];
+        DAD.f[DIR_MPP] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+        DAD.f[DIR_PPM] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+        DAD.f[DIR_MMM] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+        DAD.f[DIR_PMM] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+        DAD.f[DIR_MPM] = &distributionsAD[DIR_MPM * numberOfLBnodes];
     }
     else
     {
-        DAD.f[DIR_M00   ] = &distributionsAD[DIR_P00    * size_Mat];
-        DAD.f[DIR_P00   ] = &distributionsAD[DIR_M00    * size_Mat];
-        DAD.f[DIR_0M0   ] = &distributionsAD[DIR_0P0    * size_Mat];
-        DAD.f[DIR_0P0   ] = &distributionsAD[DIR_0M0    * size_Mat];
-        DAD.f[DIR_00M   ] = &distributionsAD[DIR_00P    * size_Mat];
-        DAD.f[DIR_00P   ] = &distributionsAD[DIR_00M    * size_Mat];
-        DAD.f[DIR_MM0  ] = &distributionsAD[DIR_PP0   * size_Mat];
-        DAD.f[DIR_PP0  ] = &distributionsAD[DIR_MM0   * size_Mat];
-        DAD.f[DIR_MP0  ] = &distributionsAD[DIR_PM0   * size_Mat];
-        DAD.f[DIR_PM0  ] = &distributionsAD[DIR_MP0   * size_Mat];
-        DAD.f[DIR_M0M  ] = &distributionsAD[DIR_P0P   * size_Mat];
-        DAD.f[DIR_P0P  ] = &distributionsAD[DIR_M0M   * size_Mat];
-        DAD.f[DIR_M0P  ] = &distributionsAD[DIR_P0M   * size_Mat];
-        DAD.f[DIR_P0M  ] = &distributionsAD[DIR_M0P   * size_Mat];
-        DAD.f[DIR_0MM  ] = &distributionsAD[DIR_0PP   * size_Mat];
-        DAD.f[DIR_0PP  ] = &distributionsAD[DIR_0MM   * size_Mat];
-        DAD.f[DIR_0MP  ] = &distributionsAD[DIR_0PM   * size_Mat];
-        DAD.f[DIR_0PM  ] = &distributionsAD[DIR_0MP   * size_Mat];
-        DAD.f[DIR_000] = &distributionsAD[DIR_000 * size_Mat];
-        DAD.f[DIR_PPP ] = &distributionsAD[DIR_MMM  * size_Mat];
-        DAD.f[DIR_MMP ] = &distributionsAD[DIR_PPM  * size_Mat];
-        DAD.f[DIR_PMP ] = &distributionsAD[DIR_MPM  * size_Mat];
-        DAD.f[DIR_MPP ] = &distributionsAD[DIR_PMM  * size_Mat];
-        DAD.f[DIR_PPM ] = &distributionsAD[DIR_MMP  * size_Mat];
-        DAD.f[DIR_MMM ] = &distributionsAD[DIR_PPP  * size_Mat];
-        DAD.f[DIR_PMM ] = &distributionsAD[DIR_MPP  * size_Mat];
-        DAD.f[DIR_MPM ] = &distributionsAD[DIR_PMP  * size_Mat];
+        DAD.f[DIR_M00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+        DAD.f[DIR_P00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+        DAD.f[DIR_0M0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+        DAD.f[DIR_0P0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+        DAD.f[DIR_00M] = &distributionsAD[DIR_00P * numberOfLBnodes];
+        DAD.f[DIR_00P] = &distributionsAD[DIR_00M * numberOfLBnodes];
+        DAD.f[DIR_MM0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+        DAD.f[DIR_PP0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+        DAD.f[DIR_MP0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+        DAD.f[DIR_PM0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+        DAD.f[DIR_M0M] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+        DAD.f[DIR_P0P] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+        DAD.f[DIR_M0P] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+        DAD.f[DIR_P0M] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+        DAD.f[DIR_0MM] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+        DAD.f[DIR_0PP] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+        DAD.f[DIR_0MP] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+        DAD.f[DIR_0PM] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+        DAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+        DAD.f[DIR_PPP] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+        DAD.f[DIR_MMP] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+        DAD.f[DIR_PMP] = &distributionsAD[DIR_MPM * numberOfLBnodes];
+        DAD.f[DIR_MPP] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+        DAD.f[DIR_PPM] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+        DAD.f[DIR_MMM] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+        DAD.f[DIR_PMM] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+        DAD.f[DIR_MPM] = &distributionsAD[DIR_PMP * numberOfLBnodes];
     }
     ////////////////////////////////////////////////////////////////////////////////
     const unsigned  x = threadIdx.x;  // Globaler x-Index
@@ -6888,24 +6888,24 @@ __global__ void AD_SlipVelDeviceComp(
             * 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   = &Qarrays[DIR_P00   * numberOfBCnodes];
-        q_dirW   = &Qarrays[DIR_M00   * numberOfBCnodes];
-        q_dirN   = &Qarrays[DIR_0P0   * numberOfBCnodes];
-        q_dirS   = &Qarrays[DIR_0M0   * numberOfBCnodes];
-        q_dirT   = &Qarrays[DIR_00P   * numberOfBCnodes];
-        q_dirB   = &Qarrays[DIR_00M   * numberOfBCnodes];
-        q_dirNE  = &Qarrays[DIR_PP0  * numberOfBCnodes];
-        q_dirSW  = &Qarrays[DIR_MM0  * numberOfBCnodes];
-        q_dirSE  = &Qarrays[DIR_PM0  * numberOfBCnodes];
-        q_dirNW  = &Qarrays[DIR_MP0  * numberOfBCnodes];
-        q_dirTE  = &Qarrays[DIR_P0P  * numberOfBCnodes];
-        q_dirBW  = &Qarrays[DIR_M0M  * numberOfBCnodes];
-        q_dirBE  = &Qarrays[DIR_P0M  * numberOfBCnodes];
-        q_dirTW  = &Qarrays[DIR_M0P  * numberOfBCnodes];
-        q_dirTN  = &Qarrays[DIR_0PP  * numberOfBCnodes];
-        q_dirBS  = &Qarrays[DIR_0MM  * numberOfBCnodes];
-        q_dirBN  = &Qarrays[DIR_0PM  * numberOfBCnodes];
-        q_dirTS  = &Qarrays[DIR_0MP  * numberOfBCnodes];
+        q_dirE   = &Qarrays[DIR_P00 * numberOfBCnodes];
+        q_dirW   = &Qarrays[DIR_M00 * numberOfBCnodes];
+        q_dirN   = &Qarrays[DIR_0P0 * numberOfBCnodes];
+        q_dirS   = &Qarrays[DIR_0M0 * numberOfBCnodes];
+        q_dirT   = &Qarrays[DIR_00P * numberOfBCnodes];
+        q_dirB   = &Qarrays[DIR_00M * numberOfBCnodes];
+        q_dirNE  = &Qarrays[DIR_PP0 * numberOfBCnodes];
+        q_dirSW  = &Qarrays[DIR_MM0 * numberOfBCnodes];
+        q_dirSE  = &Qarrays[DIR_PM0 * numberOfBCnodes];
+        q_dirNW  = &Qarrays[DIR_MP0 * numberOfBCnodes];
+        q_dirTE  = &Qarrays[DIR_P0P * numberOfBCnodes];
+        q_dirBW  = &Qarrays[DIR_M0M * numberOfBCnodes];
+        q_dirBE  = &Qarrays[DIR_P0M * numberOfBCnodes];
+        q_dirTW  = &Qarrays[DIR_M0P * numberOfBCnodes];
+        q_dirTN  = &Qarrays[DIR_0PP * numberOfBCnodes];
+        q_dirBS  = &Qarrays[DIR_0MM * numberOfBCnodes];
+        q_dirBN  = &Qarrays[DIR_0PM * numberOfBCnodes];
+        q_dirTS  = &Qarrays[DIR_0MP * numberOfBCnodes];
         q_dirTNE = &Qarrays[DIR_PPP * numberOfBCnodes];
         q_dirTSW = &Qarrays[DIR_MMP * numberOfBCnodes];
         q_dirTSE = &Qarrays[DIR_PMP * numberOfBCnodes];
@@ -7025,63 +7025,63 @@ __global__ void AD_SlipVelDeviceComp(
         //////////////////////////////////////////////////////////////////////////
         if (!isEvenTimestep)
         {
-            DAD.f[DIR_P00   ] = &distributionsAD[DIR_P00    * size_Mat];
-            DAD.f[DIR_M00   ] = &distributionsAD[DIR_M00    * size_Mat];
-            DAD.f[DIR_0P0   ] = &distributionsAD[DIR_0P0    * size_Mat];
-            DAD.f[DIR_0M0   ] = &distributionsAD[DIR_0M0    * size_Mat];
-            DAD.f[DIR_00P   ] = &distributionsAD[DIR_00P    * size_Mat];
-            DAD.f[DIR_00M   ] = &distributionsAD[DIR_00M    * size_Mat];
-            DAD.f[DIR_PP0  ] = &distributionsAD[DIR_PP0   * size_Mat];
-            DAD.f[DIR_MM0  ] = &distributionsAD[DIR_MM0   * size_Mat];
-            DAD.f[DIR_PM0  ] = &distributionsAD[DIR_PM0   * size_Mat];
-            DAD.f[DIR_MP0  ] = &distributionsAD[DIR_MP0   * size_Mat];
-            DAD.f[DIR_P0P  ] = &distributionsAD[DIR_P0P   * size_Mat];
-            DAD.f[DIR_M0M  ] = &distributionsAD[DIR_M0M   * size_Mat];
-            DAD.f[DIR_P0M  ] = &distributionsAD[DIR_P0M   * size_Mat];
-            DAD.f[DIR_M0P  ] = &distributionsAD[DIR_M0P   * size_Mat];
-            DAD.f[DIR_0PP  ] = &distributionsAD[DIR_0PP   * size_Mat];
-            DAD.f[DIR_0MM  ] = &distributionsAD[DIR_0MM   * size_Mat];
-            DAD.f[DIR_0PM  ] = &distributionsAD[DIR_0PM   * size_Mat];
-            DAD.f[DIR_0MP  ] = &distributionsAD[DIR_0MP   * size_Mat];
-            DAD.f[DIR_000] = &distributionsAD[DIR_000 * size_Mat];
-            DAD.f[DIR_PPP ] = &distributionsAD[DIR_PPP  * size_Mat];
-            DAD.f[DIR_MMP ] = &distributionsAD[DIR_MMP  * size_Mat];
-            DAD.f[DIR_PMP ] = &distributionsAD[DIR_PMP  * size_Mat];
-            DAD.f[DIR_MPP ] = &distributionsAD[DIR_MPP  * size_Mat];
-            DAD.f[DIR_PPM ] = &distributionsAD[DIR_PPM  * size_Mat];
-            DAD.f[DIR_MMM ] = &distributionsAD[DIR_MMM  * size_Mat];
-            DAD.f[DIR_PMM ] = &distributionsAD[DIR_PMM  * size_Mat];
-            DAD.f[DIR_MPM ] = &distributionsAD[DIR_MPM  * size_Mat];
+            DAD.f[DIR_P00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+            DAD.f[DIR_M00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+            DAD.f[DIR_0P0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+            DAD.f[DIR_0M0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+            DAD.f[DIR_00P] = &distributionsAD[DIR_00P * numberOfLBnodes];
+            DAD.f[DIR_00M] = &distributionsAD[DIR_00M * numberOfLBnodes];
+            DAD.f[DIR_PP0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+            DAD.f[DIR_MM0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+            DAD.f[DIR_PM0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+            DAD.f[DIR_MP0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+            DAD.f[DIR_P0P] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+            DAD.f[DIR_M0M] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+            DAD.f[DIR_P0M] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+            DAD.f[DIR_M0P] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+            DAD.f[DIR_0PP] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+            DAD.f[DIR_0MM] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+            DAD.f[DIR_0PM] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+            DAD.f[DIR_0MP] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+            DAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+            DAD.f[DIR_PPP] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+            DAD.f[DIR_MMP] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+            DAD.f[DIR_PMP] = &distributionsAD[DIR_PMP * numberOfLBnodes];
+            DAD.f[DIR_MPP] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+            DAD.f[DIR_PPM] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+            DAD.f[DIR_MMM] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+            DAD.f[DIR_PMM] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+            DAD.f[DIR_MPM] = &distributionsAD[DIR_MPM * numberOfLBnodes];
         }
         else
         {
-            DAD.f[DIR_M00   ] = &distributionsAD[DIR_P00    * size_Mat];
-            DAD.f[DIR_P00   ] = &distributionsAD[DIR_M00    * size_Mat];
-            DAD.f[DIR_0M0   ] = &distributionsAD[DIR_0P0    * size_Mat];
-            DAD.f[DIR_0P0   ] = &distributionsAD[DIR_0M0    * size_Mat];
-            DAD.f[DIR_00M   ] = &distributionsAD[DIR_00P    * size_Mat];
-            DAD.f[DIR_00P   ] = &distributionsAD[DIR_00M    * size_Mat];
-            DAD.f[DIR_MM0  ] = &distributionsAD[DIR_PP0   * size_Mat];
-            DAD.f[DIR_PP0  ] = &distributionsAD[DIR_MM0   * size_Mat];
-            DAD.f[DIR_MP0  ] = &distributionsAD[DIR_PM0   * size_Mat];
-            DAD.f[DIR_PM0  ] = &distributionsAD[DIR_MP0   * size_Mat];
-            DAD.f[DIR_M0M  ] = &distributionsAD[DIR_P0P   * size_Mat];
-            DAD.f[DIR_P0P  ] = &distributionsAD[DIR_M0M   * size_Mat];
-            DAD.f[DIR_M0P  ] = &distributionsAD[DIR_P0M   * size_Mat];
-            DAD.f[DIR_P0M  ] = &distributionsAD[DIR_M0P   * size_Mat];
-            DAD.f[DIR_0MM  ] = &distributionsAD[DIR_0PP   * size_Mat];
-            DAD.f[DIR_0PP  ] = &distributionsAD[DIR_0MM   * size_Mat];
-            DAD.f[DIR_0MP  ] = &distributionsAD[DIR_0PM   * size_Mat];
-            DAD.f[DIR_0PM  ] = &distributionsAD[DIR_0MP   * size_Mat];
-            DAD.f[DIR_000] = &distributionsAD[DIR_000 * size_Mat];
-            DAD.f[DIR_PPP ] = &distributionsAD[DIR_MMM  * size_Mat];
-            DAD.f[DIR_MMP ] = &distributionsAD[DIR_PPM  * size_Mat];
-            DAD.f[DIR_PMP ] = &distributionsAD[DIR_MPM  * size_Mat];
-            DAD.f[DIR_MPP ] = &distributionsAD[DIR_PMM  * size_Mat];
-            DAD.f[DIR_PPM ] = &distributionsAD[DIR_MMP  * size_Mat];
-            DAD.f[DIR_MMM ] = &distributionsAD[DIR_PPP  * size_Mat];
-            DAD.f[DIR_PMM ] = &distributionsAD[DIR_MPP  * size_Mat];
-            DAD.f[DIR_MPM ] = &distributionsAD[DIR_PMP  * size_Mat];
+            DAD.f[DIR_M00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+            DAD.f[DIR_P00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+            DAD.f[DIR_0M0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+            DAD.f[DIR_0P0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+            DAD.f[DIR_00M] = &distributionsAD[DIR_00P * numberOfLBnodes];
+            DAD.f[DIR_00P] = &distributionsAD[DIR_00M * numberOfLBnodes];
+            DAD.f[DIR_MM0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+            DAD.f[DIR_PP0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+            DAD.f[DIR_MP0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+            DAD.f[DIR_PM0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+            DAD.f[DIR_M0M] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+            DAD.f[DIR_P0P] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+            DAD.f[DIR_M0P] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+            DAD.f[DIR_P0M] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+            DAD.f[DIR_0MM] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+            DAD.f[DIR_0PP] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+            DAD.f[DIR_0MP] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+            DAD.f[DIR_0PM] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+            DAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+            DAD.f[DIR_PPP] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+            DAD.f[DIR_MMP] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+            DAD.f[DIR_PMP] = &distributionsAD[DIR_MPM * numberOfLBnodes];
+            DAD.f[DIR_MPP] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+            DAD.f[DIR_PPM] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+            DAD.f[DIR_MMM] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+            DAD.f[DIR_PMM] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+            DAD.f[DIR_MPM] = &distributionsAD[DIR_PMP * numberOfLBnodes];
         }
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         real concentration =
@@ -7115,24 +7115,24 @@ __global__ void AD_SlipVelDeviceComp(
         real jTan3 = jx3 - NormJ * NormZ;
 
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-        q = q_dirE[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_M00  ])[kw  ] = calcDistributionBC_AD(q, c2o27,   vx1,         cu_sq, f_E,   f_W,   omegaDiffusivity,        jTan1,       concentration); }
-        q = q_dirW[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_P00  ])[ke  ] = calcDistributionBC_AD(q, c2o27,  -vx1,         cu_sq, f_W,   f_E,   omegaDiffusivity,       -jTan1,       concentration); }
-        q = q_dirN[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0M0  ])[ks  ] = calcDistributionBC_AD(q, c2o27,   vx2,         cu_sq, f_N,   f_S,   omegaDiffusivity,        jTan2,       concentration); }
-        q = q_dirS[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0P0  ])[kn  ] = calcDistributionBC_AD(q, c2o27,  -vx2,         cu_sq, f_S,   f_N,   omegaDiffusivity,       -jTan2,       concentration); }
-        q = q_dirT[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_00M  ])[kb  ] = calcDistributionBC_AD(q, c2o27,   vx3,         cu_sq, f_T,   f_B,   omegaDiffusivity,        jTan3,       concentration); }
-        q = q_dirB[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_00P  ])[kt  ] = calcDistributionBC_AD(q, c2o27,  -vx3,         cu_sq, f_B,   f_T,   omegaDiffusivity,       -jTan3,       concentration); }
-        q = q_dirNE[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_MM0 ])[ksw ] = calcDistributionBC_AD(q, c1o54,   vx1+vx2,     cu_sq, f_NE,  f_SW,  omegaDiffusivity,  jTan1+jTan2,       concentration); }
-        q = q_dirSW[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_PP0 ])[kne ] = calcDistributionBC_AD(q, c1o54,  -vx1-vx2,     cu_sq, f_SW,  f_NE,  omegaDiffusivity, -jTan1-jTan2,       concentration); }
-        q = q_dirSE[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_MP0 ])[knw ] = calcDistributionBC_AD(q, c1o54,   vx1-vx2,     cu_sq, f_SE,  f_NW,  omegaDiffusivity,  jTan1-jTan2,       concentration); }
-        q = q_dirNW[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_PM0 ])[kse ] = calcDistributionBC_AD(q, c1o54,  -vx1+vx2,     cu_sq, f_NW,  f_SE,  omegaDiffusivity, -jTan1+jTan2,       concentration); }
-        q = q_dirTE[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_M0M ])[kbw ] = calcDistributionBC_AD(q, c1o54,   vx1    +vx3, cu_sq, f_TE,  f_BW,  omegaDiffusivity,  jTan1      +jTan3, concentration); }
-        q = q_dirBW[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_P0P ])[kte ] = calcDistributionBC_AD(q, c1o54,  -vx1    -vx3, cu_sq, f_BW,  f_TE,  omegaDiffusivity, -jTan1      -jTan3, concentration); }
-        q = q_dirBE[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_M0P ])[ktw ] = calcDistributionBC_AD(q, c1o54,   vx1    -vx3, cu_sq, f_BE,  f_TW,  omegaDiffusivity,  jTan1      -jTan3, concentration); }
-        q = q_dirTW[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_P0M ])[kbe ] = calcDistributionBC_AD(q, c1o54,  -vx1    +vx3, cu_sq, f_TW,  f_BE,  omegaDiffusivity, -jTan1      +jTan3, concentration); }
-        q = q_dirTN[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0MM ])[kbs ] = calcDistributionBC_AD(q, c1o54,       vx2+vx3, cu_sq, f_TN,  f_BS,  omegaDiffusivity,        jTan2+jTan3, concentration); }
-        q = q_dirBS[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0PP ])[ktn ] = calcDistributionBC_AD(q, c1o54,      -vx2-vx3, cu_sq, f_BS,  f_TN,  omegaDiffusivity,       -jTan2-jTan3, concentration); }
-        q = q_dirBN[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0MP ])[kts ] = calcDistributionBC_AD(q, c1o54,       vx2-vx3, cu_sq, f_BN,  f_TS,  omegaDiffusivity,        jTan2-jTan3, concentration); }
-        q = q_dirTS[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0PM ])[kbn ] = calcDistributionBC_AD(q, c1o54,      -vx2+vx3, cu_sq, f_TS,  f_BN,  omegaDiffusivity,       -jTan2+jTan3, concentration); }
+        q = q_dirE[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_M00])[kw  ] = calcDistributionBC_AD(q, c2o27,   vx1,         cu_sq, f_E,   f_W,   omegaDiffusivity,        jTan1,       concentration); }
+        q = q_dirW[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_P00])[ke  ] = calcDistributionBC_AD(q, c2o27,  -vx1,         cu_sq, f_W,   f_E,   omegaDiffusivity,       -jTan1,       concentration); }
+        q = q_dirN[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0M0])[ks  ] = calcDistributionBC_AD(q, c2o27,   vx2,         cu_sq, f_N,   f_S,   omegaDiffusivity,        jTan2,       concentration); }
+        q = q_dirS[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0P0])[kn  ] = calcDistributionBC_AD(q, c2o27,  -vx2,         cu_sq, f_S,   f_N,   omegaDiffusivity,       -jTan2,       concentration); }
+        q = q_dirT[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_00M])[kb  ] = calcDistributionBC_AD(q, c2o27,   vx3,         cu_sq, f_T,   f_B,   omegaDiffusivity,        jTan3,       concentration); }
+        q = q_dirB[k];   if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_00P])[kt  ] = calcDistributionBC_AD(q, c2o27,  -vx3,         cu_sq, f_B,   f_T,   omegaDiffusivity,       -jTan3,       concentration); }
+        q = q_dirNE[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_MM0])[ksw ] = calcDistributionBC_AD(q, c1o54,   vx1+vx2,     cu_sq, f_NE,  f_SW,  omegaDiffusivity,  jTan1+jTan2,       concentration); }
+        q = q_dirSW[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_PP0])[kne ] = calcDistributionBC_AD(q, c1o54,  -vx1-vx2,     cu_sq, f_SW,  f_NE,  omegaDiffusivity, -jTan1-jTan2,       concentration); }
+        q = q_dirSE[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_MP0])[knw ] = calcDistributionBC_AD(q, c1o54,   vx1-vx2,     cu_sq, f_SE,  f_NW,  omegaDiffusivity,  jTan1-jTan2,       concentration); }
+        q = q_dirNW[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_PM0])[kse ] = calcDistributionBC_AD(q, c1o54,  -vx1+vx2,     cu_sq, f_NW,  f_SE,  omegaDiffusivity, -jTan1+jTan2,       concentration); }
+        q = q_dirTE[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_M0M])[kbw ] = calcDistributionBC_AD(q, c1o54,   vx1    +vx3, cu_sq, f_TE,  f_BW,  omegaDiffusivity,  jTan1      +jTan3, concentration); }
+        q = q_dirBW[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_P0P])[kte ] = calcDistributionBC_AD(q, c1o54,  -vx1    -vx3, cu_sq, f_BW,  f_TE,  omegaDiffusivity, -jTan1      -jTan3, concentration); }
+        q = q_dirBE[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_M0P])[ktw ] = calcDistributionBC_AD(q, c1o54,   vx1    -vx3, cu_sq, f_BE,  f_TW,  omegaDiffusivity,  jTan1      -jTan3, concentration); }
+        q = q_dirTW[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_P0M])[kbe ] = calcDistributionBC_AD(q, c1o54,  -vx1    +vx3, cu_sq, f_TW,  f_BE,  omegaDiffusivity, -jTan1      +jTan3, concentration); }
+        q = q_dirTN[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0MM])[kbs ] = calcDistributionBC_AD(q, c1o54,       vx2+vx3, cu_sq, f_TN,  f_BS,  omegaDiffusivity,        jTan2+jTan3, concentration); }
+        q = q_dirBS[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0PP])[ktn ] = calcDistributionBC_AD(q, c1o54,      -vx2-vx3, cu_sq, f_BS,  f_TN,  omegaDiffusivity,       -jTan2-jTan3, concentration); }
+        q = q_dirBN[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0MP])[kts ] = calcDistributionBC_AD(q, c1o54,       vx2-vx3, cu_sq, f_BN,  f_TS,  omegaDiffusivity,        jTan2-jTan3, concentration); }
+        q = q_dirTS[k];  if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_0PM])[kbn ] = calcDistributionBC_AD(q, c1o54,      -vx2+vx3, cu_sq, f_TS,  f_BN,  omegaDiffusivity,       -jTan2+jTan3, concentration); }
         q = q_dirTNE[k]; if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_MMM])[kbsw] = calcDistributionBC_AD(q, c1o216,  vx1+vx2+vx3, cu_sq, f_TNE, f_BSW, omegaDiffusivity,  jTan1+jTan2+jTan3, concentration); }
         q = q_dirBSW[k]; if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_PPP])[ktne] = calcDistributionBC_AD(q, c1o216, -vx1-vx2-vx3, cu_sq, f_BSW, f_TNE, omegaDiffusivity, -jTan1-jTan2-jTan3, concentration); }
         q = q_dirBNE[k]; if (q >= c0o1 && q <= c1o1) { (DAD.f[DIR_MMP])[ktsw] = calcDistributionBC_AD(q, c1o216,  vx1+vx2-vx3, cu_sq, f_BNE, f_TSW, omegaDiffusivity,  jTan1+jTan2-jTan3, concentration); }
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CP27.cu b/src/gpu/VirtualFluids_GPU/GPU/CP27.cu
index 1ef111330c0d4293c14d66893847689ad8fac77f..8d02f4e1c110fc82b65adda4db67976f29796d07 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CP27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/CP27.cu
@@ -14,69 +14,69 @@ __global__ void CalcCP27(real* DD,
 									unsigned int* neighborX,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
-									unsigned int size_Mat, 
+									unsigned long long numberOfLBnodes, 
 									bool isEvenTimestep)
 {
 	Distributions27 D;
 	if (isEvenTimestep==true)
 	{
-		D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	} 
 	else
 	{
-		D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+		D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -124,20 +124,20 @@ __global__ void CalcCP27(real* DD,
 		////////////////////////////////////////////////////////////////////////////////
 		double PressCP;
 
-		PressCP  =   (D.f[DIR_P00   ])[ke  ]+ (D.f[DIR_M00   ])[kw  ]+ 
-                     (D.f[DIR_0P0   ])[kn  ]+ (D.f[DIR_0M0   ])[ks  ]+
-                     (D.f[DIR_00P   ])[kt  ]+ (D.f[DIR_00M   ])[kb  ]+
-                     (D.f[DIR_PP0  ])[kne ]+ (D.f[DIR_MM0  ])[ksw ]+
-                     (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                     (D.f[DIR_P0P  ])[kte ]+ (D.f[DIR_M0M  ])[kbw ]+
-                     (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                     (D.f[DIR_0PP  ])[ktn ]+ (D.f[DIR_0MM  ])[kbs ]+
-                     (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ]+
+		PressCP  =   (D.f[DIR_P00])[ke  ]+ (D.f[DIR_M00])[kw  ]+ 
+                     (D.f[DIR_0P0])[kn  ]+ (D.f[DIR_0M0])[ks  ]+
+                     (D.f[DIR_00P])[kt  ]+ (D.f[DIR_00M])[kb  ]+
+                     (D.f[DIR_PP0])[kne ]+ (D.f[DIR_MM0])[ksw ]+
+                     (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                     (D.f[DIR_P0P])[kte ]+ (D.f[DIR_M0M])[kbw ]+
+                     (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                     (D.f[DIR_0PP])[ktn ]+ (D.f[DIR_0MM])[kbs ]+
+                     (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ]+
                      (D.f[DIR_000])[kzero]+ 
-                     (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                     (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                     (D.f[DIR_PPM ])[kbne]+ (D.f[DIR_MMM ])[kbsw]+ 
-                     (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw];
+                     (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                     (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                     (D.f[DIR_PPM])[kbne]+ (D.f[DIR_MMM])[kbsw]+ 
+                     (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw];
 		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 		cpPress[k] = PressCP;
 		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/GPU/Calc2ndMoments27.cu b/src/gpu/VirtualFluids_GPU/GPU/Calc2ndMoments27.cu
index ce8fe68cd6a2e8f09f150cb0ccdec502a6278b50..c41751dc1b5cea53983d94d9cc7c3c75c8a84101 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/Calc2ndMoments27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/Calc2ndMoments27.cu
@@ -16,70 +16,70 @@ __global__ void LBCalc2ndMomentsIncompSP27(  real* kxyFromfcNEQ,
 														unsigned int* neighborX,
 														unsigned int* neighborY,
 														unsigned int* neighborZ,
-														unsigned int size_Mat,
+														unsigned long long numberOfLBnodes,
 														real* DD,
 														bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -92,7 +92,7 @@ __global__ void LBCalc2ndMomentsIncompSP27(  real* kxyFromfcNEQ,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k < size_Mat)
+   if(k < numberOfLBnodes)
    {
       //////////////////////////////////////////////////////////////////////////
       //index
@@ -125,33 +125,33 @@ __global__ void LBCalc2ndMomentsIncompSP27(  real* kxyFromfcNEQ,
       unsigned int kbsw = neighborZ[ksw];
       //////////////////////////////////////////////////////////////////////////
       real        f_E,f_W,f_N,f_S,f_T,f_B,f_NE,f_SW,f_SE,f_NW,f_TE,f_BW,f_BE,f_TW,f_TN,f_BS,f_BN,f_TS,/*f_ZERO,*/f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
-	  f_E    = (D.f[DIR_P00   ])[ke   ];
-	  f_W    = (D.f[DIR_M00   ])[kw   ];
-	  f_N    = (D.f[DIR_0P0   ])[kn   ];
-	  f_S    = (D.f[DIR_0M0   ])[ks   ];
-	  f_T    = (D.f[DIR_00P   ])[kt   ];
-	  f_B    = (D.f[DIR_00M   ])[kb   ];
-	  f_NE   = (D.f[DIR_PP0  ])[kne  ];
-	  f_SW   = (D.f[DIR_MM0  ])[ksw  ];
-	  f_SE   = (D.f[DIR_PM0  ])[kse  ];
-	  f_NW   = (D.f[DIR_MP0  ])[knw  ];
-	  f_TE   = (D.f[DIR_P0P  ])[kte  ];
-	  f_BW   = (D.f[DIR_M0M  ])[kbw  ];
-	  f_BE   = (D.f[DIR_P0M  ])[kbe  ];
-	  f_TW   = (D.f[DIR_M0P  ])[ktw  ];
-	  f_TN   = (D.f[DIR_0PP  ])[ktn  ];
-	  f_BS   = (D.f[DIR_0MM  ])[kbs  ];
-	  f_BN   = (D.f[DIR_0PM  ])[kbn  ];
-	  f_TS   = (D.f[DIR_0MP  ])[kts  ];
+	  f_E    = (D.f[DIR_P00])[ke   ];
+	  f_W    = (D.f[DIR_M00])[kw   ];
+	  f_N    = (D.f[DIR_0P0])[kn   ];
+	  f_S    = (D.f[DIR_0M0])[ks   ];
+	  f_T    = (D.f[DIR_00P])[kt   ];
+	  f_B    = (D.f[DIR_00M])[kb   ];
+	  f_NE   = (D.f[DIR_PP0])[kne  ];
+	  f_SW   = (D.f[DIR_MM0])[ksw  ];
+	  f_SE   = (D.f[DIR_PM0])[kse  ];
+	  f_NW   = (D.f[DIR_MP0])[knw  ];
+	  f_TE   = (D.f[DIR_P0P])[kte  ];
+	  f_BW   = (D.f[DIR_M0M])[kbw  ];
+	  f_BE   = (D.f[DIR_P0M])[kbe  ];
+	  f_TW   = (D.f[DIR_M0P])[ktw  ];
+	  f_TN   = (D.f[DIR_0PP])[ktn  ];
+	  f_BS   = (D.f[DIR_0MM])[kbs  ];
+	  f_BN   = (D.f[DIR_0PM])[kbn  ];
+	  f_TS   = (D.f[DIR_0MP])[kts  ];
 	  //f_ZERO = (D.f[DIR_000])[kzero];
-	  f_TNE  = (D.f[DIR_PPP ])[ktne ];
-	  f_TSW  = (D.f[DIR_MMP ])[ktsw ];
-	  f_TSE  = (D.f[DIR_PMP ])[ktse ];
-	  f_TNW  = (D.f[DIR_MPP ])[ktnw ];
-	  f_BNE  = (D.f[DIR_PPM ])[kbne ];
-	  f_BSW  = (D.f[DIR_MMM ])[kbsw ];
-	  f_BSE  = (D.f[DIR_PMM ])[kbse ];
-	  f_BNW  = (D.f[DIR_MPM ])[kbnw ];
+	  f_TNE  = (D.f[DIR_PPP])[ktne ];
+	  f_TSW  = (D.f[DIR_MMP])[ktsw ];
+	  f_TSE  = (D.f[DIR_PMP])[ktse ];
+	  f_TNW  = (D.f[DIR_MPP])[ktnw ];
+	  f_BNE  = (D.f[DIR_PPM])[kbne ];
+	  f_BSW  = (D.f[DIR_MMM])[kbsw ];
+	  f_BSE  = (D.f[DIR_PMM])[kbse ];
+	  f_BNW  = (D.f[DIR_MPM])[kbnw ];
       //////////////////////////////////////////////////////////////////////////
 	  real vx1, vx2, vx3;
       kxyFromfcNEQ[k]       = c0o1;
@@ -215,70 +215,70 @@ __global__ void LBCalc2ndMomentsCompSP27(real* kxyFromfcNEQ,
 													unsigned int* neighborX,
 													unsigned int* neighborY,
 													unsigned int* neighborZ,
-													unsigned int size_Mat,
+													unsigned long long numberOfLBnodes,
 													real* DD,
 													bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -291,7 +291,7 @@ __global__ void LBCalc2ndMomentsCompSP27(real* kxyFromfcNEQ,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k < size_Mat)
+   if(k < numberOfLBnodes)
    {
       //////////////////////////////////////////////////////////////////////////
       //index
@@ -325,33 +325,33 @@ __global__ void LBCalc2ndMomentsCompSP27(real* kxyFromfcNEQ,
       //////////////////////////////////////////////////////////////////////////
       real f_ZERO;
       real        f_E,f_W,f_N,f_S,f_T,f_B,f_NE,f_SW,f_SE,f_NW,f_TE,f_BW,f_BE,f_TW,f_TN,f_BS,f_BN,f_TS,f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
-	  f_E    = (D.f[DIR_P00   ])[ke   ];
-	  f_W    = (D.f[DIR_M00   ])[kw   ];
-	  f_N    = (D.f[DIR_0P0   ])[kn   ];
-	  f_S    = (D.f[DIR_0M0   ])[ks   ];
-	  f_T    = (D.f[DIR_00P   ])[kt   ];
-	  f_B    = (D.f[DIR_00M   ])[kb   ];
-	  f_NE   = (D.f[DIR_PP0  ])[kne  ];
-	  f_SW   = (D.f[DIR_MM0  ])[ksw  ];
-	  f_SE   = (D.f[DIR_PM0  ])[kse  ];
-	  f_NW   = (D.f[DIR_MP0  ])[knw  ];
-	  f_TE   = (D.f[DIR_P0P  ])[kte  ];
-	  f_BW   = (D.f[DIR_M0M  ])[kbw  ];
-	  f_BE   = (D.f[DIR_P0M  ])[kbe  ];
-	  f_TW   = (D.f[DIR_M0P  ])[ktw  ];
-	  f_TN   = (D.f[DIR_0PP  ])[ktn  ];
-	  f_BS   = (D.f[DIR_0MM  ])[kbs  ];
-	  f_BN   = (D.f[DIR_0PM  ])[kbn  ];
-	  f_TS   = (D.f[DIR_0MP  ])[kts  ];
+	  f_E    = (D.f[DIR_P00])[ke   ];
+	  f_W    = (D.f[DIR_M00])[kw   ];
+	  f_N    = (D.f[DIR_0P0])[kn   ];
+	  f_S    = (D.f[DIR_0M0])[ks   ];
+	  f_T    = (D.f[DIR_00P])[kt   ];
+	  f_B    = (D.f[DIR_00M])[kb   ];
+	  f_NE   = (D.f[DIR_PP0])[kne  ];
+	  f_SW   = (D.f[DIR_MM0])[ksw  ];
+	  f_SE   = (D.f[DIR_PM0])[kse  ];
+	  f_NW   = (D.f[DIR_MP0])[knw  ];
+	  f_TE   = (D.f[DIR_P0P])[kte  ];
+	  f_BW   = (D.f[DIR_M0M])[kbw  ];
+	  f_BE   = (D.f[DIR_P0M])[kbe  ];
+	  f_TW   = (D.f[DIR_M0P])[ktw  ];
+	  f_TN   = (D.f[DIR_0PP])[ktn  ];
+	  f_BS   = (D.f[DIR_0MM])[kbs  ];
+	  f_BN   = (D.f[DIR_0PM])[kbn  ];
+	  f_TS   = (D.f[DIR_0MP])[kts  ];
 	  f_ZERO = (D.f[DIR_000])[kzero];
-	  f_TNE  = (D.f[DIR_PPP ])[ktne ];
-	  f_TSW  = (D.f[DIR_MMP ])[ktsw ];
-	  f_TSE  = (D.f[DIR_PMP ])[ktse ];
-	  f_TNW  = (D.f[DIR_MPP ])[ktnw ];
-	  f_BNE  = (D.f[DIR_PPM ])[kbne ];
-	  f_BSW  = (D.f[DIR_MMM ])[kbsw ];
-	  f_BSE  = (D.f[DIR_PMM ])[kbse ];
-	  f_BNW  = (D.f[DIR_MPM ])[kbnw ];
+	  f_TNE  = (D.f[DIR_PPP])[ktne ];
+	  f_TSW  = (D.f[DIR_MMP])[ktsw ];
+	  f_TSE  = (D.f[DIR_PMP])[ktse ];
+	  f_TNW  = (D.f[DIR_MPP])[ktnw ];
+	  f_BNE  = (D.f[DIR_PPM])[kbne ];
+	  f_BSW  = (D.f[DIR_MMM])[kbsw ];
+	  f_BSE  = (D.f[DIR_PMM])[kbse ];
+	  f_BNW  = (D.f[DIR_MPM])[kbnw ];
       //////////////////////////////////////////////////////////////////////////
 	  real drho;
 	  real vx1, vx2, vx3, rho;
@@ -423,7 +423,7 @@ __global__ void LBCalc3rdMomentsIncompSP27(  real* CUMbbb,
 														unsigned int* neighborY,
 														unsigned int* neighborZ,
 														real* DDStart,
-														int size_Mat,
+														unsigned long long numberOfLBnodes,
 														bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -437,7 +437,7 @@ __global__ void LBCalc3rdMomentsIncompSP27(  real* CUMbbb,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -448,63 +448,63 @@ __global__ void LBCalc3rdMomentsIncompSP27(  real* CUMbbb,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -517,33 +517,33 @@ __global__ void LBCalc3rdMomentsIncompSP27(  real* CUMbbb,
 			unsigned int kbs  = neighborZ[ks];
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];
-			real mfabb = (D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];
-			real mfbab = (D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];
-			real mfbba = (D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];
-			real mfacb = (D.f[DIR_MP0  ])[kw ];
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];
-			real mfabc = (D.f[DIR_M0P  ])[kw ];
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];
-			real mfbac = (D.f[DIR_0MP  ])[ks ];
+			real mfcbb = (D.f[DIR_P00])[k  ];
+			real mfabb = (D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];
+			real mfbab = (D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];
+			real mfbba = (D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];
+			real mfaab = (D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];
+			real mfacb = (D.f[DIR_MP0])[kw ];
+			real mfcbc = (D.f[DIR_P0P])[k  ];
+			real mfaba = (D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];
+			real mfabc = (D.f[DIR_M0P])[kw ];
+			real mfbcc = (D.f[DIR_0PP])[k  ];
+			real mfbaa = (D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];
+			real mfbac = (D.f[DIR_0MP])[ks ];
 			real mfbbb = (D.f[DIR_000])[k  ];
-			real mfccc = (D.f[DIR_PPP ])[k  ];
-			real mfaac = (D.f[DIR_MMP ])[ksw];
-			real mfcac = (D.f[DIR_PMP ])[ks ];
-			real mfacc = (D.f[DIR_MPP ])[kw ];
-			real mfcca = (D.f[DIR_PPM ])[kb ];
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];
-			real mfaca = (D.f[DIR_MPM ])[kbw];
+			real mfccc = (D.f[DIR_PPP])[k  ];
+			real mfaac = (D.f[DIR_MMP])[ksw];
+			real mfcac = (D.f[DIR_PMP])[ks ];
+			real mfacc = (D.f[DIR_MPP])[kw ];
+			real mfcca = (D.f[DIR_PPM])[kb ];
+			real mfaaa = (D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];
+			real mfaca = (D.f[DIR_MPM])[kbw];
 			////////////////////////////////////////////////////////////////////////////////////
 			real vvx    =((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfcaa-mfacc) + (mfcca-mfaac))) + 
 						     (((mfcba-mfabc) + (mfcbc-mfaba)) + ((mfcab-mfacb) + (mfccb-mfaab))) +
@@ -857,7 +857,7 @@ __global__ void LBCalc3rdMomentsCompSP27(real* CUMbbb,
 													unsigned int* neighborY,
 													unsigned int* neighborZ,
 													real* DDStart,
-													int size_Mat,
+													unsigned long long numberOfLBnodes,
 													bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -871,7 +871,7 @@ __global__ void LBCalc3rdMomentsCompSP27(real* CUMbbb,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -882,63 +882,63 @@ __global__ void LBCalc3rdMomentsCompSP27(real* CUMbbb,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -951,33 +951,33 @@ __global__ void LBCalc3rdMomentsCompSP27(real* CUMbbb,
 			unsigned int kbs  = neighborZ[ks];
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];
-			real mfabb = (D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];
-			real mfbab = (D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];
-			real mfbba = (D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];
-			real mfacb = (D.f[DIR_MP0  ])[kw ];
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];
-			real mfabc = (D.f[DIR_M0P  ])[kw ];
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];
-			real mfbac = (D.f[DIR_0MP  ])[ks ];
+			real mfcbb = (D.f[DIR_P00])[k  ];
+			real mfabb = (D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];
+			real mfbab = (D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];
+			real mfbba = (D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];
+			real mfaab = (D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];
+			real mfacb = (D.f[DIR_MP0])[kw ];
+			real mfcbc = (D.f[DIR_P0P])[k  ];
+			real mfaba = (D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];
+			real mfabc = (D.f[DIR_M0P])[kw ];
+			real mfbcc = (D.f[DIR_0PP])[k  ];
+			real mfbaa = (D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];
+			real mfbac = (D.f[DIR_0MP])[ks ];
 			real mfbbb = (D.f[DIR_000])[k  ];
-			real mfccc = (D.f[DIR_PPP ])[k  ];
-			real mfaac = (D.f[DIR_MMP ])[ksw];
-			real mfcac = (D.f[DIR_PMP ])[ks ];
-			real mfacc = (D.f[DIR_MPP ])[kw ];
-			real mfcca = (D.f[DIR_PPM ])[kb ];
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];
-			real mfaca = (D.f[DIR_MPM ])[kbw];
+			real mfccc = (D.f[DIR_PPP])[k  ];
+			real mfaac = (D.f[DIR_MMP])[ksw];
+			real mfcac = (D.f[DIR_PMP])[ks ];
+			real mfacc = (D.f[DIR_MPP])[kw ];
+			real mfcca = (D.f[DIR_PPM])[kb ];
+			real mfaaa = (D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];
+			real mfaca = (D.f[DIR_MPM])[kbw];
 			////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
 							(((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) +
@@ -1298,7 +1298,7 @@ __global__ void LBCalcHigherMomentsIncompSP27(   real* CUMcbb,
 															unsigned int* neighborY,
 															unsigned int* neighborZ,
 															real* DDStart,
-															int size_Mat,
+															unsigned long long numberOfLBnodes,
 															bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -1312,7 +1312,7 @@ __global__ void LBCalcHigherMomentsIncompSP27(   real* CUMcbb,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -1323,63 +1323,63 @@ __global__ void LBCalcHigherMomentsIncompSP27(   real* CUMcbb,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -1392,33 +1392,33 @@ __global__ void LBCalcHigherMomentsIncompSP27(   real* CUMcbb,
 			unsigned int kbs  = neighborZ[ks];
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];
-			real mfabb = (D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];
-			real mfbab = (D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];
-			real mfbba = (D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];
-			real mfacb = (D.f[DIR_MP0  ])[kw ];
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];
-			real mfabc = (D.f[DIR_M0P  ])[kw ];
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];
-			real mfbac = (D.f[DIR_0MP  ])[ks ];
+			real mfcbb = (D.f[DIR_P00])[k  ];
+			real mfabb = (D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];
+			real mfbab = (D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];
+			real mfbba = (D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];
+			real mfaab = (D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];
+			real mfacb = (D.f[DIR_MP0])[kw ];
+			real mfcbc = (D.f[DIR_P0P])[k  ];
+			real mfaba = (D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];
+			real mfabc = (D.f[DIR_M0P])[kw ];
+			real mfbcc = (D.f[DIR_0PP])[k  ];
+			real mfbaa = (D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];
+			real mfbac = (D.f[DIR_0MP])[ks ];
 			real mfbbb = (D.f[DIR_000])[k  ];
-			real mfccc = (D.f[DIR_PPP ])[k  ];
-			real mfaac = (D.f[DIR_MMP ])[ksw];
-			real mfcac = (D.f[DIR_PMP ])[ks ];
-			real mfacc = (D.f[DIR_MPP ])[kw ];
-			real mfcca = (D.f[DIR_PPM ])[kb ];
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];
-			real mfaca = (D.f[DIR_MPM ])[kbw];
+			real mfccc = (D.f[DIR_PPP])[k  ];
+			real mfaac = (D.f[DIR_MMP])[ksw];
+			real mfcac = (D.f[DIR_PMP])[ks ];
+			real mfacc = (D.f[DIR_MPP])[kw ];
+			real mfcca = (D.f[DIR_PPM])[kb ];
+			real mfaaa = (D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];
+			real mfaca = (D.f[DIR_MPM])[kbw];
 			////////////////////////////////////////////////////////////////////////////////////
 			real vvx    =((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfcaa-mfacc) + (mfcca-mfaac))) + 
 						     (((mfcba-mfabc) + (mfcbc-mfaba)) + ((mfcab-mfacb) + (mfccb-mfaab))) +
@@ -1752,7 +1752,7 @@ __global__ void LBCalcHigherMomentsCompSP27( real* CUMcbb,
 														unsigned int* neighborY,
 														unsigned int* neighborZ,
 														real* DDStart,
-														int size_Mat,
+														unsigned long long numberOfLBnodes,
 														bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -1766,7 +1766,7 @@ __global__ void LBCalcHigherMomentsCompSP27( real* CUMcbb,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -1777,63 +1777,63 @@ __global__ void LBCalcHigherMomentsCompSP27( real* CUMcbb,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -1846,33 +1846,33 @@ __global__ void LBCalcHigherMomentsCompSP27( real* CUMcbb,
 			unsigned int kbs  = neighborZ[ks];
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];
-			real mfabb = (D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];
-			real mfbab = (D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];
-			real mfbba = (D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];
-			real mfacb = (D.f[DIR_MP0  ])[kw ];
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];
-			real mfabc = (D.f[DIR_M0P  ])[kw ];
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];
-			real mfbac = (D.f[DIR_0MP  ])[ks ];
+			real mfcbb = (D.f[DIR_P00])[k  ];
+			real mfabb = (D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];
+			real mfbab = (D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];
+			real mfbba = (D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];
+			real mfaab = (D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];
+			real mfacb = (D.f[DIR_MP0])[kw ];
+			real mfcbc = (D.f[DIR_P0P])[k  ];
+			real mfaba = (D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];
+			real mfabc = (D.f[DIR_M0P])[kw ];
+			real mfbcc = (D.f[DIR_0PP])[k  ];
+			real mfbaa = (D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];
+			real mfbac = (D.f[DIR_0MP])[ks ];
 			real mfbbb = (D.f[DIR_000])[k  ];
-			real mfccc = (D.f[DIR_PPP ])[k  ];
-			real mfaac = (D.f[DIR_MMP ])[ksw];
-			real mfcac = (D.f[DIR_PMP ])[ks ];
-			real mfacc = (D.f[DIR_MPP ])[kw ];
-			real mfcca = (D.f[DIR_PPM ])[kb ];
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];
-			real mfaca = (D.f[DIR_MPM ])[kbw];
+			real mfccc = (D.f[DIR_PPP])[k  ];
+			real mfaac = (D.f[DIR_MMP])[ksw];
+			real mfcac = (D.f[DIR_PMP])[ks ];
+			real mfacc = (D.f[DIR_MPP])[kw ];
+			real mfcca = (D.f[DIR_PPM])[kb ];
+			real mfaaa = (D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];
+			real mfaca = (D.f[DIR_MPM])[kbw];
 			////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
 							(((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) +
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CalcConc27.cu b/src/gpu/VirtualFluids_GPU/GPU/CalcConc27.cu
index d246f39a030b6df0b249aee17f37b7d5258ff00d..ad5a05b12a1b3ae2541e36ccffae4635fccfe62a 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CalcConc27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/CalcConc27.cu
@@ -45,7 +45,7 @@ __global__ void CalcConc27(
 	uint* neighborX,
 	uint* neighborY,
 	uint* neighborZ,
-	uint size_Mat,
+	unsigned long long numberOfLBnodes,
 	real* distributionsAD,
 	bool isEvenTimestep)
 {
@@ -67,7 +67,7 @@ __global__ void CalcConc27(
 
    //////////////////////////////////////////////////////////////////////////
    // run for all indices in size_Mat and fluid nodes
-   if ((k < size_Mat) && (typeOfGridNode[k] == GEO_FLUID))
+   if ((k < numberOfLBnodes) && (typeOfGridNode[k] == GEO_FLUID))
    {
       //////////////////////////////////////////////////////////////////////////
       //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref
@@ -76,63 +76,63 @@ __global__ void CalcConc27(
       Distributions27 distAD;
       if (isEvenTimestep)
       {
-         distAD.f[DIR_P00   ] = &distributionsAD[DIR_P00   *size_Mat];
-         distAD.f[DIR_M00   ] = &distributionsAD[DIR_M00   *size_Mat];
-         distAD.f[DIR_0P0   ] = &distributionsAD[DIR_0P0   *size_Mat];
-         distAD.f[DIR_0M0   ] = &distributionsAD[DIR_0M0   *size_Mat];
-         distAD.f[DIR_00P   ] = &distributionsAD[DIR_00P   *size_Mat];
-         distAD.f[DIR_00M   ] = &distributionsAD[DIR_00M   *size_Mat];
-         distAD.f[DIR_PP0  ] = &distributionsAD[DIR_PP0  *size_Mat];
-         distAD.f[DIR_MM0  ] = &distributionsAD[DIR_MM0  *size_Mat];
-         distAD.f[DIR_PM0  ] = &distributionsAD[DIR_PM0  *size_Mat];
-         distAD.f[DIR_MP0  ] = &distributionsAD[DIR_MP0  *size_Mat];
-         distAD.f[DIR_P0P  ] = &distributionsAD[DIR_P0P  *size_Mat];
-         distAD.f[DIR_M0M  ] = &distributionsAD[DIR_M0M  *size_Mat];
-         distAD.f[DIR_P0M  ] = &distributionsAD[DIR_P0M  *size_Mat];
-         distAD.f[DIR_M0P  ] = &distributionsAD[DIR_M0P  *size_Mat];
-         distAD.f[DIR_0PP  ] = &distributionsAD[DIR_0PP  *size_Mat];
-         distAD.f[DIR_0MM  ] = &distributionsAD[DIR_0MM  *size_Mat];
-         distAD.f[DIR_0PM  ] = &distributionsAD[DIR_0PM  *size_Mat];
-         distAD.f[DIR_0MP  ] = &distributionsAD[DIR_0MP  *size_Mat];
-         distAD.f[DIR_000] = &distributionsAD[DIR_000*size_Mat];
-         distAD.f[DIR_PPP ] = &distributionsAD[DIR_PPP *size_Mat];
-         distAD.f[DIR_MMP ] = &distributionsAD[DIR_MMP *size_Mat];
-         distAD.f[DIR_PMP ] = &distributionsAD[DIR_PMP *size_Mat];
-         distAD.f[DIR_MPP ] = &distributionsAD[DIR_MPP *size_Mat];
-         distAD.f[DIR_PPM ] = &distributionsAD[DIR_PPM *size_Mat];
-         distAD.f[DIR_MMM ] = &distributionsAD[DIR_MMM *size_Mat];
-         distAD.f[DIR_PMM ] = &distributionsAD[DIR_PMM *size_Mat];
-         distAD.f[DIR_MPM ] = &distributionsAD[DIR_MPM *size_Mat];
+         distAD.f[DIR_P00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+         distAD.f[DIR_M00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+         distAD.f[DIR_0P0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+         distAD.f[DIR_0M0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+         distAD.f[DIR_00P] = &distributionsAD[DIR_00P * numberOfLBnodes];
+         distAD.f[DIR_00M] = &distributionsAD[DIR_00M * numberOfLBnodes];
+         distAD.f[DIR_PP0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+         distAD.f[DIR_MM0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+         distAD.f[DIR_PM0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+         distAD.f[DIR_MP0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+         distAD.f[DIR_P0P] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+         distAD.f[DIR_M0M] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+         distAD.f[DIR_P0M] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+         distAD.f[DIR_M0P] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+         distAD.f[DIR_0PP] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+         distAD.f[DIR_0MM] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+         distAD.f[DIR_0PM] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+         distAD.f[DIR_0MP] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+         distAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+         distAD.f[DIR_PPP] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+         distAD.f[DIR_MMP] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+         distAD.f[DIR_PMP] = &distributionsAD[DIR_PMP * numberOfLBnodes];
+         distAD.f[DIR_MPP] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+         distAD.f[DIR_PPM] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+         distAD.f[DIR_MMM] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+         distAD.f[DIR_PMM] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+         distAD.f[DIR_MPM] = &distributionsAD[DIR_MPM * numberOfLBnodes];
       }
       else
       {
-         distAD.f[DIR_M00   ] = &distributionsAD[DIR_P00   *size_Mat];
-         distAD.f[DIR_P00   ] = &distributionsAD[DIR_M00   *size_Mat];
-         distAD.f[DIR_0M0   ] = &distributionsAD[DIR_0P0   *size_Mat];
-         distAD.f[DIR_0P0   ] = &distributionsAD[DIR_0M0   *size_Mat];
-         distAD.f[DIR_00M   ] = &distributionsAD[DIR_00P   *size_Mat];
-         distAD.f[DIR_00P   ] = &distributionsAD[DIR_00M   *size_Mat];
-         distAD.f[DIR_MM0  ] = &distributionsAD[DIR_PP0  *size_Mat];
-         distAD.f[DIR_PP0  ] = &distributionsAD[DIR_MM0  *size_Mat];
-         distAD.f[DIR_MP0  ] = &distributionsAD[DIR_PM0  *size_Mat];
-         distAD.f[DIR_PM0  ] = &distributionsAD[DIR_MP0  *size_Mat];
-         distAD.f[DIR_M0M  ] = &distributionsAD[DIR_P0P  *size_Mat];
-         distAD.f[DIR_P0P  ] = &distributionsAD[DIR_M0M  *size_Mat];
-         distAD.f[DIR_M0P  ] = &distributionsAD[DIR_P0M  *size_Mat];
-         distAD.f[DIR_P0M  ] = &distributionsAD[DIR_M0P  *size_Mat];
-         distAD.f[DIR_0MM  ] = &distributionsAD[DIR_0PP  *size_Mat];
-         distAD.f[DIR_0PP  ] = &distributionsAD[DIR_0MM  *size_Mat];
-         distAD.f[DIR_0MP  ] = &distributionsAD[DIR_0PM  *size_Mat];
-         distAD.f[DIR_0PM  ] = &distributionsAD[DIR_0MP  *size_Mat];
-         distAD.f[DIR_000] = &distributionsAD[DIR_000*size_Mat];
-         distAD.f[DIR_PPP ] = &distributionsAD[DIR_MMM *size_Mat];
-         distAD.f[DIR_MMP ] = &distributionsAD[DIR_PPM *size_Mat];
-         distAD.f[DIR_PMP ] = &distributionsAD[DIR_MPM *size_Mat];
-         distAD.f[DIR_MPP ] = &distributionsAD[DIR_PMM *size_Mat];
-         distAD.f[DIR_PPM ] = &distributionsAD[DIR_MMP *size_Mat];
-         distAD.f[DIR_MMM ] = &distributionsAD[DIR_PPP *size_Mat];
-         distAD.f[DIR_PMM ] = &distributionsAD[DIR_MPP *size_Mat];
-         distAD.f[DIR_MPM ] = &distributionsAD[DIR_PMP *size_Mat];
+         distAD.f[DIR_M00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+         distAD.f[DIR_P00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+         distAD.f[DIR_0M0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+         distAD.f[DIR_0P0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+         distAD.f[DIR_00M] = &distributionsAD[DIR_00P * numberOfLBnodes];
+         distAD.f[DIR_00P] = &distributionsAD[DIR_00M * numberOfLBnodes];
+         distAD.f[DIR_MM0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+         distAD.f[DIR_PP0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+         distAD.f[DIR_MP0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+         distAD.f[DIR_PM0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+         distAD.f[DIR_M0M] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+         distAD.f[DIR_P0P] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+         distAD.f[DIR_M0P] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+         distAD.f[DIR_P0M] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+         distAD.f[DIR_0MM] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+         distAD.f[DIR_0PP] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+         distAD.f[DIR_0MP] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+         distAD.f[DIR_0PM] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+         distAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+         distAD.f[DIR_PPP] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+         distAD.f[DIR_MMP] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+         distAD.f[DIR_PMP] = &distributionsAD[DIR_MPM * numberOfLBnodes];
+         distAD.f[DIR_MPP] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+         distAD.f[DIR_PPM] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+         distAD.f[DIR_MMM] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+         distAD.f[DIR_PMM] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+         distAD.f[DIR_MPM] = &distributionsAD[DIR_PMP * numberOfLBnodes];
       }
 	  ////////////////////////////////////////////////////////////////////////////////
 	  //! - Set neighbor indices (necessary for indirect addressing)
@@ -166,33 +166,33 @@ __global__ void CalcConc27(
 	  ////////////////////////////////////////////////////////////////////////////////
 	  //! - Set local distributions
 	  //!
-	  real mfcbb = (distAD.f[DIR_P00   ])[ke  ];
-	  real mfabb = (distAD.f[DIR_M00   ])[kw  ];
-	  real mfbcb = (distAD.f[DIR_0P0   ])[kn  ];
-	  real mfbab = (distAD.f[DIR_0M0   ])[ks  ];
-	  real mfbbc = (distAD.f[DIR_00P   ])[kt  ];
-	  real mfbba = (distAD.f[DIR_00M   ])[kb  ];
-	  real mfccb = (distAD.f[DIR_PP0  ])[kne ];
-	  real mfaab = (distAD.f[DIR_MM0  ])[ksw ];
-	  real mfcab = (distAD.f[DIR_PM0  ])[kse ];
-	  real mfacb = (distAD.f[DIR_MP0  ])[knw ];
-	  real mfcbc = (distAD.f[DIR_P0P  ])[kte ];
-	  real mfaba = (distAD.f[DIR_M0M  ])[kbw ];
-	  real mfcba = (distAD.f[DIR_P0M  ])[kbe ];
-	  real mfabc = (distAD.f[DIR_M0P  ])[ktw ];
-	  real mfbcc = (distAD.f[DIR_0PP  ])[ktn ];
-	  real mfbaa = (distAD.f[DIR_0MM  ])[kbs ];
-	  real mfbca = (distAD.f[DIR_0PM  ])[kbn ];
-	  real mfbac = (distAD.f[DIR_0MP  ])[kts ];
+	  real mfcbb = (distAD.f[DIR_P00])[ke  ];
+	  real mfabb = (distAD.f[DIR_M00])[kw  ];
+	  real mfbcb = (distAD.f[DIR_0P0])[kn  ];
+	  real mfbab = (distAD.f[DIR_0M0])[ks  ];
+	  real mfbbc = (distAD.f[DIR_00P])[kt  ];
+	  real mfbba = (distAD.f[DIR_00M])[kb  ];
+	  real mfccb = (distAD.f[DIR_PP0])[kne ];
+	  real mfaab = (distAD.f[DIR_MM0])[ksw ];
+	  real mfcab = (distAD.f[DIR_PM0])[kse ];
+	  real mfacb = (distAD.f[DIR_MP0])[knw ];
+	  real mfcbc = (distAD.f[DIR_P0P])[kte ];
+	  real mfaba = (distAD.f[DIR_M0M])[kbw ];
+	  real mfcba = (distAD.f[DIR_P0M])[kbe ];
+	  real mfabc = (distAD.f[DIR_M0P])[ktw ];
+	  real mfbcc = (distAD.f[DIR_0PP])[ktn ];
+	  real mfbaa = (distAD.f[DIR_0MM])[kbs ];
+	  real mfbca = (distAD.f[DIR_0PM])[kbn ];
+	  real mfbac = (distAD.f[DIR_0MP])[kts ];
 	  real mfbbb = (distAD.f[DIR_000])[k   ];
-	  real mfccc = (distAD.f[DIR_PPP ])[ktne];
-	  real mfaac = (distAD.f[DIR_MMP ])[ktsw];
-	  real mfcac = (distAD.f[DIR_PMP ])[ktse];
-	  real mfacc = (distAD.f[DIR_MPP ])[ktnw];
-	  real mfcca = (distAD.f[DIR_PPM ])[kbne];
-	  real mfaaa = (distAD.f[DIR_MMM ])[kbsw];
-	  real mfcaa = (distAD.f[DIR_PMM ])[kbse];
-	  real mfaca = (distAD.f[DIR_MPM ])[kbnw];
+	  real mfccc = (distAD.f[DIR_PPP])[ktne];
+	  real mfaac = (distAD.f[DIR_MMP])[ktsw];
+	  real mfcac = (distAD.f[DIR_PMP])[ktse];
+	  real mfacc = (distAD.f[DIR_MPP])[ktnw];
+	  real mfcca = (distAD.f[DIR_PPM])[kbne];
+	  real mfaaa = (distAD.f[DIR_MMM])[kbsw];
+	  real mfcaa = (distAD.f[DIR_PMM])[kbse];
+	  real mfaca = (distAD.f[DIR_MPM])[kbnw];
       //////////////////////////////////////////////////////////////////////////
 	  //! - Calculate concentration using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref
 	  //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a>
@@ -229,30 +229,30 @@ __global__ void CalcConc7( real* Conc,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           real* DD7,
                                           bool isEvenTimestep)
 {
    Distributions7 D7;
    if (isEvenTimestep==true)
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[1] = &DD7[1*size_Mat];
-      D7.f[2] = &DD7[2*size_Mat];
-      D7.f[3] = &DD7[3*size_Mat];
-      D7.f[4] = &DD7[4*size_Mat];
-      D7.f[5] = &DD7[5*size_Mat];
-      D7.f[6] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[1] = &DD7[1*numberOfLBnodes];
+      D7.f[2] = &DD7[2*numberOfLBnodes];
+      D7.f[3] = &DD7[3*numberOfLBnodes];
+      D7.f[4] = &DD7[4*numberOfLBnodes];
+      D7.f[5] = &DD7[5*numberOfLBnodes];
+      D7.f[6] = &DD7[6*numberOfLBnodes];
    } 
    else
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[2] = &DD7[1*size_Mat];
-      D7.f[1] = &DD7[2*size_Mat];
-      D7.f[4] = &DD7[3*size_Mat];
-      D7.f[3] = &DD7[4*size_Mat];
-      D7.f[6] = &DD7[5*size_Mat];
-      D7.f[5] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[2] = &DD7[1*numberOfLBnodes];
+      D7.f[1] = &DD7[2*numberOfLBnodes];
+      D7.f[4] = &DD7[3*numberOfLBnodes];
+      D7.f[3] = &DD7[4*numberOfLBnodes];
+      D7.f[6] = &DD7[5*numberOfLBnodes];
+      D7.f[5] = &DD7[6*numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -265,7 +265,7 @@ __global__ void CalcConc7( real* Conc,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       //////////////////////////////////////////////////////////////////////////
       //index
@@ -327,63 +327,63 @@ __global__ void CalcConc7( real* Conc,
 //    Distributions27 D27;
 //    if (isEvenTimestep==true)
 //    {
-//       D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-//       D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-//       D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-//       D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-//       D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-//       D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-//       D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-//       D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-//       D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-//       D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-//       D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-//       D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-//       D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-//       D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-//       D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-//       D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-//       D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-//       D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-//       D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-//       D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-//       D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-//       D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-//       D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-//       D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-//       D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-//       D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-//       D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+//       D27.f[DIR_P00] = &DD27[DIR_P00 * size_Mat];
+//       D27.f[DIR_M00] = &DD27[DIR_M00 * size_Mat];
+//       D27.f[DIR_0P0] = &DD27[DIR_0P0 * size_Mat];
+//       D27.f[DIR_0M0] = &DD27[DIR_0M0 * size_Mat];
+//       D27.f[DIR_00P] = &DD27[DIR_00P * size_Mat];
+//       D27.f[DIR_00M] = &DD27[DIR_00M * size_Mat];
+//       D27.f[DIR_PP0] = &DD27[DIR_PP0 * size_Mat];
+//       D27.f[DIR_MM0] = &DD27[DIR_MM0 * size_Mat];
+//       D27.f[DIR_PM0] = &DD27[DIR_PM0 * size_Mat];
+//       D27.f[DIR_MP0] = &DD27[DIR_MP0 * size_Mat];
+//       D27.f[DIR_P0P] = &DD27[DIR_P0P * size_Mat];
+//       D27.f[DIR_M0M] = &DD27[DIR_M0M * size_Mat];
+//       D27.f[DIR_P0M] = &DD27[DIR_P0M * size_Mat];
+//       D27.f[DIR_M0P] = &DD27[DIR_M0P * size_Mat];
+//       D27.f[DIR_0PP] = &DD27[DIR_0PP * size_Mat];
+//       D27.f[DIR_0MM] = &DD27[DIR_0MM * size_Mat];
+//       D27.f[DIR_0PM] = &DD27[DIR_0PM * size_Mat];
+//       D27.f[DIR_0MP] = &DD27[DIR_0MP * size_Mat];
+//       D27.f[DIR_000] = &DD27[DIR_000 * size_Mat];
+//       D27.f[DIR_PPP] = &DD27[DIR_PPP * size_Mat];
+//       D27.f[DIR_MMP] = &DD27[DIR_MMP * size_Mat];
+//       D27.f[DIR_PMP] = &DD27[DIR_PMP * size_Mat];
+//       D27.f[DIR_MPP] = &DD27[DIR_MPP * size_Mat];
+//       D27.f[DIR_PPM] = &DD27[DIR_PPM * size_Mat];
+//       D27.f[DIR_MMM] = &DD27[DIR_MMM * size_Mat];
+//       D27.f[DIR_PMM] = &DD27[DIR_PMM * size_Mat];
+//       D27.f[DIR_MPM] = &DD27[DIR_MPM * size_Mat];
 //    }
 //    else
 //    {
-//       D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-//       D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-//       D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-//       D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-//       D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-//       D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-//       D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-//       D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-//       D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-//       D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-//       D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-//       D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-//       D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-//       D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-//       D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-//       D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-//       D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-//       D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-//       D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-//       D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-//       D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-//       D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
-//       D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-//       D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-//       D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-//       D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-//       D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
+//       D27.f[DIR_M00] = &DD27[DIR_P00 * size_Mat];
+//       D27.f[DIR_P00] = &DD27[DIR_M00 * size_Mat];
+//       D27.f[DIR_0M0] = &DD27[DIR_0P0 * size_Mat];
+//       D27.f[DIR_0P0] = &DD27[DIR_0M0 * size_Mat];
+//       D27.f[DIR_00M] = &DD27[DIR_00P * size_Mat];
+//       D27.f[DIR_00P] = &DD27[DIR_00M * size_Mat];
+//       D27.f[DIR_MM0] = &DD27[DIR_PP0 * size_Mat];
+//       D27.f[DIR_PP0] = &DD27[DIR_MM0 * size_Mat];
+//       D27.f[DIR_MP0] = &DD27[DIR_PM0 * size_Mat];
+//       D27.f[DIR_PM0] = &DD27[DIR_MP0 * size_Mat];
+//       D27.f[DIR_M0M] = &DD27[DIR_P0P * size_Mat];
+//       D27.f[DIR_P0P] = &DD27[DIR_M0M * size_Mat];
+//       D27.f[DIR_M0P] = &DD27[DIR_P0M * size_Mat];
+//       D27.f[DIR_P0M] = &DD27[DIR_M0P * size_Mat];
+//       D27.f[DIR_0MM] = &DD27[DIR_0PP * size_Mat];
+//       D27.f[DIR_0PP] = &DD27[DIR_0MM * size_Mat];
+//       D27.f[DIR_0MP] = &DD27[DIR_0PM * size_Mat];
+//       D27.f[DIR_0PM] = &DD27[DIR_0MP * size_Mat];
+//       D27.f[DIR_000] = &DD27[DIR_000 * size_Mat];
+//       D27.f[DIR_MMM] = &DD27[DIR_PPP * size_Mat];
+//       D27.f[DIR_PPM] = &DD27[DIR_MMP * size_Mat];
+//       D27.f[DIR_MPM] = &DD27[DIR_PMP * size_Mat];
+//       D27.f[DIR_PMM] = &DD27[DIR_MPP * size_Mat];
+//       D27.f[DIR_MMP] = &DD27[DIR_PPM * size_Mat];
+//       D27.f[DIR_PPP] = &DD27[DIR_MMM * size_Mat];
+//       D27.f[DIR_MPP] = &DD27[DIR_PMM * size_Mat];
+//       D27.f[DIR_PMP] = &DD27[DIR_MPM * size_Mat];
 //    }
 //    ////////////////////////////////////////////////////////////////////////////////
 //    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -432,20 +432,20 @@ __global__ void CalcConc7( real* Conc,
 
 //       if(geoD[k] == GEO_FLUID)
 //       {
-//          Conc[k]    =   (D27.f[DIR_P00   ])[ke  ]+ (D27.f[DIR_M00   ])[kw  ]+ 
-//                         (D27.f[DIR_0P0   ])[kn  ]+ (D27.f[DIR_0M0   ])[ks  ]+
-//                         (D27.f[DIR_00P   ])[kt  ]+ (D27.f[DIR_00M   ])[kb  ]+
-//                         (D27.f[DIR_PP0  ])[kne ]+ (D27.f[DIR_MM0  ])[ksw ]+
-//                         (D27.f[DIR_PM0  ])[kse ]+ (D27.f[DIR_MP0  ])[knw ]+
-//                         (D27.f[DIR_P0P  ])[kte ]+ (D27.f[DIR_M0M  ])[kbw ]+
-//                         (D27.f[DIR_P0M  ])[kbe ]+ (D27.f[DIR_M0P  ])[ktw ]+
-//                         (D27.f[DIR_0PP  ])[ktn ]+ (D27.f[DIR_0MM  ])[kbs ]+
-//                         (D27.f[DIR_0PM  ])[kbn ]+ (D27.f[DIR_0MP  ])[kts ]+
+//          Conc[k]    =   (D27.f[DIR_P00])[ke  ]+ (D27.f[DIR_M00])[kw  ]+ 
+//                         (D27.f[DIR_0P0])[kn  ]+ (D27.f[DIR_0M0])[ks  ]+
+//                         (D27.f[DIR_00P])[kt  ]+ (D27.f[DIR_00M])[kb  ]+
+//                         (D27.f[DIR_PP0])[kne ]+ (D27.f[DIR_MM0])[ksw ]+
+//                         (D27.f[DIR_PM0])[kse ]+ (D27.f[DIR_MP0])[knw ]+
+//                         (D27.f[DIR_P0P])[kte ]+ (D27.f[DIR_M0M])[kbw ]+
+//                         (D27.f[DIR_P0M])[kbe ]+ (D27.f[DIR_M0P])[ktw ]+
+//                         (D27.f[DIR_0PP])[ktn ]+ (D27.f[DIR_0MM])[kbs ]+
+//                         (D27.f[DIR_0PM])[kbn ]+ (D27.f[DIR_0MP])[kts ]+
 //                         (D27.f[DIR_000])[kzero]+ 
-//                         (D27.f[DIR_PPP ])[ktne]+ (D27.f[DIR_MMP ])[ktsw]+
-//                         (D27.f[DIR_PMP ])[ktse]+ (D27.f[DIR_MPP ])[ktnw]+
-//                         (D27.f[DIR_PPM ])[kbne]+ (D27.f[DIR_MMM ])[kbsw]+
-//                         (D27.f[DIR_PMM ])[kbse]+ (D27.f[DIR_MPM ])[kbnw];
+//                         (D27.f[DIR_PPP])[ktne]+ (D27.f[DIR_MMP])[ktsw]+
+//                         (D27.f[DIR_PMP])[ktse]+ (D27.f[DIR_MPP])[ktnw]+
+//                         (D27.f[DIR_PPM])[kbne]+ (D27.f[DIR_MMM])[kbsw]+
+//                         (D27.f[DIR_PMM])[kbse]+ (D27.f[DIR_MPM])[kbnw];
 //       }
 //    }   
 // }
@@ -476,30 +476,30 @@ __global__ void GetPlaneConc7(real* Conc,
 											unsigned int* neighborX,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
-											unsigned int size_Mat,
+											unsigned long long numberOfLBnodes,
 											real* DD7,
 											bool isEvenTimestep)
 {
    Distributions7 D7;
    if (isEvenTimestep==true)
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[1] = &DD7[1*size_Mat];
-      D7.f[2] = &DD7[2*size_Mat];
-      D7.f[3] = &DD7[3*size_Mat];
-      D7.f[4] = &DD7[4*size_Mat];
-      D7.f[5] = &DD7[5*size_Mat];
-      D7.f[6] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[1] = &DD7[1*numberOfLBnodes];
+      D7.f[2] = &DD7[2*numberOfLBnodes];
+      D7.f[3] = &DD7[3*numberOfLBnodes];
+      D7.f[4] = &DD7[4*numberOfLBnodes];
+      D7.f[5] = &DD7[5*numberOfLBnodes];
+      D7.f[6] = &DD7[6*numberOfLBnodes];
    } 
    else
    {
-      D7.f[0] = &DD7[0*size_Mat];
-      D7.f[2] = &DD7[1*size_Mat];
-      D7.f[1] = &DD7[2*size_Mat];
-      D7.f[4] = &DD7[3*size_Mat];
-      D7.f[3] = &DD7[4*size_Mat];
-      D7.f[6] = &DD7[5*size_Mat];
-      D7.f[5] = &DD7[6*size_Mat];
+      D7.f[0] = &DD7[0*numberOfLBnodes];
+      D7.f[2] = &DD7[1*numberOfLBnodes];
+      D7.f[1] = &DD7[2*numberOfLBnodes];
+      D7.f[4] = &DD7[3*numberOfLBnodes];
+      D7.f[3] = &DD7[4*numberOfLBnodes];
+      D7.f[6] = &DD7[5*numberOfLBnodes];
+      D7.f[5] = &DD7[6*numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -581,70 +581,70 @@ __global__ void GetPlaneConc27(real* Conc,
 											 unsigned int* neighborX,
 											 unsigned int* neighborY,
 											 unsigned int* neighborZ,
-											 unsigned int size_Mat,
+											 unsigned long long numberOfLBnodes,
 											 real* DD27,
 											 bool isEvenTimestep)
 {
    Distributions27 D27;
    if (isEvenTimestep==true)
    {
-      D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+      D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
    }
    else
    {
-      D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-      D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-      D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-      D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-      D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-      D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-      D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-      D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-      D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-      D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-      D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-      D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-      D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-      D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-      D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-      D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-      D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-      D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-      D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-      D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-      D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-      D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
-      D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-      D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-      D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-      D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-      D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
+      D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+      D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+      D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+      D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+      D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+      D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+      D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+      D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+      D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+      D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+      D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+      D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+      D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+      D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+      D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+      D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+      D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+      D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+      D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+      D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+      D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+      D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
+      D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+      D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+      D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+      D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+      D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -693,20 +693,20 @@ __global__ void GetPlaneConc27(real* Conc,
 
       if(geoD[k] == GEO_FLUID)
       {
-         Conc[k]    =   (D27.f[DIR_P00   ])[ke  ]+ (D27.f[DIR_M00   ])[kw  ]+ 
-                        (D27.f[DIR_0P0   ])[kn  ]+ (D27.f[DIR_0M0   ])[ks  ]+
-                        (D27.f[DIR_00P   ])[kt  ]+ (D27.f[DIR_00M   ])[kb  ]+
-                        (D27.f[DIR_PP0  ])[kne ]+ (D27.f[DIR_MM0  ])[ksw ]+
-                        (D27.f[DIR_PM0  ])[kse ]+ (D27.f[DIR_MP0  ])[knw ]+
-                        (D27.f[DIR_P0P  ])[kte ]+ (D27.f[DIR_M0M  ])[kbw ]+
-                        (D27.f[DIR_P0M  ])[kbe ]+ (D27.f[DIR_M0P  ])[ktw ]+
-                        (D27.f[DIR_0PP  ])[ktn ]+ (D27.f[DIR_0MM  ])[kbs ]+
-                        (D27.f[DIR_0PM  ])[kbn ]+ (D27.f[DIR_0MP  ])[kts ]+
+         Conc[k]    =   (D27.f[DIR_P00])[ke  ]+ (D27.f[DIR_M00])[kw  ]+ 
+                        (D27.f[DIR_0P0])[kn  ]+ (D27.f[DIR_0M0])[ks  ]+
+                        (D27.f[DIR_00P])[kt  ]+ (D27.f[DIR_00M])[kb  ]+
+                        (D27.f[DIR_PP0])[kne ]+ (D27.f[DIR_MM0])[ksw ]+
+                        (D27.f[DIR_PM0])[kse ]+ (D27.f[DIR_MP0])[knw ]+
+                        (D27.f[DIR_P0P])[kte ]+ (D27.f[DIR_M0M])[kbw ]+
+                        (D27.f[DIR_P0M])[kbe ]+ (D27.f[DIR_M0P])[ktw ]+
+                        (D27.f[DIR_0PP])[ktn ]+ (D27.f[DIR_0MM])[kbs ]+
+                        (D27.f[DIR_0PM])[kbn ]+ (D27.f[DIR_0MP])[kts ]+
                         (D27.f[DIR_000])[kzero]+ 
-                        (D27.f[DIR_PPP ])[ktne]+ (D27.f[DIR_MMP ])[ktsw]+
-                        (D27.f[DIR_PMP ])[ktse]+ (D27.f[DIR_MPP ])[ktnw]+
-                        (D27.f[DIR_PPM ])[kbne]+ (D27.f[DIR_MMM ])[kbsw]+
-                        (D27.f[DIR_PMM ])[kbse]+ (D27.f[DIR_MPM ])[kbnw];
+                        (D27.f[DIR_PPP])[ktne]+ (D27.f[DIR_MMP])[ktsw]+
+                        (D27.f[DIR_PMP])[ktse]+ (D27.f[DIR_MPP])[ktnw]+
+                        (D27.f[DIR_PPM])[kbne]+ (D27.f[DIR_MMM])[kbsw]+
+                        (D27.f[DIR_PMM])[kbse]+ (D27.f[DIR_MPM])[kbnw];
       }
    }   
 }
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu b/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu
index 4792b8846b2612383c07a97419e0473b21ebd187..c1b178a4a1ea94b61afdcbe78476684d032f43c0 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu
@@ -27,7 +27,7 @@ __global__ void LBCalcMac27( real* vxD,
                                         unsigned int* neighborX,
                                         unsigned int* neighborY,
                                         unsigned int* neighborZ,
-                                        unsigned int size_Mat,
+                                        unsigned long long numberOfLBnodes,
                                         real* distributions,
                                         bool isEvenTimestep)
 {
@@ -44,7 +44,7 @@ __global__ void LBCalcMac27( real* vxD,
    const unsigned int k = nx*(ny*z + y) + x; // Zugriff auf arrays im device
 
 
-   if(k >= size_Mat)
+   if(k >= numberOfLBnodes)
       return;
 
    if(!vf::gpu::isValidFluidNode(geoD[k]))
@@ -55,7 +55,7 @@ __global__ void LBCalcMac27( real* vxD,
    vyD[k]  = c0o1;
    vzD[k]  = c0o1;
 
-   vf::gpu::DistributionWrapper distr_wrapper(distributions, size_Mat, isEvenTimestep, k, neighborX, neighborY, neighborZ);
+   vf::gpu::DistributionWrapper distr_wrapper(distributions, numberOfLBnodes, isEvenTimestep, k, neighborX, neighborY, neighborZ);
    const auto& distribution = distr_wrapper.distribution;
 
    rhoD[k] = vf::lbm::getDensity(distribution.f);
@@ -79,70 +79,70 @@ __global__ void LBCalcMacSP27( real* vxD,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           real* DD,
                                           bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -155,7 +155,7 @@ __global__ void LBCalcMacSP27( real* vxD,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       //////////////////////////////////////////////////////////////////////////
       //index
@@ -195,66 +195,66 @@ __global__ void LBCalcMacSP27( real* vxD,
 
       if(geoD[k] == GEO_FLUID)
       {
-         rhoD[k]    =   (D.f[DIR_P00   ])[ke  ]+ (D.f[DIR_M00   ])[kw  ]+ 
-                        (D.f[DIR_0P0   ])[kn  ]+ (D.f[DIR_0M0   ])[ks  ]+
-                        (D.f[DIR_00P   ])[kt  ]+ (D.f[DIR_00M   ])[kb  ]+
-                        (D.f[DIR_PP0  ])[kne ]+ (D.f[DIR_MM0  ])[ksw ]+
-                        (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_P0P  ])[kte ]+ (D.f[DIR_M0M  ])[kbw ]+
-                        (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_0PP  ])[ktn ]+ (D.f[DIR_0MM  ])[kbs ]+
-                        (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ]+
+         rhoD[k]    =   (D.f[DIR_P00])[ke  ]+ (D.f[DIR_M00])[kw  ]+ 
+                        (D.f[DIR_0P0])[kn  ]+ (D.f[DIR_0M0])[ks  ]+
+                        (D.f[DIR_00P])[kt  ]+ (D.f[DIR_00M])[kb  ]+
+                        (D.f[DIR_PP0])[kne ]+ (D.f[DIR_MM0])[ksw ]+
+                        (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_P0P])[kte ]+ (D.f[DIR_M0M])[kbw ]+
+                        (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_0PP])[ktn ]+ (D.f[DIR_0MM])[kbs ]+
+                        (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ]+
                         (D.f[DIR_000])[kzero]+ 
-                        (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]+ (D.f[DIR_MMM ])[kbsw]+ 
-                        (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw];
-
-         vxD[k]     =   (D.f[DIR_P00   ])[ke  ]- (D.f[DIR_M00   ])[kw  ]+ 
-                        (D.f[DIR_PP0  ])[kne ]- (D.f[DIR_MM0  ])[ksw ]+
-                        (D.f[DIR_PM0  ])[kse ]- (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_P0P  ])[kte ]- (D.f[DIR_M0M  ])[kbw ]+
-                        (D.f[DIR_P0M  ])[kbe ]- (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_PPP ])[ktne]- (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]- (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]+ 
-                        (D.f[DIR_PMM ])[kbse]- (D.f[DIR_MPM ])[kbnw];
-
-         vyD[k]     =   (D.f[DIR_0P0   ])[kn  ]- (D.f[DIR_0M0   ])[ks  ]+
-                        (D.f[DIR_PP0  ])[kne ]- (D.f[DIR_MM0  ])[ksw ]-
-                        (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_0PP  ])[ktn ]- (D.f[DIR_0MM  ])[kbs ]+
-                        (D.f[DIR_0PM  ])[kbn ]- (D.f[DIR_0MP  ])[kts ]+
-                        (D.f[DIR_PPP ])[ktne]- (D.f[DIR_MMP ])[ktsw]- 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]- 
-                        (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw];
-
-         vzD[k]     =   (D.f[DIR_00P   ])[kt  ]- (D.f[DIR_00M   ])[kb  ]+
-                        (D.f[DIR_P0P  ])[kte ]- (D.f[DIR_M0M  ])[kbw ]-
-                        (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_0PP  ])[ktn ]- (D.f[DIR_0MM  ])[kbs ]-
-                        (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ]+
-                        (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]- 
-                        (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]- 
-                        (D.f[DIR_PMM ])[kbse]- (D.f[DIR_MPM ])[kbnw];
-
-         pressD[k]  =  ((D.f[DIR_P00   ])[ke  ]+ (D.f[DIR_M00   ])[kw  ]+ 
-                        (D.f[DIR_0P0   ])[kn  ]+ (D.f[DIR_0M0   ])[ks  ]+
-                        (D.f[DIR_00P   ])[kt  ]+ (D.f[DIR_00M   ])[kb  ]+
+                        (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]+ (D.f[DIR_MMM])[kbsw]+ 
+                        (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw];
+
+         vxD[k]     =   (D.f[DIR_P00])[ke  ]- (D.f[DIR_M00])[kw  ]+ 
+                        (D.f[DIR_PP0])[kne ]- (D.f[DIR_MM0])[ksw ]+
+                        (D.f[DIR_PM0])[kse ]- (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_P0P])[kte ]- (D.f[DIR_M0M])[kbw ]+
+                        (D.f[DIR_P0M])[kbe ]- (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_PPP])[ktne]- (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]- (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]+ 
+                        (D.f[DIR_PMM])[kbse]- (D.f[DIR_MPM])[kbnw];
+
+         vyD[k]     =   (D.f[DIR_0P0])[kn  ]- (D.f[DIR_0M0])[ks  ]+
+                        (D.f[DIR_PP0])[kne ]- (D.f[DIR_MM0])[ksw ]-
+                        (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_0PP])[ktn ]- (D.f[DIR_0MM])[kbs ]+
+                        (D.f[DIR_0PM])[kbn ]- (D.f[DIR_0MP])[kts ]+
+                        (D.f[DIR_PPP])[ktne]- (D.f[DIR_MMP])[ktsw]- 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]- 
+                        (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw];
+
+         vzD[k]     =   (D.f[DIR_00P])[kt  ]- (D.f[DIR_00M])[kb  ]+
+                        (D.f[DIR_P0P])[kte ]- (D.f[DIR_M0M])[kbw ]-
+                        (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_0PP])[ktn ]- (D.f[DIR_0MM])[kbs ]-
+                        (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ]+
+                        (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]- 
+                        (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]- 
+                        (D.f[DIR_PMM])[kbse]- (D.f[DIR_MPM])[kbnw];
+
+         pressD[k]  =  ((D.f[DIR_P00])[ke  ]+ (D.f[DIR_M00])[kw  ]+ 
+                        (D.f[DIR_0P0])[kn  ]+ (D.f[DIR_0M0])[ks  ]+
+                        (D.f[DIR_00P])[kt  ]+ (D.f[DIR_00M])[kb  ]+
                         2.f*(
-                        (D.f[DIR_PP0  ])[kne ]+ (D.f[DIR_MM0  ])[ksw ]+
-                        (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_P0P  ])[kte ]+ (D.f[DIR_M0M  ])[kbw ]+
-                        (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_0PP  ])[ktn ]+ (D.f[DIR_0MM  ])[kbs ]+
-                        (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ])+
+                        (D.f[DIR_PP0])[kne ]+ (D.f[DIR_MM0])[ksw ]+
+                        (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_P0P])[kte ]+ (D.f[DIR_M0M])[kbw ]+
+                        (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_0PP])[ktn ]+ (D.f[DIR_0MM])[kbs ]+
+                        (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ])+
                         3.f*(
-                        (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]+ (D.f[DIR_MMM ])[kbsw]+ 
-                        (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw])-
+                        (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]+ (D.f[DIR_MMM])[kbsw]+ 
+                        (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw])-
                         rhoD[k]-(vxD[k] * vxD[k] + vyD[k] * vyD[k] + vzD[k] * vzD[k]) * (c1o1+c0o1*rhoD[k])) * c1o2+rhoD[k]; // times zero for incompressible case   
          //achtung op hart gesetzt Annahme op = 1 ;                                                    ^^^^(1.0/op-0.5)=0.5
 
@@ -274,13 +274,13 @@ __global__ void LBCalcMacCompSP27(
    unsigned int *neighborX,
    unsigned int *neighborY,
    unsigned int *neighborZ,
-   unsigned int size_Mat,
+   unsigned long long numberOfLBnodes,
    real *distributions,
    bool isEvenTimestep)
 {
     const unsigned k = vf::gpu::getNodeIndex();
 
-    if(k >= size_Mat)
+    if(k >= numberOfLBnodes)
         return;
 
     pressD[k] = c0o1;
@@ -292,7 +292,7 @@ __global__ void LBCalcMacCompSP27(
     if (!vf::gpu::isValidFluidNode(geoD[k]))
         return;
 
-    vf::gpu::DistributionWrapper distr_wrapper(distributions, size_Mat, isEvenTimestep, k, neighborX, neighborY,
+    vf::gpu::DistributionWrapper distr_wrapper(distributions, numberOfLBnodes, isEvenTimestep, k, neighborX, neighborY,
                                                neighborZ);
     const auto &distribution = distr_wrapper.distribution;
 
@@ -348,70 +348,70 @@ __global__ void LBCalcMedSP27( real* vxD,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           real* DD,
                                           bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -424,7 +424,7 @@ __global__ void LBCalcMedSP27( real* vxD,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       //////////////////////////////////////////////////////////////////////////
       //index
@@ -470,70 +470,70 @@ __global__ void LBCalcMedSP27( real* vxD,
 
       if(geoD[k] == GEO_FLUID)
       {
-         rhoD[k]    =   (D.f[DIR_P00   ])[ke  ]+ (D.f[DIR_M00   ])[kw  ]+ 
-                        (D.f[DIR_0P0   ])[kn  ]+ (D.f[DIR_0M0   ])[ks  ]+
-                        (D.f[DIR_00P   ])[kt  ]+ (D.f[DIR_00M   ])[kb  ]+
-                        (D.f[DIR_PP0  ])[kne ]+ (D.f[DIR_MM0  ])[ksw ]+
-                        (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_P0P  ])[kte ]+ (D.f[DIR_M0M  ])[kbw ]+
-                        (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_0PP  ])[ktn ]+ (D.f[DIR_0MM  ])[kbs ]+
-                        (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ]+
+         rhoD[k]    =   (D.f[DIR_P00])[ke  ]+ (D.f[DIR_M00])[kw  ]+ 
+                        (D.f[DIR_0P0])[kn  ]+ (D.f[DIR_0M0])[ks  ]+
+                        (D.f[DIR_00P])[kt  ]+ (D.f[DIR_00M])[kb  ]+
+                        (D.f[DIR_PP0])[kne ]+ (D.f[DIR_MM0])[ksw ]+
+                        (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_P0P])[kte ]+ (D.f[DIR_M0M])[kbw ]+
+                        (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_0PP])[ktn ]+ (D.f[DIR_0MM])[kbs ]+
+                        (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ]+
                         (D.f[DIR_000])[kzero]+ 
-                        (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]+ (D.f[DIR_MMM ])[kbsw]+ 
-                        (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw]+
+                        (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]+ (D.f[DIR_MMM])[kbsw]+ 
+                        (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw]+
                         RHO;
 
-         vxD[k]     =   (D.f[DIR_P00   ])[ke  ]- (D.f[DIR_M00   ])[kw  ]+ 
-                        (D.f[DIR_PP0  ])[kne ]- (D.f[DIR_MM0  ])[ksw ]+
-                        (D.f[DIR_PM0  ])[kse ]- (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_P0P  ])[kte ]- (D.f[DIR_M0M  ])[kbw ]+
-                        (D.f[DIR_P0M  ])[kbe ]- (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_PPP ])[ktne]- (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]- (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]+ 
-                        (D.f[DIR_PMM ])[kbse]- (D.f[DIR_MPM ])[kbnw]+
+         vxD[k]     =   (D.f[DIR_P00])[ke  ]- (D.f[DIR_M00])[kw  ]+ 
+                        (D.f[DIR_PP0])[kne ]- (D.f[DIR_MM0])[ksw ]+
+                        (D.f[DIR_PM0])[kse ]- (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_P0P])[kte ]- (D.f[DIR_M0M])[kbw ]+
+                        (D.f[DIR_P0M])[kbe ]- (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_PPP])[ktne]- (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]- (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]+ 
+                        (D.f[DIR_PMM])[kbse]- (D.f[DIR_MPM])[kbnw]+
                         VX;
 
-         vyD[k]     =   (D.f[DIR_0P0   ])[kn  ]- (D.f[DIR_0M0   ])[ks  ]+
-                        (D.f[DIR_PP0  ])[kne ]- (D.f[DIR_MM0  ])[ksw ]-
-                        (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_0PP  ])[ktn ]- (D.f[DIR_0MM  ])[kbs ]+
-                        (D.f[DIR_0PM  ])[kbn ]- (D.f[DIR_0MP  ])[kts ]+
-                        (D.f[DIR_PPP ])[ktne]- (D.f[DIR_MMP ])[ktsw]- 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]- 
-                        (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw]+
+         vyD[k]     =   (D.f[DIR_0P0])[kn  ]- (D.f[DIR_0M0])[ks  ]+
+                        (D.f[DIR_PP0])[kne ]- (D.f[DIR_MM0])[ksw ]-
+                        (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_0PP])[ktn ]- (D.f[DIR_0MM])[kbs ]+
+                        (D.f[DIR_0PM])[kbn ]- (D.f[DIR_0MP])[kts ]+
+                        (D.f[DIR_PPP])[ktne]- (D.f[DIR_MMP])[ktsw]- 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]- 
+                        (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw]+
                         VY;
 
-         vzD[k]     =   (D.f[DIR_00P   ])[kt  ]- (D.f[DIR_00M   ])[kb  ]+
-                        (D.f[DIR_P0P  ])[kte ]- (D.f[DIR_M0M  ])[kbw ]-
-                        (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_0PP  ])[ktn ]- (D.f[DIR_0MM  ])[kbs ]-
-                        (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ]+
-                        (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]- 
-                        (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]- 
-                        (D.f[DIR_PMM ])[kbse]- (D.f[DIR_MPM ])[kbnw]+
+         vzD[k]     =   (D.f[DIR_00P])[kt  ]- (D.f[DIR_00M])[kb  ]+
+                        (D.f[DIR_P0P])[kte ]- (D.f[DIR_M0M])[kbw ]-
+                        (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_0PP])[ktn ]- (D.f[DIR_0MM])[kbs ]-
+                        (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ]+
+                        (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]- 
+                        (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]- 
+                        (D.f[DIR_PMM])[kbse]- (D.f[DIR_MPM])[kbnw]+
                         VZ;
 
-         pressD[k]  =   ((D.f[DIR_P00   ])[ke  ]+ (D.f[DIR_M00   ])[kw  ]+ 
-                        (D.f[DIR_0P0   ])[kn  ]+ (D.f[DIR_0M0   ])[ks  ]+
-                        (D.f[DIR_00P   ])[kt  ]+ (D.f[DIR_00M   ])[kb  ]+
+         pressD[k]  =   ((D.f[DIR_P00])[ke  ]+ (D.f[DIR_M00])[kw  ]+ 
+                        (D.f[DIR_0P0])[kn  ]+ (D.f[DIR_0M0])[ks  ]+
+                        (D.f[DIR_00P])[kt  ]+ (D.f[DIR_00M])[kb  ]+
                         c2o1*(
-                        (D.f[DIR_PP0  ])[kne ]+ (D.f[DIR_MM0  ])[ksw ]+
-                        (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_P0P  ])[kte ]+ (D.f[DIR_M0M  ])[kbw ]+
-                        (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_0PP  ])[ktn ]+ (D.f[DIR_0MM  ])[kbs ]+
-                        (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ])+
+                        (D.f[DIR_PP0])[kne ]+ (D.f[DIR_MM0])[ksw ]+
+                        (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_P0P])[kte ]+ (D.f[DIR_M0M])[kbw ]+
+                        (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_0PP])[ktn ]+ (D.f[DIR_0MM])[kbs ]+
+                        (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ])+
                         c3o1*(
-                        (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]+ (D.f[DIR_MMM ])[kbsw]+ 
-                        (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw])-
+                        (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]+ (D.f[DIR_MMM])[kbsw]+ 
+                        (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw])-
                         rhoD[k]-(vxD[k] * vxD[k] + vyD[k] * vyD[k] + vzD[k] * vzD[k]) * (c1o1+rhoD[k])) * c1o2+rhoD[k]+
                         PRESS;    
          //achtung op hart gesetzt Annahme op = 1 ;                                                    ^^^^(1.0/op-0.5)=0.5
@@ -572,70 +572,70 @@ __global__ void LBCalcMedCompSP27( real* vxD,
 											  unsigned int* neighborX,
 											  unsigned int* neighborY,
 											  unsigned int* neighborZ,
-											  unsigned int size_Mat,
+											  unsigned long long numberOfLBnodes,
 											  real* DD,
 											  bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -648,7 +648,7 @@ __global__ void LBCalcMedCompSP27( real* vxD,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       //////////////////////////////////////////////////////////////////////////
       //index
@@ -761,56 +761,56 @@ __global__ void LBCalcMedCompSP27( real* vxD,
 			 // (D.f[DIR_PMM])[kbse] + (D.f[DIR_MPM])[kbnw];// +RHO;
 
     //     vxD[k] =  
-			 //((D.f[DIR_P00  ])[ke  ]- (D.f[DIR_M00   ])[kw  ]+ 
-    //         (D.f[DIR_PP0  ])[kne ]- (D.f[DIR_MM0  ])[ksw ]+
-    //         (D.f[DIR_PM0  ])[kse ]- (D.f[DIR_MP0  ])[knw ]+
-    //         (D.f[DIR_P0P  ])[kte ]- (D.f[DIR_M0M  ])[kbw ]+
-    //         (D.f[DIR_P0M  ])[kbe ]- (D.f[DIR_M0P  ])[ktw ]+
-    //         (D.f[DIR_PPP ])[ktne]- (D.f[DIR_MMP ])[ktsw]+ 
-    //         (D.f[DIR_PMP ])[ktse]- (D.f[DIR_MPP ])[ktnw]+ 
-    //         (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]+ 
-    //         (D.f[DIR_PMM ])[kbse]- (D.f[DIR_MPM ])[kbnw]) / (one + rhoD[k])+
+			 //((D.f[DIR_P00])[ke  ]- (D.f[DIR_M00])[kw  ]+ 
+    //         (D.f[DIR_PP0])[kne ]- (D.f[DIR_MM0])[ksw ]+
+    //         (D.f[DIR_PM0])[kse ]- (D.f[DIR_MP0])[knw ]+
+    //         (D.f[DIR_P0P])[kte ]- (D.f[DIR_M0M])[kbw ]+
+    //         (D.f[DIR_P0M])[kbe ]- (D.f[DIR_M0P])[ktw ]+
+    //         (D.f[DIR_PPP])[ktne]- (D.f[DIR_MMP])[ktsw]+ 
+    //         (D.f[DIR_PMP])[ktse]- (D.f[DIR_MPP])[ktnw]+ 
+    //         (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]+ 
+    //         (D.f[DIR_PMM])[kbse]- (D.f[DIR_MPM])[kbnw]) / (one + rhoD[k])+
     //         VX;
 
     //     vyD[k] =  
-			 //((D.f[DIR_0P0  ])[kn  ]- (D.f[DIR_0M0   ])[ks  ]+
-    //         (D.f[DIR_PP0  ])[kne ]- (D.f[DIR_MM0  ])[ksw ]-
-    //         (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-    //         (D.f[DIR_0PP  ])[ktn ]- (D.f[DIR_0MM  ])[kbs ]+
-    //         (D.f[DIR_0PM  ])[kbn ]- (D.f[DIR_0MP  ])[kts ]+
-    //         (D.f[DIR_PPP ])[ktne]- (D.f[DIR_MMP ])[ktsw]- 
-    //         (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-    //         (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]- 
-    //         (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw]) / (one + rhoD[k])+
+			 //((D.f[DIR_0P0])[kn  ]- (D.f[DIR_0M0])[ks  ]+
+    //         (D.f[DIR_PP0])[kne ]- (D.f[DIR_MM0])[ksw ]-
+    //         (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+    //         (D.f[DIR_0PP])[ktn ]- (D.f[DIR_0MM])[kbs ]+
+    //         (D.f[DIR_0PM])[kbn ]- (D.f[DIR_0MP])[kts ]+
+    //         (D.f[DIR_PPP])[ktne]- (D.f[DIR_MMP])[ktsw]- 
+    //         (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+    //         (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]- 
+    //         (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw]) / (one + rhoD[k])+
     //         VY;
 
     //     vzD[k] =  
-			 //((D.f[DIR_00P  ])[kt  ]- (D.f[DIR_00M   ])[kb  ]+
-    //         (D.f[DIR_P0P  ])[kte ]- (D.f[DIR_M0M  ])[kbw ]-
-    //         (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-    //         (D.f[DIR_0PP  ])[ktn ]- (D.f[DIR_0MM  ])[kbs ]-
-    //         (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ]+
-    //         (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-    //         (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]- 
-    //         (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]- 
-    //         (D.f[DIR_PMM ])[kbse]- (D.f[DIR_MPM ])[kbnw]) / (one + rhoD[k])+
+			 //((D.f[DIR_00P])[kt  ]- (D.f[DIR_00M])[kb  ]+
+    //         (D.f[DIR_P0P])[kte ]- (D.f[DIR_M0M])[kbw ]-
+    //         (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+    //         (D.f[DIR_0PP])[ktn ]- (D.f[DIR_0MM])[kbs ]-
+    //         (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ]+
+    //         (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+    //         (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]- 
+    //         (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]- 
+    //         (D.f[DIR_PMM])[kbse]- (D.f[DIR_MPM])[kbnw]) / (one + rhoD[k])+
     //         VZ;
 
-         pressD[k]  =  ((D.f[DIR_P00   ])[ke  ]+ (D.f[DIR_M00   ])[kw  ]+ 
-                        (D.f[DIR_0P0   ])[kn  ]+ (D.f[DIR_0M0   ])[ks  ]+
-                        (D.f[DIR_00P   ])[kt  ]+ (D.f[DIR_00M   ])[kb  ]+
+         pressD[k]  =  ((D.f[DIR_P00])[ke  ]+ (D.f[DIR_M00])[kw  ]+ 
+                        (D.f[DIR_0P0])[kn  ]+ (D.f[DIR_0M0])[ks  ]+
+                        (D.f[DIR_00P])[kt  ]+ (D.f[DIR_00M])[kb  ]+
                         c2o1*(
-                        (D.f[DIR_PP0  ])[kne ]+ (D.f[DIR_MM0  ])[ksw ]+
-                        (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_P0P  ])[kte ]+ (D.f[DIR_M0M  ])[kbw ]+
-                        (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_0PP  ])[ktn ]+ (D.f[DIR_0MM  ])[kbs ]+
-                        (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ])+
+                        (D.f[DIR_PP0])[kne ]+ (D.f[DIR_MM0])[ksw ]+
+                        (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_P0P])[kte ]+ (D.f[DIR_M0M])[kbw ]+
+                        (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_0PP])[ktn ]+ (D.f[DIR_0MM])[kbs ]+
+                        (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ])+
                         c3o1*(
-                        (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]+ (D.f[DIR_MMM ])[kbsw]+ 
-                        (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw])-
+                        (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]+ (D.f[DIR_MMM])[kbsw]+ 
+                        (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw])-
                         rhoD[k]-(vxD[k] * vxD[k] + vyD[k] * vyD[k] + vzD[k] * vzD[k]) * (c1o1+rhoD[k])) * c1o2+rhoD[k]+
                         PRESS;    
          //achtung op hart gesetzt Annahme op = 1 ;                                                    ^^^^(1.0/op-0.5)=0.5
@@ -851,7 +851,7 @@ __global__ void LBCalcMedCompAD27(
 	unsigned int* neighborX,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	real* DD,
 	real* DD_AD,
 	bool isEvenTimestep)
@@ -859,125 +859,125 @@ __global__ void LBCalcMedCompAD27(
 	Distributions27 D;
 	if (isEvenTimestep == true)
 	{
-		D.f[DIR_P00] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM] = &DD[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	}
 	else
 	{
-		D.f[DIR_M00] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM] = &DD[DIR_PMP *size_Mat];
+		D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	Distributions27 Dad;
 	if (isEvenTimestep == true)
 	{
-		Dad.f[DIR_P00]    = &DD_AD[DIR_P00   *size_Mat];
-		Dad.f[DIR_M00]    = &DD_AD[DIR_M00   *size_Mat];
-		Dad.f[DIR_0P0]    = &DD_AD[DIR_0P0   *size_Mat];
-		Dad.f[DIR_0M0]    = &DD_AD[DIR_0M0   *size_Mat];
-		Dad.f[DIR_00P]    = &DD_AD[DIR_00P   *size_Mat];
-		Dad.f[DIR_00M]    = &DD_AD[DIR_00M   *size_Mat];
-		Dad.f[DIR_PP0]   = &DD_AD[DIR_PP0  *size_Mat];
-		Dad.f[DIR_MM0]   = &DD_AD[DIR_MM0  *size_Mat];
-		Dad.f[DIR_PM0]   = &DD_AD[DIR_PM0  *size_Mat];
-		Dad.f[DIR_MP0]   = &DD_AD[DIR_MP0  *size_Mat];
-		Dad.f[DIR_P0P]   = &DD_AD[DIR_P0P  *size_Mat];
-		Dad.f[DIR_M0M]   = &DD_AD[DIR_M0M  *size_Mat];
-		Dad.f[DIR_P0M]   = &DD_AD[DIR_P0M  *size_Mat];
-		Dad.f[DIR_M0P]   = &DD_AD[DIR_M0P  *size_Mat];
-		Dad.f[DIR_0PP]   = &DD_AD[DIR_0PP  *size_Mat];
-		Dad.f[DIR_0MM]   = &DD_AD[DIR_0MM  *size_Mat];
-		Dad.f[DIR_0PM]   = &DD_AD[DIR_0PM  *size_Mat];
-		Dad.f[DIR_0MP]   = &DD_AD[DIR_0MP  *size_Mat];
-		Dad.f[DIR_000] = &DD_AD[DIR_000*size_Mat];
-		Dad.f[DIR_PPP]  = &DD_AD[DIR_PPP *size_Mat];
-		Dad.f[DIR_MMP]  = &DD_AD[DIR_MMP *size_Mat];
-		Dad.f[DIR_PMP]  = &DD_AD[DIR_PMP *size_Mat];
-		Dad.f[DIR_MPP]  = &DD_AD[DIR_MPP *size_Mat];
-		Dad.f[DIR_PPM]  = &DD_AD[DIR_PPM *size_Mat];
-		Dad.f[DIR_MMM]  = &DD_AD[DIR_MMM *size_Mat];
-		Dad.f[DIR_PMM]  = &DD_AD[DIR_PMM *size_Mat];
-		Dad.f[DIR_MPM]  = &DD_AD[DIR_MPM *size_Mat];
+		Dad.f[DIR_P00]    = &DD_AD[DIR_P00 * numberOfLBnodes];
+		Dad.f[DIR_M00]    = &DD_AD[DIR_M00 * numberOfLBnodes];
+		Dad.f[DIR_0P0]    = &DD_AD[DIR_0P0 * numberOfLBnodes];
+		Dad.f[DIR_0M0]    = &DD_AD[DIR_0M0 * numberOfLBnodes];
+		Dad.f[DIR_00P]    = &DD_AD[DIR_00P * numberOfLBnodes];
+		Dad.f[DIR_00M]    = &DD_AD[DIR_00M * numberOfLBnodes];
+		Dad.f[DIR_PP0]   = &DD_AD[DIR_PP0 * numberOfLBnodes];
+		Dad.f[DIR_MM0]   = &DD_AD[DIR_MM0 * numberOfLBnodes];
+		Dad.f[DIR_PM0]   = &DD_AD[DIR_PM0 * numberOfLBnodes];
+		Dad.f[DIR_MP0]   = &DD_AD[DIR_MP0 * numberOfLBnodes];
+		Dad.f[DIR_P0P]   = &DD_AD[DIR_P0P * numberOfLBnodes];
+		Dad.f[DIR_M0M]   = &DD_AD[DIR_M0M * numberOfLBnodes];
+		Dad.f[DIR_P0M]   = &DD_AD[DIR_P0M * numberOfLBnodes];
+		Dad.f[DIR_M0P]   = &DD_AD[DIR_M0P * numberOfLBnodes];
+		Dad.f[DIR_0PP]   = &DD_AD[DIR_0PP * numberOfLBnodes];
+		Dad.f[DIR_0MM]   = &DD_AD[DIR_0MM * numberOfLBnodes];
+		Dad.f[DIR_0PM]   = &DD_AD[DIR_0PM * numberOfLBnodes];
+		Dad.f[DIR_0MP]   = &DD_AD[DIR_0MP * numberOfLBnodes];
+		Dad.f[DIR_000] = &DD_AD[DIR_000 * numberOfLBnodes];
+		Dad.f[DIR_PPP]  = &DD_AD[DIR_PPP * numberOfLBnodes];
+		Dad.f[DIR_MMP]  = &DD_AD[DIR_MMP * numberOfLBnodes];
+		Dad.f[DIR_PMP]  = &DD_AD[DIR_PMP * numberOfLBnodes];
+		Dad.f[DIR_MPP]  = &DD_AD[DIR_MPP * numberOfLBnodes];
+		Dad.f[DIR_PPM]  = &DD_AD[DIR_PPM * numberOfLBnodes];
+		Dad.f[DIR_MMM]  = &DD_AD[DIR_MMM * numberOfLBnodes];
+		Dad.f[DIR_PMM]  = &DD_AD[DIR_PMM * numberOfLBnodes];
+		Dad.f[DIR_MPM]  = &DD_AD[DIR_MPM * numberOfLBnodes];
 	}						
 	else					
 	{						
-		Dad.f[DIR_M00]    = &DD_AD[DIR_P00   *size_Mat];
-		Dad.f[DIR_P00]    = &DD_AD[DIR_M00   *size_Mat];
-		Dad.f[DIR_0M0]    = &DD_AD[DIR_0P0   *size_Mat];
-		Dad.f[DIR_0P0]    = &DD_AD[DIR_0M0   *size_Mat];
-		Dad.f[DIR_00M]    = &DD_AD[DIR_00P   *size_Mat];
-		Dad.f[DIR_00P]    = &DD_AD[DIR_00M   *size_Mat];
-		Dad.f[DIR_MM0]   = &DD_AD[DIR_PP0  *size_Mat];
-		Dad.f[DIR_PP0]   = &DD_AD[DIR_MM0  *size_Mat];
-		Dad.f[DIR_MP0]   = &DD_AD[DIR_PM0  *size_Mat];
-		Dad.f[DIR_PM0]   = &DD_AD[DIR_MP0  *size_Mat];
-		Dad.f[DIR_M0M]   = &DD_AD[DIR_P0P  *size_Mat];
-		Dad.f[DIR_P0P]   = &DD_AD[DIR_M0M  *size_Mat];
-		Dad.f[DIR_M0P]   = &DD_AD[DIR_P0M  *size_Mat];
-		Dad.f[DIR_P0M]   = &DD_AD[DIR_M0P  *size_Mat];
-		Dad.f[DIR_0MM]   = &DD_AD[DIR_0PP  *size_Mat];
-		Dad.f[DIR_0PP]   = &DD_AD[DIR_0MM  *size_Mat];
-		Dad.f[DIR_0MP]   = &DD_AD[DIR_0PM  *size_Mat];
-		Dad.f[DIR_0PM]   = &DD_AD[DIR_0MP  *size_Mat];
-		Dad.f[DIR_000] = &DD_AD[DIR_000*size_Mat];
-		Dad.f[DIR_PPP]  = &DD_AD[DIR_MMM *size_Mat];
-		Dad.f[DIR_MMP]  = &DD_AD[DIR_PPM *size_Mat];
-		Dad.f[DIR_PMP]  = &DD_AD[DIR_MPM *size_Mat];
-		Dad.f[DIR_MPP]  = &DD_AD[DIR_PMM *size_Mat];
-		Dad.f[DIR_PPM]  = &DD_AD[DIR_MMP *size_Mat];
-		Dad.f[DIR_MMM]  = &DD_AD[DIR_PPP *size_Mat];
-		Dad.f[DIR_PMM]  = &DD_AD[DIR_MPP *size_Mat];
-		Dad.f[DIR_MPM]  = &DD_AD[DIR_PMP *size_Mat];
+		Dad.f[DIR_M00]    = &DD_AD[DIR_P00 * numberOfLBnodes];
+		Dad.f[DIR_P00]    = &DD_AD[DIR_M00 * numberOfLBnodes];
+		Dad.f[DIR_0M0]    = &DD_AD[DIR_0P0 * numberOfLBnodes];
+		Dad.f[DIR_0P0]    = &DD_AD[DIR_0M0 * numberOfLBnodes];
+		Dad.f[DIR_00M]    = &DD_AD[DIR_00P * numberOfLBnodes];
+		Dad.f[DIR_00P]    = &DD_AD[DIR_00M * numberOfLBnodes];
+		Dad.f[DIR_MM0]   = &DD_AD[DIR_PP0 * numberOfLBnodes];
+		Dad.f[DIR_PP0]   = &DD_AD[DIR_MM0 * numberOfLBnodes];
+		Dad.f[DIR_MP0]   = &DD_AD[DIR_PM0 * numberOfLBnodes];
+		Dad.f[DIR_PM0]   = &DD_AD[DIR_MP0 * numberOfLBnodes];
+		Dad.f[DIR_M0M]   = &DD_AD[DIR_P0P * numberOfLBnodes];
+		Dad.f[DIR_P0P]   = &DD_AD[DIR_M0M * numberOfLBnodes];
+		Dad.f[DIR_M0P]   = &DD_AD[DIR_P0M * numberOfLBnodes];
+		Dad.f[DIR_P0M]   = &DD_AD[DIR_M0P * numberOfLBnodes];
+		Dad.f[DIR_0MM]   = &DD_AD[DIR_0PP * numberOfLBnodes];
+		Dad.f[DIR_0PP]   = &DD_AD[DIR_0MM * numberOfLBnodes];
+		Dad.f[DIR_0MP]   = &DD_AD[DIR_0PM * numberOfLBnodes];
+		Dad.f[DIR_0PM]   = &DD_AD[DIR_0MP * numberOfLBnodes];
+		Dad.f[DIR_000] = &DD_AD[DIR_000 * numberOfLBnodes];
+		Dad.f[DIR_PPP]  = &DD_AD[DIR_MMM * numberOfLBnodes];
+		Dad.f[DIR_MMP]  = &DD_AD[DIR_PPM * numberOfLBnodes];
+		Dad.f[DIR_PMP]  = &DD_AD[DIR_MPM * numberOfLBnodes];
+		Dad.f[DIR_MPP]  = &DD_AD[DIR_PMM * numberOfLBnodes];
+		Dad.f[DIR_PPM]  = &DD_AD[DIR_MMP * numberOfLBnodes];
+		Dad.f[DIR_MMM]  = &DD_AD[DIR_PPP * numberOfLBnodes];
+		Dad.f[DIR_PMM]  = &DD_AD[DIR_MPP * numberOfLBnodes];
+		Dad.f[DIR_MPM]  = &DD_AD[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -990,7 +990,7 @@ __global__ void LBCalcMedCompAD27(
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if (k < size_Mat)
+	if (k < numberOfLBnodes)
 	{
 		//////////////////////////////////////////////////////////////////////////
 		//index
@@ -1110,33 +1110,33 @@ __global__ void LBCalcMedCompAD27(
 				 PRESS;
 				 //achtung op hart gesetzt Annahme op = 1 ;                                                    ^^^^(1.0/op-0.5)=0.5
 			//////////////////////////////////////////////////////////////////////////
-			mfcbb = (Dad.f[DIR_P00   ])[k   ];
-			mfabb = (Dad.f[DIR_M00   ])[kw  ];
-			mfbcb = (Dad.f[DIR_0P0   ])[k   ];
-			mfbab = (Dad.f[DIR_0M0   ])[ks  ];
-			mfbbc = (Dad.f[DIR_00P   ])[k   ];
-			mfbba = (Dad.f[DIR_00M   ])[kb  ];
-			mfccb = (Dad.f[DIR_PP0  ])[k   ];
-			mfaab = (Dad.f[DIR_MM0  ])[ksw ];
-			mfcab = (Dad.f[DIR_PM0  ])[ks  ];
-			mfacb = (Dad.f[DIR_MP0  ])[kw  ];
-			mfcbc = (Dad.f[DIR_P0P  ])[k   ];
-			mfaba = (Dad.f[DIR_M0M  ])[kbw ];
-			mfcba = (Dad.f[DIR_P0M  ])[kb  ];
-			mfabc = (Dad.f[DIR_M0P  ])[kw  ];
-			mfbcc = (Dad.f[DIR_0PP  ])[k   ];
-			mfbaa = (Dad.f[DIR_0MM  ])[kbs ];
-			mfbca = (Dad.f[DIR_0PM  ])[kb  ];
-			mfbac = (Dad.f[DIR_0MP  ])[ks  ];
+			mfcbb = (Dad.f[DIR_P00])[k   ];
+			mfabb = (Dad.f[DIR_M00])[kw  ];
+			mfbcb = (Dad.f[DIR_0P0])[k   ];
+			mfbab = (Dad.f[DIR_0M0])[ks  ];
+			mfbbc = (Dad.f[DIR_00P])[k   ];
+			mfbba = (Dad.f[DIR_00M])[kb  ];
+			mfccb = (Dad.f[DIR_PP0])[k   ];
+			mfaab = (Dad.f[DIR_MM0])[ksw ];
+			mfcab = (Dad.f[DIR_PM0])[ks  ];
+			mfacb = (Dad.f[DIR_MP0])[kw  ];
+			mfcbc = (Dad.f[DIR_P0P])[k   ];
+			mfaba = (Dad.f[DIR_M0M])[kbw ];
+			mfcba = (Dad.f[DIR_P0M])[kb  ];
+			mfabc = (Dad.f[DIR_M0P])[kw  ];
+			mfbcc = (Dad.f[DIR_0PP])[k   ];
+			mfbaa = (Dad.f[DIR_0MM])[kbs ];
+			mfbca = (Dad.f[DIR_0PM])[kb  ];
+			mfbac = (Dad.f[DIR_0MP])[ks  ];
 			mfbbb = (Dad.f[DIR_000])[k   ];
-			mfccc = (Dad.f[DIR_PPP ])[k   ];
-			mfaac = (Dad.f[DIR_MMP ])[ksw ];
-			mfcac = (Dad.f[DIR_PMP ])[ks  ];
-			mfacc = (Dad.f[DIR_MPP ])[kw  ];
-			mfcca = (Dad.f[DIR_PPM ])[kb  ];
-			mfaaa = (Dad.f[DIR_MMM ])[kbsw];
-			mfcaa = (Dad.f[DIR_PMM ])[kbs ];
-			mfaca = (Dad.f[DIR_MPM ])[kbw ];
+			mfccc = (Dad.f[DIR_PPP])[k   ];
+			mfaac = (Dad.f[DIR_MMP])[ksw ];
+			mfcac = (Dad.f[DIR_PMP])[ks  ];
+			mfacc = (Dad.f[DIR_MPP])[kw  ];
+			mfcca = (Dad.f[DIR_PPM])[kb  ];
+			mfaaa = (Dad.f[DIR_MMM])[kbsw];
+			mfcaa = (Dad.f[DIR_PMM])[kbs ];
+			mfaca = (Dad.f[DIR_MPM])[kbw ];
 			//////////////////////////////////////////////////////////////////////////
 			concD[k] = 
 				((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa)   + (mfaac + mfcca))) +
@@ -1178,7 +1178,7 @@ __global__ void LBCalcMacMedSP27( real* vxD,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
                                              unsigned int tdiff,
-                                             unsigned int size_Mat,
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -1192,7 +1192,7 @@ __global__ void LBCalcMacMedSP27( real* vxD,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       //////////////////////////////////////////////////////////////////////////
       real PRESS = pressD[k];
@@ -1246,7 +1246,7 @@ __global__ void LBResetMedianValuesSP27(
 	real* vzD,
 	real* rhoD,
 	real* pressD,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool isEvenTimestep)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -1260,7 +1260,7 @@ __global__ void LBResetMedianValuesSP27(
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if (k<size_Mat)
+	if (k<numberOfLBnodes)
 	{
 		//////////////////////////////////////////////////////////////////////////
 		pressD[k] = c0o1;
@@ -1300,7 +1300,7 @@ __global__ void LBResetMedianValuesAD27(
 	real* rhoD,
 	real* pressD,
 	real* concD,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool isEvenTimestep)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -1314,7 +1314,7 @@ __global__ void LBResetMedianValuesAD27(
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if (k < size_Mat)
+	if (k < numberOfLBnodes)
 	{
 		//////////////////////////////////////////////////////////////////////////
 		concD[k]  = c0o1;
@@ -1360,70 +1360,70 @@ __global__ void LBCalcMeasurePoints( real* vxMP,
 												unsigned int* neighborX,
 												unsigned int* neighborY,
 												unsigned int* neighborZ,
-												unsigned int size_Mat,
+												unsigned long long numberOfLBnodes,
 												real* DD,
 												bool isEvenTimestep)
 {
 	Distributions27 D;
 	if (isEvenTimestep==true)
 	{
-		D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	} 
 	else
 	{
-		D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+		D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -1473,50 +1473,50 @@ __global__ void LBCalcMeasurePoints( real* vxMP,
 
       if(geoD[kzero] == GEO_FLUID)
       {
-         rhoMP[kMac]=   (D.f[DIR_P00   ])[ke  ]+ (D.f[DIR_M00   ])[kw  ]+ 
-                        (D.f[DIR_0P0   ])[kn  ]+ (D.f[DIR_0M0   ])[ks  ]+
-                        (D.f[DIR_00P   ])[kt  ]+ (D.f[DIR_00M   ])[kb  ]+
-                        (D.f[DIR_PP0  ])[kne ]+ (D.f[DIR_MM0  ])[ksw ]+
-                        (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_P0P  ])[kte ]+ (D.f[DIR_M0M  ])[kbw ]+
-                        (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_0PP  ])[ktn ]+ (D.f[DIR_0MM  ])[kbs ]+
-                        (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ]+
+         rhoMP[kMac]=   (D.f[DIR_P00])[ke  ]+ (D.f[DIR_M00])[kw  ]+ 
+                        (D.f[DIR_0P0])[kn  ]+ (D.f[DIR_0M0])[ks  ]+
+                        (D.f[DIR_00P])[kt  ]+ (D.f[DIR_00M])[kb  ]+
+                        (D.f[DIR_PP0])[kne ]+ (D.f[DIR_MM0])[ksw ]+
+                        (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_P0P])[kte ]+ (D.f[DIR_M0M])[kbw ]+
+                        (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_0PP])[ktn ]+ (D.f[DIR_0MM])[kbs ]+
+                        (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ]+
                         (D.f[DIR_000])[kzero]+ 
-                        (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]+ (D.f[DIR_MMM ])[kbsw]+ 
-                        (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw];
-
-         vxMP[kMac] =   (D.f[DIR_P00   ])[ke  ]- (D.f[DIR_M00   ])[kw  ]+ 
-                        (D.f[DIR_PP0  ])[kne ]- (D.f[DIR_MM0  ])[ksw ]+
-                        (D.f[DIR_PM0  ])[kse ]- (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_P0P  ])[kte ]- (D.f[DIR_M0M  ])[kbw ]+
-                        (D.f[DIR_P0M  ])[kbe ]- (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_PPP ])[ktne]- (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]- (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]+ 
-                        (D.f[DIR_PMM ])[kbse]- (D.f[DIR_MPM ])[kbnw];
-
-         vyMP[kMac] =   (D.f[DIR_0P0   ])[kn  ]- (D.f[DIR_0M0   ])[ks  ]+
-                        (D.f[DIR_PP0  ])[kne ]- (D.f[DIR_MM0  ])[ksw ]-
-                        (D.f[DIR_PM0  ])[kse ]+ (D.f[DIR_MP0  ])[knw ]+
-                        (D.f[DIR_0PP  ])[ktn ]- (D.f[DIR_0MM  ])[kbs ]+
-                        (D.f[DIR_0PM  ])[kbn ]- (D.f[DIR_0MP  ])[kts ]+
-                        (D.f[DIR_PPP ])[ktne]- (D.f[DIR_MMP ])[ktsw]- 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]+ 
-                        (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]- 
-                        (D.f[DIR_PMM ])[kbse]+ (D.f[DIR_MPM ])[kbnw];
-
-         vzMP[kMac] =   (D.f[DIR_00P   ])[kt  ]- (D.f[DIR_00M   ])[kb  ]+
-                        (D.f[DIR_P0P  ])[kte ]- (D.f[DIR_M0M  ])[kbw ]-
-                        (D.f[DIR_P0M  ])[kbe ]+ (D.f[DIR_M0P  ])[ktw ]+
-                        (D.f[DIR_0PP  ])[ktn ]- (D.f[DIR_0MM  ])[kbs ]-
-                        (D.f[DIR_0PM  ])[kbn ]+ (D.f[DIR_0MP  ])[kts ]+
-                        (D.f[DIR_PPP ])[ktne]+ (D.f[DIR_MMP ])[ktsw]+ 
-                        (D.f[DIR_PMP ])[ktse]+ (D.f[DIR_MPP ])[ktnw]- 
-                        (D.f[DIR_PPM ])[kbne]- (D.f[DIR_MMM ])[kbsw]- 
-                        (D.f[DIR_PMM ])[kbse]- (D.f[DIR_MPM ])[kbnw];
+                        (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]+ (D.f[DIR_MMM])[kbsw]+ 
+                        (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw];
+
+         vxMP[kMac] =   (D.f[DIR_P00])[ke  ]- (D.f[DIR_M00])[kw  ]+ 
+                        (D.f[DIR_PP0])[kne ]- (D.f[DIR_MM0])[ksw ]+
+                        (D.f[DIR_PM0])[kse ]- (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_P0P])[kte ]- (D.f[DIR_M0M])[kbw ]+
+                        (D.f[DIR_P0M])[kbe ]- (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_PPP])[ktne]- (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]- (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]+ 
+                        (D.f[DIR_PMM])[kbse]- (D.f[DIR_MPM])[kbnw];
+
+         vyMP[kMac] =   (D.f[DIR_0P0])[kn  ]- (D.f[DIR_0M0])[ks  ]+
+                        (D.f[DIR_PP0])[kne ]- (D.f[DIR_MM0])[ksw ]-
+                        (D.f[DIR_PM0])[kse ]+ (D.f[DIR_MP0])[knw ]+
+                        (D.f[DIR_0PP])[ktn ]- (D.f[DIR_0MM])[kbs ]+
+                        (D.f[DIR_0PM])[kbn ]- (D.f[DIR_0MP])[kts ]+
+                        (D.f[DIR_PPP])[ktne]- (D.f[DIR_MMP])[ktsw]- 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]+ 
+                        (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]- 
+                        (D.f[DIR_PMM])[kbse]+ (D.f[DIR_MPM])[kbnw];
+
+         vzMP[kMac] =   (D.f[DIR_00P])[kt  ]- (D.f[DIR_00M])[kb  ]+
+                        (D.f[DIR_P0P])[kte ]- (D.f[DIR_M0M])[kbw ]-
+                        (D.f[DIR_P0M])[kbe ]+ (D.f[DIR_M0P])[ktw ]+
+                        (D.f[DIR_0PP])[ktn ]- (D.f[DIR_0MM])[kbs ]-
+                        (D.f[DIR_0PM])[kbn ]+ (D.f[DIR_0MP])[kts ]+
+                        (D.f[DIR_PPP])[ktne]+ (D.f[DIR_MMP])[ktsw]+ 
+                        (D.f[DIR_PMP])[ktse]+ (D.f[DIR_MPP])[ktnw]- 
+                        (D.f[DIR_PPM])[kbne]- (D.f[DIR_MMM])[kbsw]- 
+                        (D.f[DIR_PMM])[kbse]- (D.f[DIR_MPM])[kbnw];
       }
    }
 }
@@ -1573,7 +1573,7 @@ __global__ void LBSetOutputWallVelocitySP27( real* vxD,
 														unsigned int* neighborX,
 														unsigned int* neighborY,
 														unsigned int* neighborZ,
-														unsigned int size_Mat,
+														unsigned long long numberOfLBnodes,
 														real* DD,
 														bool isEvenTimestep)
 {
diff --git a/src/gpu/VirtualFluids_GPU/GPU/Cascade27.cu b/src/gpu/VirtualFluids_GPU/GPU/Cascade27.cu
index a79588421a624cae62ec32127739efb47bb7b2ef..457623d4ee62b624248306b6b900fcff3f026286 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/Cascade27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/Cascade27.cu
@@ -15,7 +15,7 @@ __global__ void LB_Kernel_Cascade_SP_27(     real omega,
 														unsigned int* neighborY,
 														unsigned int* neighborZ,
 														real* DDStart,
-														int size_Mat,
+														unsigned long long numberOfLBnodes,
 														bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -29,7 +29,7 @@ __global__ void LB_Kernel_Cascade_SP_27(     real omega,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -40,63 +40,63 @@ __global__ void LB_Kernel_Cascade_SP_27(     real omega,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -129,33 +129,33 @@ __global__ void LB_Kernel_Cascade_SP_27(     real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00   ])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0   ])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M   ])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0  ])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0  ])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M  ])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P  ])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP  ])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k  ];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP ])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP ])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP ])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP ])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM ])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM ])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 			////////////////////////////////////////////////////////////////////////////////////
 			//slow
 			//real oMdrho = one - ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
@@ -842,7 +842,7 @@ __global__ void LB_Kernel_Casc_Comp_SP_27(      real omega,
 														   unsigned int* neighborY,
 														   unsigned int* neighborZ,
 														   real* DDStart,
-														   int size_Mat,
+														   unsigned long long numberOfLBnodes,
 														   bool EvenOrOdd)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -856,7 +856,7 @@ __global__ void LB_Kernel_Casc_Comp_SP_27(      real omega,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       ////////////////////////////////////////////////////////////////////////////////
       unsigned int BC;
@@ -867,63 +867,63 @@ __global__ void LB_Kernel_Casc_Comp_SP_27(      real omega,
          Distributions27 D;
          if (EvenOrOdd==true)
          {
-            D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-            D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-            D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-            D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-            D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-            D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-            D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-            D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-            D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-            D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-            D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-            D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-            D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-            D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-            D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-            D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-            D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-            D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-            D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-            D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-            D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-            D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-            D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-            D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-            D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-            D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-            D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+            D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+            D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+            D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+            D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+            D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+            D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+            D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+            D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+            D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+            D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+            D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+            D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+            D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+            D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+            D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+            D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+            D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+            D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+            D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+            D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+            D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+            D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+            D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+            D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+            D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+            D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+            D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
          }
          else
          {
-            D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-            D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-            D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-            D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-            D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-            D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-            D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-            D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-            D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-            D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-            D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-            D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-            D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-            D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-            D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-            D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-            D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-            D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-            D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-            D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-            D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-            D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-            D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-            D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-            D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-            D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-            D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+            D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+            D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+            D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+            D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+            D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+            D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+            D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+            D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+            D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+            D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+            D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+            D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+            D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+            D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+            D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+            D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+            D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+            D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+            D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+            D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+            D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+            D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+            D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+            D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+            D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+            D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+            D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
          }
 
          ////////////////////////////////////////////////////////////////////////////////
@@ -956,33 +956,33 @@ __global__ void LB_Kernel_Casc_Comp_SP_27(      real omega,
          unsigned int ktne = k;
          unsigned int kbsw = neighborZ[ksw];
          //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-         real f_E     = (D.f[DIR_P00   ])[ke   ];// +  c2over27 ;
-         real f_W     = (D.f[DIR_M00   ])[kw   ];// +  c2over27 ;
-         real f_N     = (D.f[DIR_0P0   ])[kn   ];// +  c2over27 ;
-         real f_S     = (D.f[DIR_0M0   ])[ks   ];// +  c2over27 ;
-         real f_F     = (D.f[DIR_00P   ])[kt   ];// +  c2over27 ;
-         real f_B     = (D.f[DIR_00M   ])[kb   ];// +  c2over27 ;
-         real f_NE    = (D.f[DIR_PP0  ])[kne  ];// +  c1over54 ;
-         real f_SW    = (D.f[DIR_MM0  ])[ksw  ];// +  c1over54 ;
-         real f_SE    = (D.f[DIR_PM0  ])[kse  ];// +  c1over54 ;
-         real f_NW    = (D.f[DIR_MP0  ])[knw  ];// +  c1over54 ;
-         real f_Ef    = (D.f[DIR_P0P  ])[kte  ];// +  c1over54 ;
-         real f_Wb    = (D.f[DIR_M0M  ])[kbw  ];// +  c1over54 ;
-         real f_Eb    = (D.f[DIR_P0M  ])[kbe  ];// +  c1over54 ;
-         real f_Wf    = (D.f[DIR_M0P  ])[ktw  ];// +  c1over54 ;
-         real f_Nf    = (D.f[DIR_0PP  ])[ktn  ];// +  c1over54 ;
-         real f_Sb    = (D.f[DIR_0MM  ])[kbs  ];// +  c1over54 ;
-         real f_Nb    = (D.f[DIR_0PM  ])[kbn  ];// +  c1over54 ;
-         real f_Sf    = (D.f[DIR_0MP  ])[kts  ];// +  c1over54 ;
+         real f_E     = (D.f[DIR_P00])[ke   ];// +  c2over27 ;
+         real f_W     = (D.f[DIR_M00])[kw   ];// +  c2over27 ;
+         real f_N     = (D.f[DIR_0P0])[kn   ];// +  c2over27 ;
+         real f_S     = (D.f[DIR_0M0])[ks   ];// +  c2over27 ;
+         real f_F     = (D.f[DIR_00P])[kt   ];// +  c2over27 ;
+         real f_B     = (D.f[DIR_00M])[kb   ];// +  c2over27 ;
+         real f_NE    = (D.f[DIR_PP0])[kne  ];// +  c1over54 ;
+         real f_SW    = (D.f[DIR_MM0])[ksw  ];// +  c1over54 ;
+         real f_SE    = (D.f[DIR_PM0])[kse  ];// +  c1over54 ;
+         real f_NW    = (D.f[DIR_MP0])[knw  ];// +  c1over54 ;
+         real f_Ef    = (D.f[DIR_P0P])[kte  ];// +  c1over54 ;
+         real f_Wb    = (D.f[DIR_M0M])[kbw  ];// +  c1over54 ;
+         real f_Eb    = (D.f[DIR_P0M])[kbe  ];// +  c1over54 ;
+         real f_Wf    = (D.f[DIR_M0P])[ktw  ];// +  c1over54 ;
+         real f_Nf    = (D.f[DIR_0PP])[ktn  ];// +  c1over54 ;
+         real f_Sb    = (D.f[DIR_0MM])[kbs  ];// +  c1over54 ;
+         real f_Nb    = (D.f[DIR_0PM])[kbn  ];// +  c1over54 ;
+         real f_Sf    = (D.f[DIR_0MP])[kts  ];// +  c1over54 ;
          real f_R     = (D.f[DIR_000])[kzero];// +  c8over27 ;
-         real f_Nef   = (D.f[DIR_PPP ])[ktne ];// +  c1over216;
-         real f_Swf   = (D.f[DIR_MMP ])[ktsw ];// +  c1over216;
-         real f_Sef   = (D.f[DIR_PMP ])[ktse ];// +  c1over216;
-         real f_Nwf   = (D.f[DIR_MPP ])[ktnw ];// +  c1over216;
-         real f_Neb   = (D.f[DIR_PPM ])[kbne ];// +  c1over216;
-         real f_Swb   = (D.f[DIR_MMM ])[kbsw ];// +  c1over216;
-         real f_Seb   = (D.f[DIR_PMM ])[kbse ];// +  c1over216;
-         real f_Nwb   = (D.f[DIR_MPM ])[kbnw ];// +  c1over216;
+         real f_Nef   = (D.f[DIR_PPP])[ktne ];// +  c1over216;
+         real f_Swf   = (D.f[DIR_MMP])[ktsw ];// +  c1over216;
+         real f_Sef   = (D.f[DIR_PMP])[ktse ];// +  c1over216;
+         real f_Nwf   = (D.f[DIR_MPP])[ktnw ];// +  c1over216;
+         real f_Neb   = (D.f[DIR_PPM])[kbne ];// +  c1over216;
+         real f_Swb   = (D.f[DIR_MMM])[kbsw ];// +  c1over216;
+         real f_Seb   = (D.f[DIR_PMM])[kbse ];// +  c1over216;
+         real f_Nwb   = (D.f[DIR_MPM])[kbnw ];// +  c1over216;
          ////////////////////////////////////////////////////////////////////////////////////
 		 real rho=f_NW+f_W+f_SW+f_S+f_SE+f_E+f_NE+f_N+f_R+f_Nf+f_Nb+f_Sf+f_Sb+f_Ef+f_Eb+f_Wf+f_Wb+f_Nwf+f_Nwb+f_Nef+f_Neb+f_Swf+f_Swb+f_Sef+f_Seb+f_F+f_B+c1o1;// ACHTUNG ne EINS !!!!!!!!
 		 real pix=(f_NE+f_E+f_SE+f_Ef+f_Eb-f_NW-f_W-f_SW-f_Wf-f_Wb+f_Nef+f_Neb+f_Sef+f_Seb-f_Nwf-f_Nwb-f_Swf-f_Swb);
@@ -1689,7 +1689,7 @@ __global__ void LB_Kernel_Casc_SP_MS_OHM_27(  real omega,
                                                          unsigned int* neighborY,
                                                          unsigned int* neighborZ,
                                                          real* DDStart,
-                                                         int size_Mat,
+                                                         unsigned long long numberOfLBnodes,
                                                          bool EvenOrOdd)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -1703,7 +1703,7 @@ __global__ void LB_Kernel_Casc_SP_MS_OHM_27(  real omega,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       ////////////////////////////////////////////////////////////////////////////////
       unsigned int BC;
@@ -1714,63 +1714,63 @@ __global__ void LB_Kernel_Casc_SP_MS_OHM_27(  real omega,
          Distributions27 D;
          if (EvenOrOdd==true)
          {
-            D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-            D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-            D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-            D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-            D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-            D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-            D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-            D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-            D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-            D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-            D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-            D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-            D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-            D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-            D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-            D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-            D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-            D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-            D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-            D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-            D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-            D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-            D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-            D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-            D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-            D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-            D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+            D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+            D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+            D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+            D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+            D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+            D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+            D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+            D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+            D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+            D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+            D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+            D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+            D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+            D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+            D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+            D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+            D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+            D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+            D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+            D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+            D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+            D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+            D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+            D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+            D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+            D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+            D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
          }
          else
          {
-            D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-            D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-            D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-            D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-            D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-            D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-            D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-            D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-            D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-            D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-            D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-            D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-            D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-            D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-            D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-            D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-            D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-            D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-            D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-            D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-            D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-            D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-            D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-            D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-            D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-            D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-            D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+            D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+            D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+            D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+            D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+            D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+            D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+            D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+            D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+            D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+            D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+            D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+            D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+            D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+            D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+            D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+            D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+            D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+            D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+            D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+            D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+            D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+            D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+            D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+            D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+            D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+            D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+            D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
          }
 
          ////////////////////////////////////////////////////////////////////////////////
@@ -1803,33 +1803,33 @@ __global__ void LB_Kernel_Casc_SP_MS_OHM_27(  real omega,
          //unsigned int ktne = k;
          unsigned int kbsw = neighborZ[ksw];
          //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-         real fE    =  (D.f[DIR_P00   ])[k  ];//ke
-         real fW    =  (D.f[DIR_M00   ])[kw ];
-         real fN    =  (D.f[DIR_0P0   ])[k  ];//kn
-         real fS    =  (D.f[DIR_0M0   ])[ks ];
-         real fT    =  (D.f[DIR_00P   ])[k  ];//kt
-         real fB    =  (D.f[DIR_00M   ])[kb ];
-         real fNE   =  (D.f[DIR_PP0  ])[k  ];//kne
-         real fSW   =  (D.f[DIR_MM0  ])[ksw];
-         real fSE   =  (D.f[DIR_PM0  ])[ks ];//kse
-         real fNW   =  (D.f[DIR_MP0  ])[kw ];//knw
-         real fTE   =  (D.f[DIR_P0P  ])[k  ];//kte
-         real fBW   =  (D.f[DIR_M0M  ])[kbw];
-         real fBE   =  (D.f[DIR_P0M  ])[kb ];//kbe
-         real fTW   =  (D.f[DIR_M0P  ])[kw ];//ktw
-         real fTN   =  (D.f[DIR_0PP  ])[k  ];//ktn
-         real fBS   =  (D.f[DIR_0MM  ])[kbs];
-         real fBN   =  (D.f[DIR_0PM  ])[kb ];//kbn
-         real fTS   =  (D.f[DIR_0MP  ])[ks ];//kts
+         real fE    =  (D.f[DIR_P00])[k  ];//ke
+         real fW    =  (D.f[DIR_M00])[kw ];
+         real fN    =  (D.f[DIR_0P0])[k  ];//kn
+         real fS    =  (D.f[DIR_0M0])[ks ];
+         real fT    =  (D.f[DIR_00P])[k  ];//kt
+         real fB    =  (D.f[DIR_00M])[kb ];
+         real fNE   =  (D.f[DIR_PP0])[k  ];//kne
+         real fSW   =  (D.f[DIR_MM0])[ksw];
+         real fSE   =  (D.f[DIR_PM0])[ks ];//kse
+         real fNW   =  (D.f[DIR_MP0])[kw ];//knw
+         real fTE   =  (D.f[DIR_P0P])[k  ];//kte
+         real fBW   =  (D.f[DIR_M0M])[kbw];
+         real fBE   =  (D.f[DIR_P0M])[kb ];//kbe
+         real fTW   =  (D.f[DIR_M0P])[kw ];//ktw
+         real fTN   =  (D.f[DIR_0PP])[k  ];//ktn
+         real fBS   =  (D.f[DIR_0MM])[kbs];
+         real fBN   =  (D.f[DIR_0PM])[kb ];//kbn
+         real fTS   =  (D.f[DIR_0MP])[ks ];//kts
          real fZERO =  (D.f[DIR_000])[k  ];//kzero
-         real fTNE   = (D.f[DIR_PPP ])[k  ];//ktne
-         real fTSW   = (D.f[DIR_MMP ])[ksw];//ktsw
-         real fTSE   = (D.f[DIR_PMP ])[ks ];//ktse
-         real fTNW   = (D.f[DIR_MPP ])[kw ];//ktnw
-         real fBNE   = (D.f[DIR_PPM ])[kb ];//kbne
-         real fBSW   = (D.f[DIR_MMM ])[kbsw];
-         real fBSE   = (D.f[DIR_PMM ])[kbs];//kbse
-         real fBNW   = (D.f[DIR_MPM ])[kbw];//kbnw
+         real fTNE   = (D.f[DIR_PPP])[k  ];//ktne
+         real fTSW   = (D.f[DIR_MMP])[ksw];//ktsw
+         real fTSE   = (D.f[DIR_PMP])[ks ];//ktse
+         real fTNW   = (D.f[DIR_MPP])[kw ];//ktnw
+         real fBNE   = (D.f[DIR_PPM])[kb ];//kbne
+         real fBSW   = (D.f[DIR_MMM])[kbsw];
+         real fBSE   = (D.f[DIR_PMM])[kbs];//kbse
+         real fBNW   = (D.f[DIR_MPM])[kbw];//kbnw
          ////////////////////////////////////////////////////////////////////////////////
          real rho0   =  (fTNE+fBSW)+(fTSW+fBNE)+(fTSE+fBNW)+(fTNW+fBSE)+(fNE+fSW)+(fNW+fSE)+(fTE+fBW)+(fBE+fTW)+(fTN+fBS)+(fBN+fTS)+(fE+fW)+(fN+fS)+(fT+fB)+fZERO;
          real rho    =  rho0 + c1o1;
@@ -2321,7 +2321,7 @@ __global__ void LB_Kernel_Casc_SP_MS_27(   real omega,
                                                       unsigned int* neighborY,
                                                       unsigned int* neighborZ,
                                                       real* DDStart,
-                                                      int size_Mat,
+                                                      unsigned long long numberOfLBnodes,
                                                       bool EvenOrOdd)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -2335,7 +2335,7 @@ __global__ void LB_Kernel_Casc_SP_MS_27(   real omega,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       ////////////////////////////////////////////////////////////////////////////////
       unsigned int BC;
@@ -2346,63 +2346,63 @@ __global__ void LB_Kernel_Casc_SP_MS_27(   real omega,
          Distributions27 D;
          if (EvenOrOdd==true)
          {
-            D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-            D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-            D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-            D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-            D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-            D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-            D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-            D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-            D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-            D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-            D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-            D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-            D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-            D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-            D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-            D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-            D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-            D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-            D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-            D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-            D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-            D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-            D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-            D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-            D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-            D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-            D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+            D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+            D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+            D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+            D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+            D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+            D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+            D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+            D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+            D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+            D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+            D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+            D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+            D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+            D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+            D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+            D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+            D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+            D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+            D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+            D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+            D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+            D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+            D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+            D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+            D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+            D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+            D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
          }
          else
          {
-            D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-            D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-            D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-            D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-            D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-            D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-            D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-            D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-            D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-            D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-            D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-            D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-            D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-            D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-            D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-            D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-            D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-            D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-            D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-            D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-            D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-            D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-            D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-            D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-            D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-            D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-            D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+            D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+            D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+            D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+            D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+            D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+            D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+            D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+            D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+            D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+            D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+            D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+            D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+            D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+            D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+            D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+            D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+            D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+            D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+            D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+            D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+            D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+            D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+            D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+            D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+            D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+            D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+            D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
          }
 
          ////////////////////////////////////////////////////////////////////////////////
@@ -2435,33 +2435,33 @@ __global__ void LB_Kernel_Casc_SP_MS_27(   real omega,
          //unsigned int ktne = k;
          unsigned int kbsw = neighborZ[ksw];
          //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-         real fE    =  (D.f[DIR_P00   ])[k  ];//ke
-         real fW    =  (D.f[DIR_M00   ])[kw ];
-         real fN    =  (D.f[DIR_0P0   ])[k  ];//kn
-         real fS    =  (D.f[DIR_0M0   ])[ks ];
-         real fT    =  (D.f[DIR_00P   ])[k  ];//kt
-         real fB    =  (D.f[DIR_00M   ])[kb ];
-         real fNE   =  (D.f[DIR_PP0  ])[k  ];//kne
-         real fSW   =  (D.f[DIR_MM0  ])[ksw];
-         real fSE   =  (D.f[DIR_PM0  ])[ks ];//kse
-         real fNW   =  (D.f[DIR_MP0  ])[kw ];//knw
-         real fTE   =  (D.f[DIR_P0P  ])[k  ];//kte
-         real fBW   =  (D.f[DIR_M0M  ])[kbw];
-         real fBE   =  (D.f[DIR_P0M  ])[kb ];//kbe
-         real fTW   =  (D.f[DIR_M0P  ])[kw ];//ktw
-         real fTN   =  (D.f[DIR_0PP  ])[k  ];//ktn
-         real fBS   =  (D.f[DIR_0MM  ])[kbs];
-         real fBN   =  (D.f[DIR_0PM  ])[kb ];//kbn
-         real fTS   =  (D.f[DIR_0MP  ])[ks ];//kts
+         real fE    =  (D.f[DIR_P00])[k  ];//ke
+         real fW    =  (D.f[DIR_M00])[kw ];
+         real fN    =  (D.f[DIR_0P0])[k  ];//kn
+         real fS    =  (D.f[DIR_0M0])[ks ];
+         real fT    =  (D.f[DIR_00P])[k  ];//kt
+         real fB    =  (D.f[DIR_00M])[kb ];
+         real fNE   =  (D.f[DIR_PP0])[k  ];//kne
+         real fSW   =  (D.f[DIR_MM0])[ksw];
+         real fSE   =  (D.f[DIR_PM0])[ks ];//kse
+         real fNW   =  (D.f[DIR_MP0])[kw ];//knw
+         real fTE   =  (D.f[DIR_P0P])[k  ];//kte
+         real fBW   =  (D.f[DIR_M0M])[kbw];
+         real fBE   =  (D.f[DIR_P0M])[kb ];//kbe
+         real fTW   =  (D.f[DIR_M0P])[kw ];//ktw
+         real fTN   =  (D.f[DIR_0PP])[k  ];//ktn
+         real fBS   =  (D.f[DIR_0MM])[kbs];
+         real fBN   =  (D.f[DIR_0PM])[kb ];//kbn
+         real fTS   =  (D.f[DIR_0MP])[ks ];//kts
          real fZERO =  (D.f[DIR_000])[k  ];//kzero
-         real fTNE   = (D.f[DIR_PPP ])[k  ];//ktne
-         real fTSW   = (D.f[DIR_MMP ])[ksw];//ktsw
-         real fTSE   = (D.f[DIR_PMP ])[ks ];//ktse
-         real fTNW   = (D.f[DIR_MPP ])[kw ];//ktnw
-         real fBNE   = (D.f[DIR_PPM ])[kb ];//kbne
-         real fBSW   = (D.f[DIR_MMM ])[kbsw];
-         real fBSE   = (D.f[DIR_PMM ])[kbs];//kbse
-         real fBNW   = (D.f[DIR_MPM ])[kbw];//kbnw
+         real fTNE   = (D.f[DIR_PPP])[k  ];//ktne
+         real fTSW   = (D.f[DIR_MMP])[ksw];//ktsw
+         real fTSE   = (D.f[DIR_PMP])[ks ];//ktse
+         real fTNW   = (D.f[DIR_MPP])[kw ];//ktnw
+         real fBNE   = (D.f[DIR_PPM])[kb ];//kbne
+         real fBSW   = (D.f[DIR_MMM])[kbsw];
+         real fBSE   = (D.f[DIR_PMM])[kbs];//kbse
+         real fBNW   = (D.f[DIR_MPM])[kbw];//kbnw
          ////////////////////////////////////////////////////////////////////////////////
          real rho0   =  fZERO+fE+fW+fN+fS+fT+fB+fNE+fSW+fSE+fNW+fTE+fBW+fBE+fTW+fTN+fBS+fBN+fTS+fTNE+fTSW+fTSE+fTNW+fBNE+fBSW+fBSE+fBNW;
          real rho    =  rho0 + c1o1;
@@ -2846,7 +2846,7 @@ __global__ void LB_Kernel_Casc_SP_MS_Diff_27(real omega,
                                                         unsigned int* neighborY,
                                                         unsigned int* neighborZ,
                                                         real* DDStart,
-                                                        int size_Mat,
+                                                        unsigned long long numberOfLBnodes,
                                                         bool EvenOrOdd)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -2860,7 +2860,7 @@ __global__ void LB_Kernel_Casc_SP_MS_Diff_27(real omega,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       ////////////////////////////////////////////////////////////////////////////////
       unsigned int BC;
@@ -2871,63 +2871,63 @@ __global__ void LB_Kernel_Casc_SP_MS_Diff_27(real omega,
          Distributions27 D;
          if (EvenOrOdd==true)
          {
-            D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-            D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-            D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-            D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-            D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-            D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-            D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-            D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-            D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-            D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-            D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-            D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-            D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-            D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-            D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-            D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-            D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-            D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-            D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-            D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-            D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-            D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-            D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-            D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-            D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-            D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-            D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+            D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+            D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+            D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+            D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+            D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+            D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+            D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+            D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+            D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+            D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+            D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+            D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+            D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+            D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+            D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+            D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+            D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+            D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+            D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+            D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+            D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+            D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+            D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+            D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+            D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+            D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+            D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
          }
          else
          {
-            D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-            D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-            D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-            D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-            D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-            D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-            D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-            D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-            D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-            D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-            D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-            D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-            D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-            D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-            D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-            D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-            D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-            D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-            D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-            D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-            D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-            D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-            D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-            D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-            D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-            D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-            D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+            D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+            D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+            D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+            D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+            D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+            D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+            D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+            D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+            D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+            D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+            D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+            D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+            D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+            D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+            D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+            D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+            D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+            D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+            D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+            D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+            D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+            D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+            D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+            D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+            D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+            D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+            D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
          }
 
          ////////////////////////////////////////////////////////////////////////////////
@@ -2960,33 +2960,33 @@ __global__ void LB_Kernel_Casc_SP_MS_Diff_27(real omega,
          //unsigned int ktne = k;
          unsigned int kbsw = neighborZ[ksw];
          //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-         real fE    =  (D.f[DIR_P00   ])[k  ];//ke
-         real fW    =  (D.f[DIR_M00   ])[kw ];
-         real fN    =  (D.f[DIR_0P0   ])[k  ];//kn
-         real fS    =  (D.f[DIR_0M0   ])[ks ];
-         real fT    =  (D.f[DIR_00P   ])[k  ];//kt
-         real fB    =  (D.f[DIR_00M   ])[kb ];
-         real fNE   =  (D.f[DIR_PP0  ])[k  ];//kne
-         real fSW   =  (D.f[DIR_MM0  ])[ksw];
-         real fSE   =  (D.f[DIR_PM0  ])[ks ];//kse
-         real fNW   =  (D.f[DIR_MP0  ])[kw ];//knw
-         real fTE   =  (D.f[DIR_P0P  ])[k  ];//kte
-         real fBW   =  (D.f[DIR_M0M  ])[kbw];
-         real fBE   =  (D.f[DIR_P0M  ])[kb ];//kbe
-         real fTW   =  (D.f[DIR_M0P  ])[kw ];//ktw
-         real fTN   =  (D.f[DIR_0PP  ])[k  ];//ktn
-         real fBS   =  (D.f[DIR_0MM  ])[kbs];
-         real fBN   =  (D.f[DIR_0PM  ])[kb ];//kbn
-         real fTS   =  (D.f[DIR_0MP  ])[ks ];//kts
+         real fE    =  (D.f[DIR_P00])[k  ];//ke
+         real fW    =  (D.f[DIR_M00])[kw ];
+         real fN    =  (D.f[DIR_0P0])[k  ];//kn
+         real fS    =  (D.f[DIR_0M0])[ks ];
+         real fT    =  (D.f[DIR_00P])[k  ];//kt
+         real fB    =  (D.f[DIR_00M])[kb ];
+         real fNE   =  (D.f[DIR_PP0])[k  ];//kne
+         real fSW   =  (D.f[DIR_MM0])[ksw];
+         real fSE   =  (D.f[DIR_PM0])[ks ];//kse
+         real fNW   =  (D.f[DIR_MP0])[kw ];//knw
+         real fTE   =  (D.f[DIR_P0P])[k  ];//kte
+         real fBW   =  (D.f[DIR_M0M])[kbw];
+         real fBE   =  (D.f[DIR_P0M])[kb ];//kbe
+         real fTW   =  (D.f[DIR_M0P])[kw ];//ktw
+         real fTN   =  (D.f[DIR_0PP])[k  ];//ktn
+         real fBS   =  (D.f[DIR_0MM])[kbs];
+         real fBN   =  (D.f[DIR_0PM])[kb ];//kbn
+         real fTS   =  (D.f[DIR_0MP])[ks ];//kts
          real fZERO =  (D.f[DIR_000])[k  ];//kzero
-         real fTNE   = (D.f[DIR_PPP ])[k  ];//ktne
-         real fTSW   = (D.f[DIR_MMP ])[ksw];//ktsw
-         real fTSE   = (D.f[DIR_PMP ])[ks ];//ktse
-         real fTNW   = (D.f[DIR_MPP ])[kw ];//ktnw
-         real fBNE   = (D.f[DIR_PPM ])[kb ];//kbne
-         real fBSW   = (D.f[DIR_MMM ])[kbsw];
-         real fBSE   = (D.f[DIR_PMM ])[kbs];//kbse
-         real fBNW   = (D.f[DIR_MPM ])[kbw];//kbnw
+         real fTNE   = (D.f[DIR_PPP])[k  ];//ktne
+         real fTSW   = (D.f[DIR_MMP])[ksw];//ktsw
+         real fTSE   = (D.f[DIR_PMP])[ks ];//ktse
+         real fTNW   = (D.f[DIR_MPP])[kw ];//ktnw
+         real fBNE   = (D.f[DIR_PPM])[kb ];//kbne
+         real fBSW   = (D.f[DIR_MMM])[kbsw];
+         real fBSE   = (D.f[DIR_PMM])[kbs];//kbse
+         real fBNW   = (D.f[DIR_MPM])[kbw];//kbnw
          ////////////////////////////////////////////////////////////////////////////////
          real rho0   =  fZERO+fE+fW+fN+fS+fT+fB+fNE+fSW+fSE+fNW+fTE+fBW+fBE+fTW+fTN+fBS+fBN+fTS+fTNE+fTSW+fTSE+fTNW+fBNE+fBSW+fBSE+fBNW;
          real rho    =  rho0 + c1o1;
@@ -3368,7 +3368,7 @@ __global__ void LB_Kernel_Casc_SP_27(  real omega,
                                                   unsigned int* neighborY,
                                                   unsigned int* neighborZ,
                                                   real* DDStart,
-                                                  int size_Mat,
+                                                  unsigned long long numberOfLBnodes,
                                                   bool EvenOrOdd)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -3382,7 +3382,7 @@ __global__ void LB_Kernel_Casc_SP_27(  real omega,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       ////////////////////////////////////////////////////////////////////////////////
       unsigned int BC;
@@ -3393,63 +3393,63 @@ __global__ void LB_Kernel_Casc_SP_27(  real omega,
        Distributions27 D;
        if (EvenOrOdd==true)
        {
-          D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-          D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-          D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-          D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-          D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-          D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-          D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-          D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-          D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-          D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-          D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-          D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-          D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-          D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-          D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-          D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-          D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-          D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-          D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-          D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-          D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-          D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-          D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-          D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-          D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-          D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-          D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+          D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+          D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+          D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+          D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+          D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+          D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+          D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+          D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+          D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+          D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+          D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+          D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+          D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+          D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+          D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+          D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+          D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+          D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+          D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+          D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+          D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+          D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+          D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+          D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+          D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+          D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+          D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
        }
        else
        {
-          D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-          D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-          D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-          D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-          D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-          D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-          D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-          D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-          D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-          D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-          D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-          D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-          D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-          D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-          D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-          D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-          D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-          D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-          D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-          D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-          D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-          D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-          D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-          D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-          D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-          D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-          D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+          D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+          D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+          D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+          D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+          D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+          D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+          D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+          D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+          D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+          D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+          D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+          D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+          D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+          D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+          D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+          D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+          D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+          D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+          D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+          D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+          D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+          D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+          D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+          D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+          D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+          D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+          D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
        }
 
        ////////////////////////////////////////////////////////////////////////////////
@@ -3512,33 +3512,33 @@ __global__ void LB_Kernel_Casc_SP_27(  real omega,
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        real f_E,f_W,f_N,f_S,f_T,f_B,f_NE,f_SW,f_SE,f_NW,f_TE,f_BW,f_BE,f_TW,f_TN,f_BS,f_BN,f_TS,f_ZERO, f_TNE,f_TNW,f_TSE,f_TSW, f_BNE,f_BNW,f_BSE,f_BSW;
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-       f_E    =  (D.f[DIR_P00   ])[ke]+c2o27;
-       f_W    =  (D.f[DIR_M00   ])[kw]+c2o27;
-       f_N    =  (D.f[DIR_0P0   ])[kn]+c2o27;
-       f_S    =  (D.f[DIR_0M0   ])[ks]+c2o27;
-       f_T    =  (D.f[DIR_00P   ])[kt]+c2o27;
-       f_B    =  (D.f[DIR_00M   ])[kb]+c2o27;
-       f_NE   =  (D.f[DIR_PP0  ])[kne]+c1o54;
-       f_SW   =  (D.f[DIR_MM0  ])[ksw]+c1o54;
-       f_SE   =  (D.f[DIR_PM0  ])[kse]+c1o54;
-       f_NW   =  (D.f[DIR_MP0  ])[knw]+c1o54;
-       f_TE   =  (D.f[DIR_P0P  ])[kte]+c1o54;
-       f_BW   =  (D.f[DIR_M0M  ])[kbw]+c1o54;
-       f_BE   =  (D.f[DIR_P0M  ])[kbe]+c1o54;
-       f_TW   =  (D.f[DIR_M0P  ])[ktw]+c1o54;
-       f_TN   =  (D.f[DIR_0PP  ])[ktn]+c1o54;
-       f_BS   =  (D.f[DIR_0MM  ])[kbs]+c1o54;
-       f_BN   =  (D.f[DIR_0PM  ])[kbn]+c1o54;
-       f_TS   =  (D.f[DIR_0MP  ])[kts]+c1o54;
+       f_E    =  (D.f[DIR_P00])[ke]+c2o27;
+       f_W    =  (D.f[DIR_M00])[kw]+c2o27;
+       f_N    =  (D.f[DIR_0P0])[kn]+c2o27;
+       f_S    =  (D.f[DIR_0M0])[ks]+c2o27;
+       f_T    =  (D.f[DIR_00P])[kt]+c2o27;
+       f_B    =  (D.f[DIR_00M])[kb]+c2o27;
+       f_NE   =  (D.f[DIR_PP0])[kne]+c1o54;
+       f_SW   =  (D.f[DIR_MM0])[ksw]+c1o54;
+       f_SE   =  (D.f[DIR_PM0])[kse]+c1o54;
+       f_NW   =  (D.f[DIR_MP0])[knw]+c1o54;
+       f_TE   =  (D.f[DIR_P0P])[kte]+c1o54;
+       f_BW   =  (D.f[DIR_M0M])[kbw]+c1o54;
+       f_BE   =  (D.f[DIR_P0M])[kbe]+c1o54;
+       f_TW   =  (D.f[DIR_M0P])[ktw]+c1o54;
+       f_TN   =  (D.f[DIR_0PP])[ktn]+c1o54;
+       f_BS   =  (D.f[DIR_0MM])[kbs]+c1o54;
+       f_BN   =  (D.f[DIR_0PM])[kbn]+c1o54;
+       f_TS   =  (D.f[DIR_0MP])[kts]+c1o54;
        f_ZERO =  (D.f[DIR_000])[kzero]+c8o27;
-       f_TNE   = (D.f[DIR_PPP ])[ktne]+c1o216;
-       f_TSW   = (D.f[DIR_MMP ])[ktsw]+c1o216;
-       f_TSE   = (D.f[DIR_PMP ])[ktse]+c1o216;
-       f_TNW   = (D.f[DIR_MPP ])[ktnw]+c1o216;
-       f_BNE   = (D.f[DIR_PPM ])[kbne]+c1o216;
-       f_BSW   = (D.f[DIR_MMM ])[kbsw]+c1o216;
-       f_BSE   = (D.f[DIR_PMM ])[kbse]+c1o216;
-       f_BNW   = (D.f[DIR_MPM ])[kbnw]+c1o216;
+       f_TNE   = (D.f[DIR_PPP])[ktne]+c1o216;
+       f_TSW   = (D.f[DIR_MMP])[ktsw]+c1o216;
+       f_TSE   = (D.f[DIR_PMP])[ktse]+c1o216;
+       f_TNW   = (D.f[DIR_MPP])[ktnw]+c1o216;
+       f_BNE   = (D.f[DIR_PPM])[kbne]+c1o216;
+       f_BSW   = (D.f[DIR_MMM])[kbsw]+c1o216;
+       f_BSE   = (D.f[DIR_PMM])[kbse]+c1o216;
+       f_BNW   = (D.f[DIR_MPM])[kbnw]+c1o216;
        ////////////////////////////////////////////////////////////////////////////////
 
        if( BC == GEO_FLUID || BC == GEO_VELO)
@@ -4060,7 +4060,7 @@ __global__ void LB_Kernel_Casc27(real omega,
                                             unsigned int* neighborY,
                                             unsigned int* neighborZ,
                                             real* DDStart,
-                                            int size_Mat,
+                                            unsigned long long numberOfLBnodes,
                                             bool EvenOrOdd)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -4089,63 +4089,63 @@ __global__ void LB_Kernel_Casc27(real omega,
       Distributions27 D;
       if (EvenOrOdd==true)
       {
-         D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
       }
       else
       {
-         D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-         D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-         D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-         D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-         D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-         D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-         D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-         D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-         D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+         D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+         D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
       }
 
       ////////////////////////////////////////////////////////////////////////////////
@@ -4208,33 +4208,33 @@ __global__ void LB_Kernel_Casc27(real omega,
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real f_E,f_W,f_N,f_S,f_T,f_B,f_NE,f_SW,f_SE,f_NW,f_TE,f_BW,f_BE,f_TW,f_TN,f_BS,f_BN,f_TS,f_ZERO, f_TNE,f_TNW,f_TSE,f_TSW, f_BNE,f_BNW,f_BSE,f_BSW;
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      f_E    =  (D.f[DIR_P00   ])[ke]+c2o27;
-      f_W    =  (D.f[DIR_M00   ])[kw]+c2o27;
-      f_N    =  (D.f[DIR_0P0   ])[kn]+c2o27;
-      f_S    =  (D.f[DIR_0M0   ])[ks]+c2o27;
-      f_T    =  (D.f[DIR_00P   ])[kt]+c2o27;
-      f_B    =  (D.f[DIR_00M   ])[kb]+c2o27;
-      f_NE   =  (D.f[DIR_PP0  ])[kne]+c1o54;
-      f_SW   =  (D.f[DIR_MM0  ])[ksw]+c1o54;
-      f_SE   =  (D.f[DIR_PM0  ])[kse]+c1o54;
-      f_NW   =  (D.f[DIR_MP0  ])[knw]+c1o54;
-      f_TE   =  (D.f[DIR_P0P  ])[kte]+c1o54;
-      f_BW   =  (D.f[DIR_M0M  ])[kbw]+c1o54;
-      f_BE   =  (D.f[DIR_P0M  ])[kbe]+c1o54;
-      f_TW   =  (D.f[DIR_M0P  ])[ktw]+c1o54;
-      f_TN   =  (D.f[DIR_0PP  ])[ktn]+c1o54;
-      f_BS   =  (D.f[DIR_0MM  ])[kbs]+c1o54;
-      f_BN   =  (D.f[DIR_0PM  ])[kbn]+c1o54;
-      f_TS   =  (D.f[DIR_0MP  ])[kts]+c1o54;
+      f_E    =  (D.f[DIR_P00])[ke]+c2o27;
+      f_W    =  (D.f[DIR_M00])[kw]+c2o27;
+      f_N    =  (D.f[DIR_0P0])[kn]+c2o27;
+      f_S    =  (D.f[DIR_0M0])[ks]+c2o27;
+      f_T    =  (D.f[DIR_00P])[kt]+c2o27;
+      f_B    =  (D.f[DIR_00M])[kb]+c2o27;
+      f_NE   =  (D.f[DIR_PP0])[kne]+c1o54;
+      f_SW   =  (D.f[DIR_MM0])[ksw]+c1o54;
+      f_SE   =  (D.f[DIR_PM0])[kse]+c1o54;
+      f_NW   =  (D.f[DIR_MP0])[knw]+c1o54;
+      f_TE   =  (D.f[DIR_P0P])[kte]+c1o54;
+      f_BW   =  (D.f[DIR_M0M])[kbw]+c1o54;
+      f_BE   =  (D.f[DIR_P0M])[kbe]+c1o54;
+      f_TW   =  (D.f[DIR_M0P])[ktw]+c1o54;
+      f_TN   =  (D.f[DIR_0PP])[ktn]+c1o54;
+      f_BS   =  (D.f[DIR_0MM])[kbs]+c1o54;
+      f_BN   =  (D.f[DIR_0PM])[kbn]+c1o54;
+      f_TS   =  (D.f[DIR_0MP])[kts]+c1o54;
       f_ZERO =  (D.f[DIR_000])[kzero]+c8o27;
-      f_TNE   = (D.f[DIR_PPP ])[ktne]+c1o216;
-      f_TSW   = (D.f[DIR_MMP ])[ktsw]+c1o216;
-      f_TSE   = (D.f[DIR_PMP ])[ktse]+c1o216;
-      f_TNW   = (D.f[DIR_MPP ])[ktnw]+c1o216;
-      f_BNE   = (D.f[DIR_PPM ])[kbne]+c1o216;
-      f_BSW   = (D.f[DIR_MMM ])[kbsw]+c1o216;
-      f_BSE   = (D.f[DIR_PMM ])[kbse]+c1o216;
-      f_BNW   = (D.f[DIR_MPM ])[kbnw]+c1o216;
+      f_TNE   = (D.f[DIR_PPP])[ktne]+c1o216;
+      f_TSW   = (D.f[DIR_MMP])[ktsw]+c1o216;
+      f_TSE   = (D.f[DIR_PMP])[ktse]+c1o216;
+      f_TNW   = (D.f[DIR_MPP])[ktnw]+c1o216;
+      f_BNE   = (D.f[DIR_PPM])[kbne]+c1o216;
+      f_BSW   = (D.f[DIR_MMM])[kbsw]+c1o216;
+      f_BSE   = (D.f[DIR_PMM])[kbse]+c1o216;
+      f_BNW   = (D.f[DIR_MPM])[kbnw]+c1o216;
       ////////////////////////////////////////////////////////////////////////////////
 
       if( BC == GEO_FLUID || BC == GEO_VELO)
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
index 16a53b25ca42fdeab1436724f6a01f44b2465305..922e02eb7fcd3cc2c14316d1737a45dc8a41647f 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
@@ -16,64 +16,54 @@
 #include "lbm/constants/NumericConstants.h"
 
 
-void CudaMemoryManager::cudaAllocFull(int lev)
-{
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->geo      ), parameter->getParH(lev)->mem_size_int  ));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->k        ), parameter->getParH(lev)->mem_size_int  ));
-}
-void CudaMemoryManager::cudaFreeFull(int lev)
-{
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->geo   ));
-    checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->k     ));
-}
 void CudaMemoryManager::cudaCopyPrint(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityX   , parameter->getParD(lev)->velocityX   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityY   , parameter->getParD(lev)->velocityY   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityZ   , parameter->getParD(lev)->velocityZ   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->rho  , parameter->getParD(lev)->rho  , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->pressure, parameter->getParD(lev)->pressure, parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityX   , parameter->getParD(lev)->velocityX   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityY   , parameter->getParD(lev)->velocityY   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityZ   , parameter->getParD(lev)->velocityZ   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->rho         , parameter->getParD(lev)->rho         , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->pressure    , parameter->getParD(lev)->pressure    , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
 
     if(parameter->getIsBodyForce())
     {
-        checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->forceX_SP   , parameter->getParD(lev)->forceX_SP   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-        checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->forceY_SP   , parameter->getParD(lev)->forceY_SP   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-        checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->forceZ_SP   , parameter->getParD(lev)->forceZ_SP   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
+        checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->forceX_SP   , parameter->getParD(lev)->forceX_SP   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+        checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->forceY_SP   , parameter->getParD(lev)->forceY_SP   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+        checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->forceZ_SP   , parameter->getParD(lev)->forceZ_SP   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
     }
 
     if(parameter->getUseTurbulentViscosity())
     {
-        checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->turbViscosity   , parameter->getParD(lev)->turbViscosity   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
+        checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->turbViscosity   , parameter->getParD(lev)->turbViscosity   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
     }
 }
 void CudaMemoryManager::cudaCopyMedianPrint(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->vx_SP_Med   , parameter->getParD(lev)->vx_SP_Med   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->vy_SP_Med   , parameter->getParD(lev)->vy_SP_Med   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->vz_SP_Med   , parameter->getParD(lev)->vz_SP_Med   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->rho_SP_Med  , parameter->getParD(lev)->rho_SP_Med  , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->press_SP_Med, parameter->getParD(lev)->press_SP_Med, parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->vx_SP_Med   , parameter->getParD(lev)->vx_SP_Med   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->vy_SP_Med   , parameter->getParD(lev)->vy_SP_Med   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->vz_SP_Med   , parameter->getParD(lev)->vz_SP_Med   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->rho_SP_Med  , parameter->getParD(lev)->rho_SP_Med  , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->press_SP_Med, parameter->getParD(lev)->press_SP_Med, parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
 }
 void CudaMemoryManager::cudaAllocCoord(int lev)
 {
 	//Host
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateX      ), parameter->getParH(lev)->mem_size_real_SP  ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateY      ), parameter->getParH(lev)->mem_size_real_SP  ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateZ      ), parameter->getParH(lev)->mem_size_real_SP  ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateX      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateY      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateZ      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
 	//Device (spinning ship + uppsala)
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateX      ), parameter->getParH(lev)->mem_size_real_SP  ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateY      ), parameter->getParH(lev)->mem_size_real_SP  ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateZ      ), parameter->getParH(lev)->mem_size_real_SP  ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateX      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateY      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateZ      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
 	//////////////////////////////////////////////////////////////////////////
-	double tmp = 3. * (double)parameter->getParH(lev)->mem_size_real_SP;
+	double tmp = 3. * (double)parameter->getParH(lev)->memSizeRealLBnodes;
 	setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopyCoord(int lev)
 {
 	//copy host to device
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateX,  parameter->getParH(lev)->coordinateX,  parameter->getParH(lev)->mem_size_real_SP     , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateY,  parameter->getParH(lev)->coordinateY,  parameter->getParH(lev)->mem_size_real_SP     , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateZ,  parameter->getParH(lev)->coordinateZ,  parameter->getParH(lev)->mem_size_real_SP     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateX,  parameter->getParH(lev)->coordinateX,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateY,  parameter->getParH(lev)->coordinateY,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateZ,  parameter->getParH(lev)->coordinateZ,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaFreeCoord(int lev)
 {
@@ -84,24 +74,24 @@ void CudaMemoryManager::cudaFreeCoord(int lev)
 void CudaMemoryManager::cudaAllocBodyForce(int lev)
 {
     //Host
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->forceX_SP      ), parameter->getParH(lev)->mem_size_real_SP  ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->forceY_SP      ), parameter->getParH(lev)->mem_size_real_SP  ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->forceZ_SP      ), parameter->getParH(lev)->mem_size_real_SP  ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->forceX_SP      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->forceY_SP      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->forceZ_SP      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
 	//Device
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->forceX_SP      ), parameter->getParH(lev)->mem_size_real_SP  ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->forceY_SP      ), parameter->getParH(lev)->mem_size_real_SP  ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->forceZ_SP      ), parameter->getParH(lev)->mem_size_real_SP  ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->forceX_SP      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->forceY_SP      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->forceZ_SP      ), parameter->getParH(lev)->memSizeRealLBnodes  ));
 	//////////////////////////////////////////////////////////////////////////
-	double tmp = 3. * (double)parameter->getParH(lev)->mem_size_real_SP;
+	double tmp = 3. * (double)parameter->getParH(lev)->memSizeRealLBnodes;
 	setMemsizeGPU(tmp, false);
 
 }
 void CudaMemoryManager::cudaCopyBodyForce(int lev)
 {
    	//copy host to device
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->forceX_SP,  parameter->getParH(lev)->forceX_SP,  parameter->getParH(lev)->mem_size_real_SP     , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->forceY_SP,  parameter->getParH(lev)->forceY_SP,  parameter->getParH(lev)->mem_size_real_SP     , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->forceZ_SP,  parameter->getParH(lev)->forceZ_SP,  parameter->getParH(lev)->mem_size_real_SP     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->forceX_SP,  parameter->getParH(lev)->forceX_SP,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->forceY_SP,  parameter->getParH(lev)->forceY_SP,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->forceZ_SP,  parameter->getParH(lev)->forceZ_SP,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
 
 }
 void CudaMemoryManager::cudaFreeBodyForce(int lev)
@@ -114,71 +104,71 @@ void CudaMemoryManager::cudaFreeBodyForce(int lev)
 //print
 void CudaMemoryManager::cudaCopyDataToHost(int lev)
 {
-	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityX   , parameter->getParD(lev)->velocityX   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityY   , parameter->getParD(lev)->velocityY   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityZ   , parameter->getParD(lev)->velocityZ   , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->rho  , parameter->getParD(lev)->rho  , parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
-	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->pressure, parameter->getParD(lev)->pressure, parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
+	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityX   , parameter->getParD(lev)->velocityX   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityY   , parameter->getParD(lev)->velocityY   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->velocityZ   , parameter->getParD(lev)->velocityZ   , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->rho         , parameter->getParD(lev)->rho         , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
+	checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->pressure    , parameter->getParD(lev)->pressure    , parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
 }
 //sparse
 void CudaMemoryManager::cudaAllocSP(int lev)
 {
 	//Host
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->typeOfGridNode           ), parameter->getParH(lev)->mem_size_int_SP    ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborX    ), parameter->getParH(lev)->mem_size_int_SP    ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborY    ), parameter->getParH(lev)->mem_size_int_SP    ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborZ    ), parameter->getParH(lev)->mem_size_int_SP    ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->rho          ), parameter->getParH(lev)->mem_size_real_SP));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityX           ), parameter->getParH(lev)->mem_size_real_SP));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityY           ), parameter->getParH(lev)->mem_size_real_SP));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityZ           ), parameter->getParH(lev)->mem_size_real_SP));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->pressure        ), parameter->getParH(lev)->mem_size_real_SP));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->typeOfGridNode), parameter->getParH(lev)->memSizeLonglongLBnodes));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborX     ), parameter->getParH(lev)->memSizeLonglongLBnodes));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborY     ), parameter->getParH(lev)->memSizeLonglongLBnodes));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborZ     ), parameter->getParH(lev)->memSizeLonglongLBnodes));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->rho           ), parameter->getParH(lev)->memSizeRealLBnodes    ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityX     ), parameter->getParH(lev)->memSizeRealLBnodes    ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityY     ), parameter->getParH(lev)->memSizeRealLBnodes    ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityZ     ), parameter->getParH(lev)->memSizeRealLBnodes    ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->pressure      ), parameter->getParH(lev)->memSizeRealLBnodes    ));
 	//Device
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->typeOfGridNode               ), parameter->getParD(lev)->mem_size_int_SP    ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborX        ), parameter->getParD(lev)->mem_size_int_SP    ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborY        ), parameter->getParD(lev)->mem_size_int_SP    ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborZ        ), parameter->getParD(lev)->mem_size_int_SP    ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->rho              ), parameter->getParD(lev)->mem_size_real_SP));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityX               ), parameter->getParD(lev)->mem_size_real_SP));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityY               ), parameter->getParD(lev)->mem_size_real_SP));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityZ               ), parameter->getParD(lev)->mem_size_real_SP));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->pressure            ), parameter->getParD(lev)->mem_size_real_SP));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->distributions.f[0]           ), (unsigned long long)parameter->getD3Qxx()*(unsigned long long)parameter->getParD(lev)->mem_size_real_SP));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->typeOfGridNode    ), parameter->getParD(lev)->memSizeLonglongLBnodes));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborX         ), parameter->getParD(lev)->memSizeLonglongLBnodes));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborY         ), parameter->getParD(lev)->memSizeLonglongLBnodes));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborZ         ), parameter->getParD(lev)->memSizeLonglongLBnodes));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->rho               ), parameter->getParD(lev)->memSizeRealLBnodes    ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityX         ), parameter->getParD(lev)->memSizeRealLBnodes    ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityY         ), parameter->getParD(lev)->memSizeRealLBnodes    ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityZ         ), parameter->getParD(lev)->memSizeRealLBnodes    ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->pressure          ), parameter->getParD(lev)->memSizeRealLBnodes    ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->distributions.f[0]), (unsigned long long)parameter->getD3Qxx()*(unsigned long long)parameter->getParD(lev)->memSizeRealLBnodes));
 	//////////////////////////////////////////////////////////////////////////
-	double tmp = 4. * (double)parameter->getParH(lev)->mem_size_int_SP + 5. * (double)parameter->getParH(lev)->mem_size_real_SP + (double)parameter->getD3Qxx() * (double)parameter->getParH(lev)->mem_size_real_SP;
+	double tmp = 4. * (double)parameter->getParH(lev)->memSizeLonglongLBnodes + 5. * (double)parameter->getParH(lev)->memSizeRealLBnodes + (double)parameter->getD3Qxx() * (double)parameter->getParH(lev)->memSizeRealLBnodes;
 	setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopySP(int lev)
 {
 	//copy host to device
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->typeOfGridNode       ,  parameter->getParH(lev)->typeOfGridNode       ,  parameter->getParH(lev)->mem_size_int_SP     , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->neighborX,  parameter->getParH(lev)->neighborX,  parameter->getParH(lev)->mem_size_int_SP     , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->neighborY,  parameter->getParH(lev)->neighborY,  parameter->getParH(lev)->mem_size_int_SP     , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->neighborZ,  parameter->getParH(lev)->neighborZ,  parameter->getParH(lev)->mem_size_int_SP     , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->rho      ,  parameter->getParH(lev)->rho      ,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityX       ,  parameter->getParH(lev)->velocityX       ,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityY       ,  parameter->getParH(lev)->velocityY       ,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityZ       ,  parameter->getParH(lev)->velocityZ       ,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->pressure    ,  parameter->getParH(lev)->pressure    ,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->typeOfGridNode, parameter->getParH(lev)->typeOfGridNode,  parameter->getParH(lev)->memSizeLonglongLBnodes , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->neighborX     , parameter->getParH(lev)->neighborX     ,  parameter->getParH(lev)->memSizeLonglongLBnodes , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->neighborY     , parameter->getParH(lev)->neighborY     ,  parameter->getParH(lev)->memSizeLonglongLBnodes , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->neighborZ     , parameter->getParH(lev)->neighborZ     ,  parameter->getParH(lev)->memSizeLonglongLBnodes , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->rho           , parameter->getParH(lev)->rho           ,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityX     , parameter->getParH(lev)->velocityX     ,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityY     , parameter->getParH(lev)->velocityY     ,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityZ     , parameter->getParH(lev)->velocityZ     ,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->pressure      , parameter->getParH(lev)->pressure      ,  parameter->getParH(lev)->memSizeRealLBnodes     , cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaFreeSP(int lev)
 {
-	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->typeOfGridNode       ));
-	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->velocityX       ));
-	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->velocityY       ));
-	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->velocityZ       ));
-	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->rho      ));
-	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->pressure    ));
-	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborX));
-	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborY));
-	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborZ));
+	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->typeOfGridNode ));
+	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->velocityX      ));
+	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->velocityY      ));
+	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->velocityZ      ));
+	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->rho            ));
+	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->pressure       ));
+	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborX      ));
+	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborY      ));
+	checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->neighborZ      ));
 }
 void CudaMemoryManager::cudaAllocF3SP(int lev)
 {
     //Device
-    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->g6.g[0]), (unsigned long long)6*(unsigned long long)parameter->getParD(lev)->mem_size_real_SP));
+    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->g6.g[0]), (unsigned long long)6*(unsigned long long)parameter->getParD(lev)->memSizeRealLBnodes));
     //////////////////////////////////////////////////////////////////////////
-    double tmp = (double)6 * (double)parameter->getParH(lev)->mem_size_real_SP;
+    double tmp = (double)6 * (double)parameter->getParH(lev)->memSizeRealLBnodes;
     setMemsizeGPU(tmp, false);
 }
 
@@ -210,20 +200,20 @@ void CudaMemoryManager::cudaAllocVeloBC(int lev)
 
 	//Host
 	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.q27[0]),  parameter->getD3Qxx()*mem_size_inflow_Q_q ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.k),                  mem_size_inflow_Q_k ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.Vx),                 mem_size_inflow_Q_q ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.Vy),                 mem_size_inflow_Q_q ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.Vz),                 mem_size_inflow_Q_q ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.deltaVz),            mem_size_inflow_Q_q ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.RhoBC),              mem_size_inflow_Q_q ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.k),                             mem_size_inflow_Q_k ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.Vx),                            mem_size_inflow_Q_q ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.Vy),                            mem_size_inflow_Q_q ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.Vz),                            mem_size_inflow_Q_q ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.deltaVz),                       mem_size_inflow_Q_q ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->velocityBC.RhoBC),                         mem_size_inflow_Q_q ));
 
 	//Device
 	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.q27[0]),      parameter->getD3Qxx()*mem_size_inflow_Q_q ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.k),                      mem_size_inflow_Q_k ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.Vx),                     mem_size_inflow_Q_q ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.Vy),                     mem_size_inflow_Q_q ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.Vz),                     mem_size_inflow_Q_q ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.deltaVz),                mem_size_inflow_Q_q ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.k),                                 mem_size_inflow_Q_k ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.Vx),                                mem_size_inflow_Q_q ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.Vy),                                mem_size_inflow_Q_q ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.Vz),                                mem_size_inflow_Q_q ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->velocityBC.deltaVz),                           mem_size_inflow_Q_q ));
 
 	//////////////////////////////////////////////////////////////////////////
 	double tmp = (double)mem_size_inflow_Q_k + 4. * (double)mem_size_inflow_Q_q + (double)parameter->getD3Qxx() * (double)mem_size_inflow_Q_q;
@@ -235,11 +225,11 @@ void CudaMemoryManager::cudaCopyVeloBC(int lev)
 	unsigned int mem_size_inflow_Q_q = sizeof(real)*parameter->getParH(lev)->velocityBC.numberOfBCnodes;
 
 	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.q27[0],  parameter->getParH(lev)->velocityBC.q27[0], parameter->getD3Qxx()* mem_size_inflow_Q_q,  cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.k,       parameter->getParH(lev)->velocityBC.k,                  mem_size_inflow_Q_k,  cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.Vx,      parameter->getParH(lev)->velocityBC.Vx,                 mem_size_inflow_Q_q,  cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.Vy,      parameter->getParH(lev)->velocityBC.Vy,                 mem_size_inflow_Q_q,  cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.Vz,      parameter->getParH(lev)->velocityBC.Vz,                 mem_size_inflow_Q_q,  cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.deltaVz, parameter->getParH(lev)->velocityBC.deltaVz,            mem_size_inflow_Q_q,  cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.k,       parameter->getParH(lev)->velocityBC.k,                             mem_size_inflow_Q_k,  cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.Vx,      parameter->getParH(lev)->velocityBC.Vx,                            mem_size_inflow_Q_q,  cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.Vy,      parameter->getParH(lev)->velocityBC.Vy,                            mem_size_inflow_Q_q,  cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.Vz,      parameter->getParH(lev)->velocityBC.Vz,                            mem_size_inflow_Q_q,  cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->velocityBC.deltaVz, parameter->getParH(lev)->velocityBC.deltaVz,                       mem_size_inflow_Q_q,  cudaMemcpyHostToDevice));
 
 }
 
@@ -260,15 +250,15 @@ void CudaMemoryManager::cudaAllocOutflowBC(int lev)
 
 	//Host
 	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->outflowBC.q27[0]), parameter->getD3Qxx()*mem_size_outflow_Q_q ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->outflowBC.k),                 mem_size_outflow_Q_k ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->outflowBC.kN),                mem_size_outflow_Q_k ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->outflowBC.RhoBC),             mem_size_outflow_Q_q ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->outflowBC.k),                            mem_size_outflow_Q_k ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->outflowBC.kN),                           mem_size_outflow_Q_k ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->outflowBC.RhoBC),                        mem_size_outflow_Q_q ));
 
 	//Device
 	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->outflowBC.q27[0]),     parameter->getD3Qxx()* mem_size_outflow_Q_q ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->outflowBC.k),                      mem_size_outflow_Q_k ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->outflowBC.kN),                     mem_size_outflow_Q_k ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->outflowBC.RhoBC),                  mem_size_outflow_Q_q ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->outflowBC.k),                                 mem_size_outflow_Q_k ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->outflowBC.kN),                                mem_size_outflow_Q_k ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->outflowBC.RhoBC),                             mem_size_outflow_Q_q ));
 
 	//////////////////////////////////////////////////////////////////////////
 	double tmp = (double)mem_size_outflow_Q_q + 2. * (double)mem_size_outflow_Q_k + (double)parameter->getD3Qxx()*(double)mem_size_outflow_Q_q;
@@ -280,9 +270,9 @@ void CudaMemoryManager::cudaCopyOutflowBC(int lev)
 	unsigned int mem_size_outflow_Q_q = sizeof(real)*parameter->getParH(lev)->outflowBC.numberOfBCnodes;
 
 	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->outflowBC.q27[0],  parameter->getParH(lev)->outflowBC.q27[0], parameter->getD3Qxx()* mem_size_outflow_Q_q,  cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->outflowBC.k,       parameter->getParH(lev)->outflowBC.k,                  mem_size_outflow_Q_k,  cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->outflowBC.kN,      parameter->getParH(lev)->outflowBC.kN,                 mem_size_outflow_Q_k,  cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->outflowBC.RhoBC,   parameter->getParH(lev)->outflowBC.RhoBC,              mem_size_outflow_Q_q,  cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->outflowBC.k,       parameter->getParH(lev)->outflowBC.k,                             mem_size_outflow_Q_k,  cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->outflowBC.kN,      parameter->getParH(lev)->outflowBC.kN,                            mem_size_outflow_Q_k,  cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->outflowBC.RhoBC,   parameter->getParH(lev)->outflowBC.RhoBC,                         mem_size_outflow_Q_q,  cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaFreeOutflowBC(int lev)
 {
@@ -301,13 +291,13 @@ void CudaMemoryManager::cudaAllocNoSlipBC(int lev)
 
 	//Host
 	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->noSlipBC.q27[0]), parameter->getD3Qxx()*mem_size_Q_q      ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->noSlipBC.k),                 mem_size_Q_k      ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->noSlipBC.qread),             mem_size_Q_q_read ));//Geller
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->noSlipBC.valueQ),            mem_size_Q_value  ));//Geller
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->noSlipBC.k),                            mem_size_Q_k      ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->noSlipBC.qread),                        mem_size_Q_q_read ));//Geller
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->noSlipBC.valueQ),                       mem_size_Q_value  ));//Geller
 
 	//Device
 	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->noSlipBC.q27[0]),     parameter->getD3Qxx()* mem_size_Q_q     ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->noSlipBC.k),                      mem_size_Q_k     ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->noSlipBC.k),                                 mem_size_Q_k     ));
 
 	//////////////////////////////////////////////////////////////////////////
 	double tmp = (double)mem_size_Q_k + (double)parameter->getD3Qxx()*(double)mem_size_Q_q;
@@ -319,7 +309,7 @@ void CudaMemoryManager::cudaCopyNoSlipBC(int lev)
 	unsigned int mem_size_Q_q = sizeof(real)*parameter->getParH(lev)->noSlipBC.numberOfBCnodes;
 
 	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->noSlipBC.q27[0], parameter->getParH(lev)->noSlipBC.q27[0], parameter->getD3Qxx()* mem_size_Q_q,       cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->noSlipBC.k,      parameter->getParH(lev)->noSlipBC.k,                  mem_size_Q_k,       cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->noSlipBC.k,      parameter->getParH(lev)->noSlipBC.k,                             mem_size_Q_k,       cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaFreeNoSlipBC(int lev)
 {
@@ -336,11 +326,11 @@ void CudaMemoryManager::cudaAllocGeomBC(int lev)
 
 	//Host
 	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->geometryBC.q27[0]), parameter->getD3Qxx()*mem_size_Q_q      ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->geometryBC.k),                 mem_size_Q_k      ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->geometryBC.k),                            mem_size_Q_k      ));
 
 	//Device
 	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->geometryBC.q27[0]),     parameter->getD3Qxx()* mem_size_Q_q     ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->geometryBC.k),                      mem_size_Q_k     ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->geometryBC.k),                                 mem_size_Q_k     ));
 
 	//////////////////////////////////////////////////////////////////////////
 	double tmp = (double)mem_size_Q_k + (double)parameter->getD3Qxx()*(double)mem_size_Q_q;
@@ -352,7 +342,7 @@ void CudaMemoryManager::cudaCopyGeomBC(int lev)
 	unsigned int mem_size_Q_q = sizeof(real)*parameter->getParH(lev)->geometryBC.numberOfBCnodes;
 
 	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->geometryBC.q27[0], parameter->getParH(lev)->geometryBC.q27[0], parameter->getD3Qxx()* mem_size_Q_q,       cudaMemcpyHostToDevice));
-	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->geometryBC.k,      parameter->getParH(lev)->geometryBC.k,                  mem_size_Q_k,       cudaMemcpyHostToDevice));
+	checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->geometryBC.k,      parameter->getParH(lev)->geometryBC.k,                             mem_size_Q_k,       cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaFreeGeomBC(int lev)
 {
@@ -367,15 +357,15 @@ void CudaMemoryManager::cudaAllocPress(int lev)
 
 	//Host
 	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->pressureBC.q27[0]), parameter->getD3Qxx()*mem_size_Q_q      ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->pressureBC.k),                 mem_size_Q_k      ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->pressureBC.kN),                mem_size_Q_k      ));
-	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->pressureBC.RhoBC),             mem_size_Q_q      ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->pressureBC.k),                            mem_size_Q_k      ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->pressureBC.kN),                           mem_size_Q_k      ));
+	checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->pressureBC.RhoBC),                        mem_size_Q_q      ));
 
 	//Device
 	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->pressureBC.q27[0]),     parameter->getD3Qxx()* mem_size_Q_q     ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->pressureBC.k),                      mem_size_Q_k     ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->pressureBC.kN),                     mem_size_Q_k     ));
-	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->pressureBC.RhoBC),                  mem_size_Q_q     ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->pressureBC.k),                                 mem_size_Q_k     ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->pressureBC.kN),                                mem_size_Q_k     ));
+	checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->pressureBC.RhoBC),                             mem_size_Q_q     ));
 
 	//////////////////////////////////////////////////////////////////////////
 	double tmp = 2. * (double)mem_size_Q_k + (double)mem_size_Q_q + (double)parameter->getD3Qxx()*(double)mem_size_Q_q;
@@ -889,17 +879,17 @@ void CudaMemoryManager::cudaFreeProcessNeighborF3Z(int lev, unsigned int process
 void CudaMemoryManager::cudaAllocNeighborWSB(int lev)
 {
     //Host
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborInverse    ), parameter->getParH(lev)->mem_size_int_SP    ));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->neighborInverse    ), parameter->getParH(lev)->memSizeLonglongLBnodes    ));
     //Device
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborInverse        ), parameter->getParD(lev)->mem_size_int_SP    ));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->neighborInverse        ), parameter->getParD(lev)->memSizeLonglongLBnodes    ));
     //////////////////////////////////////////////////////////////////////////
-    double tmp = (double)parameter->getParH(lev)->mem_size_int_SP;
+    double tmp = (double)parameter->getParH(lev)->memSizeLonglongLBnodes;
     setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopyNeighborWSB(int lev)
 {
     //copy host to device
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->neighborInverse,  parameter->getParH(lev)->neighborInverse,  parameter->getParH(lev)->mem_size_int_SP     , cudaMemcpyHostToDevice));
+    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->neighborInverse,  parameter->getParH(lev)->neighborInverse,  parameter->getParH(lev)->memSizeLonglongLBnodes     , cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaFreeNeighborWSB(int lev)
 {
@@ -909,7 +899,7 @@ void CudaMemoryManager::cudaFreeNeighborWSB(int lev)
 void CudaMemoryManager::cudaAllocTurbulentViscosity(int lev)
 {
     //Host
-    checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->turbViscosity), parameter->getParH(lev)->mem_size_real_SP));
+    checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->turbViscosity), parameter->getParH(lev)->memSizeRealLBnodes));
     //Debug
     // checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->gSij ), parameter->getParH(lev)->mem_size_real_SP));
     // checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->gSDij), parameter->getParH(lev)->mem_size_real_SP));
@@ -924,7 +914,7 @@ void CudaMemoryManager::cudaAllocTurbulentViscosity(int lev)
     // checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->gDzvz), parameter->getParH(lev)->mem_size_real_SP));
 
     //Device
-    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->turbViscosity), parameter->getParD(lev)->mem_size_real_SP));
+    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->turbViscosity), parameter->getParD(lev)->memSizeRealLBnodes));
     //Debug
     // checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->gSij ), parameter->getParD(lev)->mem_size_real_SP));
     // checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->gSDij), parameter->getParD(lev)->mem_size_real_SP));
@@ -939,13 +929,13 @@ void CudaMemoryManager::cudaAllocTurbulentViscosity(int lev)
     // checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->gDzvz), parameter->getParD(lev)->mem_size_real_SP));
     // //////////////////////////////////////////////////////////////////////////
     // double tmp = (double)parameter->getParH(lev)->mem_size_real_SP * 12.0;
-    double tmp = (double)parameter->getParH(lev)->mem_size_real_SP;
+    double tmp = (double)parameter->getParH(lev)->memSizeRealLBnodes;
     setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopyTurbulentViscosityHD(int lev)
 {
     //copy host to device
-    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->turbViscosity, parameter->getParH(lev)->turbViscosity, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->turbViscosity, parameter->getParH(lev)->turbViscosity, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyHostToDevice));
     //Debug
     // checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->gSij , parameter->getParH(lev)->gSij , parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyHostToDevice));
     // checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->gSDij, parameter->getParH(lev)->gSDij, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyHostToDevice));
@@ -962,7 +952,7 @@ void CudaMemoryManager::cudaCopyTurbulentViscosityHD(int lev)
 void CudaMemoryManager::cudaCopyTurbulentViscosityDH(int lev)
 {
     //copy device to host
-    checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->turbViscosity, parameter->getParD(lev)->turbViscosity, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyDeviceToHost));
+    checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->turbViscosity, parameter->getParD(lev)->turbViscosity, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyDeviceToHost));
     //Debug
     // checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->gSij , parameter->getParD(lev)->gSij , parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyDeviceToHost));
     // checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->gSDij, parameter->getParD(lev)->gSDij, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyDeviceToHost));
@@ -1064,29 +1054,29 @@ void CudaMemoryManager::cudaFreeTurbulenceIntensity(int lev)
 void CudaMemoryManager::cudaAllocMedianSP(int lev)
 {
     //Host
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->rho_SP_Med      ), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vx_SP_Med       ), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vy_SP_Med       ), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vz_SP_Med       ), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->press_SP_Med    ), parameter->getParH(lev)->mem_size_real_SP));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->rho_SP_Med      ), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vx_SP_Med       ), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vy_SP_Med       ), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vz_SP_Med       ), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->press_SP_Med    ), parameter->getParH(lev)->memSizeRealLBnodes));
     //Device
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->rho_SP_Med          ), parameter->getParD(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->vx_SP_Med           ), parameter->getParD(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->vy_SP_Med           ), parameter->getParD(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->vz_SP_Med           ), parameter->getParD(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->press_SP_Med        ), parameter->getParD(lev)->mem_size_real_SP));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->rho_SP_Med          ), parameter->getParD(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->vx_SP_Med           ), parameter->getParD(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->vy_SP_Med           ), parameter->getParD(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->vz_SP_Med           ), parameter->getParD(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->press_SP_Med        ), parameter->getParD(lev)->memSizeRealLBnodes));
     //////////////////////////////////////////////////////////////////////////
-    double tmp = 5. * (double)parameter->getParH(lev)->mem_size_real_SP;
+    double tmp = 5. * (double)parameter->getParH(lev)->memSizeRealLBnodes;
     setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopyMedianSP(int lev)
 {
     //copy host to device
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->rho_SP_Med  ,  parameter->getParH(lev)->rho_SP_Med  ,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->vx_SP_Med   ,  parameter->getParH(lev)->vx_SP_Med   ,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->vy_SP_Med   ,  parameter->getParH(lev)->vy_SP_Med   ,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->vz_SP_Med   ,  parameter->getParH(lev)->vz_SP_Med   ,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->press_SP_Med,  parameter->getParH(lev)->press_SP_Med,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
+    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->rho_SP_Med  ,  parameter->getParH(lev)->rho_SP_Med  ,  parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice));
+    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->vx_SP_Med   ,  parameter->getParH(lev)->vx_SP_Med   ,  parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice));
+    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->vy_SP_Med   ,  parameter->getParH(lev)->vy_SP_Med   ,  parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice));
+    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->vz_SP_Med   ,  parameter->getParH(lev)->vz_SP_Med   ,  parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice));
+    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->press_SP_Med,  parameter->getParH(lev)->press_SP_Med,  parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaFreeMedianSP(int lev)
 {
@@ -1099,11 +1089,11 @@ void CudaMemoryManager::cudaFreeMedianSP(int lev)
 void CudaMemoryManager::cudaAllocMedianOut(int lev)
 {
     //Host
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->rho_SP_Med_Out      ), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vx_SP_Med_Out       ), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vy_SP_Med_Out       ), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vz_SP_Med_Out       ), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->press_SP_Med_Out    ), parameter->getParH(lev)->mem_size_real_SP));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->rho_SP_Med_Out      ), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vx_SP_Med_Out       ), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vy_SP_Med_Out       ), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->vz_SP_Med_Out       ), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->press_SP_Med_Out    ), parameter->getParH(lev)->memSizeRealLBnodes));
 }
 void CudaMemoryManager::cudaFreeMedianOut(int lev)
 {
@@ -2042,15 +2032,15 @@ void CudaMemoryManager::cudaFreeMeasurePointsIndex(int lev)
 }
 void CudaMemoryManager::cudaAllocFsForCheckPointAndRestart(int lev)
 {
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->distributions.f[0] ),           (unsigned long long)parameter->getD3Qxx()*(unsigned long long)parameter->getParH(lev)->mem_size_real_SP));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->distributions.f[0] ),           (unsigned long long)parameter->getD3Qxx()*(unsigned long long)parameter->getParH(lev)->memSizeRealLBnodes));
 }
 void CudaMemoryManager::cudaCopyFsForRestart(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->distributions.f[0],  parameter->getParH(lev)->distributions.f[0],     (unsigned long long)parameter->getD3Qxx()*(unsigned long long)parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyHostToDevice));
+    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->distributions.f[0],  parameter->getParH(lev)->distributions.f[0],     (unsigned long long)parameter->getD3Qxx()*(unsigned long long)parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaCopyFsForCheckPoint(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->distributions.f[0],  parameter->getParD(lev)->distributions.f[0],     (unsigned long long)parameter->getD3Qxx()*(unsigned long long)parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->distributions.f[0],  parameter->getParD(lev)->distributions.f[0],     (unsigned long long)parameter->getD3Qxx()*(unsigned long long)parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
 }
 void CudaMemoryManager::cudaFreeFsForCheckPointAndRestart(int lev)
 {
@@ -2529,20 +2519,20 @@ void CudaMemoryManager::cudaFreePorousMedia(PorousMedia* pm, int lev)
 void CudaMemoryManager::cudaAllocConcentration(int lev)
 {
     //Host
-    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->Conc), parameter->getParH(lev)->mem_size_real_SP));
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->Conc), parameter->getParH(lev)->memSizeRealLBnodes));
     //Device
-    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->Conc), parameter->getParD(lev)->mem_size_real_SP));
+    checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->Conc), parameter->getParD(lev)->memSizeRealLBnodes));
     //////////////////////////////////////////////////////////////////////////
-    double tmp = (double)parameter->getParH(lev)->mem_size_real_SP;
+    double tmp = (double)parameter->getParH(lev)->memSizeRealLBnodes;
     setMemsizeGPU(tmp, false);
 }
 void CudaMemoryManager::cudaCopyConcentrationDeviceToHost(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->Conc, parameter->getParD(lev)->Conc,  parameter->getParH(lev)->mem_size_real_SP , cudaMemcpyDeviceToHost));
+    checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->Conc, parameter->getParD(lev)->Conc,  parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyDeviceToHost));
 }
 void CudaMemoryManager::cudaCopyConcentrationHostToDevice(int lev)
 {
-    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->Conc, parameter->getParH(lev)->Conc, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyHostToDevice));
+    checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->Conc, parameter->getParH(lev)->Conc, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyHostToDevice));
 }
 void CudaMemoryManager::cudaFreeConcentration(int lev)
 {
@@ -2554,14 +2544,14 @@ void CudaMemoryManager::cudaAllocTempFs(int lev)
     //Device
     if (parameter->getDiffMod() == 7)
     {
-        checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->distributionsAD7.f[0]), parameter->getDiffMod()*parameter->getParH(lev)->mem_size_real_SP));
+        checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->distributionsAD7.f[0]), parameter->getDiffMod()*parameter->getParH(lev)->memSizeRealLBnodes));
     }
     else if (parameter->getDiffMod() == 27)
     {
-        checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->distributionsAD27.f[0]), parameter->getDiffMod()*parameter->getParH(lev)->mem_size_real_SP));
+        checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->distributionsAD27.f[0]), parameter->getDiffMod()*parameter->getParH(lev)->memSizeRealLBnodes));
     }
     //////////////////////////////////////////////////////////////////////////
-    double tmp = (double)(parameter->getDiffMod() * parameter->getParH(lev)->mem_size_real_SP);
+    double tmp = (double)(parameter->getDiffMod() * parameter->getParH(lev)->memSizeRealLBnodes);
     setMemsizeGPU(tmp, false);
 }
 //////////////////////////////////////////////////////////////////////////
@@ -2756,12 +2746,12 @@ void CudaMemoryManager::cudaFreeConcFile(int lev)
 void CudaMemoryManager::cudaAllocMedianOutAD(int lev)
 {
 	//Host
-	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->rho_SP_Med_Out),   parameter->getParH(lev)->mem_size_real_SP));
-	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->vx_SP_Med_Out),    parameter->getParH(lev)->mem_size_real_SP));
-	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->vy_SP_Med_Out),    parameter->getParH(lev)->mem_size_real_SP));
-	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->vz_SP_Med_Out),    parameter->getParH(lev)->mem_size_real_SP));
-	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->press_SP_Med_Out), parameter->getParH(lev)->mem_size_real_SP));
-	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->Conc_Med_Out),     parameter->getParH(lev)->mem_size_real_SP));
+	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->rho_SP_Med_Out),   parameter->getParH(lev)->memSizeRealLBnodes));
+	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->vx_SP_Med_Out),    parameter->getParH(lev)->memSizeRealLBnodes));
+	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->vy_SP_Med_Out),    parameter->getParH(lev)->memSizeRealLBnodes));
+	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->vz_SP_Med_Out),    parameter->getParH(lev)->memSizeRealLBnodes));
+	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->press_SP_Med_Out), parameter->getParH(lev)->memSizeRealLBnodes));
+	checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->Conc_Med_Out),     parameter->getParH(lev)->memSizeRealLBnodes));
 }
 void CudaMemoryManager::cudaFreeMedianOutAD(int lev)
 {
@@ -3015,31 +3005,31 @@ void CudaMemoryManager::cudaFreeProcessNeighborADZ(int lev, unsigned int process
 void CudaMemoryManager::cudaAlloc2ndOrderDerivitivesIsoTest(int lev)
 {
     //Host
-    checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->dxxUx), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->dyyUy), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->dzzUz), parameter->getParH(lev)->mem_size_real_SP));
+    checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->dxxUx), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->dyyUy), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors(cudaMallocHost((void**) &(parameter->getParH(lev)->dzzUz), parameter->getParH(lev)->memSizeRealLBnodes));
     //Device (spinning ship)
-    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->dxxUx), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->dyyUy), parameter->getParH(lev)->mem_size_real_SP));
-    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->dzzUz), parameter->getParH(lev)->mem_size_real_SP));
+    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->dxxUx), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->dyyUy), parameter->getParH(lev)->memSizeRealLBnodes));
+    checkCudaErrors(cudaMalloc((void**) &(parameter->getParD(lev)->dzzUz), parameter->getParH(lev)->memSizeRealLBnodes));
     //////////////////////////////////////////////////////////////////////////
-    double tmp = 3. * (double)parameter->getParH(lev)->mem_size_real_SP;
+    double tmp = 3. * (double)parameter->getParH(lev)->memSizeRealLBnodes;
     setMemsizeGPU(tmp, false);
     //printf("Coord = %f MB",tmp/1000000.);
 }
 void CudaMemoryManager::cudaCopy2ndOrderDerivitivesIsoTestDH(int lev)
 {
     //copy device to host
-    checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->dxxUx, parameter->getParD(lev)->dxxUx, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyDeviceToHost));
-    checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->dyyUy, parameter->getParD(lev)->dyyUy, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyDeviceToHost));
-    checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->dzzUz, parameter->getParD(lev)->dzzUz, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyDeviceToHost));
+    checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->dxxUx, parameter->getParD(lev)->dxxUx, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyDeviceToHost));
+    checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->dyyUy, parameter->getParD(lev)->dyyUy, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyDeviceToHost));
+    checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->dzzUz, parameter->getParD(lev)->dzzUz, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyDeviceToHost));
 }
 void CudaMemoryManager::cudaCopy2ndOrderDerivitivesIsoTestHD(int lev)
 {
     //copy host to device
-    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->dxxUx, parameter->getParH(lev)->dxxUx, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyHostToDevice));
-    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->dyyUy, parameter->getParH(lev)->dyyUy, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyHostToDevice));
-    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->dzzUz, parameter->getParH(lev)->dzzUz, parameter->getParH(lev)->mem_size_real_SP, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->dxxUx, parameter->getParH(lev)->dxxUx, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->dyyUy, parameter->getParH(lev)->dyyUy, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyHostToDevice));
+    checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->dzzUz, parameter->getParH(lev)->dzzUz, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyHostToDevice));
 
 }
 void CudaMemoryManager::cudaFree2ndOrderDerivitivesIsoTest(int lev)
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h
index 67347d005b1abb6ae6b6badf8f187a11b2bde15a..e2f2e8658b6ef7a9453546454dd8e1f643574e17 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h
+++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h
@@ -32,8 +32,8 @@ public:
     void setMemsizeGPU(double admem, bool reset);
     double getMemsizeGPU();
 
-    void cudaAllocFull(int lev);
-    void cudaFreeFull(int lev);
+    //void cudaAllocFull(int lev); //DEPRECATED: related to full matrix
+    //void cudaFreeFull(int lev);  //DEPRECATED: related to full matrix
 
     void cudaCopyPrint(int lev);
     void cudaCopyMedianPrint(int lev);
diff --git a/src/gpu/VirtualFluids_GPU/GPU/Cumulant27.cu b/src/gpu/VirtualFluids_GPU/GPU/Cumulant27.cu
index bbce8181d814fc8b9dbb086764becb73a86c0eda..553e1f34f7993a42682605b66d53407ede9292fd 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/Cumulant27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/Cumulant27.cu
@@ -21,7 +21,7 @@ __global__ void LB_Kernel_Kum_AA2016_Comp_Bulk_SP_27(real omega,
 																unsigned int* neighborY,
 																unsigned int* neighborZ,
 																real* DDStart,
-																int size_Mat,
+																unsigned long long numberOfLBnodes,
 																int level,
 																real* forces,
 																bool EvenOrOdd)
@@ -37,7 +37,7 @@ __global__ void LB_Kernel_Kum_AA2016_Comp_Bulk_SP_27(real omega,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -48,63 +48,63 @@ __global__ void LB_Kernel_Kum_AA2016_Comp_Bulk_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -137,33 +137,33 @@ __global__ void LB_Kernel_Kum_AA2016_Comp_Bulk_SP_27(real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00   ])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0   ])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M   ])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0  ])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0  ])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M  ])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P  ])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP  ])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k  ];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP ])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP ])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP ])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP ])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM ])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM ])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 			////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
 							(((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) +
@@ -975,7 +975,7 @@ __global__ void LB_Kernel_Kum_IsoTest_SP_27( real omega,
 														real* dxxUx,
 														real* dyyUy,
 														real* dzzUz,
-														int size_Mat,
+														unsigned long long numberOfLBnodes,
 														bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -989,7 +989,7 @@ __global__ void LB_Kernel_Kum_IsoTest_SP_27( real omega,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -1000,63 +1000,63 @@ __global__ void LB_Kernel_Kum_IsoTest_SP_27( real omega,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -1089,33 +1089,33 @@ __global__ void LB_Kernel_Kum_IsoTest_SP_27( real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00   ])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0   ])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M   ])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0  ])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0  ])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M  ])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P  ])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP  ])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k  ];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP ])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP ])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP ])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP ])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM ])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM ])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 			////////////////////////////////////////////////////////////////////////////////////
 			//slow
 			//real oMdrho = one - ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
@@ -2016,7 +2016,7 @@ __global__ void LB_Kernel_Kum_1h_SP_27(  real omega,
 													real* coordY,
 													real* coordZ,
 													real* DDStart,
-													int size_Mat,
+													unsigned long long numberOfLBnodes,
 													bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -2030,7 +2030,7 @@ __global__ void LB_Kernel_Kum_1h_SP_27(  real omega,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -2041,63 +2041,63 @@ __global__ void LB_Kernel_Kum_1h_SP_27(  real omega,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -2158,33 +2158,33 @@ __global__ void LB_Kernel_Kum_1h_SP_27(  real omega,
 			//unsigned int ktne = k;
 			//unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00   ])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0   ])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M   ])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0  ])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0  ])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M  ])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P  ])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP  ])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k  ];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP ])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP ])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP ])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP ])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM ])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM ])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 			////////////////////////////////////////////////////////////////////////////////////
 			//Ship
 			real coord0X = 281.125f;//7.5f;
@@ -3238,7 +3238,7 @@ __global__ void LB_Kernel_Kum_New_SP_27(     real omega,
 														unsigned int* neighborY,
 														unsigned int* neighborZ,
 														real* DDStart,
-														int size_Mat,
+														unsigned long long numberOfLBnodes,
 														bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -3252,7 +3252,7 @@ __global__ void LB_Kernel_Kum_New_SP_27(     real omega,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -3263,63 +3263,63 @@ __global__ void LB_Kernel_Kum_New_SP_27(     real omega,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -3380,33 +3380,33 @@ __global__ void LB_Kernel_Kum_New_SP_27(     real omega,
 			//unsigned int ktne = k;
 			//unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00   ])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0   ])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M   ])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0  ])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0  ])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M  ])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P  ])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP  ])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k  ];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw ];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks ];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb ];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw ];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k  ];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw ];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k  ];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks ];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k  ];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP ])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP ])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP ])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP ])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM ])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM ])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k  ];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks ];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw ];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb ];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 			////////////////////////////////////////////////////////////////////////////////////
 			//slow
 			//real oMdrho = one - ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
@@ -4510,7 +4510,7 @@ __global__ void LB_Kernel_Kum_Comp_SP_27(    real omega,
 														unsigned int* neighborY,
 														unsigned int* neighborZ,
 														real* DDStart,
-														int size_Mat,
+														unsigned long long numberOfLBnodes,
 														bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -4524,7 +4524,7 @@ __global__ void LB_Kernel_Kum_Comp_SP_27(    real omega,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if(k<size_Mat)
+	if(k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -4535,63 +4535,63 @@ __global__ void LB_Kernel_Kum_Comp_SP_27(    real omega,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -4624,33 +4624,33 @@ __global__ void LB_Kernel_Kum_Comp_SP_27(    real omega,
 			unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real f_E     = (D.f[DIR_P00   ])[ke   ];// +  c2over27 ;
-			real f_W     = (D.f[DIR_M00   ])[kw   ];// +  c2over27 ;
-			real f_N     = (D.f[DIR_0P0   ])[kn   ];// +  c2over27 ;
-			real f_S     = (D.f[DIR_0M0   ])[ks   ];// +  c2over27 ;
-			real f_T     = (D.f[DIR_00P   ])[kt   ];// +  c2over27 ;
-			real f_B     = (D.f[DIR_00M   ])[kb   ];// +  c2over27 ;
-			real f_NE    = (D.f[DIR_PP0  ])[kne  ];// +  c1over54 ;
-			real f_SW    = (D.f[DIR_MM0  ])[ksw  ];// +  c1over54 ;
-			real f_SE    = (D.f[DIR_PM0  ])[kse  ];// +  c1over54 ;
-			real f_NW    = (D.f[DIR_MP0  ])[knw  ];// +  c1over54 ;
-			real f_TE    = (D.f[DIR_P0P  ])[kte  ];// +  c1over54 ;
-			real f_BW    = (D.f[DIR_M0M  ])[kbw  ];// +  c1over54 ;
-			real f_BE    = (D.f[DIR_P0M  ])[kbe  ];// +  c1over54 ;
-			real f_TW    = (D.f[DIR_M0P  ])[ktw  ];// +  c1over54 ;
-			real f_TN    = (D.f[DIR_0PP  ])[ktn  ];// +  c1over54 ;
-			real f_BS    = (D.f[DIR_0MM  ])[kbs  ];// +  c1over54 ;
-			real f_BN    = (D.f[DIR_0PM  ])[kbn  ];// +  c1over54 ;
-			real f_TS    = (D.f[DIR_0MP  ])[kts  ];// +  c1over54 ;
+			real f_E     = (D.f[DIR_P00])[ke   ];// +  c2over27 ;
+			real f_W     = (D.f[DIR_M00])[kw   ];// +  c2over27 ;
+			real f_N     = (D.f[DIR_0P0])[kn   ];// +  c2over27 ;
+			real f_S     = (D.f[DIR_0M0])[ks   ];// +  c2over27 ;
+			real f_T     = (D.f[DIR_00P])[kt   ];// +  c2over27 ;
+			real f_B     = (D.f[DIR_00M])[kb   ];// +  c2over27 ;
+			real f_NE    = (D.f[DIR_PP0])[kne  ];// +  c1over54 ;
+			real f_SW    = (D.f[DIR_MM0])[ksw  ];// +  c1over54 ;
+			real f_SE    = (D.f[DIR_PM0])[kse  ];// +  c1over54 ;
+			real f_NW    = (D.f[DIR_MP0])[knw  ];// +  c1over54 ;
+			real f_TE    = (D.f[DIR_P0P])[kte  ];// +  c1over54 ;
+			real f_BW    = (D.f[DIR_M0M])[kbw  ];// +  c1over54 ;
+			real f_BE    = (D.f[DIR_P0M])[kbe  ];// +  c1over54 ;
+			real f_TW    = (D.f[DIR_M0P])[ktw  ];// +  c1over54 ;
+			real f_TN    = (D.f[DIR_0PP])[ktn  ];// +  c1over54 ;
+			real f_BS    = (D.f[DIR_0MM])[kbs  ];// +  c1over54 ;
+			real f_BN    = (D.f[DIR_0PM])[kbn  ];// +  c1over54 ;
+			real f_TS    = (D.f[DIR_0MP])[kts  ];// +  c1over54 ;
 			real f_R     = (D.f[DIR_000])[kzero];// +  c8over27 ;
-			real f_TNE   = (D.f[DIR_PPP ])[ktne ];// +  c1over216;
-			real f_TSW   = (D.f[DIR_MMP ])[ktsw ];// +  c1over216;
-			real f_TSE   = (D.f[DIR_PMP ])[ktse ];// +  c1over216;
-			real f_TNW   = (D.f[DIR_MPP ])[ktnw ];// +  c1over216;
-			real f_BNE   = (D.f[DIR_PPM ])[kbne ];// +  c1over216;
-			real f_BSW   = (D.f[DIR_MMM ])[kbsw ];// +  c1over216;
-			real f_BSE   = (D.f[DIR_PMM ])[kbse ];// +  c1over216;
-			real f_BNW   = (D.f[DIR_MPM ])[kbnw ];// +  c1over216;
+			real f_TNE   = (D.f[DIR_PPP])[ktne ];// +  c1over216;
+			real f_TSW   = (D.f[DIR_MMP])[ktsw ];// +  c1over216;
+			real f_TSE   = (D.f[DIR_PMP])[ktse ];// +  c1over216;
+			real f_TNW   = (D.f[DIR_MPP])[ktnw ];// +  c1over216;
+			real f_BNE   = (D.f[DIR_PPM])[kbne ];// +  c1over216;
+			real f_BSW   = (D.f[DIR_MMM])[kbsw ];// +  c1over216;
+			real f_BSE   = (D.f[DIR_PMM])[kbse ];// +  c1over216;
+			real f_BNW   = (D.f[DIR_MPM])[kbnw ];// +  c1over216;
 			////////////////////////////////////////////////////////////////////////////////////
 			real fx = c0o1;
 			real fy = c0o1;
@@ -5451,7 +5451,7 @@ __global__ void LB_Kernel_Kum_New_Comp_SRT_SP_27(
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
 	real* DDStart,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int level,
 	real* forces,
 	bool EvenOrOdd)
@@ -5467,7 +5467,7 @@ __global__ void LB_Kernel_Kum_New_Comp_SRT_SP_27(
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if (k<size_Mat)
+	if (k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -5478,63 +5478,63 @@ __global__ void LB_Kernel_Kum_New_Comp_SRT_SP_27(
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -5568,33 +5568,33 @@ __global__ void LB_Kernel_Kum_New_Comp_SRT_SP_27(
 			unsigned int kbsw = neighborZ[ksw];
 
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k   ];
-			real mfabb = (D.f[DIR_M00   ])[kw  ];
-			real mfbcb = (D.f[DIR_0P0   ])[k   ];
-			real mfbab = (D.f[DIR_0M0   ])[ks  ];
-			real mfbbc = (D.f[DIR_00P   ])[k   ];
-			real mfbba = (D.f[DIR_00M   ])[kb  ];
-			real mfccb = (D.f[DIR_PP0  ])[k   ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw ];
-			real mfcab = (D.f[DIR_PM0  ])[ks  ];
-			real mfacb = (D.f[DIR_MP0  ])[kw  ];
-			real mfcbc = (D.f[DIR_P0P  ])[k   ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw ];
-			real mfcba = (D.f[DIR_P0M  ])[kb  ];
-			real mfabc = (D.f[DIR_M0P  ])[kw  ];
-			real mfbcc = (D.f[DIR_0PP  ])[k   ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs ];
-			real mfbca = (D.f[DIR_0PM  ])[kb  ];
-			real mfbac = (D.f[DIR_0MP  ])[ks  ];
+			real mfcbb = (D.f[DIR_P00])[k   ];
+			real mfabb = (D.f[DIR_M00])[kw  ];
+			real mfbcb = (D.f[DIR_0P0])[k   ];
+			real mfbab = (D.f[DIR_0M0])[ks  ];
+			real mfbbc = (D.f[DIR_00P])[k   ];
+			real mfbba = (D.f[DIR_00M])[kb  ];
+			real mfccb = (D.f[DIR_PP0])[k   ];
+			real mfaab = (D.f[DIR_MM0])[ksw ];
+			real mfcab = (D.f[DIR_PM0])[ks  ];
+			real mfacb = (D.f[DIR_MP0])[kw  ];
+			real mfcbc = (D.f[DIR_P0P])[k   ];
+			real mfaba = (D.f[DIR_M0M])[kbw ];
+			real mfcba = (D.f[DIR_P0M])[kb  ];
+			real mfabc = (D.f[DIR_M0P])[kw  ];
+			real mfbcc = (D.f[DIR_0PP])[k   ];
+			real mfbaa = (D.f[DIR_0MM])[kbs ];
+			real mfbca = (D.f[DIR_0PM])[kb  ];
+			real mfbac = (D.f[DIR_0MP])[ks  ];
 			real mfbbb = (D.f[DIR_000])[k   ];
-			real mfccc = (D.f[DIR_PPP ])[k   ];
-			real mfaac = (D.f[DIR_MMP ])[ksw ];
-			real mfcac = (D.f[DIR_PMP ])[ks  ];
-			real mfacc = (D.f[DIR_MPP ])[kw  ];
-			real mfcca = (D.f[DIR_PPM ])[kb  ];
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs ];
-			real mfaca = (D.f[DIR_MPM ])[kbw ];
+			real mfccc = (D.f[DIR_PPP])[k   ];
+			real mfaac = (D.f[DIR_MMP])[ksw ];
+			real mfcac = (D.f[DIR_PMP])[ks  ];
+			real mfacc = (D.f[DIR_MPP])[kw  ];
+			real mfcca = (D.f[DIR_PPM])[kb  ];
+			real mfaaa = (D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs ];
+			real mfaca = (D.f[DIR_MPM])[kbw ];
 			////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
 				(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
@@ -6349,33 +6349,33 @@ __global__ void LB_Kernel_Kum_New_Comp_SRT_SP_27(
 					((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
 			mfbbb += drho - drhoPost;
 			////////////////////////////////////////////////////////////////////////////////////
-			(D.f[DIR_P00   ])[k   ] = mfabb;                                                                   
-			(D.f[DIR_M00   ])[kw  ] = mfcbb;                                                                 
-			(D.f[DIR_0P0   ])[k   ] = mfbab;
-			(D.f[DIR_0M0   ])[ks  ] = mfbcb;
-			(D.f[DIR_00P   ])[k   ] = mfbba;
-			(D.f[DIR_00M   ])[kb  ] = mfbbc;
-			(D.f[DIR_PP0  ])[k   ] = mfaab;
-			(D.f[DIR_MM0  ])[ksw ] = mfccb;
-			(D.f[DIR_PM0  ])[ks  ] = mfacb;
-			(D.f[DIR_MP0  ])[kw  ] = mfcab;
-			(D.f[DIR_P0P  ])[k   ] = mfaba;
-			(D.f[DIR_M0M  ])[kbw ] = mfcbc;
-			(D.f[DIR_P0M  ])[kb  ] = mfabc;
-			(D.f[DIR_M0P  ])[kw  ] = mfcba;
-			(D.f[DIR_0PP  ])[k   ] = mfbaa;
-			(D.f[DIR_0MM  ])[kbs ] = mfbcc;
-			(D.f[DIR_0PM  ])[kb  ] = mfbac;
-			(D.f[DIR_0MP  ])[ks  ] = mfbca;
+			(D.f[DIR_P00])[k   ] = mfabb;                                                                   
+			(D.f[DIR_M00])[kw  ] = mfcbb;                                                                 
+			(D.f[DIR_0P0])[k   ] = mfbab;
+			(D.f[DIR_0M0])[ks  ] = mfbcb;
+			(D.f[DIR_00P])[k   ] = mfbba;
+			(D.f[DIR_00M])[kb  ] = mfbbc;
+			(D.f[DIR_PP0])[k   ] = mfaab;
+			(D.f[DIR_MM0])[ksw ] = mfccb;
+			(D.f[DIR_PM0])[ks  ] = mfacb;
+			(D.f[DIR_MP0])[kw  ] = mfcab;
+			(D.f[DIR_P0P])[k   ] = mfaba;
+			(D.f[DIR_M0M])[kbw ] = mfcbc;
+			(D.f[DIR_P0M])[kb  ] = mfabc;
+			(D.f[DIR_M0P])[kw  ] = mfcba;
+			(D.f[DIR_0PP])[k   ] = mfbaa;
+			(D.f[DIR_0MM])[kbs ] = mfbcc;
+			(D.f[DIR_0PM])[kb  ] = mfbac;
+			(D.f[DIR_0MP])[ks  ] = mfbca;
 			(D.f[DIR_000])[k   ] = mfbbb;
-			(D.f[DIR_PPP ])[k   ] = mfaaa;
-			(D.f[DIR_PMP ])[ks  ] = mfaca;
-			(D.f[DIR_PPM ])[kb  ] = mfaac;
-			(D.f[DIR_PMM ])[kbs ] = mfacc;
-			(D.f[DIR_MPP ])[kw  ] = mfcaa;
-			(D.f[DIR_MMP ])[ksw ] = mfcca;
-			(D.f[DIR_MPM ])[kbw ] = mfcac;
-			(D.f[DIR_MMM ])[kbsw] = mfccc;
+			(D.f[DIR_PPP])[k   ] = mfaaa;
+			(D.f[DIR_PMP])[ks  ] = mfaca;
+			(D.f[DIR_PPM])[kb  ] = mfaac;
+			(D.f[DIR_PMM])[kbs ] = mfacc;
+			(D.f[DIR_MPP])[kw  ] = mfcaa;
+			(D.f[DIR_MMP])[ksw ] = mfcca;
+			(D.f[DIR_MPM])[kbw ] = mfcac;
+			(D.f[DIR_MMM])[kbsw] = mfccc;
 		}
 	}
 }
diff --git a/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu b/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu
index 97c1aff4d26cb85deaf1dd0d145245f28affc2e3..3706e5f929b50a2a72c107a982525ec3172eb144 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu
@@ -51,7 +51,7 @@ __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27(
     unsigned int* neighborY,
     unsigned int* neighborZ,
     real* DDStart,
-    int size_Mat,
+    unsigned long long numberOfLBnodes,
     int level,
     real* forces,
     bool EvenOrOdd)
@@ -67,7 +67,7 @@ __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27(
     const unsigned k = nx*(ny*z + y) + x;
     //////////////////////////////////////////////////////////////////////////
 
-    if (k<size_Mat)
+    if (k<numberOfLBnodes)
     {
         ////////////////////////////////////////////////////////////////////////////////
         unsigned int BC;
@@ -78,63 +78,63 @@ __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27(
             Distributions27 D;
             if (EvenOrOdd == true)
             {
-                D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-                D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-                D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-                D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-                D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-                D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-                D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-                D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-                D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-                D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-                D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-                D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-                D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-                D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-                D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-                D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-                D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-                D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-                D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-                D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-                D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-                D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-                D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-                D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-                D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-                D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-                D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+                D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+                D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+                D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+                D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+                D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+                D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+                D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+                D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+                D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+                D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+                D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+                D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+                D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+                D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+                D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+                D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+                D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+                D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+                D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+                D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+                D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+                D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+                D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+                D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+                D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+                D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+                D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
             }
             else
             {
-                D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-                D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-                D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-                D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-                D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-                D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-                D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-                D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-                D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-                D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-                D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-                D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-                D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-                D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-                D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-                D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-                D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-                D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-                D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-                D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-                D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-                D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-                D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-                D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-                D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-                D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-                D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+                D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+                D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+                D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+                D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+                D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+                D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+                D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+                D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+                D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+                D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+                D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+                D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+                D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+                D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+                D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+                D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+                D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+                D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+                D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+                D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+                D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+                D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+                D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+                D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+                D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+                D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+                D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
             }
 
             ////////////////////////////////////////////////////////////////////////////////
@@ -170,33 +170,33 @@ __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27(
 
 
             //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-            real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-            real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-            real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-            real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-            real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-            real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-            real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-            real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-            real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-            real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-            real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-            real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-            real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-            real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-            real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-            real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-            real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-            real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+            real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+            real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+            real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+            real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+            real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+            real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+            real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+            real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+            real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+            real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+            real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+            real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+            real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+            real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+            real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+            real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+            real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+            real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
             real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-            real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-            real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-            real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-            real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-            real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-            real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-            real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-            real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+            real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+            real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+            real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+            real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+            real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+            real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+            real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+            real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
                                                ////////////////////////////////////////////////////////////////////////////////////
             real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
                 (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
@@ -966,7 +966,7 @@ __global__ void Cumulant_One_preconditioned_chim_Comp_SP_27(
     unsigned int* neighborY,
     unsigned int* neighborZ,
     real* DDStart,
-    int size_Mat,
+    unsigned long long numberOfLBnodes,
     int level,
     real* forces,
     bool EvenOrOdd)
@@ -982,7 +982,7 @@ __global__ void Cumulant_One_preconditioned_chim_Comp_SP_27(
     const unsigned k = nx*(ny*z + y) + x;
     //////////////////////////////////////////////////////////////////////////
 
-    if (k<size_Mat)
+    if (k<numberOfLBnodes)
     {
         ////////////////////////////////////////////////////////////////////////////////
         unsigned int BC;
@@ -993,63 +993,63 @@ __global__ void Cumulant_One_preconditioned_chim_Comp_SP_27(
             Distributions27 D;
             if (EvenOrOdd == true)
             {
-                D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-                D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-                D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-                D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-                D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-                D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-                D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-                D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-                D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-                D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-                D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-                D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-                D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-                D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-                D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-                D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-                D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-                D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-                D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-                D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-                D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-                D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-                D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-                D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-                D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-                D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-                D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+                D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+                D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+                D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+                D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+                D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+                D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+                D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+                D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+                D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+                D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+                D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+                D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+                D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+                D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+                D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+                D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+                D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+                D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+                D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+                D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+                D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+                D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+                D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+                D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+                D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+                D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+                D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
             }
             else
             {
-                D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-                D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-                D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-                D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-                D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-                D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-                D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-                D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-                D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-                D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-                D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-                D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-                D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-                D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-                D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-                D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-                D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-                D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-                D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-                D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-                D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-                D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-                D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-                D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-                D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-                D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-                D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+                D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+                D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+                D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+                D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+                D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+                D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+                D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+                D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+                D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+                D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+                D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+                D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+                D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+                D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+                D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+                D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+                D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+                D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+                D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+                D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+                D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+                D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+                D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+                D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+                D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+                D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+                D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
             }
 
             ////////////////////////////////////////////////////////////////////////////////
@@ -1085,33 +1085,33 @@ __global__ void Cumulant_One_preconditioned_chim_Comp_SP_27(
 
 
             //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-            real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-            real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-            real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-            real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-            real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-            real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-            real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-            real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-            real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-            real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-            real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-            real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-            real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-            real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-            real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-            real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-            real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-            real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+            real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+            real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+            real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+            real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+            real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+            real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+            real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+            real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+            real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+            real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+            real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+            real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+            real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+            real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+            real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+            real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+            real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+            real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
             real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-            real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-            real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-            real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-            real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-            real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-            real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-            real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-            real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+            real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+            real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+            real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+            real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+            real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+            real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+            real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+            real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
                                                ////////////////////////////////////////////////////////////////////////////////////
             real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
                 (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
@@ -1762,7 +1762,7 @@ __global__ void Cumulant_One_chim_Comp_SP_27(
     unsigned int* neighborY,
     unsigned int* neighborZ,
     real* DDStart,
-    int size_Mat,
+    unsigned long long numberOfLBnodes,
     int level,
     real* forces,
     bool EvenOrOdd)
@@ -1778,7 +1778,7 @@ __global__ void Cumulant_One_chim_Comp_SP_27(
     const unsigned k = nx*(ny*z + y) + x;
     //////////////////////////////////////////////////////////////////////////
 
-    if (k<size_Mat)
+    if (k<numberOfLBnodes)
     {
         ////////////////////////////////////////////////////////////////////////////////
         unsigned int BC;
@@ -1789,63 +1789,63 @@ __global__ void Cumulant_One_chim_Comp_SP_27(
             Distributions27 D;
             if (EvenOrOdd == true)
             {
-                D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-                D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-                D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-                D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-                D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-                D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-                D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-                D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-                D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-                D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-                D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-                D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-                D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-                D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-                D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-                D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-                D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-                D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-                D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-                D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-                D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-                D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-                D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-                D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-                D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-                D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-                D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+                D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+                D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+                D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+                D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+                D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+                D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+                D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+                D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+                D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+                D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+                D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+                D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+                D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+                D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+                D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+                D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+                D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+                D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+                D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+                D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+                D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+                D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+                D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+                D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+                D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+                D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+                D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
             }
             else
             {
-                D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-                D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-                D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-                D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-                D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-                D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-                D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-                D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-                D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-                D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-                D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-                D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-                D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-                D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-                D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-                D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-                D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-                D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-                D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-                D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-                D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-                D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-                D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-                D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-                D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-                D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-                D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+                D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+                D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+                D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+                D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+                D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+                D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+                D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+                D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+                D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+                D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+                D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+                D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+                D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+                D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+                D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+                D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+                D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+                D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+                D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+                D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+                D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+                D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+                D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+                D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+                D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+                D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+                D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
             }
             ////////////////////////////////////////////////////////////////////////////////
             //index
@@ -1857,33 +1857,33 @@ __global__ void Cumulant_One_chim_Comp_SP_27(
             unsigned int kbs = neighborZ[ks];
             unsigned int kbsw = neighborZ[ksw];
             ////////////////////////////////////////////////////////////////////////////////////
-            real mfcbb = (D.f[DIR_P00   ])[k   ];
-            real mfabb = (D.f[DIR_M00   ])[kw  ];
-            real mfbcb = (D.f[DIR_0P0   ])[k   ];
-            real mfbab = (D.f[DIR_0M0   ])[ks  ];
-            real mfbbc = (D.f[DIR_00P   ])[k   ];
-            real mfbba = (D.f[DIR_00M   ])[kb  ];
-            real mfccb = (D.f[DIR_PP0  ])[k   ];
-            real mfaab = (D.f[DIR_MM0  ])[ksw ];
-            real mfcab = (D.f[DIR_PM0  ])[ks  ];
-            real mfacb = (D.f[DIR_MP0  ])[kw  ];
-            real mfcbc = (D.f[DIR_P0P  ])[k   ];
-            real mfaba = (D.f[DIR_M0M  ])[kbw ];
-            real mfcba = (D.f[DIR_P0M  ])[kb  ];
-            real mfabc = (D.f[DIR_M0P  ])[kw  ];
-            real mfbcc = (D.f[DIR_0PP  ])[k   ];
-            real mfbaa = (D.f[DIR_0MM  ])[kbs ];
-            real mfbca = (D.f[DIR_0PM  ])[kb  ];
-            real mfbac = (D.f[DIR_0MP  ])[ks  ];
+            real mfcbb = (D.f[DIR_P00])[k   ];
+            real mfabb = (D.f[DIR_M00])[kw  ];
+            real mfbcb = (D.f[DIR_0P0])[k   ];
+            real mfbab = (D.f[DIR_0M0])[ks  ];
+            real mfbbc = (D.f[DIR_00P])[k   ];
+            real mfbba = (D.f[DIR_00M])[kb  ];
+            real mfccb = (D.f[DIR_PP0])[k   ];
+            real mfaab = (D.f[DIR_MM0])[ksw ];
+            real mfcab = (D.f[DIR_PM0])[ks  ];
+            real mfacb = (D.f[DIR_MP0])[kw  ];
+            real mfcbc = (D.f[DIR_P0P])[k   ];
+            real mfaba = (D.f[DIR_M0M])[kbw ];
+            real mfcba = (D.f[DIR_P0M])[kb  ];
+            real mfabc = (D.f[DIR_M0P])[kw  ];
+            real mfbcc = (D.f[DIR_0PP])[k   ];
+            real mfbaa = (D.f[DIR_0MM])[kbs ];
+            real mfbca = (D.f[DIR_0PM])[kb  ];
+            real mfbac = (D.f[DIR_0MP])[ks  ];
             real mfbbb = (D.f[DIR_000])[k   ];
-            real mfccc = (D.f[DIR_PPP ])[k   ];
-            real mfaac = (D.f[DIR_MMP ])[ksw ];
-            real mfcac = (D.f[DIR_PMP ])[ks  ];
-            real mfacc = (D.f[DIR_MPP ])[kw  ];
-            real mfcca = (D.f[DIR_PPM ])[kb  ];
-            real mfaaa = (D.f[DIR_MMM ])[kbsw];
-            real mfcaa = (D.f[DIR_PMM ])[kbs ];
-            real mfaca = (D.f[DIR_MPM ])[kbw ];
+            real mfccc = (D.f[DIR_PPP])[k   ];
+            real mfaac = (D.f[DIR_MMP])[ksw ];
+            real mfcac = (D.f[DIR_PMP])[ks  ];
+            real mfacc = (D.f[DIR_MPP])[kw  ];
+            real mfcca = (D.f[DIR_PPM])[kb  ];
+            real mfaaa = (D.f[DIR_MMM])[kbsw];
+            real mfcaa = (D.f[DIR_PMM])[kbs ];
+            real mfaca = (D.f[DIR_MPM])[kbw ];
             ////////////////////////////////////////////////////////////////////////////////////
             real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
                 (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
@@ -2204,33 +2204,33 @@ __global__ void Cumulant_One_chim_Comp_SP_27(
                     ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
             mfbbb += drho - drhoPost;
             ////////////////////////////////////////////////////////////////////////////////////
-            (D.f[DIR_P00   ])[k   ] = mfabb;                                                                   
-            (D.f[DIR_M00   ])[kw  ] = mfcbb;                                                                 
-            (D.f[DIR_0P0   ])[k   ] = mfbab;
-            (D.f[DIR_0M0   ])[ks  ] = mfbcb;
-            (D.f[DIR_00P   ])[k   ] = mfbba;
-            (D.f[DIR_00M   ])[kb  ] = mfbbc;
-            (D.f[DIR_PP0  ])[k   ] = mfaab;
-            (D.f[DIR_MM0  ])[ksw ] = mfccb;
-            (D.f[DIR_PM0  ])[ks  ] = mfacb;
-            (D.f[DIR_MP0  ])[kw  ] = mfcab;
-            (D.f[DIR_P0P  ])[k   ] = mfaba;
-            (D.f[DIR_M0M  ])[kbw ] = mfcbc;
-            (D.f[DIR_P0M  ])[kb  ] = mfabc;
-            (D.f[DIR_M0P  ])[kw  ] = mfcba;
-            (D.f[DIR_0PP  ])[k   ] = mfbaa;
-            (D.f[DIR_0MM  ])[kbs ] = mfbcc;
-            (D.f[DIR_0PM  ])[kb  ] = mfbac;
-            (D.f[DIR_0MP  ])[ks  ] = mfbca;
+            (D.f[DIR_P00])[k   ] = mfabb;                                                                   
+            (D.f[DIR_M00])[kw  ] = mfcbb;                                                                 
+            (D.f[DIR_0P0])[k   ] = mfbab;
+            (D.f[DIR_0M0])[ks  ] = mfbcb;
+            (D.f[DIR_00P])[k   ] = mfbba;
+            (D.f[DIR_00M])[kb  ] = mfbbc;
+            (D.f[DIR_PP0])[k   ] = mfaab;
+            (D.f[DIR_MM0])[ksw ] = mfccb;
+            (D.f[DIR_PM0])[ks  ] = mfacb;
+            (D.f[DIR_MP0])[kw  ] = mfcab;
+            (D.f[DIR_P0P])[k   ] = mfaba;
+            (D.f[DIR_M0M])[kbw ] = mfcbc;
+            (D.f[DIR_P0M])[kb  ] = mfabc;
+            (D.f[DIR_M0P])[kw  ] = mfcba;
+            (D.f[DIR_0PP])[k   ] = mfbaa;
+            (D.f[DIR_0MM])[kbs ] = mfbcc;
+            (D.f[DIR_0PM])[kb  ] = mfbac;
+            (D.f[DIR_0MP])[ks  ] = mfbca;
             (D.f[DIR_000])[k   ] = mfbbb;
-            (D.f[DIR_PPP ])[k   ] = mfaaa;
-            (D.f[DIR_PMP ])[ks  ] = mfaca;
-            (D.f[DIR_PPM ])[kb  ] = mfaac;
-            (D.f[DIR_PMM ])[kbs ] = mfacc;
-            (D.f[DIR_MPP ])[kw  ] = mfcaa;
-            (D.f[DIR_MMP ])[ksw ] = mfcca;
-            (D.f[DIR_MPM ])[kbw ] = mfcac;
-            (D.f[DIR_MMM ])[kbsw] = mfccc;
+            (D.f[DIR_PPP])[k   ] = mfaaa;
+            (D.f[DIR_PMP])[ks  ] = mfaca;
+            (D.f[DIR_PPM])[kb  ] = mfaac;
+            (D.f[DIR_PMM])[kbs ] = mfacc;
+            (D.f[DIR_MPP])[kw  ] = mfcaa;
+            (D.f[DIR_MMP])[ksw ] = mfcca;
+            (D.f[DIR_MPM])[kbw ] = mfcac;
+            (D.f[DIR_MMM])[kbsw] = mfccc;
         }
     }
 }
diff --git a/src/gpu/VirtualFluids_GPU/GPU/Cumulant_F3_27.cu b/src/gpu/VirtualFluids_GPU/GPU/Cumulant_F3_27.cu
index 7adfd40da157d825d83c63b084bf1f855ea6dca2..c89c3cfe87560c808d47163b45d512fa0d7e494f 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/Cumulant_F3_27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/Cumulant_F3_27.cu
@@ -27,7 +27,7 @@ __global__ void LB_PostProcessor_F3_2018_Fehlberg(real omega,
 															 real* vzOut,
 															 real* DDStart,
 															 real* G6,
-															 int size_Mat,
+															 unsigned long long numberOfLBnodes,
 															 int level,
 															 real* forces,
 															 bool EvenOrOdd)
@@ -43,7 +43,7 @@ __global__ void LB_PostProcessor_F3_2018_Fehlberg(real omega,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if (k < size_Mat)
+	if (k < numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -54,83 +54,83 @@ __global__ void LB_PostProcessor_F3_2018_Fehlberg(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			Distributions6 G;
 			if (EvenOrOdd == true)
 			{
-				G.g[DIR_P00] = &G6[DIR_P00   *size_Mat];
-				G.g[DIR_M00] = &G6[DIR_M00   *size_Mat];
-				G.g[DIR_0P0] = &G6[DIR_0P0   *size_Mat];
-				G.g[DIR_0M0] = &G6[DIR_0M0   *size_Mat];
-				G.g[DIR_00P] = &G6[DIR_00P   *size_Mat];
-				G.g[DIR_00M] = &G6[DIR_00M   *size_Mat];
+				G.g[DIR_P00] = &G6[DIR_P00 * numberOfLBnodes];
+				G.g[DIR_M00] = &G6[DIR_M00 * numberOfLBnodes];
+				G.g[DIR_0P0] = &G6[DIR_0P0 * numberOfLBnodes];
+				G.g[DIR_0M0] = &G6[DIR_0M0 * numberOfLBnodes];
+				G.g[DIR_00P] = &G6[DIR_00P * numberOfLBnodes];
+				G.g[DIR_00M] = &G6[DIR_00M * numberOfLBnodes];
 			}
 			else
 			{
-				G.g[DIR_M00] = &G6[DIR_P00   *size_Mat];
-				G.g[DIR_P00] = &G6[DIR_M00   *size_Mat];
-				G.g[DIR_0M0] = &G6[DIR_0P0   *size_Mat];
-				G.g[DIR_0P0] = &G6[DIR_0M0   *size_Mat];
-				G.g[DIR_00M] = &G6[DIR_00P   *size_Mat];
-				G.g[DIR_00P] = &G6[DIR_00M   *size_Mat];
+				G.g[DIR_M00] = &G6[DIR_P00 * numberOfLBnodes];
+				G.g[DIR_P00] = &G6[DIR_M00 * numberOfLBnodes];
+				G.g[DIR_0M0] = &G6[DIR_0P0 * numberOfLBnodes];
+				G.g[DIR_0P0] = &G6[DIR_0M0 * numberOfLBnodes];
+				G.g[DIR_00M] = &G6[DIR_00P * numberOfLBnodes];
+				G.g[DIR_00P] = &G6[DIR_00M * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -1026,83 +1026,83 @@ __global__ void LB_PostProcessor_F3_2018_Fehlberg(real omega,
 //			Distributions27 D;
 //			if (EvenOrOdd == true)
 //			{
-//				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-//				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-//				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-//				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-//				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-//				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-//				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-//				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-//				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-//				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-//				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-//				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-//				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-//				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-//				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-//				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-//				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-//				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-//				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-//				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-//				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-//				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-//				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-//				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-//				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-//				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-//				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+//				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+//				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+//				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+//				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+//				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+//				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+//				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+//				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+//				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+//				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+//				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+//				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+//				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+//				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+//				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+//				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+//				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+//				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+//				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+//				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+//				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+//				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+//				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+//				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+//				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+//				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+//				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 //			}
 //			else
 //			{
-//				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-//				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-//				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-//				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-//				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-//				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-//				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-//				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-//				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-//				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-//				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-//				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-//				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-//				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-//				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-//				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-//				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-//				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-//				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-//				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-//				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-//				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-//				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-//				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-//				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-//				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-//				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+//				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+//				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+//				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+//				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+//				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+//				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+//				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+//				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+//				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+//				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+//				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+//				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+//				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+//				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+//				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+//				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+//				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+//				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+//				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+//				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+//				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+//				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+//				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+//				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+//				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+//				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+//				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 //			}
 //
 //			Distributions6 G;
 //			if (EvenOrOdd == true)
 //			{
-//				G.g[DIR_P00] = &G6[DIR_P00   *size_Mat];
-//				G.g[DIR_M00] = &G6[DIR_M00   *size_Mat];
-//				G.g[DIR_0P0] = &G6[DIR_0P0   *size_Mat];
-//				G.g[DIR_0M0] = &G6[DIR_0M0   *size_Mat];
-//				G.g[DIR_00P] = &G6[DIR_00P   *size_Mat];
-//				G.g[DIR_00M] = &G6[DIR_00M   *size_Mat];
+//				G.g[DIR_P00] = &G6[DIR_P00 * size_Mat];
+//				G.g[DIR_M00] = &G6[DIR_M00 * size_Mat];
+//				G.g[DIR_0P0] = &G6[DIR_0P0 * size_Mat];
+//				G.g[DIR_0M0] = &G6[DIR_0M0 * size_Mat];
+//				G.g[DIR_00P] = &G6[DIR_00P * size_Mat];
+//				G.g[DIR_00M] = &G6[DIR_00M * size_Mat];
 //			}
 //			else
 //			{
-//				G.g[DIR_M00] = &G6[DIR_P00   *size_Mat];
-//				G.g[DIR_P00] = &G6[DIR_M00   *size_Mat];
-//				G.g[DIR_0M0] = &G6[DIR_0P0   *size_Mat];
-//				G.g[DIR_0P0] = &G6[DIR_0M0   *size_Mat];
-//				G.g[DIR_00M] = &G6[DIR_00P   *size_Mat];
-//				G.g[DIR_00P] = &G6[DIR_00M   *size_Mat];
+//				G.g[DIR_M00] = &G6[DIR_P00 * size_Mat];
+//				G.g[DIR_P00] = &G6[DIR_M00 * size_Mat];
+//				G.g[DIR_0M0] = &G6[DIR_0P0 * size_Mat];
+//				G.g[DIR_0P0] = &G6[DIR_0M0 * size_Mat];
+//				G.g[DIR_00M] = &G6[DIR_00P * size_Mat];
+//				G.g[DIR_00P] = &G6[DIR_00M * size_Mat];
 //			}
 //
 //			////////////////////////////////////////////////////////////////////////////////
@@ -2006,83 +2006,83 @@ __global__ void LB_PostProcessor_F3_2018_Fehlberg(real omega,
 //			Distributions27 D;
 //			if (EvenOrOdd == true)
 //			{
-//				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-//				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-//				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-//				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-//				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-//				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-//				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-//				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-//				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-//				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-//				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-//				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-//				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-//				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-//				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-//				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-//				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-//				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-//				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-//				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-//				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-//				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-//				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-//				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-//				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-//				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-//				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+//				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+//				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+//				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+//				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+//				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+//				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+//				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+//				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+//				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+//				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+//				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+//				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+//				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+//				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+//				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+//				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+//				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+//				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+//				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+//				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+//				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+//				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+//				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+//				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+//				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+//				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+//				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 //			}
 //			else
 //			{
-//				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-//				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-//				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-//				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-//				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-//				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-//				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-//				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-//				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-//				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-//				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-//				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-//				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-//				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-//				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-//				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-//				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-//				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-//				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-//				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-//				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-//				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-//				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-//				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-//				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-//				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-//				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+//				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+//				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+//				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+//				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+//				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+//				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+//				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+//				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+//				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+//				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+//				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+//				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+//				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+//				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+//				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+//				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+//				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+//				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+//				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+//				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+//				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+//				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+//				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+//				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+//				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+//				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+//				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 //			}
 //
 //			Distributions6 G;
 //			if (EvenOrOdd == true)
 //			{
-//				G.g[DIR_P00] = &G6[DIR_P00   *size_Mat];
-//				G.g[DIR_M00] = &G6[DIR_M00   *size_Mat];
-//				G.g[DIR_0P0] = &G6[DIR_0P0   *size_Mat];
-//				G.g[DIR_0M0] = &G6[DIR_0M0   *size_Mat];
-//				G.g[DIR_00P] = &G6[DIR_00P   *size_Mat];
-//				G.g[DIR_00M] = &G6[DIR_00M   *size_Mat];
+//				G.g[DIR_P00] = &G6[DIR_P00 * size_Mat];
+//				G.g[DIR_M00] = &G6[DIR_M00 * size_Mat];
+//				G.g[DIR_0P0] = &G6[DIR_0P0 * size_Mat];
+//				G.g[DIR_0M0] = &G6[DIR_0M0 * size_Mat];
+//				G.g[DIR_00P] = &G6[DIR_00P * size_Mat];
+//				G.g[DIR_00M] = &G6[DIR_00M * size_Mat];
 //			}
 //			else
 //			{
-//				G.g[DIR_M00] = &G6[DIR_P00   *size_Mat];
-//				G.g[DIR_P00] = &G6[DIR_M00   *size_Mat];
-//				G.g[DIR_0M0] = &G6[DIR_0P0   *size_Mat];
-//				G.g[DIR_0P0] = &G6[DIR_0M0   *size_Mat];
-//				G.g[DIR_00M] = &G6[DIR_00P   *size_Mat];
-//				G.g[DIR_00P] = &G6[DIR_00M   *size_Mat];
+//				G.g[DIR_M00] = &G6[DIR_P00 * size_Mat];
+//				G.g[DIR_P00] = &G6[DIR_M00 * size_Mat];
+//				G.g[DIR_0M0] = &G6[DIR_0P0 * size_Mat];
+//				G.g[DIR_0P0] = &G6[DIR_0M0 * size_Mat];
+//				G.g[DIR_00M] = &G6[DIR_00P * size_Mat];
+//				G.g[DIR_00P] = &G6[DIR_00M * size_Mat];
 //			}
 //
 //			////////////////////////////////////////////////////////////////////////////////
@@ -2153,33 +2153,33 @@ __global__ void LB_PostProcessor_F3_2018_Fehlberg(real omega,
 //			real dyyuy = c1o2 * (-mgbcb + mgbab);
 //			real dzzuz = c1o2 * (-mgbbc + mgbba);
 //			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-//			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-//			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-//			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-//			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-//			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-//			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-//			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-//			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-//			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-//			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-//			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-//			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-//			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-//			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-//			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-//			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-//			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+//			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+//			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+//			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+//			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+//			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+//			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+//			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+//			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+//			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+//			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+//			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+//			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+//			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+//			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+//			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+//			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+//			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+//			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 //			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-//			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-//			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-//			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-//			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-//			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-//			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-//			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-//			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+//			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+//			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+//			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+//			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+//			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+//			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+//			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+//			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 //			////////////////////////////////////////////////////////////////////////////////////
 //			real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
 //				(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
diff --git a/src/gpu/VirtualFluids_GPU/GPU/DragLift27.cu b/src/gpu/VirtualFluids_GPU/GPU/DragLift27.cu
index 5146242fed374a919b6dcc02774db1d8ce4f864a..0e3945829725c0614ed4da01d0bae3b99ba2720a 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/DragLift27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/DragLift27.cu
@@ -17,69 +17,69 @@ __global__ void DragLiftPost27(  real* DD,
 											unsigned int* neighborX,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
-											unsigned int size_Mat, 
+											unsigned long long numberOfLBnodes, 
 											bool isEvenTimestep)
 {
 	Distributions27 D;
 	if (isEvenTimestep==true)
 	{
-		D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	} 
 	else
 	{
-		D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+		D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -100,24 +100,24 @@ __global__ void DragLiftPost27(  real* DD,
 			*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[DIR_P00   * numberOfBCnodes];
-		q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-		q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-		q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-		q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-		q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-		q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-		q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-		q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-		q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-		q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-		q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-		q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-		q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-		q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-		q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-		q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-		q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+		q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+		q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+		q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+		q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+		q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+		q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+		q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+		q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+		q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+		q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+		q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+		q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+		q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+		q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+		q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+		q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+		q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+		q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
 		q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
 		q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
 		q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -160,32 +160,32 @@ __global__ void DragLiftPost27(  real* DD,
 		real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
                 f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-		f_W    = (D.f[DIR_P00   ])[ke   ];
-		f_E    = (D.f[DIR_M00   ])[kw   ];
-		f_S    = (D.f[DIR_0P0   ])[kn   ];
-		f_N    = (D.f[DIR_0M0   ])[ks   ];
-		f_B    = (D.f[DIR_00P   ])[kt   ];
-		f_T    = (D.f[DIR_00M   ])[kb   ];
-		f_SW   = (D.f[DIR_PP0  ])[kne  ];
-		f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-		f_NW   = (D.f[DIR_PM0  ])[kse  ];
-		f_SE   = (D.f[DIR_MP0  ])[knw  ];
-		f_BW   = (D.f[DIR_P0P  ])[kte  ];
-		f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-		f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-		f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-		f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-		f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-		f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-		f_BN   = (D.f[DIR_0MP  ])[kts  ];
-		f_BSW  = (D.f[DIR_PPP ])[ktne ];
-		f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-		f_BNW  = (D.f[DIR_PMP ])[ktse ];
-		f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-		f_TSW  = (D.f[DIR_PPM ])[kbne ];
-		f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-		f_TNW  = (D.f[DIR_PMM ])[kbse ];
-		f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+		f_W    = (D.f[DIR_P00])[ke   ];
+		f_E    = (D.f[DIR_M00])[kw   ];
+		f_S    = (D.f[DIR_0P0])[kn   ];
+		f_N    = (D.f[DIR_0M0])[ks   ];
+		f_B    = (D.f[DIR_00P])[kt   ];
+		f_T    = (D.f[DIR_00M])[kb   ];
+		f_SW   = (D.f[DIR_PP0])[kne  ];
+		f_NE   = (D.f[DIR_MM0])[ksw  ];
+		f_NW   = (D.f[DIR_PM0])[kse  ];
+		f_SE   = (D.f[DIR_MP0])[knw  ];
+		f_BW   = (D.f[DIR_P0P])[kte  ];
+		f_TE   = (D.f[DIR_M0M])[kbw  ];
+		f_TW   = (D.f[DIR_P0M])[kbe  ];
+		f_BE   = (D.f[DIR_M0P])[ktw  ];
+		f_BS   = (D.f[DIR_0PP])[ktn  ];
+		f_TN   = (D.f[DIR_0MM])[kbs  ];
+		f_TS   = (D.f[DIR_0PM])[kbn  ];
+		f_BN   = (D.f[DIR_0MP])[kts  ];
+		f_BSW  = (D.f[DIR_PPP])[ktne ];
+		f_BNE  = (D.f[DIR_MMP])[ktsw ];
+		f_BNW  = (D.f[DIR_PMP])[ktse ];
+		f_BSE  = (D.f[DIR_MPP])[ktnw ];
+		f_TSW  = (D.f[DIR_PPM])[kbne ];
+		f_TNE  = (D.f[DIR_MMM])[kbsw ];
+		f_TNW  = (D.f[DIR_PMM])[kbse ];
+		f_TSE  = (D.f[DIR_MPM])[kbnw ];
 		////////////////////////////////////////////////////////////////////////////////
 		double	OnE   = c0o1, OnW   = c0o1, OnN   = c0o1, OnS   = c0o1, OnT = c0o1, OnB = c0o1, 
 				OnNE  = c0o1, OnSW  = c0o1, OnSE  = c0o1, OnNW  = c0o1, 
@@ -282,69 +282,69 @@ __global__ void DragLiftPre27(   real* DD,
 											unsigned int* neighborX,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
-											unsigned int size_Mat, 
+											unsigned long long numberOfLBnodes, 
 											bool isEvenTimestep)
 {
 	Distributions27 D;
 	if (isEvenTimestep==true)
 	{
-		D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	} 
 	else
 	{
-		D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+		D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -365,24 +365,24 @@ __global__ void DragLiftPre27(   real* DD,
 			*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[DIR_P00   * numberOfBCnodes];
-		q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-		q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-		q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-		q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-		q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-		q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-		q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-		q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-		q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-		q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-		q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-		q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-		q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-		q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-		q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-		q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-		q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+		q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+		q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+		q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+		q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+		q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+		q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+		q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+		q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+		q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+		q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+		q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+		q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+		q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+		q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+		q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+		q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+		q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+		q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
 		q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
 		q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
 		q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -425,32 +425,32 @@ __global__ void DragLiftPre27(   real* DD,
 		real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
                 f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-		f_E   = (D.f[DIR_P00   ])[ke   ];
-		f_W   = (D.f[DIR_M00   ])[kw   ];
-		f_N   = (D.f[DIR_0P0   ])[kn   ];
-		f_S   = (D.f[DIR_0M0   ])[ks   ];
-		f_T   = (D.f[DIR_00P   ])[kt   ];
-		f_B   = (D.f[DIR_00M   ])[kb   ];
-		f_NE  = (D.f[DIR_PP0  ])[kne  ];
-		f_SW  = (D.f[DIR_MM0  ])[ksw  ];
-		f_SE  = (D.f[DIR_PM0  ])[kse  ];
-		f_NW  = (D.f[DIR_MP0  ])[knw  ];
-		f_TE  = (D.f[DIR_P0P  ])[kte  ];
-		f_BW  = (D.f[DIR_M0M  ])[kbw  ];
-		f_BE  = (D.f[DIR_P0M  ])[kbe  ];
-		f_TW  = (D.f[DIR_M0P  ])[ktw  ];
-		f_TN  = (D.f[DIR_0PP  ])[ktn  ];
-		f_BS  = (D.f[DIR_0MM  ])[kbs  ];
-		f_BN  = (D.f[DIR_0PM  ])[kbn  ];
-		f_TS  = (D.f[DIR_0MP  ])[kts  ];
-		f_TNE = (D.f[DIR_PPP ])[ktne ];
-		f_TSW = (D.f[DIR_MMP ])[ktsw ];
-		f_TSE = (D.f[DIR_PMP ])[ktse ];
-		f_TNW = (D.f[DIR_MPP ])[ktnw ];
-		f_BNE = (D.f[DIR_PPM ])[kbne ];
-		f_BSW = (D.f[DIR_MMM ])[kbsw ];
-		f_BSE = (D.f[DIR_PMM ])[kbse ];
-		f_BNW = (D.f[DIR_MPM ])[kbnw ];
+		f_E   = (D.f[DIR_P00])[ke   ];
+		f_W   = (D.f[DIR_M00])[kw   ];
+		f_N   = (D.f[DIR_0P0])[kn   ];
+		f_S   = (D.f[DIR_0M0])[ks   ];
+		f_T   = (D.f[DIR_00P])[kt   ];
+		f_B   = (D.f[DIR_00M])[kb   ];
+		f_NE  = (D.f[DIR_PP0])[kne  ];
+		f_SW  = (D.f[DIR_MM0])[ksw  ];
+		f_SE  = (D.f[DIR_PM0])[kse  ];
+		f_NW  = (D.f[DIR_MP0])[knw  ];
+		f_TE  = (D.f[DIR_P0P])[kte  ];
+		f_BW  = (D.f[DIR_M0M])[kbw  ];
+		f_BE  = (D.f[DIR_P0M])[kbe  ];
+		f_TW  = (D.f[DIR_M0P])[ktw  ];
+		f_TN  = (D.f[DIR_0PP])[ktn  ];
+		f_BS  = (D.f[DIR_0MM])[kbs  ];
+		f_BN  = (D.f[DIR_0PM])[kbn  ];
+		f_TS  = (D.f[DIR_0MP])[kts  ];
+		f_TNE = (D.f[DIR_PPP])[ktne ];
+		f_TSW = (D.f[DIR_MMP])[ktsw ];
+		f_TSE = (D.f[DIR_PMP])[ktse ];
+		f_TNW = (D.f[DIR_MPP])[ktnw ];
+		f_BNE = (D.f[DIR_PPM])[kbne ];
+		f_BSW = (D.f[DIR_MMM])[kbsw ];
+		f_BSE = (D.f[DIR_PMM])[kbse ];
+		f_BNW = (D.f[DIR_MPM])[kbnw ];
 		 ////////////////////////////////////////////////////////////////////////////////
 		double	OnE   = c0o1, OnW   = c0o1, OnN   = c0o1, OnS   = c0o1, OnT = c0o1, OnB = c0o1, 
 				OnNE  = c0o1, OnSW  = c0o1, OnSE  = c0o1, OnNW  = c0o1, 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/EnstrophyAnalyzer.cu b/src/gpu/VirtualFluids_GPU/GPU/EnstrophyAnalyzer.cu
index acd62b46c5666fc5f621c3772438e42b7ebef5c6..93879d73a32458d5403fd3fd16e68e0fcea7753d 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/EnstrophyAnalyzer.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/EnstrophyAnalyzer.cu
@@ -13,7 +13,7 @@
 
 #include <iomanip>
 
-//#include "Core/Logger/Logger.h"
+#include "cuda/CudaGrid.h"
 
 #include "Parameter/Parameter.h"
 // includes, kernels
@@ -22,7 +22,7 @@
 
 using namespace vf::lbm::constant;
 
-__global__                 void enstrophyKernel  ( real* veloX, real* veloY, real* veloZ, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* enstrophy, uint* isFluid, uint size_Mat );
+__global__                 void enstrophyKernel  ( real* veloX, real* veloY, real* veloZ, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* enstrophy, uint* isFluid, unsigned long long numberOfLBnodes );
 
 __host__ __device__ inline void enstrophyFunction( real* veloX, real* veloY, real* veloZ, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* enstrophy, uint* isFluid, uint index );
 
@@ -32,55 +32,40 @@ bool EnstrophyAnalyzer::run(uint iter)
 {
     if( iter % this->analyzeIter != 0 ) return false;
 
-	int lev = 0;
-	int size_Mat = this->para->getParD(lev)->numberOfNodes;
-	
-	thrust::device_vector<real> enstrophy( size_Mat, c0o1 );
-    thrust::device_vector<uint> isFluid  ( size_Mat, 0);
-
-	unsigned int numberOfThreads = 128;
-    int Grid = (size_Mat / numberOfThreads)+1;
-    int Grid1, Grid2;
-    if (Grid>512)
-    {
-       Grid1 = 512;
-       Grid2 = (Grid/Grid1)+1;
-    } 
-    else
-    {
-       Grid1 = 1;
-       Grid2 = Grid;
-    }
-    dim3 grid(Grid1, Grid2);
-    dim3 threads(numberOfThreads, 1, 1 );
-
-    LBCalcMacCompSP27<<< grid, threads >>> (para->getParD(lev)->velocityX,
-										    para->getParD(lev)->velocityY,
-										    para->getParD(lev)->velocityZ,
-										    para->getParD(lev)->rho,
-										    para->getParD(lev)->pressure,
-										    para->getParD(lev)->typeOfGridNode,
-										    para->getParD(lev)->neighborX,
-										    para->getParD(lev)->neighborY,
-										    para->getParD(lev)->neighborZ,
-										    para->getParD(lev)->numberOfNodes,
-										    para->getParD(lev)->distributions.f[0],
-										    para->getParD(lev)->isEvenTimestep); 
-	//cudaDeviceSynchronize();
-	getLastCudaError("LBCalcMacSP27 execution failed"); 
-
-	enstrophyKernel <<< grid, threads >>> ( para->getParD(lev)->velocityX,
-											para->getParD(lev)->velocityY, 
-											para->getParD(lev)->velocityZ, 
-											para->getParD(lev)->rho, 
-											para->getParD(lev)->neighborX,
-											para->getParD(lev)->neighborY,
-											para->getParD(lev)->neighborZ,
-											para->getParD(lev)->neighborInverse,
-											para->getParD(lev)->typeOfGridNode,
-											enstrophy.data().get(), 
-                                            isFluid.data().get(),
-											size_Mat);
+    int lev = 0;
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(lev)->numberofthreads, para->getParD(lev)->numberOfNodes);
+
+    thrust::device_vector<real> enstrophy( this->para->getParD(lev)->numberOfNodes, c0o1);
+    thrust::device_vector<uint> isFluid  ( this->para->getParD(lev)->numberOfNodes, 0);
+
+    LBCalcMacCompSP27<<< grid.grid, grid.threads >>>(
+        para->getParD(lev)->velocityX,
+        para->getParD(lev)->velocityY,
+        para->getParD(lev)->velocityZ,
+        para->getParD(lev)->rho,
+        para->getParD(lev)->pressure,
+        para->getParD(lev)->typeOfGridNode,
+        para->getParD(lev)->neighborX,
+        para->getParD(lev)->neighborY,
+        para->getParD(lev)->neighborZ,
+        para->getParD(lev)->numberOfNodes,
+        para->getParD(lev)->distributions.f[0],
+        para->getParD(lev)->isEvenTimestep); 
+    getLastCudaError("LBCalcMacCompSP27 execution failed");
+
+    enstrophyKernel<<< grid.grid, grid.threads >>>(
+        para->getParD(lev)->velocityX,
+        para->getParD(lev)->velocityY, 
+        para->getParD(lev)->velocityZ, 
+        para->getParD(lev)->rho, 
+        para->getParD(lev)->neighborX,
+        para->getParD(lev)->neighborY,
+        para->getParD(lev)->neighborZ,
+        para->getParD(lev)->neighborInverse,
+        para->getParD(lev)->typeOfGridNode,
+        enstrophy.data().get(), 
+        isFluid.data().get(),
+        para->getParD(lev)->numberOfNodes);
 	cudaDeviceSynchronize(); 
 	getLastCudaError("enstrophyKernel execution failed");
 
@@ -97,7 +82,7 @@ bool EnstrophyAnalyzer::run(uint iter)
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-__global__ void enstrophyKernel(real* veloX, real* veloY, real* veloZ, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* enstrophy, uint* isFluid, uint size_Mat)
+__global__ void enstrophyKernel(real* veloX, real* veloY, real* veloZ, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* enstrophy, uint* isFluid, unsigned long long numberOfLBnodes)
 {
     //////////////////////////////////////////////////////////////////////////
     const uint x = threadIdx.x;  // Globaler x-Index 
@@ -113,7 +98,7 @@ __global__ void enstrophyKernel(real* veloX, real* veloY, real* veloZ, real* rho
 
     //if( index % 34 == 0 || index % 34 == 33 ) return;
 
-    if( index >= size_Mat) return;
+    if( index >= (uint)numberOfLBnodes) return;
 
 	unsigned int BC;
 	BC = geo[index];
diff --git a/src/gpu/VirtualFluids_GPU/GPU/ExchangeData27.cu b/src/gpu/VirtualFluids_GPU/GPU/ExchangeData27.cu
index 5470da46342c85e57370227313c8c82674a17e6e..4ced64c0152bdbbd9752f736e2edca2c51fbc2ff 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/ExchangeData27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/ExchangeData27.cu
@@ -14,7 +14,7 @@ __global__ void getSendFsPost27(real* DD,
                                            unsigned int* neighborX,
                                            unsigned int* neighborY,
                                            unsigned int* neighborZ,
-                                           unsigned int size_Mat, 
+                                           unsigned long long numberOfLBnodes, 
                                            bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -65,150 +65,150 @@ __global__ void getSendFsPost27(real* DD,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //set Pointer for Buffer Fs
       Distributions27 Dbuff;
-      Dbuff.f[DIR_P00   ] = &bufferFs[DIR_P00   *buffmax];
-      Dbuff.f[DIR_M00   ] = &bufferFs[DIR_M00   *buffmax];
-      Dbuff.f[DIR_0P0   ] = &bufferFs[DIR_0P0   *buffmax];
-      Dbuff.f[DIR_0M0   ] = &bufferFs[DIR_0M0   *buffmax];
-      Dbuff.f[DIR_00P   ] = &bufferFs[DIR_00P   *buffmax];
-      Dbuff.f[DIR_00M   ] = &bufferFs[DIR_00M   *buffmax];
-      Dbuff.f[DIR_PP0  ] = &bufferFs[DIR_PP0  *buffmax];
-      Dbuff.f[DIR_MM0  ] = &bufferFs[DIR_MM0  *buffmax];
-      Dbuff.f[DIR_PM0  ] = &bufferFs[DIR_PM0  *buffmax];
-      Dbuff.f[DIR_MP0  ] = &bufferFs[DIR_MP0  *buffmax];
-      Dbuff.f[DIR_P0P  ] = &bufferFs[DIR_P0P  *buffmax];
-      Dbuff.f[DIR_M0M  ] = &bufferFs[DIR_M0M  *buffmax];
-      Dbuff.f[DIR_P0M  ] = &bufferFs[DIR_P0M  *buffmax];
-      Dbuff.f[DIR_M0P  ] = &bufferFs[DIR_M0P  *buffmax];
-      Dbuff.f[DIR_0PP  ] = &bufferFs[DIR_0PP  *buffmax];
-      Dbuff.f[DIR_0MM  ] = &bufferFs[DIR_0MM  *buffmax];
-      Dbuff.f[DIR_0PM  ] = &bufferFs[DIR_0PM  *buffmax];
-      Dbuff.f[DIR_0MP  ] = &bufferFs[DIR_0MP  *buffmax];
-      Dbuff.f[DIR_000] = &bufferFs[DIR_000*buffmax];
-      Dbuff.f[DIR_PPP ] = &bufferFs[DIR_PPP *buffmax];
-      Dbuff.f[DIR_MMP ] = &bufferFs[DIR_MMP *buffmax];
-      Dbuff.f[DIR_PMP ] = &bufferFs[DIR_PMP *buffmax];
-      Dbuff.f[DIR_MPP ] = &bufferFs[DIR_MPP *buffmax];
-      Dbuff.f[DIR_PPM ] = &bufferFs[DIR_PPM *buffmax];
-      Dbuff.f[DIR_MMM ] = &bufferFs[DIR_MMM *buffmax];
-      Dbuff.f[DIR_PMM ] = &bufferFs[DIR_PMM *buffmax];
-      Dbuff.f[DIR_MPM ] = &bufferFs[DIR_MPM *buffmax];
+      Dbuff.f[DIR_P00] = &bufferFs[DIR_P00 * buffmax];
+      Dbuff.f[DIR_M00] = &bufferFs[DIR_M00 * buffmax];
+      Dbuff.f[DIR_0P0] = &bufferFs[DIR_0P0 * buffmax];
+      Dbuff.f[DIR_0M0] = &bufferFs[DIR_0M0 * buffmax];
+      Dbuff.f[DIR_00P] = &bufferFs[DIR_00P * buffmax];
+      Dbuff.f[DIR_00M] = &bufferFs[DIR_00M * buffmax];
+      Dbuff.f[DIR_PP0] = &bufferFs[DIR_PP0 * buffmax];
+      Dbuff.f[DIR_MM0] = &bufferFs[DIR_MM0 * buffmax];
+      Dbuff.f[DIR_PM0] = &bufferFs[DIR_PM0 * buffmax];
+      Dbuff.f[DIR_MP0] = &bufferFs[DIR_MP0 * buffmax];
+      Dbuff.f[DIR_P0P] = &bufferFs[DIR_P0P * buffmax];
+      Dbuff.f[DIR_M0M] = &bufferFs[DIR_M0M * buffmax];
+      Dbuff.f[DIR_P0M] = &bufferFs[DIR_P0M * buffmax];
+      Dbuff.f[DIR_M0P] = &bufferFs[DIR_M0P * buffmax];
+      Dbuff.f[DIR_0PP] = &bufferFs[DIR_0PP * buffmax];
+      Dbuff.f[DIR_0MM] = &bufferFs[DIR_0MM * buffmax];
+      Dbuff.f[DIR_0PM] = &bufferFs[DIR_0PM * buffmax];
+      Dbuff.f[DIR_0MP] = &bufferFs[DIR_0MP * buffmax];
+      Dbuff.f[DIR_000] = &bufferFs[DIR_000 * buffmax];
+      Dbuff.f[DIR_PPP] = &bufferFs[DIR_PPP * buffmax];
+      Dbuff.f[DIR_MMP] = &bufferFs[DIR_MMP * buffmax];
+      Dbuff.f[DIR_PMP] = &bufferFs[DIR_PMP * buffmax];
+      Dbuff.f[DIR_MPP] = &bufferFs[DIR_MPP * buffmax];
+      Dbuff.f[DIR_PPM] = &bufferFs[DIR_PPM * buffmax];
+      Dbuff.f[DIR_MMM] = &bufferFs[DIR_MMM * buffmax];
+      Dbuff.f[DIR_PMM] = &bufferFs[DIR_PMM * buffmax];
+      Dbuff.f[DIR_MPM] = &bufferFs[DIR_MPM * buffmax];
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //copy to buffer
-      //(Dbuff.f[DIR_P00   ])[k] = (D.f[DIR_P00   ])[ke   ];
-      //(Dbuff.f[DIR_M00   ])[k] = (D.f[DIR_M00   ])[kw   ];
-      //(Dbuff.f[DIR_0P0   ])[k] = (D.f[DIR_0P0   ])[kn   ];
-      //(Dbuff.f[DIR_0M0   ])[k] = (D.f[DIR_0M0   ])[ks   ];
-      //(Dbuff.f[DIR_00P   ])[k] = (D.f[DIR_00P   ])[kt   ];
-      //(Dbuff.f[DIR_00M   ])[k] = (D.f[DIR_00M   ])[kb   ];
-      //(Dbuff.f[DIR_PP0  ])[k] = (D.f[DIR_PP0  ])[kne  ];
-      //(Dbuff.f[DIR_MM0  ])[k] = (D.f[DIR_MM0  ])[ksw  ];
-      //(Dbuff.f[DIR_PM0  ])[k] = (D.f[DIR_PM0  ])[kse  ];
-      //(Dbuff.f[DIR_MP0  ])[k] = (D.f[DIR_MP0  ])[knw  ];
-      //(Dbuff.f[DIR_P0P  ])[k] = (D.f[DIR_P0P  ])[kte  ];
-      //(Dbuff.f[DIR_M0M  ])[k] = (D.f[DIR_M0M  ])[kbw  ];
-      //(Dbuff.f[DIR_P0M  ])[k] = (D.f[DIR_P0M  ])[kbe  ];
-      //(Dbuff.f[DIR_M0P  ])[k] = (D.f[DIR_M0P  ])[ktw  ];
-      //(Dbuff.f[DIR_0PP  ])[k] = (D.f[DIR_0PP  ])[ktn  ];
-      //(Dbuff.f[DIR_0MM  ])[k] = (D.f[DIR_0MM  ])[kbs  ];
-      //(Dbuff.f[DIR_0PM  ])[k] = (D.f[DIR_0PM  ])[kbn  ];
-      //(Dbuff.f[DIR_0MP  ])[k] = (D.f[DIR_0MP  ])[kts  ];
+      //(Dbuff.f[DIR_P00])[k] = (D.f[DIR_P00])[ke   ];
+      //(Dbuff.f[DIR_M00])[k] = (D.f[DIR_M00])[kw   ];
+      //(Dbuff.f[DIR_0P0])[k] = (D.f[DIR_0P0])[kn   ];
+      //(Dbuff.f[DIR_0M0])[k] = (D.f[DIR_0M0])[ks   ];
+      //(Dbuff.f[DIR_00P])[k] = (D.f[DIR_00P])[kt   ];
+      //(Dbuff.f[DIR_00M])[k] = (D.f[DIR_00M])[kb   ];
+      //(Dbuff.f[DIR_PP0])[k] = (D.f[DIR_PP0])[kne  ];
+      //(Dbuff.f[DIR_MM0])[k] = (D.f[DIR_MM0])[ksw  ];
+      //(Dbuff.f[DIR_PM0])[k] = (D.f[DIR_PM0])[kse  ];
+      //(Dbuff.f[DIR_MP0])[k] = (D.f[DIR_MP0])[knw  ];
+      //(Dbuff.f[DIR_P0P])[k] = (D.f[DIR_P0P])[kte  ];
+      //(Dbuff.f[DIR_M0M])[k] = (D.f[DIR_M0M])[kbw  ];
+      //(Dbuff.f[DIR_P0M])[k] = (D.f[DIR_P0M])[kbe  ];
+      //(Dbuff.f[DIR_M0P])[k] = (D.f[DIR_M0P])[ktw  ];
+      //(Dbuff.f[DIR_0PP])[k] = (D.f[DIR_0PP])[ktn  ];
+      //(Dbuff.f[DIR_0MM])[k] = (D.f[DIR_0MM])[kbs  ];
+      //(Dbuff.f[DIR_0PM])[k] = (D.f[DIR_0PM])[kbn  ];
+      //(Dbuff.f[DIR_0MP])[k] = (D.f[DIR_0MP])[kts  ];
       //(Dbuff.f[DIR_000])[k] = (D.f[DIR_000])[kzero];
-      //(Dbuff.f[DIR_PPP ])[k] = (D.f[DIR_PPP ])[ktne ];
-      //(Dbuff.f[DIR_MMP ])[k] = (D.f[DIR_MMP ])[ktsw ];
-      //(Dbuff.f[DIR_PMP ])[k] = (D.f[DIR_PMP ])[ktse ];
-      //(Dbuff.f[DIR_MPP ])[k] = (D.f[DIR_MPP ])[ktnw ];
-      //(Dbuff.f[DIR_PPM ])[k] = (D.f[DIR_PPM ])[kbne ];
-      //(Dbuff.f[DIR_MMM ])[k] = (D.f[DIR_MMM ])[kbsw ];
-      //(Dbuff.f[DIR_PMM ])[k] = (D.f[DIR_PMM ])[kbse ];
-      //(Dbuff.f[DIR_MPM ])[k] = (D.f[DIR_MPM ])[kbnw ];
-      (Dbuff.f[DIR_P00   ])[k] = (D.f[DIR_M00   ])[kw   ];
-      (Dbuff.f[DIR_M00   ])[k] = (D.f[DIR_P00   ])[ke   ];
-      (Dbuff.f[DIR_0P0   ])[k] = (D.f[DIR_0M0   ])[ks   ];
-      (Dbuff.f[DIR_0M0   ])[k] = (D.f[DIR_0P0   ])[kn   ];
-      (Dbuff.f[DIR_00P   ])[k] = (D.f[DIR_00M   ])[kb   ];
-      (Dbuff.f[DIR_00M   ])[k] = (D.f[DIR_00P   ])[kt   ];
-      (Dbuff.f[DIR_PP0  ])[k] = (D.f[DIR_MM0  ])[ksw  ];
-      (Dbuff.f[DIR_MM0  ])[k] = (D.f[DIR_PP0  ])[kne  ];
-      (Dbuff.f[DIR_PM0  ])[k] = (D.f[DIR_MP0  ])[knw  ];
-      (Dbuff.f[DIR_MP0  ])[k] = (D.f[DIR_PM0  ])[kse  ];
-      (Dbuff.f[DIR_P0P  ])[k] = (D.f[DIR_M0M  ])[kbw  ];
-      (Dbuff.f[DIR_M0M  ])[k] = (D.f[DIR_P0P  ])[kte  ];
-      (Dbuff.f[DIR_P0M  ])[k] = (D.f[DIR_M0P  ])[ktw  ];
-      (Dbuff.f[DIR_M0P  ])[k] = (D.f[DIR_P0M  ])[kbe  ];
-      (Dbuff.f[DIR_0PP  ])[k] = (D.f[DIR_0MM  ])[kbs  ];
-      (Dbuff.f[DIR_0MM  ])[k] = (D.f[DIR_0PP  ])[ktn  ];
-      (Dbuff.f[DIR_0PM  ])[k] = (D.f[DIR_0MP  ])[kts  ];
-      (Dbuff.f[DIR_0MP  ])[k] = (D.f[DIR_0PM  ])[kbn  ];
+      //(Dbuff.f[DIR_PPP])[k] = (D.f[DIR_PPP])[ktne ];
+      //(Dbuff.f[DIR_MMP])[k] = (D.f[DIR_MMP])[ktsw ];
+      //(Dbuff.f[DIR_PMP])[k] = (D.f[DIR_PMP])[ktse ];
+      //(Dbuff.f[DIR_MPP])[k] = (D.f[DIR_MPP])[ktnw ];
+      //(Dbuff.f[DIR_PPM])[k] = (D.f[DIR_PPM])[kbne ];
+      //(Dbuff.f[DIR_MMM])[k] = (D.f[DIR_MMM])[kbsw ];
+      //(Dbuff.f[DIR_PMM])[k] = (D.f[DIR_PMM])[kbse ];
+      //(Dbuff.f[DIR_MPM])[k] = (D.f[DIR_MPM])[kbnw ];
+      (Dbuff.f[DIR_P00])[k] = (D.f[DIR_M00])[kw   ];
+      (Dbuff.f[DIR_M00])[k] = (D.f[DIR_P00])[ke   ];
+      (Dbuff.f[DIR_0P0])[k] = (D.f[DIR_0M0])[ks   ];
+      (Dbuff.f[DIR_0M0])[k] = (D.f[DIR_0P0])[kn   ];
+      (Dbuff.f[DIR_00P])[k] = (D.f[DIR_00M])[kb   ];
+      (Dbuff.f[DIR_00M])[k] = (D.f[DIR_00P])[kt   ];
+      (Dbuff.f[DIR_PP0])[k] = (D.f[DIR_MM0])[ksw  ];
+      (Dbuff.f[DIR_MM0])[k] = (D.f[DIR_PP0])[kne  ];
+      (Dbuff.f[DIR_PM0])[k] = (D.f[DIR_MP0])[knw  ];
+      (Dbuff.f[DIR_MP0])[k] = (D.f[DIR_PM0])[kse  ];
+      (Dbuff.f[DIR_P0P])[k] = (D.f[DIR_M0M])[kbw  ];
+      (Dbuff.f[DIR_M0M])[k] = (D.f[DIR_P0P])[kte  ];
+      (Dbuff.f[DIR_P0M])[k] = (D.f[DIR_M0P])[ktw  ];
+      (Dbuff.f[DIR_M0P])[k] = (D.f[DIR_P0M])[kbe  ];
+      (Dbuff.f[DIR_0PP])[k] = (D.f[DIR_0MM])[kbs  ];
+      (Dbuff.f[DIR_0MM])[k] = (D.f[DIR_0PP])[ktn  ];
+      (Dbuff.f[DIR_0PM])[k] = (D.f[DIR_0MP])[kts  ];
+      (Dbuff.f[DIR_0MP])[k] = (D.f[DIR_0PM])[kbn  ];
       (Dbuff.f[DIR_000])[k] = (D.f[DIR_000])[kzero];
-      (Dbuff.f[DIR_PPP ])[k] = (D.f[DIR_MMM ])[kbsw ];
-      (Dbuff.f[DIR_MMP ])[k] = (D.f[DIR_PPM ])[kbne ];
-      (Dbuff.f[DIR_PMP ])[k] = (D.f[DIR_MPM ])[kbnw ];
-      (Dbuff.f[DIR_MPP ])[k] = (D.f[DIR_PMM ])[kbse ];
-      (Dbuff.f[DIR_PPM ])[k] = (D.f[DIR_MMP ])[ktsw ];
-      (Dbuff.f[DIR_MMM ])[k] = (D.f[DIR_PPP ])[ktne ];
-      (Dbuff.f[DIR_PMM ])[k] = (D.f[DIR_MPP ])[ktnw ];
-      (Dbuff.f[DIR_MPM ])[k] = (D.f[DIR_PMP ])[ktse ];
+      (Dbuff.f[DIR_PPP])[k] = (D.f[DIR_MMM])[kbsw ];
+      (Dbuff.f[DIR_MMP])[k] = (D.f[DIR_PPM])[kbne ];
+      (Dbuff.f[DIR_PMP])[k] = (D.f[DIR_MPM])[kbnw ];
+      (Dbuff.f[DIR_MPP])[k] = (D.f[DIR_PMM])[kbse ];
+      (Dbuff.f[DIR_PPM])[k] = (D.f[DIR_MMP])[ktsw ];
+      (Dbuff.f[DIR_MMM])[k] = (D.f[DIR_PPP])[ktne ];
+      (Dbuff.f[DIR_PMM])[k] = (D.f[DIR_MPP])[ktnw ];
+      (Dbuff.f[DIR_MPM])[k] = (D.f[DIR_PMP])[ktse ];
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -250,7 +250,7 @@ __global__ void setRecvFsPost27(real* DD,
                                            unsigned int* neighborX,
                                            unsigned int* neighborY,
                                            unsigned int* neighborZ,
-                                           unsigned int size_Mat, 
+                                           unsigned long long numberOfLBnodes, 
                                            bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -301,150 +301,150 @@ __global__ void setRecvFsPost27(real* DD,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //set Pointer for Buffer Fs
       Distributions27 Dbuff;
-      Dbuff.f[DIR_P00   ] = &bufferFs[DIR_P00   *buffmax];
-      Dbuff.f[DIR_M00   ] = &bufferFs[DIR_M00   *buffmax];
-      Dbuff.f[DIR_0P0   ] = &bufferFs[DIR_0P0   *buffmax];
-      Dbuff.f[DIR_0M0   ] = &bufferFs[DIR_0M0   *buffmax];
-      Dbuff.f[DIR_00P   ] = &bufferFs[DIR_00P   *buffmax];
-      Dbuff.f[DIR_00M   ] = &bufferFs[DIR_00M   *buffmax];
-      Dbuff.f[DIR_PP0  ] = &bufferFs[DIR_PP0  *buffmax];
-      Dbuff.f[DIR_MM0  ] = &bufferFs[DIR_MM0  *buffmax];
-      Dbuff.f[DIR_PM0  ] = &bufferFs[DIR_PM0  *buffmax];
-      Dbuff.f[DIR_MP0  ] = &bufferFs[DIR_MP0  *buffmax];
-      Dbuff.f[DIR_P0P  ] = &bufferFs[DIR_P0P  *buffmax];
-      Dbuff.f[DIR_M0M  ] = &bufferFs[DIR_M0M  *buffmax];
-      Dbuff.f[DIR_P0M  ] = &bufferFs[DIR_P0M  *buffmax];
-      Dbuff.f[DIR_M0P  ] = &bufferFs[DIR_M0P  *buffmax];
-      Dbuff.f[DIR_0PP  ] = &bufferFs[DIR_0PP  *buffmax];
-      Dbuff.f[DIR_0MM  ] = &bufferFs[DIR_0MM  *buffmax];
-      Dbuff.f[DIR_0PM  ] = &bufferFs[DIR_0PM  *buffmax];
-      Dbuff.f[DIR_0MP  ] = &bufferFs[DIR_0MP  *buffmax];
-      Dbuff.f[DIR_000] = &bufferFs[DIR_000*buffmax];
-      Dbuff.f[DIR_PPP ] = &bufferFs[DIR_PPP *buffmax];
-      Dbuff.f[DIR_MMP ] = &bufferFs[DIR_MMP *buffmax];
-      Dbuff.f[DIR_PMP ] = &bufferFs[DIR_PMP *buffmax];
-      Dbuff.f[DIR_MPP ] = &bufferFs[DIR_MPP *buffmax];
-      Dbuff.f[DIR_PPM ] = &bufferFs[DIR_PPM *buffmax];
-      Dbuff.f[DIR_MMM ] = &bufferFs[DIR_MMM *buffmax];
-      Dbuff.f[DIR_PMM ] = &bufferFs[DIR_PMM *buffmax];
-      Dbuff.f[DIR_MPM ] = &bufferFs[DIR_MPM *buffmax];
+      Dbuff.f[DIR_P00] = &bufferFs[DIR_P00 * buffmax];
+      Dbuff.f[DIR_M00] = &bufferFs[DIR_M00 * buffmax];
+      Dbuff.f[DIR_0P0] = &bufferFs[DIR_0P0 * buffmax];
+      Dbuff.f[DIR_0M0] = &bufferFs[DIR_0M0 * buffmax];
+      Dbuff.f[DIR_00P] = &bufferFs[DIR_00P * buffmax];
+      Dbuff.f[DIR_00M] = &bufferFs[DIR_00M * buffmax];
+      Dbuff.f[DIR_PP0] = &bufferFs[DIR_PP0 * buffmax];
+      Dbuff.f[DIR_MM0] = &bufferFs[DIR_MM0 * buffmax];
+      Dbuff.f[DIR_PM0] = &bufferFs[DIR_PM0 * buffmax];
+      Dbuff.f[DIR_MP0] = &bufferFs[DIR_MP0 * buffmax];
+      Dbuff.f[DIR_P0P] = &bufferFs[DIR_P0P * buffmax];
+      Dbuff.f[DIR_M0M] = &bufferFs[DIR_M0M * buffmax];
+      Dbuff.f[DIR_P0M] = &bufferFs[DIR_P0M * buffmax];
+      Dbuff.f[DIR_M0P] = &bufferFs[DIR_M0P * buffmax];
+      Dbuff.f[DIR_0PP] = &bufferFs[DIR_0PP * buffmax];
+      Dbuff.f[DIR_0MM] = &bufferFs[DIR_0MM * buffmax];
+      Dbuff.f[DIR_0PM] = &bufferFs[DIR_0PM * buffmax];
+      Dbuff.f[DIR_0MP] = &bufferFs[DIR_0MP * buffmax];
+      Dbuff.f[DIR_000] = &bufferFs[DIR_000 * buffmax];
+      Dbuff.f[DIR_PPP] = &bufferFs[DIR_PPP * buffmax];
+      Dbuff.f[DIR_MMP] = &bufferFs[DIR_MMP * buffmax];
+      Dbuff.f[DIR_PMP] = &bufferFs[DIR_PMP * buffmax];
+      Dbuff.f[DIR_MPP] = &bufferFs[DIR_MPP * buffmax];
+      Dbuff.f[DIR_PPM] = &bufferFs[DIR_PPM * buffmax];
+      Dbuff.f[DIR_MMM] = &bufferFs[DIR_MMM * buffmax];
+      Dbuff.f[DIR_PMM] = &bufferFs[DIR_PMM * buffmax];
+      Dbuff.f[DIR_MPM] = &bufferFs[DIR_MPM * buffmax];
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //copy from buffer
-      //(D.f[DIR_P00   ])[ke   ] = (Dbuff.f[DIR_P00   ])[k];
-      //(D.f[DIR_M00   ])[kw   ] = (Dbuff.f[DIR_M00   ])[k];
-      //(D.f[DIR_0P0   ])[kn   ] = (Dbuff.f[DIR_0P0   ])[k];
-      //(D.f[DIR_0M0   ])[ks   ] = (Dbuff.f[DIR_0M0   ])[k];
-      //(D.f[DIR_00P   ])[kt   ] = (Dbuff.f[DIR_00P   ])[k];
-      //(D.f[DIR_00M   ])[kb   ] = (Dbuff.f[DIR_00M   ])[k];
-      //(D.f[DIR_PP0  ])[kne  ] = (Dbuff.f[DIR_PP0  ])[k];
-      //(D.f[DIR_MM0  ])[ksw  ] = (Dbuff.f[DIR_MM0  ])[k];
-      //(D.f[DIR_PM0  ])[kse  ] = (Dbuff.f[DIR_PM0  ])[k];
-      //(D.f[DIR_MP0  ])[knw  ] = (Dbuff.f[DIR_MP0  ])[k];
-      //(D.f[DIR_P0P  ])[kte  ] = (Dbuff.f[DIR_P0P  ])[k];
-      //(D.f[DIR_M0M  ])[kbw  ] = (Dbuff.f[DIR_M0M  ])[k];
-      //(D.f[DIR_P0M  ])[kbe  ] = (Dbuff.f[DIR_P0M  ])[k];
-      //(D.f[DIR_M0P  ])[ktw  ] = (Dbuff.f[DIR_M0P  ])[k];
-      //(D.f[DIR_0PP  ])[ktn  ] = (Dbuff.f[DIR_0PP  ])[k];
-      //(D.f[DIR_0MM  ])[kbs  ] = (Dbuff.f[DIR_0MM  ])[k];
-      //(D.f[DIR_0PM  ])[kbn  ] = (Dbuff.f[DIR_0PM  ])[k];
-      //(D.f[DIR_0MP  ])[kts  ] = (Dbuff.f[DIR_0MP  ])[k];
+      //(D.f[DIR_P00])[ke   ] = (Dbuff.f[DIR_P00])[k];
+      //(D.f[DIR_M00])[kw   ] = (Dbuff.f[DIR_M00])[k];
+      //(D.f[DIR_0P0])[kn   ] = (Dbuff.f[DIR_0P0])[k];
+      //(D.f[DIR_0M0])[ks   ] = (Dbuff.f[DIR_0M0])[k];
+      //(D.f[DIR_00P])[kt   ] = (Dbuff.f[DIR_00P])[k];
+      //(D.f[DIR_00M])[kb   ] = (Dbuff.f[DIR_00M])[k];
+      //(D.f[DIR_PP0])[kne  ] = (Dbuff.f[DIR_PP0])[k];
+      //(D.f[DIR_MM0])[ksw  ] = (Dbuff.f[DIR_MM0])[k];
+      //(D.f[DIR_PM0])[kse  ] = (Dbuff.f[DIR_PM0])[k];
+      //(D.f[DIR_MP0])[knw  ] = (Dbuff.f[DIR_MP0])[k];
+      //(D.f[DIR_P0P])[kte  ] = (Dbuff.f[DIR_P0P])[k];
+      //(D.f[DIR_M0M])[kbw  ] = (Dbuff.f[DIR_M0M])[k];
+      //(D.f[DIR_P0M])[kbe  ] = (Dbuff.f[DIR_P0M])[k];
+      //(D.f[DIR_M0P])[ktw  ] = (Dbuff.f[DIR_M0P])[k];
+      //(D.f[DIR_0PP])[ktn  ] = (Dbuff.f[DIR_0PP])[k];
+      //(D.f[DIR_0MM])[kbs  ] = (Dbuff.f[DIR_0MM])[k];
+      //(D.f[DIR_0PM])[kbn  ] = (Dbuff.f[DIR_0PM])[k];
+      //(D.f[DIR_0MP])[kts  ] = (Dbuff.f[DIR_0MP])[k];
       //(D.f[DIR_000])[kzero] = (Dbuff.f[DIR_000])[k];
-      //(D.f[DIR_PPP ])[ktne ] = (Dbuff.f[DIR_PPP ])[k];
-      //(D.f[DIR_MMP ])[ktsw ] = (Dbuff.f[DIR_MMP ])[k];
-      //(D.f[DIR_PMP ])[ktse ] = (Dbuff.f[DIR_PMP ])[k];
-      //(D.f[DIR_MPP ])[ktnw ] = (Dbuff.f[DIR_MPP ])[k];
-      //(D.f[DIR_PPM ])[kbne ] = (Dbuff.f[DIR_PPM ])[k];
-      //(D.f[DIR_MMM ])[kbsw ] = (Dbuff.f[DIR_MMM ])[k];
-      //(D.f[DIR_PMM ])[kbse ] = (Dbuff.f[DIR_PMM ])[k];
-      //(D.f[DIR_MPM ])[kbnw ] = (Dbuff.f[DIR_MPM ])[k];
-      (D.f[DIR_M00   ])[kw   ] = (Dbuff.f[DIR_P00   ])[k];
-      (D.f[DIR_P00   ])[ke   ] = (Dbuff.f[DIR_M00   ])[k];
-      (D.f[DIR_0M0   ])[ks   ] = (Dbuff.f[DIR_0P0   ])[k];
-      (D.f[DIR_0P0   ])[kn   ] = (Dbuff.f[DIR_0M0   ])[k];
-      (D.f[DIR_00M   ])[kb   ] = (Dbuff.f[DIR_00P   ])[k];
-      (D.f[DIR_00P   ])[kt   ] = (Dbuff.f[DIR_00M   ])[k];
-      (D.f[DIR_MM0  ])[ksw  ] = (Dbuff.f[DIR_PP0  ])[k];
-      (D.f[DIR_PP0  ])[kne  ] = (Dbuff.f[DIR_MM0  ])[k];
-      (D.f[DIR_MP0  ])[knw  ] = (Dbuff.f[DIR_PM0  ])[k];
-      (D.f[DIR_PM0  ])[kse  ] = (Dbuff.f[DIR_MP0  ])[k];
-      (D.f[DIR_M0M  ])[kbw  ] = (Dbuff.f[DIR_P0P  ])[k];
-      (D.f[DIR_P0P  ])[kte  ] = (Dbuff.f[DIR_M0M  ])[k];
-      (D.f[DIR_M0P  ])[ktw  ] = (Dbuff.f[DIR_P0M  ])[k];
-      (D.f[DIR_P0M  ])[kbe  ] = (Dbuff.f[DIR_M0P  ])[k];
-      (D.f[DIR_0MM  ])[kbs  ] = (Dbuff.f[DIR_0PP  ])[k];
-      (D.f[DIR_0PP  ])[ktn  ] = (Dbuff.f[DIR_0MM  ])[k];
-      (D.f[DIR_0MP  ])[kts  ] = (Dbuff.f[DIR_0PM  ])[k];
-      (D.f[DIR_0PM  ])[kbn  ] = (Dbuff.f[DIR_0MP  ])[k];
+      //(D.f[DIR_PPP])[ktne ] = (Dbuff.f[DIR_PPP])[k];
+      //(D.f[DIR_MMP])[ktsw ] = (Dbuff.f[DIR_MMP])[k];
+      //(D.f[DIR_PMP])[ktse ] = (Dbuff.f[DIR_PMP])[k];
+      //(D.f[DIR_MPP])[ktnw ] = (Dbuff.f[DIR_MPP])[k];
+      //(D.f[DIR_PPM])[kbne ] = (Dbuff.f[DIR_PPM])[k];
+      //(D.f[DIR_MMM])[kbsw ] = (Dbuff.f[DIR_MMM])[k];
+      //(D.f[DIR_PMM])[kbse ] = (Dbuff.f[DIR_PMM])[k];
+      //(D.f[DIR_MPM])[kbnw ] = (Dbuff.f[DIR_MPM])[k];
+      (D.f[DIR_M00])[kw   ] = (Dbuff.f[DIR_P00])[k];
+      (D.f[DIR_P00])[ke   ] = (Dbuff.f[DIR_M00])[k];
+      (D.f[DIR_0M0])[ks   ] = (Dbuff.f[DIR_0P0])[k];
+      (D.f[DIR_0P0])[kn   ] = (Dbuff.f[DIR_0M0])[k];
+      (D.f[DIR_00M])[kb   ] = (Dbuff.f[DIR_00P])[k];
+      (D.f[DIR_00P])[kt   ] = (Dbuff.f[DIR_00M])[k];
+      (D.f[DIR_MM0])[ksw  ] = (Dbuff.f[DIR_PP0])[k];
+      (D.f[DIR_PP0])[kne  ] = (Dbuff.f[DIR_MM0])[k];
+      (D.f[DIR_MP0])[knw  ] = (Dbuff.f[DIR_PM0])[k];
+      (D.f[DIR_PM0])[kse  ] = (Dbuff.f[DIR_MP0])[k];
+      (D.f[DIR_M0M])[kbw  ] = (Dbuff.f[DIR_P0P])[k];
+      (D.f[DIR_P0P])[kte  ] = (Dbuff.f[DIR_M0M])[k];
+      (D.f[DIR_M0P])[ktw  ] = (Dbuff.f[DIR_P0M])[k];
+      (D.f[DIR_P0M])[kbe  ] = (Dbuff.f[DIR_M0P])[k];
+      (D.f[DIR_0MM])[kbs  ] = (Dbuff.f[DIR_0PP])[k];
+      (D.f[DIR_0PP])[ktn  ] = (Dbuff.f[DIR_0MM])[k];
+      (D.f[DIR_0MP])[kts  ] = (Dbuff.f[DIR_0PM])[k];
+      (D.f[DIR_0PM])[kbn  ] = (Dbuff.f[DIR_0MP])[k];
       (D.f[DIR_000])[kzero] = (Dbuff.f[DIR_000])[k];
-      (D.f[DIR_MMM ])[kbsw ] = (Dbuff.f[DIR_PPP ])[k];
-      (D.f[DIR_PPM ])[kbne ] = (Dbuff.f[DIR_MMP ])[k];
-      (D.f[DIR_MPM ])[kbnw ] = (Dbuff.f[DIR_PMP ])[k];
-      (D.f[DIR_PMM ])[kbse ] = (Dbuff.f[DIR_MPP ])[k];
-      (D.f[DIR_MMP ])[ktsw ] = (Dbuff.f[DIR_PPM ])[k];
-      (D.f[DIR_PPP ])[ktne ] = (Dbuff.f[DIR_MMM ])[k];
-      (D.f[DIR_MPP ])[ktnw ] = (Dbuff.f[DIR_PMM ])[k];
-      (D.f[DIR_PMP ])[ktse ] = (Dbuff.f[DIR_MPM ])[k];
+      (D.f[DIR_MMM])[kbsw ] = (Dbuff.f[DIR_PPP])[k];
+      (D.f[DIR_PPM])[kbne ] = (Dbuff.f[DIR_MMP])[k];
+      (D.f[DIR_MPM])[kbnw ] = (Dbuff.f[DIR_PMP])[k];
+      (D.f[DIR_PMM])[kbse ] = (Dbuff.f[DIR_MPP])[k];
+      (D.f[DIR_MMP])[ktsw ] = (Dbuff.f[DIR_PPM])[k];
+      (D.f[DIR_PPP])[ktne ] = (Dbuff.f[DIR_MMM])[k];
+      (D.f[DIR_MPP])[ktnw ] = (Dbuff.f[DIR_PMM])[k];
+      (D.f[DIR_PMP])[ktse ] = (Dbuff.f[DIR_MPM])[k];
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -485,7 +485,7 @@ __global__ void getSendFsPre27(real* DD,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat, 
+                                          unsigned long long numberOfLBnodes, 
                                           bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -536,123 +536,123 @@ __global__ void getSendFsPre27(real* DD,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //set Pointer for Buffer Fs
       Distributions27 Dbuff;
-      Dbuff.f[DIR_P00   ] = &bufferFs[DIR_P00   *buffmax];
-      Dbuff.f[DIR_M00   ] = &bufferFs[DIR_M00   *buffmax];
-      Dbuff.f[DIR_0P0   ] = &bufferFs[DIR_0P0   *buffmax];
-      Dbuff.f[DIR_0M0   ] = &bufferFs[DIR_0M0   *buffmax];
-      Dbuff.f[DIR_00P   ] = &bufferFs[DIR_00P   *buffmax];
-      Dbuff.f[DIR_00M   ] = &bufferFs[DIR_00M   *buffmax];
-      Dbuff.f[DIR_PP0  ] = &bufferFs[DIR_PP0  *buffmax];
-      Dbuff.f[DIR_MM0  ] = &bufferFs[DIR_MM0  *buffmax];
-      Dbuff.f[DIR_PM0  ] = &bufferFs[DIR_PM0  *buffmax];
-      Dbuff.f[DIR_MP0  ] = &bufferFs[DIR_MP0  *buffmax];
-      Dbuff.f[DIR_P0P  ] = &bufferFs[DIR_P0P  *buffmax];
-      Dbuff.f[DIR_M0M  ] = &bufferFs[DIR_M0M  *buffmax];
-      Dbuff.f[DIR_P0M  ] = &bufferFs[DIR_P0M  *buffmax];
-      Dbuff.f[DIR_M0P  ] = &bufferFs[DIR_M0P  *buffmax];
-      Dbuff.f[DIR_0PP  ] = &bufferFs[DIR_0PP  *buffmax];
-      Dbuff.f[DIR_0MM  ] = &bufferFs[DIR_0MM  *buffmax];
-      Dbuff.f[DIR_0PM  ] = &bufferFs[DIR_0PM  *buffmax];
-      Dbuff.f[DIR_0MP  ] = &bufferFs[DIR_0MP  *buffmax];
-      Dbuff.f[DIR_000] = &bufferFs[DIR_000*buffmax];
-      Dbuff.f[DIR_PPP ] = &bufferFs[DIR_PPP *buffmax];
-      Dbuff.f[DIR_MMP ] = &bufferFs[DIR_MMP *buffmax];
-      Dbuff.f[DIR_PMP ] = &bufferFs[DIR_PMP *buffmax];
-      Dbuff.f[DIR_MPP ] = &bufferFs[DIR_MPP *buffmax];
-      Dbuff.f[DIR_PPM ] = &bufferFs[DIR_PPM *buffmax];
-      Dbuff.f[DIR_MMM ] = &bufferFs[DIR_MMM *buffmax];
-      Dbuff.f[DIR_PMM ] = &bufferFs[DIR_PMM *buffmax];
-      Dbuff.f[DIR_MPM ] = &bufferFs[DIR_MPM *buffmax];
+      Dbuff.f[DIR_P00] = &bufferFs[DIR_P00 * buffmax];
+      Dbuff.f[DIR_M00] = &bufferFs[DIR_M00 * buffmax];
+      Dbuff.f[DIR_0P0] = &bufferFs[DIR_0P0 * buffmax];
+      Dbuff.f[DIR_0M0] = &bufferFs[DIR_0M0 * buffmax];
+      Dbuff.f[DIR_00P] = &bufferFs[DIR_00P * buffmax];
+      Dbuff.f[DIR_00M] = &bufferFs[DIR_00M * buffmax];
+      Dbuff.f[DIR_PP0] = &bufferFs[DIR_PP0 * buffmax];
+      Dbuff.f[DIR_MM0] = &bufferFs[DIR_MM0 * buffmax];
+      Dbuff.f[DIR_PM0] = &bufferFs[DIR_PM0 * buffmax];
+      Dbuff.f[DIR_MP0] = &bufferFs[DIR_MP0 * buffmax];
+      Dbuff.f[DIR_P0P] = &bufferFs[DIR_P0P * buffmax];
+      Dbuff.f[DIR_M0M] = &bufferFs[DIR_M0M * buffmax];
+      Dbuff.f[DIR_P0M] = &bufferFs[DIR_P0M * buffmax];
+      Dbuff.f[DIR_M0P] = &bufferFs[DIR_M0P * buffmax];
+      Dbuff.f[DIR_0PP] = &bufferFs[DIR_0PP * buffmax];
+      Dbuff.f[DIR_0MM] = &bufferFs[DIR_0MM * buffmax];
+      Dbuff.f[DIR_0PM] = &bufferFs[DIR_0PM * buffmax];
+      Dbuff.f[DIR_0MP] = &bufferFs[DIR_0MP * buffmax];
+      Dbuff.f[DIR_000] = &bufferFs[DIR_000 * buffmax];
+      Dbuff.f[DIR_PPP] = &bufferFs[DIR_PPP * buffmax];
+      Dbuff.f[DIR_MMP] = &bufferFs[DIR_MMP * buffmax];
+      Dbuff.f[DIR_PMP] = &bufferFs[DIR_PMP * buffmax];
+      Dbuff.f[DIR_MPP] = &bufferFs[DIR_MPP * buffmax];
+      Dbuff.f[DIR_PPM] = &bufferFs[DIR_PPM * buffmax];
+      Dbuff.f[DIR_MMM] = &bufferFs[DIR_MMM * buffmax];
+      Dbuff.f[DIR_PMM] = &bufferFs[DIR_PMM * buffmax];
+      Dbuff.f[DIR_MPM] = &bufferFs[DIR_MPM * buffmax];
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //copy to buffer
-      (Dbuff.f[DIR_P00   ])[k] = (D.f[DIR_P00   ])[ke   ];
-      (Dbuff.f[DIR_M00   ])[k] = (D.f[DIR_M00   ])[kw   ];
-      (Dbuff.f[DIR_0P0   ])[k] = (D.f[DIR_0P0   ])[kn   ];
-      (Dbuff.f[DIR_0M0   ])[k] = (D.f[DIR_0M0   ])[ks   ];
-      (Dbuff.f[DIR_00P   ])[k] = (D.f[DIR_00P   ])[kt   ];
-      (Dbuff.f[DIR_00M   ])[k] = (D.f[DIR_00M   ])[kb   ];
-      (Dbuff.f[DIR_PP0  ])[k] = (D.f[DIR_PP0  ])[kne  ];
-      (Dbuff.f[DIR_MM0  ])[k] = (D.f[DIR_MM0  ])[ksw  ];
-      (Dbuff.f[DIR_PM0  ])[k] = (D.f[DIR_PM0  ])[kse  ];
-      (Dbuff.f[DIR_MP0  ])[k] = (D.f[DIR_MP0  ])[knw  ];
-      (Dbuff.f[DIR_P0P  ])[k] = (D.f[DIR_P0P  ])[kte  ];
-      (Dbuff.f[DIR_M0M  ])[k] = (D.f[DIR_M0M  ])[kbw  ];
-      (Dbuff.f[DIR_P0M  ])[k] = (D.f[DIR_P0M  ])[kbe  ];
-      (Dbuff.f[DIR_M0P  ])[k] = (D.f[DIR_M0P  ])[ktw  ];
-      (Dbuff.f[DIR_0PP  ])[k] = (D.f[DIR_0PP  ])[ktn  ];
-      (Dbuff.f[DIR_0MM  ])[k] = (D.f[DIR_0MM  ])[kbs  ];
-      (Dbuff.f[DIR_0PM  ])[k] = (D.f[DIR_0PM  ])[kbn  ];
-      (Dbuff.f[DIR_0MP  ])[k] = (D.f[DIR_0MP  ])[kts  ];
+      (Dbuff.f[DIR_P00])[k] = (D.f[DIR_P00])[ke   ];
+      (Dbuff.f[DIR_M00])[k] = (D.f[DIR_M00])[kw   ];
+      (Dbuff.f[DIR_0P0])[k] = (D.f[DIR_0P0])[kn   ];
+      (Dbuff.f[DIR_0M0])[k] = (D.f[DIR_0M0])[ks   ];
+      (Dbuff.f[DIR_00P])[k] = (D.f[DIR_00P])[kt   ];
+      (Dbuff.f[DIR_00M])[k] = (D.f[DIR_00M])[kb   ];
+      (Dbuff.f[DIR_PP0])[k] = (D.f[DIR_PP0])[kne  ];
+      (Dbuff.f[DIR_MM0])[k] = (D.f[DIR_MM0])[ksw  ];
+      (Dbuff.f[DIR_PM0])[k] = (D.f[DIR_PM0])[kse  ];
+      (Dbuff.f[DIR_MP0])[k] = (D.f[DIR_MP0])[knw  ];
+      (Dbuff.f[DIR_P0P])[k] = (D.f[DIR_P0P])[kte  ];
+      (Dbuff.f[DIR_M0M])[k] = (D.f[DIR_M0M])[kbw  ];
+      (Dbuff.f[DIR_P0M])[k] = (D.f[DIR_P0M])[kbe  ];
+      (Dbuff.f[DIR_M0P])[k] = (D.f[DIR_M0P])[ktw  ];
+      (Dbuff.f[DIR_0PP])[k] = (D.f[DIR_0PP])[ktn  ];
+      (Dbuff.f[DIR_0MM])[k] = (D.f[DIR_0MM])[kbs  ];
+      (Dbuff.f[DIR_0PM])[k] = (D.f[DIR_0PM])[kbn  ];
+      (Dbuff.f[DIR_0MP])[k] = (D.f[DIR_0MP])[kts  ];
       (Dbuff.f[DIR_000])[k] = (D.f[DIR_000])[kzero];
-      (Dbuff.f[DIR_PPP ])[k] = (D.f[DIR_PPP ])[ktne ];
-      (Dbuff.f[DIR_MMP ])[k] = (D.f[DIR_MMP ])[ktsw ];
-      (Dbuff.f[DIR_PMP ])[k] = (D.f[DIR_PMP ])[ktse ];
-      (Dbuff.f[DIR_MPP ])[k] = (D.f[DIR_MPP ])[ktnw ];
-      (Dbuff.f[DIR_PPM ])[k] = (D.f[DIR_PPM ])[kbne ];
-      (Dbuff.f[DIR_MMM ])[k] = (D.f[DIR_MMM ])[kbsw ];
-      (Dbuff.f[DIR_PMM ])[k] = (D.f[DIR_PMM ])[kbse ];
-      (Dbuff.f[DIR_MPM ])[k] = (D.f[DIR_MPM ])[kbnw ];
+      (Dbuff.f[DIR_PPP])[k] = (D.f[DIR_PPP])[ktne ];
+      (Dbuff.f[DIR_MMP])[k] = (D.f[DIR_MMP])[ktsw ];
+      (Dbuff.f[DIR_PMP])[k] = (D.f[DIR_PMP])[ktse ];
+      (Dbuff.f[DIR_MPP])[k] = (D.f[DIR_MPP])[ktnw ];
+      (Dbuff.f[DIR_PPM])[k] = (D.f[DIR_PPM])[kbne ];
+      (Dbuff.f[DIR_MMM])[k] = (D.f[DIR_MMM])[kbsw ];
+      (Dbuff.f[DIR_PMM])[k] = (D.f[DIR_PMM])[kbse ];
+      (Dbuff.f[DIR_MPM])[k] = (D.f[DIR_MPM])[kbnw ];
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -694,7 +694,7 @@ __global__ void setRecvFsPre27(real* DD,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat, 
+                                          unsigned long long numberOfLBnodes, 
                                           bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -745,123 +745,123 @@ __global__ void setRecvFsPre27(real* DD,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //set Pointer for Buffer Fs
       Distributions27 Dbuff;
-      Dbuff.f[DIR_P00   ] = &bufferFs[DIR_P00   *buffmax];
-      Dbuff.f[DIR_M00   ] = &bufferFs[DIR_M00   *buffmax];
-      Dbuff.f[DIR_0P0   ] = &bufferFs[DIR_0P0   *buffmax];
-      Dbuff.f[DIR_0M0   ] = &bufferFs[DIR_0M0   *buffmax];
-      Dbuff.f[DIR_00P   ] = &bufferFs[DIR_00P   *buffmax];
-      Dbuff.f[DIR_00M   ] = &bufferFs[DIR_00M   *buffmax];
-      Dbuff.f[DIR_PP0  ] = &bufferFs[DIR_PP0  *buffmax];
-      Dbuff.f[DIR_MM0  ] = &bufferFs[DIR_MM0  *buffmax];
-      Dbuff.f[DIR_PM0  ] = &bufferFs[DIR_PM0  *buffmax];
-      Dbuff.f[DIR_MP0  ] = &bufferFs[DIR_MP0  *buffmax];
-      Dbuff.f[DIR_P0P  ] = &bufferFs[DIR_P0P  *buffmax];
-      Dbuff.f[DIR_M0M  ] = &bufferFs[DIR_M0M  *buffmax];
-      Dbuff.f[DIR_P0M  ] = &bufferFs[DIR_P0M  *buffmax];
-      Dbuff.f[DIR_M0P  ] = &bufferFs[DIR_M0P  *buffmax];
-      Dbuff.f[DIR_0PP  ] = &bufferFs[DIR_0PP  *buffmax];
-      Dbuff.f[DIR_0MM  ] = &bufferFs[DIR_0MM  *buffmax];
-      Dbuff.f[DIR_0PM  ] = &bufferFs[DIR_0PM  *buffmax];
-      Dbuff.f[DIR_0MP  ] = &bufferFs[DIR_0MP  *buffmax];
-      Dbuff.f[DIR_000] = &bufferFs[DIR_000*buffmax];
-      Dbuff.f[DIR_PPP ] = &bufferFs[DIR_PPP *buffmax];
-      Dbuff.f[DIR_MMP ] = &bufferFs[DIR_MMP *buffmax];
-      Dbuff.f[DIR_PMP ] = &bufferFs[DIR_PMP *buffmax];
-      Dbuff.f[DIR_MPP ] = &bufferFs[DIR_MPP *buffmax];
-      Dbuff.f[DIR_PPM ] = &bufferFs[DIR_PPM *buffmax];
-      Dbuff.f[DIR_MMM ] = &bufferFs[DIR_MMM *buffmax];
-      Dbuff.f[DIR_PMM ] = &bufferFs[DIR_PMM *buffmax];
-      Dbuff.f[DIR_MPM ] = &bufferFs[DIR_MPM *buffmax];
+      Dbuff.f[DIR_P00] = &bufferFs[DIR_P00 * buffmax];
+      Dbuff.f[DIR_M00] = &bufferFs[DIR_M00 * buffmax];
+      Dbuff.f[DIR_0P0] = &bufferFs[DIR_0P0 * buffmax];
+      Dbuff.f[DIR_0M0] = &bufferFs[DIR_0M0 * buffmax];
+      Dbuff.f[DIR_00P] = &bufferFs[DIR_00P * buffmax];
+      Dbuff.f[DIR_00M] = &bufferFs[DIR_00M * buffmax];
+      Dbuff.f[DIR_PP0] = &bufferFs[DIR_PP0 * buffmax];
+      Dbuff.f[DIR_MM0] = &bufferFs[DIR_MM0 * buffmax];
+      Dbuff.f[DIR_PM0] = &bufferFs[DIR_PM0 * buffmax];
+      Dbuff.f[DIR_MP0] = &bufferFs[DIR_MP0 * buffmax];
+      Dbuff.f[DIR_P0P] = &bufferFs[DIR_P0P * buffmax];
+      Dbuff.f[DIR_M0M] = &bufferFs[DIR_M0M * buffmax];
+      Dbuff.f[DIR_P0M] = &bufferFs[DIR_P0M * buffmax];
+      Dbuff.f[DIR_M0P] = &bufferFs[DIR_M0P * buffmax];
+      Dbuff.f[DIR_0PP] = &bufferFs[DIR_0PP * buffmax];
+      Dbuff.f[DIR_0MM] = &bufferFs[DIR_0MM * buffmax];
+      Dbuff.f[DIR_0PM] = &bufferFs[DIR_0PM * buffmax];
+      Dbuff.f[DIR_0MP] = &bufferFs[DIR_0MP * buffmax];
+      Dbuff.f[DIR_000] = &bufferFs[DIR_000 * buffmax];
+      Dbuff.f[DIR_PPP] = &bufferFs[DIR_PPP * buffmax];
+      Dbuff.f[DIR_MMP] = &bufferFs[DIR_MMP * buffmax];
+      Dbuff.f[DIR_PMP] = &bufferFs[DIR_PMP * buffmax];
+      Dbuff.f[DIR_MPP] = &bufferFs[DIR_MPP * buffmax];
+      Dbuff.f[DIR_PPM] = &bufferFs[DIR_PPM * buffmax];
+      Dbuff.f[DIR_MMM] = &bufferFs[DIR_MMM * buffmax];
+      Dbuff.f[DIR_PMM] = &bufferFs[DIR_PMM * buffmax];
+      Dbuff.f[DIR_MPM] = &bufferFs[DIR_MPM * buffmax];
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //copy from buffer
-      (D.f[DIR_P00   ])[ke   ] = (Dbuff.f[DIR_P00   ])[k];
-      (D.f[DIR_M00   ])[kw   ] = (Dbuff.f[DIR_M00   ])[k];
-      (D.f[DIR_0P0   ])[kn   ] = (Dbuff.f[DIR_0P0   ])[k];
-      (D.f[DIR_0M0   ])[ks   ] = (Dbuff.f[DIR_0M0   ])[k];
-      (D.f[DIR_00P   ])[kt   ] = (Dbuff.f[DIR_00P   ])[k];
-      (D.f[DIR_00M   ])[kb   ] = (Dbuff.f[DIR_00M   ])[k];
-      (D.f[DIR_PP0  ])[kne  ] = (Dbuff.f[DIR_PP0  ])[k];
-      (D.f[DIR_MM0  ])[ksw  ] = (Dbuff.f[DIR_MM0  ])[k];
-      (D.f[DIR_PM0  ])[kse  ] = (Dbuff.f[DIR_PM0  ])[k];
-      (D.f[DIR_MP0  ])[knw  ] = (Dbuff.f[DIR_MP0  ])[k];
-      (D.f[DIR_P0P  ])[kte  ] = (Dbuff.f[DIR_P0P  ])[k];
-      (D.f[DIR_M0M  ])[kbw  ] = (Dbuff.f[DIR_M0M  ])[k];
-      (D.f[DIR_P0M  ])[kbe  ] = (Dbuff.f[DIR_P0M  ])[k];
-      (D.f[DIR_M0P  ])[ktw  ] = (Dbuff.f[DIR_M0P  ])[k];
-      (D.f[DIR_0PP  ])[ktn  ] = (Dbuff.f[DIR_0PP  ])[k];
-      (D.f[DIR_0MM  ])[kbs  ] = (Dbuff.f[DIR_0MM  ])[k];
-      (D.f[DIR_0PM  ])[kbn  ] = (Dbuff.f[DIR_0PM  ])[k];
-      (D.f[DIR_0MP  ])[kts  ] = (Dbuff.f[DIR_0MP  ])[k];
+      (D.f[DIR_P00])[ke   ] = (Dbuff.f[DIR_P00])[k];
+      (D.f[DIR_M00])[kw   ] = (Dbuff.f[DIR_M00])[k];
+      (D.f[DIR_0P0])[kn   ] = (Dbuff.f[DIR_0P0])[k];
+      (D.f[DIR_0M0])[ks   ] = (Dbuff.f[DIR_0M0])[k];
+      (D.f[DIR_00P])[kt   ] = (Dbuff.f[DIR_00P])[k];
+      (D.f[DIR_00M])[kb   ] = (Dbuff.f[DIR_00M])[k];
+      (D.f[DIR_PP0])[kne  ] = (Dbuff.f[DIR_PP0])[k];
+      (D.f[DIR_MM0])[ksw  ] = (Dbuff.f[DIR_MM0])[k];
+      (D.f[DIR_PM0])[kse  ] = (Dbuff.f[DIR_PM0])[k];
+      (D.f[DIR_MP0])[knw  ] = (Dbuff.f[DIR_MP0])[k];
+      (D.f[DIR_P0P])[kte  ] = (Dbuff.f[DIR_P0P])[k];
+      (D.f[DIR_M0M])[kbw  ] = (Dbuff.f[DIR_M0M])[k];
+      (D.f[DIR_P0M])[kbe  ] = (Dbuff.f[DIR_P0M])[k];
+      (D.f[DIR_M0P])[ktw  ] = (Dbuff.f[DIR_M0P])[k];
+      (D.f[DIR_0PP])[ktn  ] = (Dbuff.f[DIR_0PP])[k];
+      (D.f[DIR_0MM])[kbs  ] = (Dbuff.f[DIR_0MM])[k];
+      (D.f[DIR_0PM])[kbn  ] = (Dbuff.f[DIR_0PM])[k];
+      (D.f[DIR_0MP])[kts  ] = (Dbuff.f[DIR_0MP])[k];
       (D.f[DIR_000])[kzero] = (Dbuff.f[DIR_000])[k];
-      (D.f[DIR_PPP ])[ktne ] = (Dbuff.f[DIR_PPP ])[k];
-      (D.f[DIR_MMP ])[ktsw ] = (Dbuff.f[DIR_MMP ])[k];
-      (D.f[DIR_PMP ])[ktse ] = (Dbuff.f[DIR_PMP ])[k];
-      (D.f[DIR_MPP ])[ktnw ] = (Dbuff.f[DIR_MPP ])[k];
-      (D.f[DIR_PPM ])[kbne ] = (Dbuff.f[DIR_PPM ])[k];
-      (D.f[DIR_MMM ])[kbsw ] = (Dbuff.f[DIR_MMM ])[k];
-      (D.f[DIR_PMM ])[kbse ] = (Dbuff.f[DIR_PMM ])[k];
-      (D.f[DIR_MPM ])[kbnw ] = (Dbuff.f[DIR_MPM ])[k];
+      (D.f[DIR_PPP])[ktne ] = (Dbuff.f[DIR_PPP])[k];
+      (D.f[DIR_MMP])[ktsw ] = (Dbuff.f[DIR_MMP])[k];
+      (D.f[DIR_PMP])[ktse ] = (Dbuff.f[DIR_PMP])[k];
+      (D.f[DIR_MPP])[ktnw ] = (Dbuff.f[DIR_MPP])[k];
+      (D.f[DIR_PPM])[kbne ] = (Dbuff.f[DIR_PPM])[k];
+      (D.f[DIR_MMM])[kbsw ] = (Dbuff.f[DIR_MMM])[k];
+      (D.f[DIR_PMM])[kbse ] = (Dbuff.f[DIR_PMM])[k];
+      (D.f[DIR_MPM])[kbnw ] = (Dbuff.f[DIR_MPM])[k];
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -903,7 +903,7 @@ __global__ void getSendGsF3(
 	unsigned int* neighborX,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool isEvenTimestep)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -931,31 +931,31 @@ __global__ void getSendGsF3(
 		Distributions6 G;
 		if (isEvenTimestep)
 		{
-			G.g[DIR_P00] = &G6[DIR_P00   *size_Mat];
-			G.g[DIR_M00] = &G6[DIR_M00   *size_Mat];
-			G.g[DIR_0P0] = &G6[DIR_0P0   *size_Mat];
-			G.g[DIR_0M0] = &G6[DIR_0M0   *size_Mat];
-			G.g[DIR_00P] = &G6[DIR_00P   *size_Mat];
-			G.g[DIR_00M] = &G6[DIR_00M   *size_Mat];
+			G.g[DIR_P00] = &G6[DIR_P00 * numberOfLBnodes];
+			G.g[DIR_M00] = &G6[DIR_M00 * numberOfLBnodes];
+			G.g[DIR_0P0] = &G6[DIR_0P0 * numberOfLBnodes];
+			G.g[DIR_0M0] = &G6[DIR_0M0 * numberOfLBnodes];
+			G.g[DIR_00P] = &G6[DIR_00P * numberOfLBnodes];
+			G.g[DIR_00M] = &G6[DIR_00M * numberOfLBnodes];
 		}
 		else
 		{
-			G.g[DIR_M00] = &G6[DIR_P00   *size_Mat];
-			G.g[DIR_P00] = &G6[DIR_M00   *size_Mat];
-			G.g[DIR_0M0] = &G6[DIR_0P0   *size_Mat];
-			G.g[DIR_0P0] = &G6[DIR_0M0   *size_Mat];
-			G.g[DIR_00M] = &G6[DIR_00P   *size_Mat];
-			G.g[DIR_00P] = &G6[DIR_00M   *size_Mat];
+			G.g[DIR_M00] = &G6[DIR_P00 * numberOfLBnodes];
+			G.g[DIR_P00] = &G6[DIR_M00 * numberOfLBnodes];
+			G.g[DIR_0M0] = &G6[DIR_0P0 * numberOfLBnodes];
+			G.g[DIR_0P0] = &G6[DIR_0M0 * numberOfLBnodes];
+			G.g[DIR_00M] = &G6[DIR_00P * numberOfLBnodes];
+			G.g[DIR_00P] = &G6[DIR_00M * numberOfLBnodes];
 		}
 		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 		//set Pointer for Buffer Gs
 		Distributions6 Dbuff;
-		Dbuff.g[DIR_P00] = &bufferGs[DIR_P00   *buffmax];
-		Dbuff.g[DIR_M00] = &bufferGs[DIR_M00   *buffmax];
-		Dbuff.g[DIR_0P0] = &bufferGs[DIR_0P0   *buffmax];
-		Dbuff.g[DIR_0M0] = &bufferGs[DIR_0M0   *buffmax];
-		Dbuff.g[DIR_00P] = &bufferGs[DIR_00P   *buffmax];
-		Dbuff.g[DIR_00M] = &bufferGs[DIR_00M   *buffmax];
+		Dbuff.g[DIR_P00] = &bufferGs[DIR_P00 * buffmax];
+		Dbuff.g[DIR_M00] = &bufferGs[DIR_M00 * buffmax];
+		Dbuff.g[DIR_0P0] = &bufferGs[DIR_0P0 * buffmax];
+		Dbuff.g[DIR_0M0] = &bufferGs[DIR_0M0 * buffmax];
+		Dbuff.g[DIR_00P] = &bufferGs[DIR_00P * buffmax];
+		Dbuff.g[DIR_00M] = &bufferGs[DIR_00M * buffmax];
 		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 		//write Gs to buffer
 		(Dbuff.g[DIR_P00])[k] = (G.g[DIR_M00])[kw];
@@ -1006,7 +1006,7 @@ __global__ void setRecvGsF3(
 	unsigned int* neighborX,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool isEvenTimestep)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -1034,31 +1034,31 @@ __global__ void setRecvGsF3(
 		Distributions6 G;
 		if (isEvenTimestep)
 		{
-			G.g[DIR_P00] = &G6[DIR_P00   *size_Mat];
-			G.g[DIR_M00] = &G6[DIR_M00   *size_Mat];
-			G.g[DIR_0P0] = &G6[DIR_0P0   *size_Mat];
-			G.g[DIR_0M0] = &G6[DIR_0M0   *size_Mat];
-			G.g[DIR_00P] = &G6[DIR_00P   *size_Mat];
-			G.g[DIR_00M] = &G6[DIR_00M   *size_Mat];
+			G.g[DIR_P00] = &G6[DIR_P00 * numberOfLBnodes];
+			G.g[DIR_M00] = &G6[DIR_M00 * numberOfLBnodes];
+			G.g[DIR_0P0] = &G6[DIR_0P0 * numberOfLBnodes];
+			G.g[DIR_0M0] = &G6[DIR_0M0 * numberOfLBnodes];
+			G.g[DIR_00P] = &G6[DIR_00P * numberOfLBnodes];
+			G.g[DIR_00M] = &G6[DIR_00M * numberOfLBnodes];
 		}
 		else
 		{
-			G.g[DIR_M00] = &G6[DIR_P00   *size_Mat];
-			G.g[DIR_P00] = &G6[DIR_M00   *size_Mat];
-			G.g[DIR_0M0] = &G6[DIR_0P0   *size_Mat];
-			G.g[DIR_0P0] = &G6[DIR_0M0   *size_Mat];
-			G.g[DIR_00M] = &G6[DIR_00P   *size_Mat];
-			G.g[DIR_00P] = &G6[DIR_00M   *size_Mat];
+			G.g[DIR_M00] = &G6[DIR_P00 * numberOfLBnodes];
+			G.g[DIR_P00] = &G6[DIR_M00 * numberOfLBnodes];
+			G.g[DIR_0M0] = &G6[DIR_0P0 * numberOfLBnodes];
+			G.g[DIR_0P0] = &G6[DIR_0M0 * numberOfLBnodes];
+			G.g[DIR_00M] = &G6[DIR_00P * numberOfLBnodes];
+			G.g[DIR_00P] = &G6[DIR_00M * numberOfLBnodes];
 		}
 		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 		//set Pointer for Buffer Gs
 		Distributions6 Dbuff;
-		Dbuff.g[DIR_P00] = &bufferGs[DIR_P00   *buffmax];
-		Dbuff.g[DIR_M00] = &bufferGs[DIR_M00   *buffmax];
-		Dbuff.g[DIR_0P0] = &bufferGs[DIR_0P0   *buffmax];
-		Dbuff.g[DIR_0M0] = &bufferGs[DIR_0M0   *buffmax];
-		Dbuff.g[DIR_00P] = &bufferGs[DIR_00P   *buffmax];
-		Dbuff.g[DIR_00M] = &bufferGs[DIR_00M   *buffmax];
+		Dbuff.g[DIR_P00] = &bufferGs[DIR_P00 * buffmax];
+		Dbuff.g[DIR_M00] = &bufferGs[DIR_M00 * buffmax];
+		Dbuff.g[DIR_0P0] = &bufferGs[DIR_0P0 * buffmax];
+		Dbuff.g[DIR_0M0] = &bufferGs[DIR_0M0 * buffmax];
+		Dbuff.g[DIR_00P] = &bufferGs[DIR_00P * buffmax];
+		Dbuff.g[DIR_00M] = &bufferGs[DIR_00M * buffmax];
 		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 		//write buffer to Gs
 		(G.g[DIR_M00])[kw] = (Dbuff.g[DIR_P00])[k];
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
index ceb70fb123c52c282200137a00522ff2b9905f86..4a5b7816c1b6591e4193639bcdf71242e77688c0 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
+++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
@@ -29,7 +29,7 @@ void KernelCas27(unsigned int grid_nx,
                             unsigned int* neighborY,
                             unsigned int* neighborZ,
                             real* DD,
-                            int size_Mat,
+                            unsigned long long numberOfLBnodes,
                             bool EvenOrOdd);
 
 void KernelCasSP27(unsigned int numberOfThreads, 
@@ -39,7 +39,7 @@ void KernelCasSP27(unsigned int numberOfThreads,
                               unsigned int* neighborY,
                               unsigned int* neighborZ,
                               real* DD,
-                              int size_Mat,
+                              unsigned long long numberOfLBnodes,
                               bool EvenOrOdd);
 
 void KernelCasSPMS27(unsigned int numberOfThreads, 
@@ -49,7 +49,7 @@ void KernelCasSPMS27(unsigned int numberOfThreads,
                                 unsigned int* neighborY,
                                 unsigned int* neighborZ,
                                 real* DD,
-                                int size_Mat,
+                                unsigned long long numberOfLBnodes,
                                 bool EvenOrOdd);
 
 void KernelCasSPMSOHM27( unsigned int numberOfThreads, 
@@ -59,7 +59,7 @@ void KernelCasSPMSOHM27( unsigned int numberOfThreads,
                                    unsigned int* neighborY,
                                    unsigned int* neighborZ,
                                    real* DD,
-                                   int size_Mat,
+                                   unsigned long long numberOfLBnodes,
                                    bool EvenOrOdd);
 
 void KernelKumCompSRTSP27(
@@ -70,7 +70,7 @@ void KernelKumCompSRTSP27(
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
 	real* DDStart,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int level,
 	real* forces,
 	bool EvenOrOdd);
@@ -82,7 +82,7 @@ void KernelCumulantD3Q27All4(unsigned int numberOfThreads,
 									    unsigned int* neighborY,
 									    unsigned int* neighborZ,
 									    real* DD,
-									    int size_Mat,
+									    unsigned long long numberOfLBnodes,
 									    int level,
 									    real* forces,
 									    bool EvenOrOdd);
@@ -94,7 +94,7 @@ void KernelKumAA2016CompBulkSP27(unsigned int numberOfThreads,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
 											real* DD,
-											int size_Mat,
+											unsigned long long numberOfLBnodes,
 											int size_Array,
 											int level,
 											real* forces,
@@ -112,7 +112,7 @@ void KernelKum1hSP27(    unsigned int numberOfThreads,
 									real* coordY,
 									real* coordZ,
 									real* DDStart,
-									int size_Mat,
+									unsigned long long numberOfLBnodes,
 									bool EvenOrOdd);
 
 void KernelCascadeSP27(unsigned int numberOfThreads, 
@@ -122,7 +122,7 @@ void KernelCascadeSP27(unsigned int numberOfThreads,
 								  unsigned int* neighborY,
 								  unsigned int* neighborZ,
 								  real* DD,
-								  int size_Mat,
+								  unsigned long long numberOfLBnodes,
 								  bool EvenOrOdd);
 
 void KernelKumNewSP27(   unsigned int numberOfThreads, 
@@ -132,7 +132,7 @@ void KernelKumNewSP27(   unsigned int numberOfThreads,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
 									real* DD,
-									int size_Mat,
+									unsigned long long numberOfLBnodes,
 									bool EvenOrOdd);
 
 
@@ -144,7 +144,7 @@ void CumulantOnePreconditionedErrorDiffusionChimCompSP27(
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
 	real* DD,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int size_Array,
 	int level,
 	real* forces,
@@ -158,7 +158,7 @@ void CumulantOnePreconditionedChimCompSP27(
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
 	real* DD,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int size_Array,
 	int level,
 	real* forces,
@@ -172,7 +172,7 @@ void CumulantOneChimCompSP27(
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
 	real* DD,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int size_Array,
 	int level,
 	real* forces,
@@ -189,7 +189,7 @@ void KernelKumIsoTestSP27(unsigned int numberOfThreads,
 									 real* dxxUx,
 									 real* dyyUy,
 									 real* dzzUz,
-									 int size_Mat,
+									 unsigned long long numberOfLBnodes,
 									 bool EvenOrOdd);
 
 void KernelKumCompSP27(  unsigned int numberOfThreads, 
@@ -199,7 +199,7 @@ void KernelKumCompSP27(  unsigned int numberOfThreads,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
 									real* DD,
-									int size_Mat,
+									unsigned long long numberOfLBnodes,
 									bool EvenOrOdd);
 
 void KernelWaleBySoniMalavCumAA2016CompSP27(
@@ -215,7 +215,7 @@ void KernelWaleBySoniMalavCumAA2016CompSP27(
 	real* veloZ,
 	real* DD,
 	real* turbulentViscosity,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int size_Array,
 	int level,
 	real* forces,
@@ -227,7 +227,7 @@ void KernelPMCumOneCompSP27(unsigned int numberOfThreads,
 									   unsigned int* neighborY,
 									   unsigned int* neighborZ,
 									   real* DD,
-									   int size_Mat,
+									   unsigned long long numberOfLBnodes,
 									   int level,
 									   real* forces,
 									   real porosity,
@@ -245,7 +245,7 @@ void KernelADincomp7(   unsigned int numberOfThreads,
 								   unsigned int* neighborZ,
 								   real* DD,
 								   real* DD7,
-								   int size_Mat,
+								   unsigned long long numberOfLBnodes,
 								   bool EvenOrOdd);
 
 void KernelADincomp27(   unsigned int numberOfThreads, 
@@ -256,7 +256,7 @@ void KernelADincomp27(   unsigned int numberOfThreads,
 									unsigned int* neighborZ,
 									real* DD,
 									real* DD7,
-									int size_Mat,
+									unsigned long long numberOfLBnodes,
 									bool EvenOrOdd);
 
 void Init27(int myid,
@@ -267,7 +267,7 @@ void Init27(int myid,
                        unsigned int* neighborY,
                        unsigned int* neighborZ,
                        real* vParab,
-                       unsigned int size_Mat,
+                       unsigned long long numberOfLBnodes,
                        unsigned int grid_nx, 
                        unsigned int grid_ny, 
                        unsigned int grid_nz, 
@@ -285,7 +285,7 @@ void InitNonEqPartSP27(unsigned int numberOfThreads,
                                   real* ux,
                                   real* uy,
                                   real* uz,
-                                  unsigned int size_Mat,
+                                  unsigned long long numberOfLBnodes,
                                   real* DD,
                                   real omega,
                                   bool EvenOrOdd);
@@ -300,7 +300,7 @@ void InitThS7(  unsigned int numberOfThreads,
                            real* ux,
                            real* uy,
                            real* uz,
-                           unsigned int size_Mat,
+                           unsigned long long numberOfLBnodes,
                            real* DD7,
                            bool EvenOrOdd);
 
@@ -313,7 +313,7 @@ void InitADDev27( unsigned int numberOfThreads,
                            real* ux,
                            real* uy,
                            real* uz,
-                           unsigned int size_Mat,
+                           unsigned long long numberOfLBnodes,
                            real* DD27,
                            bool EvenOrOdd);
 
@@ -330,7 +330,7 @@ void PostProcessorF3_2018Fehlberg(
 	real* vzOut,
 	real* DDStart,
 	real* G6,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int level,
 	real* forces,
 	bool EvenOrOdd);
@@ -343,7 +343,7 @@ void CalcMac27( real* vxD,
                           unsigned int* neighborX,
                           unsigned int* neighborY,
                           unsigned int* neighborZ,
-                          unsigned int size_Mat,
+                          unsigned long long numberOfLBnodes,
                           unsigned int grid_nx, 
                           unsigned int grid_ny, 
                           unsigned int grid_nz, 
@@ -359,7 +359,7 @@ void CalcMacSP27(real* vxD,
                             unsigned int* neighborX,
                             unsigned int* neighborY,
                             unsigned int* neighborZ,
-                            unsigned int size_Mat,
+                            unsigned long long numberOfLBnodes,
                             unsigned int numberOfThreads, 
                             real* DD,
                             bool isEvenTimestep);
@@ -373,7 +373,7 @@ void CalcMacCompSP27(real* vxD,
 								unsigned int* neighborX,
 								unsigned int* neighborY,
 								unsigned int* neighborZ,
-								unsigned int size_Mat,
+								unsigned long long numberOfLBnodes,
 								unsigned int numberOfThreads, 
 								real* DD,
 								bool isEvenTimestep);
@@ -383,7 +383,7 @@ void CalcMacThS7(  real* Conc,
                               unsigned int* neighborX,
                               unsigned int* neighborY,
                               unsigned int* neighborZ,
-                              unsigned int size_Mat,
+                              unsigned long long numberOfLBnodes,
                               unsigned int numberOfThreads, 
                               real* DD7,
                               bool isEvenTimestep);
@@ -395,7 +395,7 @@ void PlaneConcThS7(real* Conc,
 							  unsigned int* neighborX,
 							  unsigned int* neighborY,
 							  unsigned int* neighborZ,
-							  unsigned int size_Mat,
+							  unsigned long long numberOfLBnodes,
 							  unsigned int numberOfThreads, 
 							  real* DD7,
 							  bool isEvenTimestep);
@@ -407,7 +407,7 @@ void PlaneConcThS27(real* Conc,
 							   unsigned int* neighborX,
 							   unsigned int* neighborY,
 							   unsigned int* neighborZ,
-							   unsigned int size_Mat,
+							   unsigned long long numberOfLBnodes,
 							   unsigned int numberOfThreads, 
 							   real* DD27,
 							   bool isEvenTimestep);
@@ -418,7 +418,7 @@ void CalcConcentration27( unsigned int numberOfThreads,
                                      unsigned int* neighborX,
                                      unsigned int* neighborY,
                                      unsigned int* neighborZ,
-                                     unsigned int size_Mat,
+                                     unsigned long long numberOfLBnodes,
                                      real* DD27,
                                      bool isEvenTimestep);
 
@@ -431,7 +431,7 @@ void CalcMedSP27(  real* vxD,
                               unsigned int* neighborX,
                               unsigned int* neighborY,
                               unsigned int* neighborZ,
-                              unsigned int size_Mat,
+                              unsigned long long numberOfLBnodes,
                               unsigned int numberOfThreads, 
                               real* DD,
                               bool isEvenTimestep);
@@ -445,7 +445,7 @@ void CalcMedCompSP27(real* vxD,
 								unsigned int* neighborX,
 								unsigned int* neighborY,
 								unsigned int* neighborZ,
-								unsigned int size_Mat,
+								unsigned long long numberOfLBnodes,
 								unsigned int numberOfThreads, 
 								real* DD,
 								bool isEvenTimestep);
@@ -461,7 +461,7 @@ void CalcMedCompAD27(
 	unsigned int* neighborX,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	unsigned int numberOfThreads,
 	real* DD,
 	real* DD_AD,
@@ -477,7 +477,7 @@ void CalcMacMedSP27(  real* vxD,
                                  unsigned int* neighborY,
                                  unsigned int* neighborZ,
                                  unsigned int tdiff,
-                                 unsigned int size_Mat,
+                                 unsigned long long numberOfLBnodes,
                                  unsigned int numberOfThreads, 
                                  bool isEvenTimestep);
 
@@ -487,7 +487,7 @@ void ResetMedianValuesSP27(
 	real* vzD,
 	real* rhoD,
 	real* pressD,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	unsigned int numberOfThreads,
 	bool isEvenTimestep);
 
@@ -498,7 +498,7 @@ void ResetMedianValuesAD27(
 	real* rhoD,
 	real* pressD,
 	real* concD,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	unsigned int numberOfThreads,
 	bool isEvenTimestep);
 
@@ -511,7 +511,7 @@ void Calc2ndMomentsIncompSP27(real* kxyFromfcNEQ,
 										 unsigned int* neighborX,
 										 unsigned int* neighborY,
 										 unsigned int* neighborZ,
-										 unsigned int size_Mat,
+										 unsigned long long numberOfLBnodes,
 										 unsigned int numberOfThreads, 
 										 real* DD,
 										 bool isEvenTimestep);
@@ -525,7 +525,7 @@ void Calc2ndMomentsCompSP27(real* kxyFromfcNEQ,
 									   unsigned int* neighborX,
 									   unsigned int* neighborY,
 									   unsigned int* neighborZ,
-									   unsigned int size_Mat,
+									   unsigned long long numberOfLBnodes,
 									   unsigned int numberOfThreads, 
 									   real* DD,
 									   bool isEvenTimestep);
@@ -541,7 +541,7 @@ void Calc3rdMomentsIncompSP27(real* CUMbbb,
 										 unsigned int* neighborX,
 										 unsigned int* neighborY,
 										 unsigned int* neighborZ,
-										 unsigned int size_Mat,
+										 unsigned long long numberOfLBnodes,
 										 unsigned int numberOfThreads, 
 										 real* DD,
 										 bool isEvenTimestep);
@@ -557,7 +557,7 @@ void Calc3rdMomentsCompSP27(real* CUMbbb,
 									   unsigned int* neighborX,
 									   unsigned int* neighborY,
 									   unsigned int* neighborZ,
-									   unsigned int size_Mat,
+									   unsigned long long numberOfLBnodes,
 									   unsigned int numberOfThreads, 
 									   real* DD,
 									   bool isEvenTimestep);
@@ -576,7 +576,7 @@ void CalcHigherMomentsIncompSP27(real* CUMcbb,
 											unsigned int* neighborX,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
-											unsigned int size_Mat,
+											unsigned long long numberOfLBnodes,
 											unsigned int numberOfThreads, 
 											real* DD,
 											bool isEvenTimestep);
@@ -595,7 +595,7 @@ void CalcHigherMomentsCompSP27(real* CUMcbb,
 										  unsigned int* neighborX,
 										  unsigned int* neighborY,
 										  unsigned int* neighborZ,
-										  unsigned int size_Mat,
+										  unsigned long long numberOfLBnodes,
 										  unsigned int numberOfThreads, 
 										  real* DD,
 										  bool isEvenTimestep);
@@ -612,7 +612,7 @@ void LBCalcMeasurePoints27(real* vxMP,
                                       unsigned int* neighborX,
                                       unsigned int* neighborY,
                                       unsigned int* neighborZ,
-                                      unsigned int size_Mat,
+                                      unsigned long long numberOfLBnodes,
                                       real* DD,
                                       unsigned int numberOfThreads, 
                                       bool isEvenTimestep);
@@ -627,7 +627,7 @@ void BcPress27(int nx,
                           unsigned int* neighborY,
                           unsigned int* neighborZ,
                           real* DD, 
-                          unsigned int size_Mat, 
+                          unsigned long long numberOfLBnodes, 
                           bool isEvenTimestep);
 
 void BcVel27(int nx, 
@@ -641,7 +641,7 @@ void BcVel27(int nx,
                         unsigned int* neighborY,
                         unsigned int* neighborZ,
                         real* DD, 
-                        unsigned int size_Mat, 
+                        unsigned long long numberOfLBnodes, 
                         bool isEvenTimestep, 
                         real u0x, 
                         real om);
@@ -661,7 +661,7 @@ void QDevCompThinWalls27(unsigned int numberOfThreads,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
 									unsigned int* neighborWSB,
-									unsigned int size_Mat, 
+									unsigned long long numberOfLBnodes, 
 									bool isEvenTimestep);
 
 void QDev3rdMomentsComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
@@ -675,7 +675,7 @@ void QDevIncompHighNu27(  unsigned int numberOfThreads,
 									 unsigned int* neighborX,
 									 unsigned int* neighborY,
 									 unsigned int* neighborZ,
-									 unsigned int size_Mat, 
+									 unsigned long long numberOfLBnodes, 
 									 bool isEvenTimestep);
 
 void QDevCompHighNu27(unsigned int numberOfThreads,
@@ -687,7 +687,7 @@ void QDevCompHighNu27(unsigned int numberOfThreads,
 								 unsigned int* neighborX,
 								 unsigned int* neighborY,
 								 unsigned int* neighborZ,
-								 unsigned int size_Mat, 
+								 unsigned long long numberOfLBnodes, 
 								 bool isEvenTimestep);
 
 void QVelDevicePlainBB27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
@@ -704,7 +704,7 @@ void QVelDeviceCouette27(unsigned int numberOfThreads,
 									unsigned int* neighborX,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
-									unsigned int size_Mat, 
+									unsigned long long numberOfLBnodes, 
 									bool isEvenTimestep);
 
 void QVelDevice1h27( unsigned int numberOfThreads,
@@ -726,7 +726,7 @@ void QVelDevice1h27( unsigned int numberOfThreads,
 								real* coordX,
 								real* coordY,
 								real* coordZ,
-								unsigned int size_Mat, 
+								unsigned long long numberOfLBnodes, 
 								bool isEvenTimestep);
 
 void QVelDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
@@ -743,7 +743,7 @@ void QVelDevCompPlusSlip27(unsigned int numberOfThreads,
 									  unsigned int* neighborX,
 									  unsigned int* neighborY,
 									  unsigned int* neighborZ,
-									  unsigned int size_Mat, 
+									  unsigned long long numberOfLBnodes, 
 									  bool isEvenTimestep);
 
 void QVelDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
@@ -762,7 +762,7 @@ void QVelDevCompThinWalls27(unsigned int numberOfThreads,
 							           unsigned int* neighborY,
 							           unsigned int* neighborZ,
 									   unsigned int* neighborWSB,
-							           unsigned int size_Mat, 
+							           unsigned long long numberOfLBnodes, 
 							           bool isEvenTimestep);
 
 void QVelDevCompZeroPress27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
@@ -779,7 +779,7 @@ void QVelDevIncompHighNu27(  unsigned int numberOfThreads,
 										unsigned int* neighborX,
 										unsigned int* neighborY,
 										unsigned int* neighborZ,
-										unsigned int size_Mat, 
+										unsigned long long numberOfLBnodes, 
 										bool isEvenTimestep);
 
 void QVelDevCompHighNu27(unsigned int numberOfThreads,
@@ -794,7 +794,7 @@ void QVelDevCompHighNu27(unsigned int numberOfThreads,
 									unsigned int* neighborX,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
-									unsigned int size_Mat, 
+									unsigned long long numberOfLBnodes, 
 									bool isEvenTimestep);
 
 void QVeloDevEQ27(unsigned int numberOfThreads,
@@ -808,7 +808,7 @@ void QVeloDevEQ27(unsigned int numberOfThreads,
 							 unsigned int* neighborX,
 							 unsigned int* neighborY,
 							 unsigned int* neighborZ,
-							 unsigned int size_Mat, 
+							 unsigned long long numberOfLBnodes, 
 							 bool isEvenTimestep);
 
 void QVeloStreetDevEQ27(
@@ -848,7 +848,7 @@ void QSlipGeomDevComp27( unsigned int numberOfThreads,
 									unsigned int* neighborX,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
-									unsigned int size_Mat, 
+									unsigned long long numberOfLBnodes, 
 									bool isEvenTimestep);
 
 void QSlipNormDevComp27(unsigned int numberOfThreads,
@@ -863,7 +863,7 @@ void QSlipNormDevComp27(unsigned int numberOfThreads,
 								   unsigned int* neighborX,
 								   unsigned int* neighborY,
 								   unsigned int* neighborZ,
-								   unsigned int size_Mat, 
+								   unsigned long long numberOfLBnodes, 
 								   bool isEvenTimestep);
 
 void QStressDevComp27(Parameter *para,  QforBoundaryConditions* boundaryCondition, const int level);
@@ -883,7 +883,7 @@ void QPressDevFixBackflow27(unsigned int numberOfThreads,
                                        unsigned int* neighborX,
                                        unsigned int* neighborY,
                                        unsigned int* neighborZ,
-                                       unsigned int size_Mat, 
+                                       unsigned long long numberOfLBnodes, 
                                        bool isEvenTimestep);
 
 void QPressDevDirDepBot27(unsigned int numberOfThreads,
@@ -895,7 +895,7 @@ void QPressDevDirDepBot27(unsigned int numberOfThreads,
                                      unsigned int* neighborX,
                                      unsigned int* neighborY,
                                      unsigned int* neighborZ,
-                                     unsigned int size_Mat, 
+                                     unsigned long long numberOfLBnodes, 
                                      bool isEvenTimestep);
 
 void QPressNoRhoDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
@@ -914,7 +914,7 @@ void QPressDevOld27(unsigned int numberOfThreads,
                                unsigned int* neighborX,
                                unsigned int* neighborY,
                                unsigned int* neighborZ,
-                               unsigned int size_Mat, 
+                               unsigned long long numberOfLBnodes, 
                                bool isEvenTimestep);
 
 void QPressDevIncompNEQ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
@@ -930,7 +930,7 @@ void QPressDevZero27(unsigned int numberOfThreads,
                                 unsigned int* neighborX,
                                 unsigned int* neighborY,
                                 unsigned int* neighborZ,
-                                unsigned int size_Mat, 
+                                unsigned long long numberOfLBnodes, 
                                 bool isEvenTimestep);
 
 void QPressDevFake27(   unsigned int numberOfThreads,
@@ -943,7 +943,7 @@ void QPressDevFake27(   unsigned int numberOfThreads,
 								   unsigned int* neighborX,
 								   unsigned int* neighborY,
 								   unsigned int* neighborZ,
-								   unsigned int size_Mat, 
+								   unsigned long long numberOfLBnodes, 
 								   bool isEvenTimestep);
 
 void BBDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
@@ -958,7 +958,7 @@ void QPressDev27_IntBB(  unsigned int numberOfThreads,
 									unsigned int* neighborX,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
-									unsigned int size_Mat, 
+									unsigned long long numberOfLBnodes, 
 									bool isEvenTimestep);
 
 void QPressDevAntiBB27(  unsigned int numberOfThreads,
@@ -974,7 +974,7 @@ void QPressDevAntiBB27(  unsigned int numberOfThreads,
 								  unsigned int* neighborX,
 								  unsigned int* neighborY,
 								  unsigned int* neighborZ,
-								  unsigned int size_Mat, 
+								  unsigned long long numberOfLBnodes, 
 								  bool isEvenTimestep);
 
 void PressSchlaffer27(unsigned int numberOfThreads,
@@ -991,7 +991,7 @@ void PressSchlaffer27(unsigned int numberOfThreads,
                                  unsigned int* neighborX,
                                  unsigned int* neighborY,
                                  unsigned int* neighborZ,
-                                 unsigned int size_Mat, 
+                                 unsigned long long numberOfLBnodes, 
                                  bool isEvenTimestep);
 
 void VelSchlaffer27(  unsigned int numberOfThreads,
@@ -1006,7 +1006,7 @@ void VelSchlaffer27(  unsigned int numberOfThreads,
                                  unsigned int* neighborX,
                                  unsigned int* neighborY,
                                  unsigned int* neighborZ,
-                                 unsigned int size_Mat, 
+                                 unsigned long long numberOfLBnodes, 
                                  bool isEvenTimestep);
 
 void QPrecursorDevCompZeroPress(LBMSimulationParameter* parameterDevice, QforPrecursorBoundaryConditions* boundaryCondition, real tRatio, real velocityRatio);
@@ -1029,7 +1029,7 @@ void QADDev7(unsigned int numberOfThreads,
                         unsigned int* neighborX,
                         unsigned int* neighborY,
                         unsigned int* neighborZ,
-                        unsigned int size_Mat, 
+                        unsigned long long numberOfLBnodes, 
                         bool isEvenTimestep);
 
 //////////////////////////////////////////////////////////////////////////
@@ -1043,7 +1043,7 @@ void FactorizedCentralMomentsAdvectionDiffusionDeviceKernel(
 	uint* neighborZ,
 	real* distributions,
 	real* distributionsAD,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	real* forces,
 	bool isEvenTimestep);
 
@@ -1063,7 +1063,7 @@ void ADSlipVelDevComp(
 	uint * neighborX,
 	uint * neighborY,
 	uint * neighborZ,
-	uint size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool isEvenTimestep);
 	
 void QADDirichletDev27( unsigned int numberOfThreads,
@@ -1078,7 +1078,7 @@ void QADDirichletDev27( unsigned int numberOfThreads,
 								   unsigned int* neighborX,
 								   unsigned int* neighborY,
 								   unsigned int* neighborZ,
-								   unsigned int size_Mat, 
+								   unsigned long long numberOfLBnodes, 
 								   bool isEvenTimestep);
 
 void QADBBDev27(  unsigned int numberOfThreads,
@@ -1093,7 +1093,7 @@ void QADBBDev27(  unsigned int numberOfThreads,
 							 unsigned int* neighborX,
 							 unsigned int* neighborY,
 							 unsigned int* neighborZ,
-							 unsigned int size_Mat, 
+							 unsigned long long numberOfLBnodes, 
 							 bool isEvenTimestep);
 
 void QADVelDev7(unsigned int numberOfThreads,
@@ -1109,7 +1109,7 @@ void QADVelDev7(unsigned int numberOfThreads,
                            unsigned int* neighborX,
                            unsigned int* neighborY,
                            unsigned int* neighborZ,
-                           unsigned int size_Mat, 
+                           unsigned long long numberOfLBnodes, 
                            bool isEvenTimestep);
 
 
@@ -1126,7 +1126,7 @@ void QADVelDev27(  unsigned int numberOfThreads,
                               unsigned int* neighborX,
                               unsigned int* neighborY,
                               unsigned int* neighborZ,
-                              unsigned int size_Mat, 
+                              unsigned long long numberOfLBnodes, 
                               bool isEvenTimestep);
 
 void QADPressDev7( unsigned int numberOfThreads,
@@ -1142,7 +1142,7 @@ void QADPressDev7( unsigned int numberOfThreads,
                               unsigned int* neighborX,
                               unsigned int* neighborY,
                               unsigned int* neighborZ,
-                              unsigned int size_Mat, 
+                              unsigned long long numberOfLBnodes, 
                               bool isEvenTimestep);
 
 void QADPressDev27(unsigned int numberOfThreads,
@@ -1158,7 +1158,7 @@ void QADPressDev27(unsigned int numberOfThreads,
                               unsigned int* neighborX,
                               unsigned int* neighborY,
                               unsigned int* neighborZ,
-                              unsigned int size_Mat, 
+                              unsigned long long numberOfLBnodes, 
                               bool isEvenTimestep);
 
 void QADPressNEQNeighborDev27(
@@ -1171,7 +1171,7 @@ void QADPressNEQNeighborDev27(
 											unsigned int* neighborX,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
-											unsigned int size_Mat,
+											unsigned long long numberOfLBnodes,
 											bool isEvenTimestep
 										);
 
@@ -1187,7 +1187,7 @@ void QNoSlipADincompDev7(unsigned int numberOfThreads,
 									unsigned int* neighborX,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
-									unsigned int size_Mat, 
+									unsigned long long numberOfLBnodes, 
 									bool isEvenTimestep);
 
 void QNoSlipADincompDev27(unsigned int numberOfThreads,
@@ -1202,7 +1202,7 @@ void QNoSlipADincompDev27(unsigned int numberOfThreads,
 									 unsigned int* neighborX,
 									 unsigned int* neighborY,
 									 unsigned int* neighborZ,
-									 unsigned int size_Mat, 
+									 unsigned long long numberOfLBnodes, 
 									 bool isEvenTimestep);
 
 void QADVeloIncompDev7( unsigned int numberOfThreads,
@@ -1218,7 +1218,7 @@ void QADVeloIncompDev7( unsigned int numberOfThreads,
 								   unsigned int* neighborX,
 								   unsigned int* neighborY,
 								   unsigned int* neighborZ,
-								   unsigned int size_Mat, 
+								   unsigned long long numberOfLBnodes, 
 								   bool isEvenTimestep);
 
 
@@ -1235,7 +1235,7 @@ void QADVeloIncompDev27( unsigned int numberOfThreads,
 									unsigned int* neighborX,
 									unsigned int* neighborY,
 									unsigned int* neighborZ,
-									unsigned int size_Mat, 
+									unsigned long long numberOfLBnodes, 
 									bool isEvenTimestep);
 
 void QADPressIncompDev7(  unsigned int numberOfThreads,
@@ -1251,7 +1251,7 @@ void QADPressIncompDev7(  unsigned int numberOfThreads,
 									 unsigned int* neighborX,
 									 unsigned int* neighborY,
 									 unsigned int* neighborZ,
-									 unsigned int size_Mat, 
+									 unsigned long long numberOfLBnodes, 
 									 bool isEvenTimestep);
 
 void QADPressIncompDev27(  unsigned int numberOfThreads,
@@ -1267,7 +1267,7 @@ void QADPressIncompDev27(  unsigned int numberOfThreads,
 									  unsigned int* neighborX,
 									  unsigned int* neighborY,
 									  unsigned int* neighborZ,
-									  unsigned int size_Mat, 
+									  unsigned long long numberOfLBnodes, 
 									  bool isEvenTimestep);
 
 void PropVelo(   unsigned int numberOfThreads,
@@ -1280,7 +1280,7 @@ void PropVelo(   unsigned int numberOfThreads,
 							real* uz,
 							int* k_Q, 
 							unsigned int size_Prop,
-							unsigned int size_Mat,
+							unsigned long long numberOfLBnodes,
 							unsigned int* bcMatD,
 							real* DD,
 							bool EvenOrOdd);
@@ -1293,8 +1293,8 @@ void ScaleCF27( real* DC,
                            unsigned int* neighborFX,
                            unsigned int* neighborFY,
                            unsigned int* neighborFZ,
-                           unsigned int size_MatC, 
-                           unsigned int size_MatF, 
+                           unsigned long long numberOfLBnodesC, 
+                           unsigned long long numberOfLBnodesF, 
                            bool isEvenTimestep,
                            unsigned int* posCSWB, 
                            unsigned int* posFSWB, 
@@ -1316,8 +1316,8 @@ void ScaleFC27( real* DC,
                            unsigned int* neighborFX,
                            unsigned int* neighborFY,
                            unsigned int* neighborFZ,
-                           unsigned int size_MatC, 
-                           unsigned int size_MatF, 
+                           unsigned long long numberOfLBnodesC, 
+                           unsigned long long numberOfLBnodesF, 
                            bool isEvenTimestep,
                            unsigned int* posC, 
                            unsigned int* posFSWB, 
@@ -1339,8 +1339,8 @@ void ScaleCFEff27(real* DC,
                              unsigned int* neighborFX,
                              unsigned int* neighborFY,
                              unsigned int* neighborFZ,
-                             unsigned int size_MatC, 
-                             unsigned int size_MatF, 
+                             unsigned long long numberOfLBnodesC, 
+                             unsigned long long numberOfLBnodesF, 
                              bool isEvenTimestep,
                              unsigned int* posCSWB, 
                              unsigned int* posFSWB, 
@@ -1363,8 +1363,8 @@ void ScaleFCEff27(real* DC,
                              unsigned int* neighborFX,
                              unsigned int* neighborFY,
                              unsigned int* neighborFZ,
-                             unsigned int size_MatC, 
-                             unsigned int size_MatF, 
+                             unsigned long long numberOfLBnodesC, 
+                             unsigned long long numberOfLBnodesF, 
                              bool isEvenTimestep,
                              unsigned int* posC, 
                              unsigned int* posFSWB, 
@@ -1387,8 +1387,8 @@ void ScaleCFLast27(real* DC,
                               unsigned int* neighborFX,
                               unsigned int* neighborFY,
                               unsigned int* neighborFZ,
-                              unsigned int size_MatC, 
-                              unsigned int size_MatF, 
+                              unsigned long long numberOfLBnodesC, 
+                              unsigned long long numberOfLBnodesF, 
                               bool isEvenTimestep,
                               unsigned int* posCSWB, 
                               unsigned int* posFSWB, 
@@ -1411,8 +1411,8 @@ void ScaleFCLast27(real* DC,
                               unsigned int* neighborFX,
                               unsigned int* neighborFY,
                               unsigned int* neighborFZ,
-                              unsigned int size_MatC, 
-                              unsigned int size_MatF, 
+                              unsigned long long numberOfLBnodesC, 
+                              unsigned long long numberOfLBnodesF, 
                               bool isEvenTimestep,
                               unsigned int* posC, 
                               unsigned int* posFSWB, 
@@ -1435,8 +1435,8 @@ void ScaleCFpress27(real* DC,
                               unsigned int* neighborFX,
                               unsigned int* neighborFY,
                               unsigned int* neighborFZ,
-                              unsigned int size_MatC, 
-                              unsigned int size_MatF, 
+                              unsigned long long numberOfLBnodesC, 
+                              unsigned long long numberOfLBnodesF, 
                               bool isEvenTimestep,
                               unsigned int* posCSWB, 
                               unsigned int* posFSWB, 
@@ -1459,8 +1459,8 @@ void ScaleFCpress27(  real* DC,
                                  unsigned int* neighborFX,
                                  unsigned int* neighborFY,
                                  unsigned int* neighborFZ,
-                                 unsigned int size_MatC, 
-                                 unsigned int size_MatF, 
+                                 unsigned long long numberOfLBnodesC, 
+                                 unsigned long long numberOfLBnodesF, 
                                  bool isEvenTimestep,
                                  unsigned int* posC, 
                                  unsigned int* posFSWB, 
@@ -1483,8 +1483,8 @@ void ScaleCF_Fix_27(real* DC,
                               unsigned int* neighborFX,
                               unsigned int* neighborFY,
                               unsigned int* neighborFZ,
-                              unsigned int size_MatC, 
-                              unsigned int size_MatF, 
+                              unsigned long long numberOfLBnodesC, 
+                              unsigned long long numberOfLBnodesF, 
                               bool isEvenTimestep,
                               unsigned int* posCSWB, 
                               unsigned int* posFSWB, 
@@ -1507,8 +1507,8 @@ void ScaleCF_Fix_comp_27(   real* DC,
 									   unsigned int* neighborFX,
 									   unsigned int* neighborFY,
 									   unsigned int* neighborFZ,
-									   unsigned int size_MatC, 
-									   unsigned int size_MatF, 
+									   unsigned long long numberOfLBnodesC, 
+									   unsigned long long numberOfLBnodesF, 
 									   bool isEvenTimestep,
 									   unsigned int* posCSWB, 
 									   unsigned int* posFSWB, 
@@ -1531,8 +1531,8 @@ void ScaleCF_0817_comp_27(  real* DC,
 									   unsigned int* neighborFX,
 									   unsigned int* neighborFY,
 									   unsigned int* neighborFZ,
-									   unsigned int size_MatC, 
-									   unsigned int size_MatF, 
+									   unsigned long long numberOfLBnodesC, 
+									   unsigned long long numberOfLBnodesF, 
 									   bool isEvenTimestep,
 									   unsigned int* posCSWB, 
 									   unsigned int* posFSWB, 
@@ -1557,8 +1557,8 @@ void ScaleCF_comp_D3Q27F3_2018(	real* DC,
 											unsigned int* neighborFX,
 											unsigned int* neighborFY,
 											unsigned int* neighborFZ,
-											unsigned int size_MatC, 
-											unsigned int size_MatF, 
+											unsigned long long numberOfLBnodesC, 
+											unsigned long long numberOfLBnodesF, 
 											bool isEvenTimestep,
 											unsigned int* posCSWB, 
 											unsigned int* posFSWB, 
@@ -1582,8 +1582,8 @@ void ScaleCF_comp_D3Q27F3(real* DC,
 									 unsigned int* neighborFX,
 									 unsigned int* neighborFY,
 									 unsigned int* neighborFZ,
-									 unsigned int size_MatC, 
-									 unsigned int size_MatF, 
+									 unsigned long long numberOfLBnodesC, 
+									 unsigned long long numberOfLBnodesF, 
 									 bool isEvenTimestep,
 									 unsigned int* posCSWB, 
 									 unsigned int* posFSWB, 
@@ -1607,8 +1607,8 @@ void ScaleCF_staggered_time_comp_27( real* DC,
 												unsigned int* neighborFX,
 												unsigned int* neighborFY,
 												unsigned int* neighborFZ,
-												unsigned int size_MatC, 
-												unsigned int size_MatF, 
+												unsigned long long numberOfLBnodesC, 
+												unsigned long long numberOfLBnodesF, 
 												bool isEvenTimestep,
 												unsigned int* posCSWB, 
 												unsigned int* posFSWB, 
@@ -1624,7 +1624,8 @@ void ScaleCF_staggered_time_comp_27( real* DC,
 												OffCF offCF);
 
 void ScaleCF_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF &offsetCF, CUstream_st *stream);
-void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF &offsetCF, CUstream_st *stream);
+
+template<bool hasTurbulentViscosity> void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF &offsetCF, CUstream_st *stream);
 
 void ScaleCF_RhoSq_3rdMom_comp_27( real* DC, 
 											  real* DF, 
@@ -1634,8 +1635,8 @@ void ScaleCF_RhoSq_3rdMom_comp_27( real* DC,
 											  unsigned int* neighborFX,
 											  unsigned int* neighborFY,
 											  unsigned int* neighborFZ,
-											  unsigned int size_MatC, 
-											  unsigned int size_MatF, 
+											  unsigned long long numberOfLBnodesC, 
+											  unsigned long long numberOfLBnodesF, 
 											  bool isEvenTimestep,
 											  unsigned int* posCSWB, 
 											  unsigned int* posFSWB, 
@@ -1659,8 +1660,8 @@ void ScaleCF_AA2016_comp_27( real* DC,
 										unsigned int* neighborFX,
 										unsigned int* neighborFY,
 										unsigned int* neighborFZ,
-										unsigned int size_MatC, 
-										unsigned int size_MatF, 
+										unsigned long long numberOfLBnodesC, 
+										unsigned long long numberOfLBnodesF, 
 										bool isEvenTimestep,
 										unsigned int* posCSWB, 
 										unsigned int* posFSWB, 
@@ -1684,8 +1685,8 @@ void ScaleCF_NSPress_27(real* DC,
 								  unsigned int* neighborFX,
 								  unsigned int* neighborFY,
 								  unsigned int* neighborFZ,
-								  unsigned int size_MatC, 
-								  unsigned int size_MatF, 
+								  unsigned long long numberOfLBnodesC, 
+								  unsigned long long numberOfLBnodesF, 
 								  bool isEvenTimestep,
 								  unsigned int* posCSWB, 
 								  unsigned int* posFSWB, 
@@ -1708,8 +1709,8 @@ void ScaleFC_Fix_27(  real* DC,
                                  unsigned int* neighborFX,
                                  unsigned int* neighborFY,
                                  unsigned int* neighborFZ,
-                                 unsigned int size_MatC, 
-                                 unsigned int size_MatF, 
+                                 unsigned long long numberOfLBnodesC, 
+                                 unsigned long long numberOfLBnodesF, 
                                  bool isEvenTimestep,
                                  unsigned int* posC, 
                                  unsigned int* posFSWB, 
@@ -1732,8 +1733,8 @@ void ScaleFC_Fix_comp_27(   real* DC,
 									   unsigned int* neighborFX,
 									   unsigned int* neighborFY,
 									   unsigned int* neighborFZ,
-									   unsigned int size_MatC, 
-									   unsigned int size_MatF, 
+									   unsigned long long numberOfLBnodesC, 
+									   unsigned long long numberOfLBnodesF, 
 									   bool isEvenTimestep,
 									   unsigned int* posC, 
 									   unsigned int* posFSWB, 
@@ -1756,8 +1757,8 @@ void ScaleFC_0817_comp_27(  real* DC,
 									   unsigned int* neighborFX,
 									   unsigned int* neighborFY,
 									   unsigned int* neighborFZ,
-									   unsigned int size_MatC, 
-									   unsigned int size_MatF, 
+									   unsigned long long numberOfLBnodesC, 
+									   unsigned long long numberOfLBnodesF, 
 									   bool isEvenTimestep,
 									   unsigned int* posC, 
 									   unsigned int* posFSWB, 
@@ -1782,8 +1783,8 @@ void ScaleFC_comp_D3Q27F3_2018(real* DC,
 										  unsigned int* neighborFX,
 										  unsigned int* neighborFY,
 										  unsigned int* neighborFZ,
-										  unsigned int size_MatC, 
-										  unsigned int size_MatF, 
+										  unsigned long long numberOfLBnodesC, 
+										  unsigned long long numberOfLBnodesF, 
 										  bool isEvenTimestep,
 										  unsigned int* posC, 
 										  unsigned int* posFSWB, 
@@ -1807,8 +1808,8 @@ void ScaleFC_comp_D3Q27F3( real* DC,
 									  unsigned int* neighborFX,
 									  unsigned int* neighborFY,
 									  unsigned int* neighborFZ,
-									  unsigned int size_MatC, 
-									  unsigned int size_MatF, 
+									  unsigned long long numberOfLBnodesC, 
+									  unsigned long long numberOfLBnodesF, 
 									  bool isEvenTimestep,
 									  unsigned int* posC, 
 									  unsigned int* posFSWB, 
@@ -1832,8 +1833,8 @@ void ScaleFC_staggered_time_comp_27( real* DC,
 												unsigned int* neighborFX,
 												unsigned int* neighborFY,
 												unsigned int* neighborFZ,
-												unsigned int size_MatC, 
-												unsigned int size_MatF, 
+												unsigned long long numberOfLBnodesC, 
+												unsigned long long numberOfLBnodesF, 
 												bool isEvenTimestep,
 												unsigned int* posC, 
 												unsigned int* posFSWB, 
@@ -1849,7 +1850,8 @@ void ScaleFC_staggered_time_comp_27( real* DC,
 												OffFC offFC);
 
 void ScaleFC_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC& offsetFC, CUstream_st *stream);
-void ScaleFC_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC& offsetFC, CUstream_st *stream);
+
+template<bool hasTurbulentViscosity> void ScaleFC_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC& offsetFC, CUstream_st *stream);
 
 void ScaleFC_RhoSq_3rdMom_comp_27( real* DC, 
 											  real* DF, 
@@ -1859,8 +1861,8 @@ void ScaleFC_RhoSq_3rdMom_comp_27( real* DC,
 											  unsigned int* neighborFX,
 											  unsigned int* neighborFY,
 											  unsigned int* neighborFZ,
-											  unsigned int size_MatC, 
-											  unsigned int size_MatF, 
+											  unsigned long long numberOfLBnodesC, 
+											  unsigned long long numberOfLBnodesF, 
 											  bool isEvenTimestep,
 											  unsigned int* posC, 
 											  unsigned int* posFSWB, 
@@ -1884,8 +1886,8 @@ void ScaleFC_AA2016_comp_27( real* DC,
 										unsigned int* neighborFX,
 										unsigned int* neighborFY,
 										unsigned int* neighborFZ,
-										unsigned int size_MatC, 
-										unsigned int size_MatF, 
+										unsigned long long numberOfLBnodesC, 
+										unsigned long long numberOfLBnodesF, 
 										bool isEvenTimestep,
 										unsigned int* posC, 
 										unsigned int* posFSWB, 
@@ -1909,8 +1911,8 @@ void ScaleFC_NSPress_27(  real* DC,
 									 unsigned int* neighborFX,
 									 unsigned int* neighborFY,
 									 unsigned int* neighborFZ,
-									 unsigned int size_MatC, 
-									 unsigned int size_MatF, 
+									 unsigned long long numberOfLBnodesC, 
+									 unsigned long long numberOfLBnodesF, 
 									 bool isEvenTimestep,
 									 unsigned int* posC, 
 									 unsigned int* posFSWB, 
@@ -1935,8 +1937,8 @@ void ScaleCFThS7(  real* DC,
                               unsigned int* neighborFX,
                               unsigned int* neighborFY,
                               unsigned int* neighborFZ,
-                              unsigned int size_MatC, 
-                              unsigned int size_MatF, 
+                              unsigned long long numberOfLBnodesC, 
+                              unsigned long long numberOfLBnodesF, 
                               bool isEvenTimestep,
                               unsigned int* posCSWB, 
                               unsigned int* posFSWB, 
@@ -1955,8 +1957,8 @@ void ScaleFCThS7(  real* DC,
                               unsigned int* neighborFX,
                               unsigned int* neighborFY,
                               unsigned int* neighborFZ,
-                              unsigned int size_MatC, 
-                              unsigned int size_MatF, 
+                              unsigned long long numberOfLBnodesC, 
+                              unsigned long long numberOfLBnodesF, 
                               bool isEvenTimestep,
                               unsigned int* posC, 
                               unsigned int* posFSWB, 
@@ -1975,8 +1977,8 @@ void ScaleCFThSMG7(   real* DC,
                                  unsigned int* neighborFX,
                                  unsigned int* neighborFY,
                                  unsigned int* neighborFZ,
-                                 unsigned int size_MatC, 
-                                 unsigned int size_MatF, 
+                                 unsigned long long numberOfLBnodesC, 
+                                 unsigned long long numberOfLBnodesF, 
                                  bool isEvenTimestep,
                                  unsigned int* posCSWB, 
                                  unsigned int* posFSWB, 
@@ -1996,8 +1998,8 @@ void ScaleFCThSMG7(real* DC,
                               unsigned int* neighborFX,
                               unsigned int* neighborFY,
                               unsigned int* neighborFZ,
-                              unsigned int size_MatC, 
-                              unsigned int size_MatF, 
+                              unsigned long long numberOfLBnodesC, 
+                              unsigned long long numberOfLBnodesF, 
                               bool isEvenTimestep,
                               unsigned int* posC, 
                               unsigned int* posFSWB, 
@@ -2017,8 +2019,8 @@ void ScaleCFThS27( real* DC,
                               unsigned int* neighborFX,
                               unsigned int* neighborFY,
                               unsigned int* neighborFZ,
-                              unsigned int size_MatC, 
-                              unsigned int size_MatF, 
+                              unsigned long long numberOfLBnodesC, 
+                              unsigned long long numberOfLBnodesF, 
                               bool isEvenTimestep,
                               unsigned int* posCSWB, 
                               unsigned int* posFSWB, 
@@ -2038,8 +2040,8 @@ void ScaleFCThS27( real* DC,
                               unsigned int* neighborFX,
                               unsigned int* neighborFY,
                               unsigned int* neighborFZ,
-                              unsigned int size_MatC, 
-                              unsigned int size_MatF, 
+                              unsigned long long numberOfLBnodesC, 
+                              unsigned long long numberOfLBnodesF, 
                               bool isEvenTimestep,
                               unsigned int* posC, 
                               unsigned int* posFSWB, 
@@ -2059,7 +2061,7 @@ void DragLiftPostD27(real* DD,
 								unsigned int* neighborX,
 								unsigned int* neighborY,
 								unsigned int* neighborZ,
-								unsigned int size_Mat, 
+								unsigned long long numberOfLBnodes, 
 								bool isEvenTimestep,
 								unsigned int numberOfThreads);
 
@@ -2073,7 +2075,7 @@ void DragLiftPreD27( real* DD,
 								unsigned int* neighborX,
 								unsigned int* neighborY,
 								unsigned int* neighborZ,
-								unsigned int size_Mat, 
+								unsigned long long numberOfLBnodes, 
 								bool isEvenTimestep,
 								unsigned int numberOfThreads);
 
@@ -2084,7 +2086,7 @@ void CalcCPtop27(real* DD,
 							unsigned int* neighborX,
 							unsigned int* neighborY,
 							unsigned int* neighborZ,
-							unsigned int size_Mat, 
+							unsigned long long numberOfLBnodes, 
 							bool isEvenTimestep,
 							unsigned int numberOfThreads);
 
@@ -2095,7 +2097,7 @@ void CalcCPbottom27(real* DD,
 							   unsigned int* neighborX,
 							   unsigned int* neighborY,
 							   unsigned int* neighborZ,
-							   unsigned int size_Mat, 
+							   unsigned long long numberOfLBnodes, 
 							   bool isEvenTimestep,
 							   unsigned int numberOfThreads);
 
@@ -2106,7 +2108,7 @@ void GetSendFsPreDev27(real* DD,
 								  unsigned int* neighborX,
 								  unsigned int* neighborY,
 								  unsigned int* neighborZ,
-								  unsigned int size_Mat, 
+								  unsigned long long numberOfLBnodes, 
 								  bool isEvenTimestep,
 								  unsigned int numberOfThreads, 
 	                              cudaStream_t stream = CU_STREAM_LEGACY);
@@ -2118,7 +2120,7 @@ void GetSendFsPostDev27(real* DD,
 								   unsigned int* neighborX,
 								   unsigned int* neighborY,
 								   unsigned int* neighborZ,
-								   unsigned int size_Mat, 
+								   unsigned long long numberOfLBnodes, 
 								   bool isEvenTimestep,
 								   unsigned int numberOfThreads, 
 	                               cudaStream_t stream = CU_STREAM_LEGACY);
@@ -2130,7 +2132,7 @@ void SetRecvFsPreDev27(real* DD,
 								  unsigned int* neighborX,
 								  unsigned int* neighborY,
 								  unsigned int* neighborZ,
-								  unsigned int size_Mat, 
+								  unsigned long long numberOfLBnodes, 
 								  bool isEvenTimestep, unsigned int numberOfThreads, 
 	                              cudaStream_t stream = CU_STREAM_LEGACY);
 
@@ -2141,7 +2143,7 @@ void SetRecvFsPostDev27(real* DD,
 								   unsigned int* neighborX,
 								   unsigned int* neighborY,
 								   unsigned int* neighborZ,
-								   unsigned int size_Mat, 
+								   unsigned long long numberOfLBnodes, 
 								   bool isEvenTimestep,
 								   unsigned int numberOfThreads,
                                    cudaStream_t stream = CU_STREAM_LEGACY);
@@ -2154,7 +2156,7 @@ void getSendGsDevF3(
 	unsigned int* neighborX,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool isEvenTimestep,
 	unsigned int numberOfThreads);
 
@@ -2166,7 +2168,7 @@ void setRecvGsDevF3(
 	unsigned int* neighborX,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool isEvenTimestep,
 	unsigned int numberOfThreads);
 
@@ -2182,7 +2184,7 @@ void WallFuncDev27(unsigned int numberOfThreads,
 							  unsigned int* neighborX,
 							  unsigned int* neighborY,
 							  unsigned int* neighborZ,
-							  unsigned int size_Mat, 
+							  unsigned long long numberOfLBnodes, 
 							  bool isEvenTimestep);
 
 void SetOutputWallVelocitySP27(unsigned int numberOfThreads,
@@ -2200,7 +2202,7 @@ void SetOutputWallVelocitySP27(unsigned int numberOfThreads,
 										  unsigned int* neighborX,
 										  unsigned int* neighborY,
 										  unsigned int* neighborZ,
-										  unsigned int size_Mat,
+										  unsigned long long numberOfLBnodes,
 										  real* DD,
 										  bool isEvenTimestep);
 
@@ -2214,7 +2216,7 @@ void GetVelotoForce27(unsigned int numberOfThreads,
 								 unsigned int* neighborX,
 								 unsigned int* neighborY,
 								 unsigned int* neighborZ,
-								 unsigned int size_Mat, 
+								 unsigned long long numberOfLBnodes, 
 								 bool isEvenTimestep);
 
 void InitParticlesDevice(real* coordX,
@@ -2239,7 +2241,7 @@ void InitParticlesDevice(real* coordX,
 									unsigned int* neighborWSB,
 									int level,
 									unsigned int numberOfParticles, 
-									unsigned int size_Mat,
+									unsigned long long numberOfLBnodes,
 									unsigned int numberOfThreads);
 
 void MoveParticlesDevice(real* coordX,
@@ -2267,16 +2269,16 @@ void MoveParticlesDevice(real* coordX,
 									unsigned int timestep, 
 									unsigned int numberOfTimesteps, 
 									unsigned int numberOfParticles, 
-									unsigned int size_Mat,
+									unsigned long long numberOfLBnodes,
 									unsigned int numberOfThreads,
 									bool isEvenTimestep);
 
 void initRandomDevice(curandState* state,
-								 unsigned int size_Mat,
+								 unsigned long long numberOfLBnodes,
 								 unsigned int numberOfThreads);
 
 void generateRandomValuesDevice(curandState* state,
-										   unsigned int size_Mat,
+										   unsigned long long numberOfLBnodes,
 										   real* randArray,
 										   unsigned int numberOfThreads);
 
@@ -2295,7 +2297,7 @@ void CalcTurbulenceIntensityDevice(
    unsigned int* neighborX,
    unsigned int* neighborY,
    unsigned int* neighborZ,
-   unsigned int size_Mat, 
+   unsigned long long numberOfLBnodes, 
    bool isEvenTimestep,
    uint numberOfThreads);
 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
index a7b22c244da368b9591c5f528bb7bd5eaea91e50..2cad4b87434136de8d2ce25e6b60cd1c39c20602 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
+++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
@@ -22,7 +22,7 @@ __global__ void LB_Kernel_Casc27(real s9,
                                             unsigned int* neighborY,
                                             unsigned int* neighborZ,
                                             real* DDStart,
-                                            int size_Mat,
+                                            unsigned long long numberOfLBnodes,
                                             bool EvenOrOdd);
 
 __global__ void LB_Kernel_Casc_SP_27(  real s9,
@@ -31,7 +31,7 @@ __global__ void LB_Kernel_Casc_SP_27(  real s9,
                                                   unsigned int* neighborY,
                                                   unsigned int* neighborZ,
                                                   real* DDStart,
-                                                  int size_Mat,
+                                                  unsigned long long numberOfLBnodes,
                                                   bool EvenOrOdd);
 
 __global__ void LB_Kernel_Casc_SP_MS_27(   real s9,
@@ -40,7 +40,7 @@ __global__ void LB_Kernel_Casc_SP_MS_27(   real s9,
                                                       unsigned int* neighborY,
                                                       unsigned int* neighborZ,
                                                       real* DDStart,
-                                                      int size_Mat,
+                                                      unsigned long long numberOfLBnodes,
                                                       bool EvenOrOdd);
 
 __global__ void LB_Kernel_Casc_SP_MS_OHM_27(  real s9,
@@ -49,134 +49,134 @@ __global__ void LB_Kernel_Casc_SP_MS_OHM_27(  real s9,
                                                          unsigned int* neighborY,
                                                          unsigned int* neighborZ,
                                                          real* DDStart,
-                                                         int size_Mat,
+                                                         unsigned long long numberOfLBnodes,
                                                          bool EvenOrOdd);
 
 __global__ void LB_Kernel_Kum_New_Comp_SRT_SP_27(
-	real omega,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* DDStart,
-	int size_Mat,
-	int level,
-	real* forces,
-	bool EvenOrOdd);
+    real omega,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DDStart,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    bool EvenOrOdd);
 
 __global__ void LB_Kernel_Cumulant_D3Q27All4(real omega,
-														unsigned int* bcMatD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														real* DDStart,
-														int size_Mat,
-														int level,
-														real* forces,
-														bool EvenOrOdd);
+                                                        unsigned int* bcMatD,
+                                                        unsigned int* neighborX,
+                                                        unsigned int* neighborY,
+                                                        unsigned int* neighborZ,
+                                                        real* DDStart,
+                                                        unsigned long long numberOfLBnodes,
+                                                        int level,
+                                                        real* forces,
+                                                        bool EvenOrOdd);
 
 
 __global__ void LB_Kernel_Kum_AA2016_Comp_Bulk_SP_27(real omega,
-																unsigned int* bcMatD,
-																unsigned int* neighborX,
-																unsigned int* neighborY,
-																unsigned int* neighborZ,
-																real* DDStart,
-																int size_Mat,
-																int level,
-																real* forces,
-																bool EvenOrOdd);
+                                                                unsigned int* bcMatD,
+                                                                unsigned int* neighborX,
+                                                                unsigned int* neighborY,
+                                                                unsigned int* neighborZ,
+                                                                real* DDStart,
+                                                                unsigned long long numberOfLBnodes,
+                                                                int level,
+                                                                real* forces,
+                                                                bool EvenOrOdd);
 
 
 
 __global__ void LB_Kernel_Kum_1h_SP_27(  real omega,
-													real deltaPhi,
-													real angularVelocity,
-													unsigned int* bcMatD,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													real* coordX,
-													real* coordY,
-													real* coordZ,
-													real* DDStart,
-													int size_Mat,
-													bool EvenOrOdd);
+                                                    real deltaPhi,
+                                                    real angularVelocity,
+                                                    unsigned int* bcMatD,
+                                                    unsigned int* neighborX,
+                                                    unsigned int* neighborY,
+                                                    unsigned int* neighborZ,
+                                                    real* coordX,
+                                                    real* coordY,
+                                                    real* coordZ,
+                                                    real* DDStart,
+                                                    unsigned long long numberOfLBnodes,
+                                                    bool EvenOrOdd);
 
 __global__ void LB_Kernel_Cascade_SP_27( real s9,
-													unsigned int* bcMatD,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													real* DDStart,
-													int size_Mat,
-													bool EvenOrOdd);
+                                                    unsigned int* bcMatD,
+                                                    unsigned int* neighborX,
+                                                    unsigned int* neighborY,
+                                                    unsigned int* neighborZ,
+                                                    real* DDStart,
+                                                    unsigned long long numberOfLBnodes,
+                                                    bool EvenOrOdd);
 
 __global__ void LB_Kernel_Kum_New_SP_27( real s9,
-													unsigned int* bcMatD,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													real* DDStart,
-													int size_Mat,
-													bool EvenOrOdd);
+                                                    unsigned int* bcMatD,
+                                                    unsigned int* neighborX,
+                                                    unsigned int* neighborY,
+                                                    unsigned int* neighborZ,
+                                                    real* DDStart,
+                                                    unsigned long long numberOfLBnodes,
+                                                    bool EvenOrOdd);
 
 __global__ void LB_Kernel_Kum_IsoTest_SP_27( real omega,
-														unsigned int* bcMatD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														real* DDStart,
-														real* dxxUx,
-														real* dyyUy,
-														real* dzzUz,
-														int size_Mat,
-														bool EvenOrOdd);
+                                                        unsigned int* bcMatD,
+                                                        unsigned int* neighborX,
+                                                        unsigned int* neighborY,
+                                                        unsigned int* neighborZ,
+                                                        real* DDStart,
+                                                        real* dxxUx,
+                                                        real* dyyUy,
+                                                        real* dzzUz,
+                                                        unsigned long long numberOfLBnodes,
+                                                        bool EvenOrOdd);
 
 __global__ void LB_Kernel_Kum_Comp_SP_27(real s9,
-													unsigned int* bcMatD,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													real* DDStart,
-													int size_Mat,
-													bool EvenOrOdd);
+                                                    unsigned int* bcMatD,
+                                                    unsigned int* neighborX,
+                                                    unsigned int* neighborY,
+                                                    unsigned int* neighborZ,
+                                                    real* DDStart,
+                                                    unsigned long long numberOfLBnodes,
+                                                    bool EvenOrOdd);
 
 __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27(
-	real omega,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* DDStart,
-	int size_Mat,
-	int level,
-	real* forces,
-	bool EvenOrOdd);
+    real omega,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DDStart,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    bool EvenOrOdd);
 
 __global__ void Cumulant_One_preconditioned_chim_Comp_SP_27(
-	real omega,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* DDStart,
-	int size_Mat,
-	int level,
-	real* forces,
-	bool EvenOrOdd);
+    real omega,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DDStart,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    bool EvenOrOdd);
 
 __global__ void Cumulant_One_chim_Comp_SP_27(
-	real omega,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* DDStart,
-	int size_Mat,
-	int level,
-	real* forces,
-	bool EvenOrOdd);
+    real omega,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DDStart,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    bool EvenOrOdd);
 
 inline __device__ void forwardChimeraWithK(real &mfa, real &mfb, real &mfc, real vv, real v2, real K);
 
@@ -189,57 +189,57 @@ inline __device__ void backwardChimeraWithK(real &mfa, real &mfb, real &mfc, rea
 
 
 __global__ void LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27(
-	real omega_in,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	unsigned int* neighborWSB,
-	real* veloX,
-	real* veloY,
-	real* veloZ,
-	real* DDStart,
-	real* turbulentViscosity,
-	int size_Mat,
-	int level,
-	real* forces,
-	bool EvenOrOdd);
+    real omega_in,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int* neighborWSB,
+    real* veloX,
+    real* veloY,
+    real* veloZ,
+    real* DDStart,
+    real* turbulentViscosity,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    bool EvenOrOdd);
 
 
 __global__ void LB_Kernel_PM_Cum_One_Comp_SP_27( real omega,
-															unsigned int* neighborX,
-															unsigned int* neighborY,
-															unsigned int* neighborZ,
-															real* DDStart,
-															int size_Mat,
-															int level,
-															real* forces,
-															real porosity,
-															real darcy,
-															real forchheimer,
-															unsigned int sizeOfPorousMedia,
-															unsigned int* nodeIdsPorousMedia,
-															bool EvenOrOdd);
+                                                            unsigned int* neighborX,
+                                                            unsigned int* neighborY,
+                                                            unsigned int* neighborZ,
+                                                            real* DDStart,
+                                                            unsigned long long numberOfLBnodes,
+                                                            int level,
+                                                            real* forces,
+                                                            real porosity,
+                                                            real darcy,
+                                                            real forchheimer,
+                                                            unsigned int sizeOfPorousMedia,
+                                                            unsigned int* nodeIdsPorousMedia,
+                                                            bool EvenOrOdd);
 
 __global__ void LB_Kernel_AD_Incomp_7( real diffusivity,
-												  unsigned int* bcMatD,
-												  unsigned int* neighborX,
-												  unsigned int* neighborY,
-												  unsigned int* neighborZ,
-												  real* DDStart,
-												  real* DD7,
-												  int size_Mat,
-												  bool EvenOrOdd);
+                                                  unsigned int* bcMatD,
+                                                  unsigned int* neighborX,
+                                                  unsigned int* neighborY,
+                                                  unsigned int* neighborZ,
+                                                  real* DDStart,
+                                                  real* DD7,
+                                                  unsigned long long numberOfLBnodes,
+                                                  bool EvenOrOdd);
 
 __global__ void LB_Kernel_AD_Incomp_27( real diffusivity,
-												   unsigned int* bcMatD,
-												   unsigned int* neighborX,
-												   unsigned int* neighborY,
-												   unsigned int* neighborZ,
-												   real* DDStart,
-												   real* DD27,
-												   int size_Mat,
-												   bool EvenOrOdd);
+                                                   unsigned int* bcMatD,
+                                                   unsigned int* neighborX,
+                                                   unsigned int* neighborY,
+                                                   unsigned int* neighborZ,
+                                                   real* DDStart,
+                                                   real* DD27,
+                                                   unsigned long long numberOfLBnodes,
+                                                   bool EvenOrOdd);
 
 __global__ void LBInit27( int myid,
                                      int numprocs,
@@ -249,7 +249,7 @@ __global__ void LBInit27( int myid,
                                      unsigned int* neighborY,
                                      unsigned int* neighborZ,
                                      real* vParabel,
-                                     unsigned int size_Mat,
+                                     unsigned long long numberOfLBnodes,
                                      unsigned int grid_nx,
                                      unsigned int grid_ny,
                                      unsigned int grid_nz,
@@ -266,7 +266,7 @@ __global__ void LBInitNonEqPartSP27(unsigned int* neighborX,
                                                real* ux,
                                                real* uy,
                                                real* uz,
-                                               unsigned int size_Mat,
+                                               unsigned long long numberOfLBnodes,
                                                real* DD,
                                                real omega,
                                                bool EvenOrOdd);
@@ -279,7 +279,7 @@ __global__ void InitAD7( unsigned int* neighborX,
                                        real* ux,
                                        real* uy,
                                        real* uz,
-                                       unsigned int size_Mat,
+                                       unsigned long long numberOfLBnodes,
                                        real* DD7,
                                        bool EvenOrOdd);
 
@@ -291,26 +291,26 @@ __global__ void InitAD27(unsigned int* neighborX,
                                        real* ux,
                                        real* uy,
                                        real* uz,
-                                       unsigned int size_Mat,
+                                       unsigned long long numberOfLBnodes,
                                        real* DD27,
                                        bool EvenOrOdd);
 
 __global__ void LB_PostProcessor_F3_2018_Fehlberg(
-	real omega,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* rhoOut,
-	real* vxOut,
-	real* vyOut,
-	real* vzOut,
-	real* DDStart,
-	real* G6,
-	int size_Mat,
-	int level,
-	real* forces,
-	bool EvenOrOdd);
+    real omega,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* rhoOut,
+    real* vxOut,
+    real* vyOut,
+    real* vzOut,
+    real* DDStart,
+    real* G6,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    bool EvenOrOdd);
 
 __global__ void LBCalcMac27( real* vxD,
                                         real* vyD,
@@ -320,7 +320,7 @@ __global__ void LBCalcMac27( real* vxD,
                                         unsigned int* neighborY,
                                         unsigned int* neighborZ,
                                         unsigned int* geoD,
-                                        unsigned int size_Mat,
+                                        unsigned long long numberOfLBnodes,
                                         real* DD,
                                         bool isEvenTimestep);
 
@@ -333,60 +333,60 @@ __global__ void LBCalcMacSP27( real* vxD,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           real* DD,
                                           bool isEvenTimestep);
 
 __global__ void LBCalcMacCompSP27( real* vxD,
-											  real* vyD,
-											  real* vzD,
-											  real* rhoD,
-											  real* pressD,
-											  unsigned int* geoD,
-											  unsigned int* neighborX,
-											  unsigned int* neighborY,
-											  unsigned int* neighborZ,
-											  unsigned int size_Mat,
-											  real* DD,
-											  bool isEvenTimestep);
+                                              real* vyD,
+                                              real* vzD,
+                                              real* rhoD,
+                                              real* pressD,
+                                              unsigned int* geoD,
+                                              unsigned int* neighborX,
+                                              unsigned int* neighborY,
+                                              unsigned int* neighborZ,
+                                              unsigned long long numberOfLBnodes,
+                                              real* DD,
+                                              bool isEvenTimestep);
 
 __global__ void CalcConc7( real* Conc,
                                           unsigned int* geoD,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           real* DD7,
                                           bool isEvenTimestep);
 
 __global__ void GetPlaneConc7(real* Conc,
-								            int* kPC,
-								            unsigned int numberOfPointskPC,
-											unsigned int* geoD,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											real* DD7,
-											bool isEvenTimestep);
+                                            int* kPC,
+                                            unsigned int numberOfPointskPC,
+                                            unsigned int* geoD,
+                                            unsigned int* neighborX,
+                                            unsigned int* neighborY,
+                                            unsigned int* neighborZ,
+                                            unsigned long long numberOfLBnodes,
+                                            real* DD7,
+                                            bool isEvenTimestep);
 
 __global__ void GetPlaneConc27(real* Conc,
-								             int* kPC,
-								             unsigned int numberOfPointskPC,
-											 unsigned int* geoD,
-											 unsigned int* neighborX,
-											 unsigned int* neighborY,
-											 unsigned int* neighborZ,
-											 unsigned int size_Mat,
-											 real* DD27,
-											 bool isEvenTimestep);
+                                             int* kPC,
+                                             unsigned int numberOfPointskPC,
+                                             unsigned int* geoD,
+                                             unsigned int* neighborX,
+                                             unsigned int* neighborY,
+                                             unsigned int* neighborZ,
+                                             unsigned long long numberOfLBnodes,
+                                             real* DD27,
+                                             bool isEvenTimestep);
 
 __global__ void CalcConc27(real* Conc,
                                           unsigned int* geoD,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           real* DD27,
                                           bool isEvenTimestep);
 
@@ -399,38 +399,38 @@ __global__ void LBCalcMedSP27( real* vxD,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           real* DD,
                                           bool isEvenTimestep);
 
 __global__ void LBCalcMedCompSP27( real* vxD,
-											  real* vyD,
-											  real* vzD,
-											  real* rhoD,
-											  real* pressD,
-											  unsigned int* geoD,
-											  unsigned int* neighborX,
-											  unsigned int* neighborY,
-											  unsigned int* neighborZ,
-											  unsigned int size_Mat,
-											  real* DD,
-											  bool isEvenTimestep);
+                                              real* vyD,
+                                              real* vzD,
+                                              real* rhoD,
+                                              real* pressD,
+                                              unsigned int* geoD,
+                                              unsigned int* neighborX,
+                                              unsigned int* neighborY,
+                                              unsigned int* neighborZ,
+                                              unsigned long long numberOfLBnodes,
+                                              real* DD,
+                                              bool isEvenTimestep);
 
 __global__ void LBCalcMedCompAD27(
-	real* vxD,
-	real* vyD,
-	real* vzD,
-	real* rhoD,
-	real* pressD,
-	real* concD,
-	unsigned int* geoD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	unsigned int size_Mat,
-	real* DD,
-	real* DD_AD,
-	bool isEvenTimestep);
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    real* concD,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    real* DD,
+    real* DD_AD,
+    bool isEvenTimestep);
 
 __global__ void LBCalcMacMedSP27( real* vxD,
                                              real* vyD,
@@ -442,119 +442,119 @@ __global__ void LBCalcMacMedSP27( real* vxD,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
                                              unsigned int tdiff,
-                                             unsigned int size_Mat,
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep);
 
 __global__ void LBResetMedianValuesSP27(
-	real* vxD,
-	real* vyD,
-	real* vzD,
-	real* rhoD,
-	real* pressD,
-	unsigned int size_Mat,
-	bool isEvenTimestep);
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
 
 __global__ void LBResetMedianValuesAD27(
-	real* vxD,
-	real* vyD,
-	real* vzD,
-	real* rhoD,
-	real* pressD,
-	real* concD,
-	unsigned int size_Mat,
-	bool isEvenTimestep);
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    real* concD,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
 
 __global__ void LBCalc2ndMomentsIncompSP27(  real* kxyFromfcNEQ,
-														real* kyzFromfcNEQ,
-														real* kxzFromfcNEQ,
-														real* kxxMyyFromfcNEQ,
-														real* kxxMzzFromfcNEQ,
-														unsigned int* geoD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														unsigned int size_Mat,
-														real* DD,
-														bool isEvenTimestep);
+                                                        real* kyzFromfcNEQ,
+                                                        real* kxzFromfcNEQ,
+                                                        real* kxxMyyFromfcNEQ,
+                                                        real* kxxMzzFromfcNEQ,
+                                                        unsigned int* geoD,
+                                                        unsigned int* neighborX,
+                                                        unsigned int* neighborY,
+                                                        unsigned int* neighborZ,
+                                                        unsigned long long numberOfLBnodes,
+                                                        real* DD,
+                                                        bool isEvenTimestep);
 
 __global__ void LBCalc2ndMomentsCompSP27(real* kxyFromfcNEQ,
-													real* kyzFromfcNEQ,
-													real* kxzFromfcNEQ,
-													real* kxxMyyFromfcNEQ,
-													real* kxxMzzFromfcNEQ,
-													unsigned int* geoD,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													unsigned int size_Mat,
-													real* DD,
-													bool isEvenTimestep);
+                                                    real* kyzFromfcNEQ,
+                                                    real* kxzFromfcNEQ,
+                                                    real* kxxMyyFromfcNEQ,
+                                                    real* kxxMzzFromfcNEQ,
+                                                    unsigned int* geoD,
+                                                    unsigned int* neighborX,
+                                                    unsigned int* neighborY,
+                                                    unsigned int* neighborZ,
+                                                    unsigned long long numberOfLBnodes,
+                                                    real* DD,
+                                                    bool isEvenTimestep);
 
 __global__ void LBCalc3rdMomentsIncompSP27(  real* CUMbbb,
-														real* CUMabc,
-														real* CUMbac,
-														real* CUMbca,
-														real* CUMcba,
-														real* CUMacb,
-														real* CUMcab,
-														unsigned int* bcMatD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														real* DDStart,
-														int size_Mat,
-														bool EvenOrOdd);
+                                                        real* CUMabc,
+                                                        real* CUMbac,
+                                                        real* CUMbca,
+                                                        real* CUMcba,
+                                                        real* CUMacb,
+                                                        real* CUMcab,
+                                                        unsigned int* bcMatD,
+                                                        unsigned int* neighborX,
+                                                        unsigned int* neighborY,
+                                                        unsigned int* neighborZ,
+                                                        real* DDStart,
+                                                        unsigned long long numberOfLBnodes,
+                                                        bool EvenOrOdd);
 
 __global__ void LBCalc3rdMomentsCompSP27(real* CUMbbb,
-													real* CUMabc,
-													real* CUMbac,
-													real* CUMbca,
-													real* CUMcba,
-													real* CUMacb,
-													real* CUMcab,
-													unsigned int* bcMatD,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													real* DDStart,
-													int size_Mat,
-													bool EvenOrOdd);
+                                                    real* CUMabc,
+                                                    real* CUMbac,
+                                                    real* CUMbca,
+                                                    real* CUMcba,
+                                                    real* CUMacb,
+                                                    real* CUMcab,
+                                                    unsigned int* bcMatD,
+                                                    unsigned int* neighborX,
+                                                    unsigned int* neighborY,
+                                                    unsigned int* neighborZ,
+                                                    real* DDStart,
+                                                    unsigned long long numberOfLBnodes,
+                                                    bool EvenOrOdd);
 
 __global__ void LBCalcHigherMomentsIncompSP27(   real* CUMcbb,
-															real* CUMbcb,
-															real* CUMbbc,
-															real* CUMcca,
-															real* CUMcac,
-															real* CUMacc,
-															real* CUMbcc,
-															real* CUMcbc,
-															real* CUMccb,
-															real* CUMccc,
-															unsigned int* bcMatD,
-															unsigned int* neighborX,
-															unsigned int* neighborY,
-															unsigned int* neighborZ,
-															real* DDStart,
-															int size_Mat,
-															bool EvenOrOdd);
+                                                            real* CUMbcb,
+                                                            real* CUMbbc,
+                                                            real* CUMcca,
+                                                            real* CUMcac,
+                                                            real* CUMacc,
+                                                            real* CUMbcc,
+                                                            real* CUMcbc,
+                                                            real* CUMccb,
+                                                            real* CUMccc,
+                                                            unsigned int* bcMatD,
+                                                            unsigned int* neighborX,
+                                                            unsigned int* neighborY,
+                                                            unsigned int* neighborZ,
+                                                            real* DDStart,
+                                                            unsigned long long numberOfLBnodes,
+                                                            bool EvenOrOdd);
 
 __global__ void LBCalcHigherMomentsCompSP27( real* CUMcbb,
-														real* CUMbcb,
-														real* CUMbbc,
-														real* CUMcca,
-														real* CUMcac,
-														real* CUMacc,
-														real* CUMbcc,
-														real* CUMcbc,
-														real* CUMccb,
-														real* CUMccc,
-														unsigned int* bcMatD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														real* DDStart,
-														int size_Mat,
-														bool EvenOrOdd);
+                                                        real* CUMbcb,
+                                                        real* CUMbbc,
+                                                        real* CUMcca,
+                                                        real* CUMcac,
+                                                        real* CUMacc,
+                                                        real* CUMbcc,
+                                                        real* CUMcbc,
+                                                        real* CUMccb,
+                                                        real* CUMccc,
+                                                        unsigned int* bcMatD,
+                                                        unsigned int* neighborX,
+                                                        unsigned int* neighborY,
+                                                        unsigned int* neighborZ,
+                                                        real* DDStart,
+                                                        unsigned long long numberOfLBnodes,
+                                                        bool EvenOrOdd);
 
 __global__ void LBCalcMeasurePoints(real* vxMP,
                                                real* vyMP,
@@ -568,7 +568,7 @@ __global__ void LBCalcMeasurePoints(real* vxMP,
                                                unsigned int* neighborX,
                                                unsigned int* neighborY,
                                                unsigned int* neighborZ,
-                                               unsigned int size_Mat,
+                                               unsigned long long numberOfLBnodes,
                                                real* DD,
                                                bool isEvenTimestep);
 
@@ -580,7 +580,7 @@ __global__ void LB_BC_Press_East27( int nx,
                                                unsigned int* neighborY,
                                                unsigned int* neighborZ,
                                                real* DD,
-                                               unsigned int size_Mat,
+                                               unsigned long long numberOfLBnodes,
                                                bool isEvenTimestep) ;
 
 __global__ void LB_BC_Vel_West_27( int nx,
@@ -592,7 +592,7 @@ __global__ void LB_BC_Vel_West_27( int nx,
                                               unsigned int* neighborY,
                                               unsigned int* neighborZ,
                                               real* DD,
-                                              unsigned int size_Mat,
+                                              unsigned long long numberOfLBnodes,
                                               bool isEvenTimestep,
                                               real u0x,
                                               unsigned int grid_nx,
@@ -608,64 +608,64 @@ __global__ void QDevice27(real* distributions,
                                      unsigned int* neighborX,
                                      unsigned int* neighborY,
                                      unsigned int* neighborZ,
-                                     unsigned int numberOfLBnodes,
+                                     unsigned long long numberOfLBnodes,
                                      bool isEvenTimestep);
 
 __global__ void QDeviceComp27(
-										 real* distributions,
-										 int* subgridDistanceIndices,
-										 real* subgridDistances,
-										 unsigned int numberOfBCnodes,
-										 real omega,
-										 unsigned int* neighborX,
-										 unsigned int* neighborY,
-										 unsigned int* neighborZ,
-										 unsigned int numberOfLBnodes,
-										 bool isEvenTimestep);
+                                         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);
 
 __global__ void QDeviceCompThinWallsPartOne27(real* DD,
-														 int* k_Q,
-														 real* QQ,
-														 unsigned int numberOfBCnodes,
-														 real om1,
-														 unsigned int* neighborX,
-														 unsigned int* neighborY,
-														 unsigned int* neighborZ,
-														 unsigned int size_Mat,
-														 bool isEvenTimestep);
-
-__global__ void QDevice3rdMomentsComp27(	 real* distributions, 
-													 int* subgridDistanceIndices, 
-													 real* subgridDistances,
-													 unsigned int numberOfBCnodes, 
-													 real omega, 
-													 unsigned int* neighborX,
-													 unsigned int* neighborY,
-													 unsigned int* neighborZ,
-													 unsigned int numberOfLBnodes, 
-													 bool isEvenTimestep);
+                                                         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 QDevice3rdMomentsComp27(	 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);
 
 __global__ void QDeviceIncompHighNu27(real* DD,
-												 int* k_Q,
-												 real* QQ,
-												 unsigned int numberOfBCnodes,
-												 real om1,
-												 unsigned int* neighborX,
-												 unsigned int* neighborY,
-												 unsigned int* neighborZ,
-												 unsigned int numberOfLBnodes,
-												 bool isEvenTimestep);
+                                                 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 QDeviceCompHighNu27(	 real* DD,
-												 int* k_Q,
-												 real* QQ,
-												 unsigned int numberOfBCnodes,
-												 real om1,
-												 unsigned int* neighborX,
-												 unsigned int* neighborY,
-												 unsigned int* neighborZ,
-												 unsigned int size_Mat,
-												 bool isEvenTimestep);
+                                                 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);
 
 //Velocity BCs
 __global__ void QVelDevPlainBB27(
@@ -679,43 +679,43 @@ __global__ void QVelDevPlainBB27(
     uint* neighborX,
     uint* neighborY,
     uint* neighborZ,
-    uint numberOfLBnodes,
+    unsigned long long numberOfLBnodes,
     bool isEvenTimestep);
 
 __global__ void QVelDevCouette27(real* vx,
-											real* vy,
-											real* vz,
-											real* DD,
-											int* k_Q,
-											real* QQ,
-											unsigned int numberOfBCnodes,
-											real om1,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											bool isEvenTimestep);
+                                            real* vy,
+                                            real* vz,
+                                            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 QVelDev1h27( int inx,
-										int iny,
-										real* vx,
-										real* vy,
-										real* vz,
-										real* DD,
-										int* k_Q,
-										real* QQ,
-										unsigned int numberOfBCnodes,
-										real om1,
-										real Phi,
-										real angularVelocity,
-										unsigned int* neighborX,
-										unsigned int* neighborY,
-										unsigned int* neighborZ,
-										real* coordX,
-										real* coordY,
-										real* coordZ,
-										unsigned int size_Mat,
-										bool isEvenTimestep);
+                                        int iny,
+                                        real* vx,
+                                        real* vy,
+                                        real* vz,
+                                        real* DD,
+                                        int* k_Q,
+                                        real* QQ,
+                                        unsigned int numberOfBCnodes,
+                                        real om1,
+                                        real Phi,
+                                        real angularVelocity,
+                                        unsigned int* neighborX,
+                                        unsigned int* neighborY,
+                                        unsigned int* neighborZ,
+                                        real* coordX,
+                                        real* coordY,
+                                        real* coordZ,
+                                        unsigned long long numberOfLBnodes,
+                                        bool isEvenTimestep);
 
 __global__ void QVelDevice27(int inx,
                                         int iny,
@@ -730,111 +730,111 @@ __global__ void QVelDevice27(int inx,
                                         unsigned int* neighborX,
                                         unsigned int* neighborY,
                                         unsigned int* neighborZ,
-                                        unsigned int size_Mat,
+                                        unsigned long long numberOfLBnodes,
                                         bool isEvenTimestep);
 
 __global__ void QVelDeviceCompPlusSlip27(real* vx,
-													real* vy,
-													real* vz,
-													real* DD,
-													int* k_Q,
-													real* QQ,
-													unsigned int numberOfBCnodes,
-													real om1,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													unsigned int size_Mat,
-													bool isEvenTimestep);
+                                                    real* vy,
+                                                    real* vz,
+                                                    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 QVelDeviceComp27(real* velocityX,
-											real* velocityY,
-											real* velocityZ,
-											real* distribution,
-											int* subgridDistanceIndices,
-											real* subgridDistances,
-											unsigned int numberOfBCnodes,
-											real omega,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int numberOfLBnodes,
-											bool isEvenTimestep);
+                                            real* velocityY,
+                                            real* velocityZ,
+                                            real* distribution,
+                                            int* subgridDistanceIndices,
+                                            real* subgridDistances,
+                                            unsigned int numberOfBCnodes,
+                                            real omega,
+                                            unsigned int* neighborX,
+                                            unsigned int* neighborY,
+                                            unsigned int* neighborZ,
+                                            unsigned long long numberOfLBnodes,
+                                            bool isEvenTimestep);
 
 __global__ void QVelDeviceCompThinWallsPartOne27(
-	real* vx,
-	real* vy,
-	real* vz,
-	real* DD,
-	int* k_Q,
-	real* QQ,
-	uint numberOfBCnodes,
-	real om1,
-	uint* neighborX,
-	uint* neighborY,
-	uint* neighborZ,
-	uint size_Mat,
-	bool isEvenTimestep);
+    real* vx,
+    real* vy,
+    real* vz,
+    real* DD,
+    int* k_Q,
+    real* QQ,
+    uint numberOfBCnodes,
+    real om1,
+    uint* neighborX,
+    uint* neighborY,
+    uint* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
 
 __global__ void QThinWallsPartTwo27(
-	real* DD,
-	int* k_Q,
-	real* QQ,
-	uint numberOfBCnodes,
-	uint* geom,
-	uint* neighborX,
-	uint* neighborY,
-	uint* neighborZ,
-	uint* neighborWSB,
-	uint size_Mat,
-	bool isEvenTimestep);
+    real* DD,
+    int* k_Q,
+    real* QQ,
+    uint numberOfBCnodes,
+    uint* geom,
+    uint* neighborX,
+    uint* neighborY,
+    uint* neighborZ,
+    uint* neighborWSB,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
 
 __global__ void QVelDeviceCompZeroPress27(
-	real* velocityX,
-	real* velocityY,
-	real* velocityZ,
-	real* distribution,
-	int* subgridDistanceIndices,
-	real* subgridDistances,
-	unsigned int numberOfBCnodes,
-	real omega,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	unsigned int numberOfLBnodes,
-	bool isEvenTimestep);
+    real* velocityX,
+    real* velocityY,
+    real* velocityZ,
+    real* distribution,
+    int* subgridDistanceIndices,
+    real* subgridDistances,
+    unsigned int numberOfBCnodes,
+    real omega,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
 
 __global__ void QVelDeviceIncompHighNu27(real* vx,
-													real* vy,
-													real* vz,
-													real* DD,
-													int* k_Q,
-													real* QQ,
-													unsigned int numberOfBCnodes,
-													real om1,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													unsigned int size_Mat,
-													bool isEvenTimestep);
+                                                    real* vy,
+                                                    real* vz,
+                                                    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 QVelDeviceCompHighNu27(	real* vx,
-													real* vy,
-													real* vz,
-													real* DD,
-													int* k_Q,
-													real* QQ,
-													unsigned int numberOfBCnodes,
-													real om1,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													unsigned int size_Mat,
-													bool isEvenTimestep);
+                                                    real* vy,
+                                                    real* vz,
+                                                    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 QVeloDeviceEQ27(real* VeloX,
-										   real* VeloY,
-										   real* VeloZ,
+                                           real* VeloY,
+                                           real* VeloZ,
                                            real* DD,
                                            int* k_Q,
                                            int numberOfBCnodes,
@@ -842,22 +842,22 @@ __global__ void QVeloDeviceEQ27(real* VeloX,
                                            unsigned int* neighborX,
                                            unsigned int* neighborY,
                                            unsigned int* neighborZ,
-                                           unsigned int size_Mat,
+                                           unsigned long long numberOfLBnodes,
                                            bool isEvenTimestep);
 
 __global__ void QVeloStreetDeviceEQ27(
-	real* veloXfraction,
-	real* veloYfraction,
-	int*  naschVelo,
-	real* DD,
-	int*  naschIndex,
-	int   numberOfStreetNodes,
-	real  velocityRatio,
-	uint* neighborX,
-	uint* neighborY,
-	uint* neighborZ,
-	uint  size_Mat,
-	bool  isEvenTimestep);
+    real* veloXfraction,
+    real* veloYfraction,
+    int*  naschVelo,
+    real* DD,
+    int*  naschIndex,
+    int   numberOfStreetNodes,
+    real  velocityRatio,
+    uint* neighborX,
+    uint* neighborY,
+    uint* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool  isEvenTimestep);
 
 //Slip BCs
 __global__ void QSlipDevice27(real* DD,
@@ -868,139 +868,139 @@ __global__ void QSlipDevice27(real* DD,
                                          unsigned int* neighborX,
                                          unsigned int* neighborY,
                                          unsigned int* neighborZ,
-                                         unsigned int size_Mat,
+                                         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 int size_Mat,
-											 bool isEvenTimestep);
+                                             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* distributions,
+                                    int* subgridDistanceIndices,
                                     real* subgridDistances,
                                     unsigned int numberOfBCnodes,
-                                    real omega, 
+                                    real omega,
                                     unsigned int* neighborX,
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
                                     real* turbViscosity,
-                                    unsigned int numberOfLBnodes, 
+                                    unsigned long long numberOfLBnodes,
                                     bool isEvenTimestep);
 
 __global__ void QSlipPressureDeviceComp27TurbViscosity(
-                                    real* distributions, 
-                                    int* subgridDistanceIndices, 
+                                    real* distributions,
+                                    int* subgridDistanceIndices,
                                     real* subgridDistances,
                                     unsigned int numberOfBCnodes,
-                                    real omega, 
+                                    real omega,
                                     unsigned int* neighborX,
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
                                     real* turbViscosity,
-                                    unsigned int numberOfLBnodes, 
+                                    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 int size_Mat,
-												 bool isEvenTimestep);
+                                                 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 int size_Mat,
-												 bool isEvenTimestep);
+                                                 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);
 
 // Stress BCs (wall model)
 __global__ void QStressDeviceComp27(real* DD,
-											   int* k_Q,
-											 int* k_N,
-											 real* QQ,
-											 unsigned int numberOfBCnodes,
-											 real om1,
-											 real* turbViscosity,
-										     real* vx,
-											 real* vy,
-                                    	     real* vz,
-											 real* normalX,
-											 real* normalY,
-                                    	     real* normalZ,
-											 real* vx_bc,
-											 real* vy_bc,
-                                    	     real* vz_bc,
-											 real* vx1,
-                                    		 real* vy1,
-                                    		 real* vz1,
-											 int* samplingOffset,
-											 real* z0,
-											 bool  hasWallModelMonitor,
-											real* u_star_monitor,
-											real* Fx_monitor,
-											real* Fy_monitor,
-											real* Fz_monitor,
-											 unsigned int* neighborX,
-											 unsigned int* neighborY,
-											 unsigned int* neighborZ,
-											 unsigned int size_Mat,
-											 bool isEvenTimestep);
+                                               int* k_Q,
+                                             int* k_N,
+                                             real* QQ,
+                                             unsigned int numberOfBCnodes,
+                                             real om1,
+                                             real* turbViscosity,
+                                             real* vx,
+                                             real* vy,
+                                             real* vz,
+                                             real* normalX,
+                                             real* normalY,
+                                             real* normalZ,
+                                             real* vx_bc,
+                                             real* vy_bc,
+                                             real* vz_bc,
+                                             real* vx1,
+                                             real* vy1,
+                                             real* vz1,
+                                             int* samplingOffset,
+                                             real* z0,
+                                             bool  hasWallModelMonitor,
+                                            real* u_star_monitor,
+                                            real* Fx_monitor,
+                                            real* Fy_monitor,
+                                            real* Fz_monitor,
+                                             unsigned int* neighborX,
+                                             unsigned int* neighborY,
+                                             unsigned int* neighborZ,
+                                             unsigned long long numberOfLBnodes,
+                                             bool isEvenTimestep);
 
 __global__ void BBStressDevice27( real* DD,
-												int* k_Q,
-												int* k_N,
-												real* QQ,
-												unsigned int numberOfBCnodes,
-												real* vx,
-												real* vy,
-												real* vz,
-												real* normalX,
-												real* normalY,
-												real* normalZ,
-												real* vx_bc,
-												real* vy_bc,
-												real* vz_bc,
-												real* vx1,
-												real* vy1,
-												real* vz1,
-												int* samplingOffset,
-												real* z0,
-												bool  hasWallModelMonitor,
-												real* u_star_monitor,
-												real* Fx_monitor,
-												real* Fy_monitor,
-												real* Fz_monitor,
-												unsigned int* neighborX,
-												unsigned int* neighborY,
-												unsigned int* neighborZ,
-												unsigned int size_Mat,
-												bool isEvenTimestep);
+                                                int* k_Q,
+                                                int* k_N,
+                                                real* QQ,
+                                                unsigned int numberOfBCnodes,
+                                                real* vx,
+                                                real* vy,
+                                                real* vz,
+                                                real* normalX,
+                                                real* normalY,
+                                                real* normalZ,
+                                                real* vx_bc,
+                                                real* vy_bc,
+                                                real* vz_bc,
+                                                real* vx1,
+                                                real* vy1,
+                                                real* vz1,
+                                                int* samplingOffset,
+                                                real* z0,
+                                                bool  hasWallModelMonitor,
+                                                real* u_star_monitor,
+                                                real* Fx_monitor,
+                                                real* Fy_monitor,
+                                                real* Fz_monitor,
+                                                unsigned int* neighborX,
+                                                unsigned int* neighborY,
+                                                unsigned int* neighborZ,
+                                                unsigned long long numberOfLBnodes,
+                                                bool isEvenTimestep);
 
 __global__ void BBStressPressureDevice27( real* DD,
-											            int* k_Q,
+                                                        int* k_Q,
                                              int* k_N,
                                              real* QQ,
                                              unsigned int  numberOfBCnodes,
@@ -1026,7 +1026,7 @@ __global__ void BBStressPressureDevice27( real* DD,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int size_Mat,
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep);
 
 //Pressure BCs
@@ -1039,23 +1039,23 @@ __global__ void QPressDevice27( real* rhoBC,
                                            unsigned int* neighborX,
                                            unsigned int* neighborY,
                                            unsigned int* neighborZ,
-                                           unsigned int size_Mat,
+                                           unsigned long long numberOfLBnodes,
                                            bool isEvenTimestep);
 
 __global__ void QPressDeviceAntiBB27(   real* rhoBC,
-												   real* vx,
-												   real* vy,
-												   real* vz,
-												   real* DD,
-												   int* k_Q,
-												   real* QQ,
-												   int numberOfBCnodes,
-												   real om1,
-												   unsigned int* neighborX,
-												   unsigned int* neighborY,
-												   unsigned int* neighborZ,
-												   unsigned int size_Mat,
-												   bool isEvenTimestep);
+                                                   real* vx,
+                                                   real* vy,
+                                                   real* vz,
+                                                   real* DD,
+                                                   int* k_Q,
+                                                   real* QQ,
+                                                   int numberOfBCnodes,
+                                                   real om1,
+                                                   unsigned int* neighborX,
+                                                   unsigned int* neighborY,
+                                                   unsigned int* neighborZ,
+                                                   unsigned long long numberOfLBnodes,
+                                                   bool isEvenTimestep);
 
 __global__ void QPressDeviceFixBackflow27( real* rhoBC,
                                                       real* DD,
@@ -1065,7 +1065,7 @@ __global__ void QPressDeviceFixBackflow27( real* rhoBC,
                                                       unsigned int* neighborX,
                                                       unsigned int* neighborY,
                                                       unsigned int* neighborZ,
-                                                      unsigned int size_Mat,
+                                                      unsigned long long numberOfLBnodes,
                                                       bool isEvenTimestep);
 
 __global__ void QPressDeviceDirDepBot27(  real* rhoBC,
@@ -1076,47 +1076,47 @@ __global__ void QPressDeviceDirDepBot27(  real* rhoBC,
                                                      unsigned int* neighborX,
                                                      unsigned int* neighborY,
                                                      unsigned int* neighborZ,
-                                                     unsigned int size_Mat,
+                                                     unsigned long long numberOfLBnodes,
                                                      bool isEvenTimestep);
 
 __global__ void QPressNoRhoDevice27(  real* rhoBC,
-												 real* distributions,
-												 int* k_Q,
-												 int* k_N,
-												 int numberOfBCnodes,
-												 real om1,
-												 unsigned int* neighborX,
-												 unsigned int* neighborY,
-												 unsigned int* neighborZ,
-												 unsigned int numberOfLBnodes,
-												 bool isEvenTimestep,
-												 int direction);
+                                                 real* distributions,
+                                                 int* k_Q,
+                                                 int* k_N,
+                                                 int numberOfBCnodes,
+                                                 real om1,
+                                                 unsigned int* neighborX,
+                                                 unsigned int* neighborY,
+                                                 unsigned int* neighborZ,
+                                                 unsigned long long numberOfLBnodes,
+                                                 bool isEvenTimestep,
+                                                 int direction);
 
 __global__ void QPressZeroRhoOutflowDevice27(  real* rhoBC,
-											real* distributions, 
-											int* k_Q, 
-											int* k_N, 
-											int numberOfBCnodes, 
-											real om1, 
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int numberOfLBnodes, 
-											bool isEvenTimestep,
-											int direction,
-											real densityCorrectionFactor);
+                                            real* distributions,
+                                            int* k_Q,
+                                            int* k_N,
+                                            int numberOfBCnodes,
+                                            real om1,
+                                            unsigned int* neighborX,
+                                            unsigned int* neighborY,
+                                            unsigned int* neighborZ,
+                                            unsigned long long numberOfLBnodes,
+                                            bool isEvenTimestep,
+                                            int direction,
+                                            real densityCorrectionFactor);
 
 __global__ void QInflowScaleByPressDevice27(  real* rhoBC,
-														 real* DD,
-														 int* k_Q,
-														 int* k_N,
-														 int numberOfBCnodes,
-														 real om1,
-														 unsigned int* neighborX,
-														 unsigned int* neighborY,
-														 unsigned int* neighborZ,
-														 unsigned int size_Mat,
-														 bool isEvenTimestep);
+                                                         real* DD,
+                                                         int* k_Q,
+                                                         int* k_N,
+                                                         int numberOfBCnodes,
+                                                         real om1,
+                                                         unsigned int* neighborX,
+                                                         unsigned int* neighborY,
+                                                         unsigned int* neighborZ,
+                                                         unsigned long long numberOfLBnodes,
+                                                         bool isEvenTimestep);
 
 __global__ void QPressDeviceOld27(real* rhoBC,
                                              real* DD,
@@ -1127,20 +1127,20 @@ __global__ void QPressDeviceOld27(real* rhoBC,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int size_Mat,
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep);
 
 __global__ void QPressDeviceIncompNEQ27( real* rhoBC,
-													real* DD,
-													int* k_Q,
-													int* k_N,
-													int numberOfBCnodes,
-													real om1,
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													unsigned int size_Mat,
-													bool isEvenTimestep);
+                                                    real* DD,
+                                                    int* k_Q,
+                                                    int* k_N,
+                                                    int numberOfBCnodes,
+                                                    real om1,
+                                                    unsigned int* neighborX,
+                                                    unsigned int* neighborY,
+                                                    unsigned int* neighborZ,
+                                                    unsigned long long numberOfLBnodes,
+                                                    bool isEvenTimestep);
 
 __global__ void QPressDeviceNEQ27(real* rhoBC,
                                              real* distribution,
@@ -1151,7 +1151,7 @@ __global__ void QPressDeviceNEQ27(real* rhoBC,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int size_Mat,
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep);
 
 __global__ void QPressDeviceEQZ27(real* rhoBC,
@@ -1164,17 +1164,17 @@ __global__ void QPressDeviceEQZ27(real* rhoBC,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int size_Mat,
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep);
 
 __global__ void QPressDeviceZero27(  real* DD,
-												int* k_Q,
-												unsigned int numberOfBCnodes,
-												unsigned int* neighborX,
-												unsigned int* neighborY,
-												unsigned int* neighborZ,
-												unsigned int size_Mat,
-												bool isEvenTimestep);
+                                                int* k_Q,
+                                                unsigned int numberOfBCnodes,
+                                                unsigned int* neighborX,
+                                                unsigned int* neighborY,
+                                                unsigned int* neighborZ,
+                                                unsigned long long numberOfLBnodes,
+                                                bool isEvenTimestep);
 
 __global__ void QPressDeviceFake27(real* rhoBC,
                                              real* DD,
@@ -1185,7 +1185,7 @@ __global__ void QPressDeviceFake27(real* rhoBC,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int size_Mat,
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep);
 
 __global__ void BBDevice27(real* distributions,
@@ -1195,20 +1195,20 @@ __global__ void BBDevice27(real* distributions,
                                      unsigned int* neighborX,
                                      unsigned int* neighborY,
                                      unsigned int* neighborZ,
-                                     unsigned int numberOfLBnodes,
+                                     unsigned long long numberOfLBnodes,
                                      bool isEvenTimestep);
 
 __global__ void QPressDevice27_IntBB(real* rho,
-												real* DD,
-												int* k_Q,
-												real* QQ,
-												unsigned int numberOfBCnodes,
-												real om1,
-												unsigned int* neighborX,
-												unsigned int* neighborY,
-												unsigned int* neighborZ,
-												unsigned int size_Mat,
-												bool isEvenTimestep);
+                                                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);
 
 // TODO: https://git.rz.tu-bs.de/irmb/VirtualFluids_dev/-/issues/29
 //Schlaffer BCs
@@ -1225,7 +1225,7 @@ __global__ void PressSchlaff27(real* rhoBC,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           bool isEvenTimestep);
 
 // TODO: https://git.rz.tu-bs.de/irmb/VirtualFluids_dev/-/issues/29
@@ -1240,7 +1240,7 @@ __global__ void VelSchlaff27(  int t,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           bool isEvenTimestep);
 
 __global__ void QPrecursorDeviceCompZeroPress( 	int* subgridDistanceIndices,
@@ -1250,18 +1250,18 @@ __global__ void QPrecursorDeviceCompZeroPress( 	int* subgridDistanceIndices,
                                                 real omega,
                                                 real* distributions,
                                                 real* subgridDistances,
-                                                uint* neighborX, 
-                                                uint* neighborY, 
+                                                uint* neighborX,
+                                                uint* neighborY,
                                                 uint* neighborZ,
-                                                uint* neighborsNT, 
+                                                uint* neighborsNT,
                                                 uint* neighborsNB,
                                                 uint* neighborsST,
                                                 uint* neighborsSB,
-                                                real* weights0PP, 
+                                                real* weights0PP,
                                                 real* weights0PM,
                                                 real* weights0MP,
                                                 real* weights0MM,
-                                                real* vLast, 
+                                                real* vLast,
                                                 real* vCurrent,
                                                 real velocityX,
                                                 real velocityY,
@@ -1276,18 +1276,18 @@ __global__ void PrecursorDeviceEQ27( 	int* subgridDistanceIndices,
                                         int numberOfPrecursorNodes,
                                         real omega,
                                         real* distributions,
-                                        uint* neighborX, 
-                                        uint* neighborY, 
+                                        uint* neighborX,
+                                        uint* neighborY,
                                         uint* neighborZ,
-                                        uint* neighborsNT, 
+                                        uint* neighborsNT,
                                         uint* neighborsNB,
                                         uint* neighborsST,
                                         uint* neighborsSB,
-                                        real* weights0PP, 
+                                        real* weights0PP,
                                         real* weights0PM,
                                         real* weights0MP,
                                         real* weights0MM,
-                                        real* vLast, 
+                                        real* vLast,
                                         real* vCurrent,
                                         real velocityX,
                                         real velocityY,
@@ -1298,48 +1298,48 @@ __global__ void PrecursorDeviceEQ27( 	int* subgridDistanceIndices,
                                         bool isEvenTimestep);
 
 __global__ void PrecursorDeviceDistributions( 	int* subgridDistanceIndices,
-												int numberOfBCNodes,
-												int numberOfPrecursorNodes,
-												real* distributions,
-												uint* neighborX, 
-												uint* neighborY, 
-												uint* neighborZ,
-												uint* neighborsNT, 
-												uint* neighborsNB,
-												uint* neighborsST,
-												uint* neighborsSB,
-												real* weights0PP, 
-												real* weights0PM,
-												real* weights0MP,
-												real* weights0MM,
-												real* fsLast, 
-												real* fsNext,
-												real timeRatio,
-												unsigned long long numberOfLBnodes,
-												bool isEvenTimestep);
+                                                int numberOfBCNodes,
+                                                int numberOfPrecursorNodes,
+                                                real* distributions,
+                                                uint* neighborX,
+                                                uint* neighborY,
+                                                uint* neighborZ,
+                                                uint* neighborsNT,
+                                                uint* neighborsNB,
+                                                uint* neighborsST,
+                                                uint* neighborsSB,
+                                                real* weights0PP,
+                                                real* weights0PM,
+                                                real* weights0MP,
+                                                real* weights0MM,
+                                                real* fsLast,
+                                                real* fsNext,
+                                                real timeRatio,
+                                                unsigned long long numberOfLBnodes,
+                                                bool isEvenTimestep);
 __global__ void QPrecursorDeviceDistributions( 	int* subgridDistanceIndices,
-												real* subgridDistances,
-												int sizeQ,
-												int numberOfBCNodes,
-												int numberOfPrecursorNodes,
-												real* distributions,
-												uint* neighborX, 
-												uint* neighborY, 
-												uint* neighborZ,
-												uint* neighborsNT, 
-												uint* neighborsNB,
-												uint* neighborsST,
-												uint* neighborsSB,
-												real* weights0PP, 
-												real* weights0PM,
-												real* weights0MP,
-												real* weights0MM,
-												real* fsLast, 
-												real* fsNext,
-												real timeRatio,
-												unsigned long long numberOfLBnodes,
-												bool isEvenTimestep);
-												
+                                                real* subgridDistances,
+                                                int sizeQ,
+                                                int numberOfBCNodes,
+                                                int numberOfPrecursorNodes,
+                                                real* distributions,
+                                                uint* neighborX,
+                                                uint* neighborY,
+                                                uint* neighborZ,
+                                                uint* neighborsNT,
+                                                uint* neighborsNB,
+                                                uint* neighborsST,
+                                                uint* neighborsSB,
+                                                real* weights0PP,
+                                                real* weights0PM,
+                                                real* weights0MP,
+                                                real* weights0MM,
+                                                real* fsLast,
+                                                real* fsNext,
+                                                real timeRatio,
+                                                unsigned long long numberOfLBnodes,
+                                                bool isEvenTimestep);
+
 //Advection / Diffusion BCs
 __global__ void QAD7( real* DD,
                                  real* DD7,
@@ -1352,68 +1352,68 @@ __global__ void QAD7( real* DD,
                                  unsigned int* neighborX,
                                  unsigned int* neighborY,
                                  unsigned int* neighborZ,
-                                 unsigned int size_Mat,
+                                 unsigned long long numberOfLBnodes,
                                  bool isEvenTimestep);
 
 //////////////////////////////////////////////////////////////////////////
 //! \brief \ref Advection_Diffusion_Device_Kernel : Factorized central moments for Advection Diffusion Equation
 __global__ void Factorized_Central_Moments_Advection_Diffusion_Device_Kernel(
-	real omegaDiffusivity,
-	uint* typeOfGridNode,
-	uint* neighborX,
-	uint* neighborY,
-	uint* neighborZ,
-	real* distributions,
-	real* distributionsAD,
-	int size_Mat,
-	real* forces,
-	bool isEvenTimestep);
+    real omegaDiffusivity,
+    uint* typeOfGridNode,
+    uint* neighborX,
+    uint* neighborY,
+    uint* neighborZ,
+    real* distributions,
+    real* distributionsAD,
+    unsigned long long numberOfLBnodes,
+    real* forces,
+    bool isEvenTimestep);
 
 //////////////////////////////////////////////////////////////////////////
 //! \brief \ref AD_SlipVelDeviceComp : device function for the slip-AD boundary condition
 __global__ void AD_SlipVelDeviceComp(
-	real * normalX,
-	real * normalY,
-	real * normalZ,
-	real * distributions,
-	real * distributionsAD,
-	int* QindexArray,
-	real * Qarrays,
-	uint numberOfBCnodes,
-	real omegaDiffusivity,
-	uint * neighborX,
-	uint * neighborY,
-	uint * neighborZ,
-	uint size_Mat,
-	bool isEvenTimestep);
+    real * normalX,
+    real * normalY,
+    real * normalZ,
+    real * distributions,
+    real * distributionsAD,
+    int* QindexArray,
+    real * Qarrays,
+    uint numberOfBCnodes,
+    real omegaDiffusivity,
+    uint * neighborX,
+    uint * neighborY,
+    uint * neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
 
 __global__ void QADDirichlet27(   real* DD,
-											 real* DD27,
-											 real* temp,
-											 real diffusivity,
-											 int* k_Q,
-											 real* QQ,
-											 unsigned int numberOfBCnodes,
-											 real om1,
-											 unsigned int* neighborX,
-											 unsigned int* neighborY,
-											 unsigned int* neighborZ,
-											 unsigned int size_Mat,
-											 bool isEvenTimestep);
+                                             real* DD27,
+                                             real* temp,
+                                             real diffusivity,
+                                             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 QADBB27(  real* DD,
-									 real* DD27,
-									 real* temp,
-									 real diffusivity,
-									 int* k_Q,
-									 real* QQ,
-									 unsigned int numberOfBCnodes,
-									 real om1,
-									 unsigned int* neighborX,
-									 unsigned int* neighborY,
-									 unsigned int* neighborZ,
-									 unsigned int size_Mat,
-									 bool isEvenTimestep);
+                                     real* DD27,
+                                     real* temp,
+                                     real diffusivity,
+                                     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 QADVel7( real* DD,
                                     real* DD7,
@@ -1427,7 +1427,7 @@ __global__ void QADVel7( real* DD,
                                     unsigned int* neighborX,
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
-                                    unsigned int size_Mat,
+                                    unsigned long long numberOfLBnodes,
                                     bool isEvenTimestep);
 
 __global__ void QADVel27(real* DD,
@@ -1442,7 +1442,7 @@ __global__ void QADVel27(real* DD,
                                     unsigned int* neighborX,
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
-                                    unsigned int size_Mat,
+                                    unsigned long long numberOfLBnodes,
                                     bool isEvenTimestep);
 
 __global__ void QADPress7(  real* DD,
@@ -1457,7 +1457,7 @@ __global__ void QADPress7(  real* DD,
                                        unsigned int* neighborX,
                                        unsigned int* neighborY,
                                        unsigned int* neighborZ,
-                                       unsigned int size_Mat,
+                                       unsigned long long numberOfLBnodes,
                                        bool isEvenTimestep);
 
 __global__ void QADPress27( real* DD,
@@ -1472,109 +1472,109 @@ __global__ void QADPress27( real* DD,
                                        unsigned int* neighborX,
                                        unsigned int* neighborY,
                                        unsigned int* neighborZ,
-                                       unsigned int size_Mat,
+                                       unsigned long long numberOfLBnodes,
                                        bool isEvenTimestep);
 
 __global__ void QADPressNEQNeighbor27(
-												 real* DD,
-												 real* DD27,
-												 int* k_Q,
-												 int* k_N,
-												 int numberOfBCnodes,
-												 unsigned int* neighborX,
-												 unsigned int* neighborY,
-												 unsigned int* neighborZ,
-												 unsigned int size_Mat,
-												 bool isEvenTimestep
-												);
+                                                 real* DD,
+                                                 real* DD27,
+                                                 int* k_Q,
+                                                 int* k_N,
+                                                 int numberOfBCnodes,
+                                                 unsigned int* neighborX,
+                                                 unsigned int* neighborY,
+                                                 unsigned int* neighborZ,
+                                                 unsigned long long numberOfLBnodes,
+                                                 bool isEvenTimestep
+                                                );
 
 __global__ void QNoSlipADincomp7( real* DD,
-											 real* DD7,
-											 real* temp,
-											 real diffusivity,
-											 int* k_Q,
-											 real* QQ,
-											 unsigned int numberOfBCnodes,
-											 real om1,
-											 unsigned int* neighborX,
-											 unsigned int* neighborY,
-											 unsigned int* neighborZ,
-											 unsigned int size_Mat,
-											 bool isEvenTimestep);
+                                             real* DD7,
+                                             real* temp,
+                                             real diffusivity,
+                                             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 QNoSlipADincomp27( real* DD,
-											 real* DD27,
-											 real* temp,
-											 real diffusivity,
-											 int* k_Q,
-											 real* QQ,
-											 unsigned int numberOfBCnodes,
-											 real om1,
-											 unsigned int* neighborX,
-											 unsigned int* neighborY,
-											 unsigned int* neighborZ,
-											 unsigned int size_Mat,
-											 bool isEvenTimestep);
+                                             real* DD27,
+                                             real* temp,
+                                             real diffusivity,
+                                             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 QADVeloIncomp7(  real* DD,
-											real* DD7,
-											real* temp,
-											real* velo,
-											real diffusivity,
-											int* k_Q,
-											real* QQ,
-											unsigned int numberOfBCnodes,
-											real om1,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											bool isEvenTimestep);
+                                            real* DD7,
+                                            real* temp,
+                                            real* velo,
+                                            real diffusivity,
+                                            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 QADVeloIncomp27( real* DD,
-											real* DD27,
-											real* temp,
-											real* velo,
-											real diffusivity,
-											int* k_Q,
-											real* QQ,
-											unsigned int numberOfBCnodes,
-											real om1,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											bool isEvenTimestep);
+                                            real* DD27,
+                                            real* temp,
+                                            real* velo,
+                                            real diffusivity,
+                                            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 QADPressIncomp7(real* DD,
-										   real* DD7,
-										   real* temp,
-										   real* velo,
-										   real diffusivity,
-										   int* k_Q,
-										   real* QQ,
-										   unsigned int numberOfBCnodes,
-										   real om1,
-										   unsigned int* neighborX,
-										   unsigned int* neighborY,
-										   unsigned int* neighborZ,
-										   unsigned int size_Mat,
-										   bool isEvenTimestep);
+                                           real* DD7,
+                                           real* temp,
+                                           real* velo,
+                                           real diffusivity,
+                                           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 QADPressIncomp27(   real* DD,
-											   real* DD27,
-											   real* temp,
-											   real* velo,
-											   real diffusivity,
-											   int* k_Q,
-											   real* QQ,
-											   unsigned int numberOfBCnodes,
-											   real om1,
-											   unsigned int* neighborX,
-											   unsigned int* neighborY,
-											   unsigned int* neighborZ,
-											   unsigned int size_Mat,
-											   bool isEvenTimestep);
+                                               real* DD27,
+                                               real* temp,
+                                               real* velo,
+                                               real diffusivity,
+                                               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);
 
 //Propeller BC
 __global__ void PropellerBC(unsigned int* neighborX,
@@ -1585,8 +1585,8 @@ __global__ void PropellerBC(unsigned int* neighborX,
                                        real* uy,
                                        real* uz,
                                        int* k_Q,
-									   unsigned int size_Prop,
-                                       unsigned int size_Mat,
+                                       unsigned int size_Prop,
+                                       unsigned long long numberOfLBnodes,
                                        unsigned int* bcMatD,
                                        real* DD,
                                        bool EvenOrOdd);
@@ -1602,19 +1602,19 @@ __global__ void scaleCF27(real* DC,
                                     unsigned int* neighborFX,
                                     unsigned int* neighborFY,
                                     unsigned int* neighborFZ,
-										       unsigned int size_MatC,
-										       unsigned int size_MatF,
-										       bool isEvenTimestep,
+                                               unsigned long long numberOfLBnodesC,
+                                               unsigned long long numberOfLBnodesF,
+                                               bool isEvenTimestep,
                                      unsigned int* posCSWB,
                                      unsigned int* posFSWB,
                                      unsigned int kCF,
-										       real omCoarse,
-										       real omFine,
-										       real nu,
-										       unsigned int nxC,
-										       unsigned int nyC,
-										       unsigned int nxF,
-										       unsigned int nyF);
+                                               real omCoarse,
+                                               real omFine,
+                                               real nu,
+                                               unsigned int nxC,
+                                               unsigned int nyC,
+                                               unsigned int nxF,
+                                               unsigned int nyF);
 
 __global__ void scaleCFEff27(real* DC,
                                         real* DF,
@@ -1624,18 +1624,18 @@ __global__ void scaleCFEff27(real* DC,
                                         unsigned int* neighborFX,
                                         unsigned int* neighborFY,
                                         unsigned int* neighborFZ,
-									             unsigned int size_MatC,
-									             unsigned int size_MatF,
-									             bool isEvenTimestep,
+                                                 unsigned long long numberOfLBnodesC,
+                                                 unsigned long long numberOfLBnodesF,
+                                                 bool isEvenTimestep,
                                         unsigned int* posCSWB,
                                         unsigned int* posFSWB,
                                         unsigned int kCF,
-									             real omCoarse,
-									             real omFine,
-									             real nu,
-									             unsigned int nxC,
-									             unsigned int nyC,
-									             unsigned int nxF,
+                                                 real omCoarse,
+                                                 real omFine,
+                                                 real nu,
+                                                 unsigned int nxC,
+                                                 unsigned int nyC,
+                                                 unsigned int nxF,
                                         unsigned int nyF,
                                         OffCF offCF);
 
@@ -1647,8 +1647,8 @@ __global__ void scaleCFLast27( real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC,
-                                          unsigned int size_MatF,
+                                          unsigned long long numberOfLBnodesC,
+                                          unsigned long long numberOfLBnodesF,
                                           bool isEvenTimestep,
                                           unsigned int* posCSWB,
                                           unsigned int* posFSWB,
@@ -1670,8 +1670,8 @@ __global__ void scaleCFpress27(real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC,
-                                          unsigned int size_MatF,
+                                          unsigned long long numberOfLBnodesC,
+                                          unsigned long long numberOfLBnodesF,
                                           bool isEvenTimestep,
                                           unsigned int* posCSWB,
                                           unsigned int* posFSWB,
@@ -1693,8 +1693,8 @@ __global__ void scaleCF_Fix_27(real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC,
-                                          unsigned int size_MatF,
+                                          unsigned long long numberOfLBnodesC,
+                                          unsigned long long numberOfLBnodesF,
                                           bool isEvenTimestep,
                                           unsigned int* posCSWB,
                                           unsigned int* posFSWB,
@@ -1709,233 +1709,235 @@ __global__ void scaleCF_Fix_27(real* DC,
                                           OffCF offCF);
 
 __global__ void scaleCF_Fix_comp_27(   real* DC,
-												  real* DF,
-												  unsigned int* neighborCX,
-												  unsigned int* neighborCY,
-												  unsigned int* neighborCZ,
-												  unsigned int* neighborFX,
-												  unsigned int* neighborFY,
-												  unsigned int* neighborFZ,
-												  unsigned int size_MatC,
-												  unsigned int size_MatF,
-												  bool isEvenTimestep,
-												  unsigned int* posCSWB,
-												  unsigned int* posFSWB,
-												  unsigned int kCF,
-												  real omCoarse,
-												  real omFine,
-												  real nu,
-												  unsigned int nxC,
-												  unsigned int nyC,
-												  unsigned int nxF,
-												  unsigned int nyF,
-												  OffCF offCF);
+                                                  real* DF,
+                                                  unsigned int* neighborCX,
+                                                  unsigned int* neighborCY,
+                                                  unsigned int* neighborCZ,
+                                                  unsigned int* neighborFX,
+                                                  unsigned int* neighborFY,
+                                                  unsigned int* neighborFZ,
+                                                  unsigned long long numberOfLBnodesC,
+                                                  unsigned long long numberOfLBnodesF,
+                                                  bool isEvenTimestep,
+                                                  unsigned int* posCSWB,
+                                                  unsigned int* posFSWB,
+                                                  unsigned int kCF,
+                                                  real omCoarse,
+                                                  real omFine,
+                                                  real nu,
+                                                  unsigned int nxC,
+                                                  unsigned int nyC,
+                                                  unsigned int nxF,
+                                                  unsigned int nyF,
+                                                  OffCF offCF);
 
 __global__ void scaleCF_0817_comp_27(  real* DC,
-												  real* DF,
-												  unsigned int* neighborCX,
-												  unsigned int* neighborCY,
-												  unsigned int* neighborCZ,
-												  unsigned int* neighborFX,
-												  unsigned int* neighborFY,
-												  unsigned int* neighborFZ,
-												  unsigned int size_MatC,
-												  unsigned int size_MatF,
-												  bool isEvenTimestep,
-												  unsigned int* posCSWB,
-												  unsigned int* posFSWB,
-												  unsigned int kCF,
-												  real omCoarse,
-												  real omFine,
-												  real nu,
-												  unsigned int nxC,
-												  unsigned int nyC,
-												  unsigned int nxF,
-												  unsigned int nyF,
-												  OffCF offCF);
+                                                  real* DF,
+                                                  unsigned int* neighborCX,
+                                                  unsigned int* neighborCY,
+                                                  unsigned int* neighborCZ,
+                                                  unsigned int* neighborFX,
+                                                  unsigned int* neighborFY,
+                                                  unsigned int* neighborFZ,
+                                                  unsigned long long numberOfLBnodesC,
+                                                  unsigned long long numberOfLBnodesF,
+                                                  bool isEvenTimestep,
+                                                  unsigned int* posCSWB,
+                                                  unsigned int* posFSWB,
+                                                  unsigned int kCF,
+                                                  real omCoarse,
+                                                  real omFine,
+                                                  real nu,
+                                                  unsigned int nxC,
+                                                  unsigned int nyC,
+                                                  unsigned int nxF,
+                                                  unsigned int nyF,
+                                                  OffCF offCF);
 
 __global__ void scaleCF_comp_D3Q27F3_2018( real* DC,
-													  real* DF,
-													  real* G6,
-													  unsigned int* neighborCX,
-													  unsigned int* neighborCY,
-													  unsigned int* neighborCZ,
-													  unsigned int* neighborFX,
-													  unsigned int* neighborFY,
-													  unsigned int* neighborFZ,
-													  unsigned int size_MatC,
-													  unsigned int size_MatF,
-													  bool isEvenTimestep,
-													  unsigned int* posCSWB,
-													  unsigned int* posFSWB,
-													  unsigned int kCF,
-													  real omCoarse,
-													  real omFine,
-													  real nu,
-													  unsigned int nxC,
-													  unsigned int nyC,
-													  unsigned int nxF,
-													  unsigned int nyF,
-													  OffCF offCF);
+                                                      real* DF,
+                                                      real* G6,
+                                                      unsigned int* neighborCX,
+                                                      unsigned int* neighborCY,
+                                                      unsigned int* neighborCZ,
+                                                      unsigned int* neighborFX,
+                                                      unsigned int* neighborFY,
+                                                      unsigned int* neighborFZ,
+                                                      unsigned long long numberOfLBnodesC,
+                                                      unsigned long long numberOfLBnodesF,
+                                                      bool isEvenTimestep,
+                                                      unsigned int* posCSWB,
+                                                      unsigned int* posFSWB,
+                                                      unsigned int kCF,
+                                                      real omCoarse,
+                                                      real omFine,
+                                                      real nu,
+                                                      unsigned int nxC,
+                                                      unsigned int nyC,
+                                                      unsigned int nxF,
+                                                      unsigned int nyF,
+                                                      OffCF offCF);
 
 __global__ void scaleCF_comp_D3Q27F3( real* DC,
-												 real* DF,
-												 real* G6,
-												 unsigned int* neighborCX,
-												 unsigned int* neighborCY,
-												 unsigned int* neighborCZ,
-												 unsigned int* neighborFX,
-												 unsigned int* neighborFY,
-												 unsigned int* neighborFZ,
-												 unsigned int size_MatC,
-												 unsigned int size_MatF,
-												 bool isEvenTimestep,
-												 unsigned int* posCSWB,
-												 unsigned int* posFSWB,
-												 unsigned int kCF,
-												 real omCoarse,
-												 real omFine,
-												 real nu,
-												 unsigned int nxC,
-												 unsigned int nyC,
-												 unsigned int nxF,
-												 unsigned int nyF,
-												 OffCF offCF);
+                                                 real* DF,
+                                                 real* G6,
+                                                 unsigned int* neighborCX,
+                                                 unsigned int* neighborCY,
+                                                 unsigned int* neighborCZ,
+                                                 unsigned int* neighborFX,
+                                                 unsigned int* neighborFY,
+                                                 unsigned int* neighborFZ,
+                                                 unsigned long long numberOfLBnodesC,
+                                                 unsigned long long numberOfLBnodesF,
+                                                 bool isEvenTimestep,
+                                                 unsigned int* posCSWB,
+                                                 unsigned int* posFSWB,
+                                                 unsigned int kCF,
+                                                 real omCoarse,
+                                                 real omFine,
+                                                 real nu,
+                                                 unsigned int nxC,
+                                                 unsigned int nyC,
+                                                 unsigned int nxF,
+                                                 unsigned int nyF,
+                                                 OffCF offCF);
 
 
 __global__ void scaleCF_staggered_time_comp_27(real* DC,
-														  real* DF,
-														  unsigned int* neighborCX,
-														  unsigned int* neighborCY,
-														  unsigned int* neighborCZ,
-														  unsigned int* neighborFX,
-														  unsigned int* neighborFY,
-														  unsigned int* neighborFZ,
-														  unsigned int size_MatC,
-														  unsigned int size_MatF,
-														  bool isEvenTimestep,
-														  unsigned int* posCSWB,
-														  unsigned int* posFSWB,
-														  unsigned int kCF,
-														  real omCoarse,
-														  real omFine,
-														  real nu,
-														  unsigned int nxC,
-														  unsigned int nyC,
-														  unsigned int nxF,
-														  unsigned int nyF,
-														  OffCF offCF);
+                                                          real* DF,
+                                                          unsigned int* neighborCX,
+                                                          unsigned int* neighborCY,
+                                                          unsigned int* neighborCZ,
+                                                          unsigned int* neighborFX,
+                                                          unsigned int* neighborFY,
+                                                          unsigned int* neighborFZ,
+                                                          unsigned long long numberOfLBnodesC,
+                                                          unsigned long long numberOfLBnodesF,
+                                                          bool isEvenTimestep,
+                                                          unsigned int* posCSWB,
+                                                          unsigned int* posFSWB,
+                                                          unsigned int kCF,
+                                                          real omCoarse,
+                                                          real omFine,
+                                                          real nu,
+                                                          unsigned int nxC,
+                                                          unsigned int nyC,
+                                                          unsigned int nxF,
+                                                          unsigned int nyF,
+                                                          OffCF offCF);
 
 __global__ void scaleCF_RhoSq_comp_27( real* DC,
-												  real* DF,
-												  unsigned int* neighborCX,
-												  unsigned int* neighborCY,
-												  unsigned int* neighborCZ,
-												  unsigned int* neighborFX,
-												  unsigned int* neighborFY,
-												  unsigned int* neighborFZ,
-												  unsigned int size_MatC,
-												  unsigned int size_MatF,
-												  bool isEvenTimestep,
-												  unsigned int* posCSWB,
-												  unsigned int* posFSWB,
-												  unsigned int kCF,
-												  real omCoarse,
-												  real omFine,
-												  real nu,
-												  unsigned int nxC,
-												  unsigned int nyC,
-												  unsigned int nxF,
-												  unsigned int nyF,
-												  OffCF offCF);
-
-__global__ void scaleCF_compressible(
-    real* distributionsCoarse, 
-    real* distributionsFine, 
+                                                  real* DF,
+                                                  unsigned int* neighborCX,
+                                                  unsigned int* neighborCY,
+                                                  unsigned int* neighborCZ,
+                                                  unsigned int* neighborFX,
+                                                  unsigned int* neighborFY,
+                                                  unsigned int* neighborFZ,
+                                                  unsigned long long numberOfLBnodesC,
+                                                  unsigned long long numberOfLBnodesF,
+                                                  bool isEvenTimestep,
+                                                  unsigned int* posCSWB,
+                                                  unsigned int* posFSWB,
+                                                  unsigned int kCF,
+                                                  real omCoarse,
+                                                  real omFine,
+                                                  real nu,
+                                                  unsigned int nxC,
+                                                  unsigned int nyC,
+                                                  unsigned int nxF,
+                                                  unsigned int nyF,
+                                                  OffCF offCF);
+
+template<bool hasTurbulentViscosity> __global__ void scaleCF_compressible(
+    real* distributionsCoarse,
+    real* distributionsFine,
     unsigned int* neighborXcoarse,
     unsigned int* neighborYcoarse,
     unsigned int* neighborZcoarse,
     unsigned int* neighborXfine,
     unsigned int* neighborYfine,
     unsigned int* neighborZfine,
-    unsigned int numberOfLBnodesCoarse, 
-    unsigned int numberOfLBnodesFine, 
+    unsigned long long numberOfLBnodesCoarse,
+    unsigned long long numberOfLBnodesFine,
     bool isEvenTimestep,
-    unsigned int* indicesCoarseMMM, 
-    unsigned int* indicesFineMMM, 
-    unsigned int numberOfInterfaceNodes, 
-    real omegaCoarse, 
-    real omegaFine, 
+    unsigned int* indicesCoarseMMM,
+    unsigned int* indicesFineMMM,
+    unsigned int numberOfInterfaceNodes,
+    real omegaCoarse,
+    real omegaFine,
+    real* turbulentViscosityCoarse,
+    real* turbulentViscosityFine,
     OffCF offsetCF);
 
 __global__ void scaleCF_RhoSq_3rdMom_comp_27(real* DC,
-														real* DF,
-														unsigned int* neighborCX,
-														unsigned int* neighborCY,
-														unsigned int* neighborCZ,
-														unsigned int* neighborFX,
-														unsigned int* neighborFY,
-														unsigned int* neighborFZ,
-														unsigned int size_MatC,
-														unsigned int size_MatF,
-														bool isEvenTimestep,
-														unsigned int* posCSWB,
-														unsigned int* posFSWB,
-														unsigned int kCF,
-														real omCoarse,
-														real omFine,
-														real nu,
-														unsigned int nxC,
-														unsigned int nyC,
-														unsigned int nxF,
-														unsigned int nyF,
-														OffCF offCF);
+                                                        real* DF,
+                                                        unsigned int* neighborCX,
+                                                        unsigned int* neighborCY,
+                                                        unsigned int* neighborCZ,
+                                                        unsigned int* neighborFX,
+                                                        unsigned int* neighborFY,
+                                                        unsigned int* neighborFZ,
+                                                        unsigned long long numberOfLBnodesC,
+                                                        unsigned long long numberOfLBnodesF,
+                                                        bool isEvenTimestep,
+                                                        unsigned int* posCSWB,
+                                                        unsigned int* posFSWB,
+                                                        unsigned int kCF,
+                                                        real omCoarse,
+                                                        real omFine,
+                                                        real nu,
+                                                        unsigned int nxC,
+                                                        unsigned int nyC,
+                                                        unsigned int nxF,
+                                                        unsigned int nyF,
+                                                        OffCF offCF);
 
 __global__ void scaleCF_AA2016_comp_27(real* DC,
-												  real* DF,
-												  unsigned int* neighborCX,
-												  unsigned int* neighborCY,
-												  unsigned int* neighborCZ,
-												  unsigned int* neighborFX,
-												  unsigned int* neighborFY,
-												  unsigned int* neighborFZ,
-												  unsigned int size_MatC,
-												  unsigned int size_MatF,
-												  bool isEvenTimestep,
-												  unsigned int* posCSWB,
-												  unsigned int* posFSWB,
-												  unsigned int kCF,
-												  real omCoarse,
-												  real omFine,
-												  real nu,
-												  unsigned int nxC,
-												  unsigned int nyC,
-												  unsigned int nxF,
-												  unsigned int nyF,
-												  OffCF offCF);
+                                                  real* DF,
+                                                  unsigned int* neighborCX,
+                                                  unsigned int* neighborCY,
+                                                  unsigned int* neighborCZ,
+                                                  unsigned int* neighborFX,
+                                                  unsigned int* neighborFY,
+                                                  unsigned int* neighborFZ,
+                                                  unsigned long long numberOfLBnodesC,
+                                                  unsigned long long numberOfLBnodesF,
+                                                  bool isEvenTimestep,
+                                                  unsigned int* posCSWB,
+                                                  unsigned int* posFSWB,
+                                                  unsigned int kCF,
+                                                  real omCoarse,
+                                                  real omFine,
+                                                  real nu,
+                                                  unsigned int nxC,
+                                                  unsigned int nyC,
+                                                  unsigned int nxF,
+                                                  unsigned int nyF,
+                                                  OffCF offCF);
 
 __global__ void scaleCF_NSPress_27(real* DC,
-											  real* DF,
-											  unsigned int* neighborCX,
-											  unsigned int* neighborCY,
-											  unsigned int* neighborCZ,
-											  unsigned int* neighborFX,
-											  unsigned int* neighborFY,
-											  unsigned int* neighborFZ,
-											  unsigned int size_MatC,
-											  unsigned int size_MatF,
-											  bool isEvenTimestep,
-											  unsigned int* posCSWB,
-											  unsigned int* posFSWB,
-											  unsigned int kCF,
-											  real omCoarse,
-											  real omFine,
-											  real nu,
-											  unsigned int nxC,
-											  unsigned int nyC,
-											  unsigned int nxF,
-											  unsigned int nyF,
-											  OffCF offCF);
+                                              real* DF,
+                                              unsigned int* neighborCX,
+                                              unsigned int* neighborCY,
+                                              unsigned int* neighborCZ,
+                                              unsigned int* neighborFX,
+                                              unsigned int* neighborFY,
+                                              unsigned int* neighborFZ,
+                                              unsigned long long numberOfLBnodesC,
+                                              unsigned long long numberOfLBnodesF,
+                                              bool isEvenTimestep,
+                                              unsigned int* posCSWB,
+                                              unsigned int* posFSWB,
+                                              unsigned int kCF,
+                                              real omCoarse,
+                                              real omFine,
+                                              real nu,
+                                              unsigned int nxC,
+                                              unsigned int nyC,
+                                              unsigned int nxF,
+                                              unsigned int nyF,
+                                              OffCF offCF);
 
 __global__ void scaleCFThSMG7( real* DC,
                                           real* DF,
@@ -1947,8 +1949,8 @@ __global__ void scaleCFThSMG7( real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC,
-                                          unsigned int size_MatF,
+                                          unsigned long long numberOfLBnodesC,
+                                          unsigned long long numberOfLBnodesF,
                                           bool isEvenTimestep,
                                           unsigned int* posCSWB,
                                           unsigned int* posFSWB,
@@ -1967,8 +1969,8 @@ __global__ void scaleCFThS7(real* DC,
                                        unsigned int* neighborFX,
                                        unsigned int* neighborFY,
                                        unsigned int* neighborFZ,
-                                       unsigned int size_MatC,
-                                       unsigned int size_MatF,
+                                       unsigned long long numberOfLBnodesC,
+                                       unsigned long long numberOfLBnodesF,
                                        bool isEvenTimestep,
                                        unsigned int* posCSWB,
                                        unsigned int* posFSWB,
@@ -1986,15 +1988,15 @@ __global__ void scaleCFThS27(real* DC,
                                         unsigned int* neighborFX,
                                         unsigned int* neighborFY,
                                         unsigned int* neighborFZ,
-                                        unsigned int size_MatC,
-                                        unsigned int size_MatF,
+                                        unsigned long long numberOfLBnodesC,
+                                        unsigned long long numberOfLBnodesF,
                                         bool isEvenTimestep,
                                         unsigned int* posCSWB,
                                         unsigned int* posFSWB,
                                         unsigned int kCF,
                                         real nu,
                                         real diffusivity_fine,
-										OffCF offCF);
+                                        OffCF offCF);
 
 //fine to coarse
 __global__ void scaleFC27(real* DC,
@@ -2005,18 +2007,18 @@ __global__ void scaleFC27(real* DC,
                                     unsigned int* neighborFX,
                                     unsigned int* neighborFY,
                                     unsigned int* neighborFZ,
-										       unsigned int size_MatC,
-										       unsigned int size_MatF,
-										       bool isEvenTimestep,
+                                               unsigned long long numberOfLBnodesC,
+                                               unsigned long long numberOfLBnodesF,
+                                               bool isEvenTimestep,
                                      unsigned int* posC,
                                      unsigned int* posFSWB,
                                      unsigned int kFC,
-										       real omCoarse,
-										       real omFine,
-										       real nu,
-										       unsigned int nxC,
-										       unsigned int nyC,
-										       unsigned int nxF,
+                                               real omCoarse,
+                                               real omFine,
+                                               real nu,
+                                               unsigned int nxC,
+                                               unsigned int nyC,
+                                               unsigned int nxF,
                                      unsigned int nyF);
 
 __global__ void scaleFCEff27(real* DC,
@@ -2027,8 +2029,8 @@ __global__ void scaleFCEff27(real* DC,
                                         unsigned int* neighborFX,
                                         unsigned int* neighborFY,
                                         unsigned int* neighborFZ,
-                                        unsigned int size_MatC,
-                                        unsigned int size_MatF,
+                                        unsigned long long numberOfLBnodesC,
+                                        unsigned long long numberOfLBnodesF,
                                         bool isEvenTimestep,
                                         unsigned int* posC,
                                         unsigned int* posFSWB,
@@ -2050,8 +2052,8 @@ __global__ void scaleFCLast27( real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC,
-                                          unsigned int size_MatF,
+                                          unsigned long long numberOfLBnodesC,
+                                          unsigned long long numberOfLBnodesF,
                                           bool isEvenTimestep,
                                           unsigned int* posC,
                                           unsigned int* posFSWB,
@@ -2073,8 +2075,8 @@ __global__ void scaleFCpress27( real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC,
-                                          unsigned int size_MatF,
+                                          unsigned long long numberOfLBnodesC,
+                                          unsigned long long numberOfLBnodesF,
                                           bool isEvenTimestep,
                                           unsigned int* posC,
                                           unsigned int* posFSWB,
@@ -2096,8 +2098,8 @@ __global__ void scaleFC_Fix_27( real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC,
-                                          unsigned int size_MatF,
+                                          unsigned long long numberOfLBnodesC,
+                                          unsigned long long numberOfLBnodesF,
                                           bool isEvenTimestep,
                                           unsigned int* posC,
                                           unsigned int* posFSWB,
@@ -2112,147 +2114,147 @@ __global__ void scaleFC_Fix_27( real* DC,
                                           OffFC offFC);
 
 __global__ void scaleFC_Fix_comp_27(   real* DC,
-												  real* DF,
-												  unsigned int* neighborCX,
-												  unsigned int* neighborCY,
-												  unsigned int* neighborCZ,
-												  unsigned int* neighborFX,
-												  unsigned int* neighborFY,
-												  unsigned int* neighborFZ,
-												  unsigned int size_MatC,
-												  unsigned int size_MatF,
-												  bool isEvenTimestep,
-												  unsigned int* posC,
-												  unsigned int* posFSWB,
-												  unsigned int kFC,
-												  real omCoarse,
-												  real omFine,
-												  real nu,
-												  unsigned int nxC,
-												  unsigned int nyC,
-												  unsigned int nxF,
-												  unsigned int nyF,
-												  OffFC offFC);
+                                                  real* DF,
+                                                  unsigned int* neighborCX,
+                                                  unsigned int* neighborCY,
+                                                  unsigned int* neighborCZ,
+                                                  unsigned int* neighborFX,
+                                                  unsigned int* neighborFY,
+                                                  unsigned int* neighborFZ,
+                                                  unsigned long long numberOfLBnodesC,
+                                                  unsigned long long numberOfLBnodesF,
+                                                  bool isEvenTimestep,
+                                                  unsigned int* posC,
+                                                  unsigned int* posFSWB,
+                                                  unsigned int kFC,
+                                                  real omCoarse,
+                                                  real omFine,
+                                                  real nu,
+                                                  unsigned int nxC,
+                                                  unsigned int nyC,
+                                                  unsigned int nxF,
+                                                  unsigned int nyF,
+                                                  OffFC offFC);
 
 __global__ void scaleFC_0817_comp_27(  real* DC,
-												  real* DF,
-												  unsigned int* neighborCX,
-												  unsigned int* neighborCY,
-												  unsigned int* neighborCZ,
-												  unsigned int* neighborFX,
-												  unsigned int* neighborFY,
-												  unsigned int* neighborFZ,
-												  unsigned int size_MatC,
-												  unsigned int size_MatF,
-												  bool isEvenTimestep,
-												  unsigned int* posC,
-												  unsigned int* posFSWB,
-												  unsigned int kFC,
-												  real omCoarse,
-												  real omFine,
-												  real nu,
-												  unsigned int nxC,
-												  unsigned int nyC,
-												  unsigned int nxF,
-												  unsigned int nyF,
-												  OffFC offFC);
+                                                  real* DF,
+                                                  unsigned int* neighborCX,
+                                                  unsigned int* neighborCY,
+                                                  unsigned int* neighborCZ,
+                                                  unsigned int* neighborFX,
+                                                  unsigned int* neighborFY,
+                                                  unsigned int* neighborFZ,
+                                                  unsigned long long numberOfLBnodesC,
+                                                  unsigned long long numberOfLBnodesF,
+                                                  bool isEvenTimestep,
+                                                  unsigned int* posC,
+                                                  unsigned int* posFSWB,
+                                                  unsigned int kFC,
+                                                  real omCoarse,
+                                                  real omFine,
+                                                  real nu,
+                                                  unsigned int nxC,
+                                                  unsigned int nyC,
+                                                  unsigned int nxF,
+                                                  unsigned int nyF,
+                                                  OffFC offFC);
 
 __global__ void scaleFC_comp_D3Q27F3_2018( real* DC,
-													  real* DF,
-													  real* G6,
-													  unsigned int* neighborCX,
-													  unsigned int* neighborCY,
-													  unsigned int* neighborCZ,
-													  unsigned int* neighborFX,
-													  unsigned int* neighborFY,
-													  unsigned int* neighborFZ,
-													  unsigned int size_MatC,
-													  unsigned int size_MatF,
-													  bool isEvenTimestep,
-													  unsigned int* posC,
-													  unsigned int* posFSWB,
-													  unsigned int kFC,
-													  real omCoarse,
-													  real omFine,
-													  real nu,
-													  unsigned int nxC,
-													  unsigned int nyC,
-													  unsigned int nxF,
-													  unsigned int nyF,
-													  OffFC offFC);
+                                                      real* DF,
+                                                      real* G6,
+                                                      unsigned int* neighborCX,
+                                                      unsigned int* neighborCY,
+                                                      unsigned int* neighborCZ,
+                                                      unsigned int* neighborFX,
+                                                      unsigned int* neighborFY,
+                                                      unsigned int* neighborFZ,
+                                                      unsigned long long numberOfLBnodesC,
+                                                      unsigned long long numberOfLBnodesF,
+                                                      bool isEvenTimestep,
+                                                      unsigned int* posC,
+                                                      unsigned int* posFSWB,
+                                                      unsigned int kFC,
+                                                      real omCoarse,
+                                                      real omFine,
+                                                      real nu,
+                                                      unsigned int nxC,
+                                                      unsigned int nyC,
+                                                      unsigned int nxF,
+                                                      unsigned int nyF,
+                                                      OffFC offFC);
 
 __global__ void scaleFC_comp_D3Q27F3( real* DC,
-												 real* DF,
-												 real* G6,
-												 unsigned int* neighborCX,
-												 unsigned int* neighborCY,
-												 unsigned int* neighborCZ,
-												 unsigned int* neighborFX,
-												 unsigned int* neighborFY,
-												 unsigned int* neighborFZ,
-												 unsigned int size_MatC,
-												 unsigned int size_MatF,
-												 bool isEvenTimestep,
-												 unsigned int* posC,
-												 unsigned int* posFSWB,
-												 unsigned int kFC,
-												 real omCoarse,
-												 real omFine,
-												 real nu,
-												 unsigned int nxC,
-												 unsigned int nyC,
-												 unsigned int nxF,
-												 unsigned int nyF,
-												 OffFC offFC);
+                                                 real* DF,
+                                                 real* G6,
+                                                 unsigned int* neighborCX,
+                                                 unsigned int* neighborCY,
+                                                 unsigned int* neighborCZ,
+                                                 unsigned int* neighborFX,
+                                                 unsigned int* neighborFY,
+                                                 unsigned int* neighborFZ,
+                                                 unsigned long long numberOfLBnodesC,
+                                                 unsigned long long numberOfLBnodesF,
+                                                 bool isEvenTimestep,
+                                                 unsigned int* posC,
+                                                 unsigned int* posFSWB,
+                                                 unsigned int kFC,
+                                                 real omCoarse,
+                                                 real omFine,
+                                                 real nu,
+                                                 unsigned int nxC,
+                                                 unsigned int nyC,
+                                                 unsigned int nxF,
+                                                 unsigned int nyF,
+                                                 OffFC offFC);
 
 
 __global__ void scaleFC_staggered_time_comp_27(real* DC,
-														  real* DF,
-														  unsigned int* neighborCX,
-														  unsigned int* neighborCY,
-														  unsigned int* neighborCZ,
-														  unsigned int* neighborFX,
-														  unsigned int* neighborFY,
-														  unsigned int* neighborFZ,
-														  unsigned int size_MatC,
-														  unsigned int size_MatF,
-														  bool isEvenTimestep,
-														  unsigned int* posC,
-														  unsigned int* posFSWB,
-														  unsigned int kFC,
-														  real omCoarse,
-														  real omFine,
-														  real nu,
-														  unsigned int nxC,
-														  unsigned int nyC,
-														  unsigned int nxF,
-														  unsigned int nyF,
-														  OffFC offFC);
+                                                          real* DF,
+                                                          unsigned int* neighborCX,
+                                                          unsigned int* neighborCY,
+                                                          unsigned int* neighborCZ,
+                                                          unsigned int* neighborFX,
+                                                          unsigned int* neighborFY,
+                                                          unsigned int* neighborFZ,
+                                                          unsigned long long numberOfLBnodesC,
+                                                          unsigned long long numberOfLBnodesF,
+                                                          bool isEvenTimestep,
+                                                          unsigned int* posC,
+                                                          unsigned int* posFSWB,
+                                                          unsigned int kFC,
+                                                          real omCoarse,
+                                                          real omFine,
+                                                          real nu,
+                                                          unsigned int nxC,
+                                                          unsigned int nyC,
+                                                          unsigned int nxF,
+                                                          unsigned int nyF,
+                                                          OffFC offFC);
 
 __global__ void scaleFC_RhoSq_comp_27( real* DC,
-												  real* DF,
-												  unsigned int* neighborCX,
-												  unsigned int* neighborCY,
-												  unsigned int* neighborCZ,
-												  unsigned int* neighborFX,
-												  unsigned int* neighborFY,
-												  unsigned int* neighborFZ,
-												  unsigned int size_MatC,
-												  unsigned int size_MatF,
-												  bool isEvenTimestep,
-												  unsigned int* posC,
-												  unsigned int* posFSWB,
-												  unsigned int kFC,
-												  real omCoarse,
-												  real omFine,
-												  real nu,
-												  unsigned int nxC,
-												  unsigned int nyC,
-												  unsigned int nxF,
-												  unsigned int nyF,
-												  OffFC offFC);
-
-__global__ void scaleFC_compressible(
+                                                  real* DF,
+                                                  unsigned int* neighborCX,
+                                                  unsigned int* neighborCY,
+                                                  unsigned int* neighborCZ,
+                                                  unsigned int* neighborFX,
+                                                  unsigned int* neighborFY,
+                                                  unsigned int* neighborFZ,
+                                                  unsigned long long numberOfLBnodesC,
+                                                  unsigned long long numberOfLBnodesF,
+                                                  bool isEvenTimestep,
+                                                  unsigned int* posC,
+                                                  unsigned int* posFSWB,
+                                                  unsigned int kFC,
+                                                  real omCoarse,
+                                                  real omFine,
+                                                  real nu,
+                                                  unsigned int nxC,
+                                                  unsigned int nyC,
+                                                  unsigned int nxF,
+                                                  unsigned int nyF,
+                                                  OffFC offFC);
+
+template<bool hasTurbulentViscosity> __global__ void scaleFC_compressible(
     real *distributionsCoarse,
     real *distributionsFine,
     unsigned int *neighborXcoarse,
@@ -2261,84 +2263,86 @@ __global__ void scaleFC_compressible(
     unsigned int *neighborXfine,
     unsigned int *neighborYfine,
     unsigned int *neighborZfine,
-    unsigned int numberOfLBnodesCoarse,
-    unsigned int numberOfLBnodesFine,
+    unsigned long long numberOfLBnodesCoarse,
+    unsigned long long numberOfLBnodesFine,
     bool isEvenTimestep,
     unsigned int *indicesCoarse000,
     unsigned int *indicesFineMMM,
     unsigned int numberOfInterfaceNodes,
     real omegaCoarse,
     real omegaFine,
+    real* turbulentViscosityCoarse,
+    real* turbulentViscosityFine,
     OffFC offsetFC);
 
 __global__ void scaleFC_RhoSq_3rdMom_comp_27(real* DC,
-														real* DF,
-														unsigned int* neighborCX,
-														unsigned int* neighborCY,
-														unsigned int* neighborCZ,
-														unsigned int* neighborFX,
-														unsigned int* neighborFY,
-														unsigned int* neighborFZ,
-														unsigned int size_MatC,
-														unsigned int size_MatF,
-														bool isEvenTimestep,
-														unsigned int* posC,
-														unsigned int* posFSWB,
-														unsigned int kFC,
-														real omCoarse,
-														real omFine,
-														real nu,
-														unsigned int nxC,
-														unsigned int nyC,
-														unsigned int nxF,
-														unsigned int nyF,
-														OffFC offFC);
+                                                        real* DF,
+                                                        unsigned int* neighborCX,
+                                                        unsigned int* neighborCY,
+                                                        unsigned int* neighborCZ,
+                                                        unsigned int* neighborFX,
+                                                        unsigned int* neighborFY,
+                                                        unsigned int* neighborFZ,
+                                                        unsigned long long numberOfLBnodesC,
+                                                        unsigned long long numberOfLBnodesF,
+                                                        bool isEvenTimestep,
+                                                        unsigned int* posC,
+                                                        unsigned int* posFSWB,
+                                                        unsigned int kFC,
+                                                        real omCoarse,
+                                                        real omFine,
+                                                        real nu,
+                                                        unsigned int nxC,
+                                                        unsigned int nyC,
+                                                        unsigned int nxF,
+                                                        unsigned int nyF,
+                                                        OffFC offFC);
 
 __global__ void scaleFC_AA2016_comp_27(real* DC,
-												  real* DF,
-												  unsigned int* neighborCX,
-												  unsigned int* neighborCY,
-												  unsigned int* neighborCZ,
-												  unsigned int* neighborFX,
-												  unsigned int* neighborFY,
-												  unsigned int* neighborFZ,
-												  unsigned int size_MatC,
-												  unsigned int size_MatF,
-												  bool isEvenTimestep,
-												  unsigned int* posC,
-												  unsigned int* posFSWB,
-												  unsigned int kFC,
-												  real omCoarse,
-												  real omFine,
-												  real nu,
-												  unsigned int nxC,
-												  unsigned int nyC,
-												  unsigned int nxF,
-												  unsigned int nyF,
-												  OffFC offFC);
+                                                  real* DF,
+                                                  unsigned int* neighborCX,
+                                                  unsigned int* neighborCY,
+                                                  unsigned int* neighborCZ,
+                                                  unsigned int* neighborFX,
+                                                  unsigned int* neighborFY,
+                                                  unsigned int* neighborFZ,
+                                                  unsigned long long numberOfLBnodesC,
+                                                  unsigned long long numberOfLBnodesF,
+                                                  bool isEvenTimestep,
+                                                  unsigned int* posC,
+                                                  unsigned int* posFSWB,
+                                                  unsigned int kFC,
+                                                  real omCoarse,
+                                                  real omFine,
+                                                  real nu,
+                                                  unsigned int nxC,
+                                                  unsigned int nyC,
+                                                  unsigned int nxF,
+                                                  unsigned int nyF,
+                                                  OffFC offFC);
 
 __global__ void scaleFC_NSPress_27(real* DC,
-											  real* DF,
-											  unsigned int* neighborCX,
-											  unsigned int* neighborCY,
-											  unsigned int* neighborCZ,
-											  unsigned int* neighborFX,
-											  unsigned int* neighborFY,
-											  unsigned int* neighborFZ,
-											  unsigned int size_MatC,
-											  unsigned int size_MatF,
-											  bool isEvenTimestep,
-											  unsigned int* posC,
-											  unsigned int* posFSWB,
-											  unsigned int kFC,
-											  real omCoarse,
-											  real omFine,
-											  real nu,
-											  unsigned int nxC,
-											  unsigned int nyC,
-											  unsigned int nxF,
-											  unsigned int nyF,
-											  OffFC offFC);
+                                              real* DF,
+                                              unsigned int* neighborCX,
+                                              unsigned int* neighborCY,
+                                              unsigned int* neighborCZ,
+                                              unsigned int* neighborFX,
+                                              unsigned int* neighborFY,
+                                              unsigned int* neighborFZ,
+                                              unsigned long long numberOfLBnodesC,
+                                              unsigned long long numberOfLBnodesF,
+                                              bool isEvenTimestep,
+                                              unsigned int* posC,
+                                              unsigned int* posFSWB,
+                                              unsigned int kFC,
+                                              real omCoarse,
+                                              real omFine,
+                                              real nu,
+                                              unsigned int nxC,
+                                              unsigned int nyC,
+                                              unsigned int nxF,
+                                              unsigned int nyF,
+                                              OffFC offFC);
 
 __global__ void scaleFCThSMG7( real* DC,
                                           real* DF,
@@ -2350,8 +2354,8 @@ __global__ void scaleFCThSMG7( real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC,
-                                          unsigned int size_MatF,
+                                          unsigned long long numberOfLBnodesC,
+                                          unsigned long long numberOfLBnodesF,
                                           bool isEvenTimestep,
                                           unsigned int* posC,
                                           unsigned int* posFSWB,
@@ -2370,8 +2374,8 @@ __global__ void scaleFCThS7(real* DC,
                                        unsigned int* neighborFX,
                                        unsigned int* neighborFY,
                                        unsigned int* neighborFZ,
-                                       unsigned int size_MatC,
-                                       unsigned int size_MatF,
+                                       unsigned long long numberOfLBnodesC,
+                                       unsigned long long numberOfLBnodesF,
                                        bool isEvenTimestep,
                                        unsigned int* posC,
                                        unsigned int* posFSWB,
@@ -2389,242 +2393,242 @@ __global__ void scaleFCThS27(  real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC,
-                                          unsigned int size_MatF,
+                                          unsigned long long numberOfLBnodesC,
+                                          unsigned long long numberOfLBnodesF,
                                           bool isEvenTimestep,
                                           unsigned int* posC,
                                           unsigned int* posFSWB,
                                           unsigned int kFC,
                                           real nu,
                                           real diffusivity_coarse,
-										  OffFC offFC);
+                                          OffFC offFC);
 
 __global__ void DragLiftPost27(  real* DD,
-											int* k_Q,
-											real* QQ,
-											int numberOfBCnodes,
-											double *DragX,
-											double *DragY,
-											double *DragZ,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											bool isEvenTimestep);
+                                            int* k_Q,
+                                            real* QQ,
+                                            int numberOfBCnodes,
+                                            double *DragX,
+                                            double *DragY,
+                                            double *DragZ,
+                                            unsigned int* neighborX,
+                                            unsigned int* neighborY,
+                                            unsigned int* neighborZ,
+                                            unsigned long long numberOfLBnodes,
+                                            bool isEvenTimestep);
 
 __global__ void DragLiftPre27(   real* DD,
-											int* k_Q,
-											real* QQ,
-											int numberOfBCnodes,
-											double *DragX,
-											double *DragY,
-											double *DragZ,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											bool isEvenTimestep);
+                                            int* k_Q,
+                                            real* QQ,
+                                            int numberOfBCnodes,
+                                            double *DragX,
+                                            double *DragY,
+                                            double *DragZ,
+                                            unsigned int* neighborX,
+                                            unsigned int* neighborY,
+                                            unsigned int* neighborZ,
+                                            unsigned long long numberOfLBnodes,
+                                            bool isEvenTimestep);
 
 __global__ void CalcCP27(real* DD,
-									int* cpIndex,
-									int nonCp,
-									double *cpPress,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int size_Mat,
-									bool isEvenTimestep);
+                                    int* cpIndex,
+                                    int nonCp,
+                                    double *cpPress,
+                                    unsigned int* neighborX,
+                                    unsigned int* neighborY,
+                                    unsigned int* neighborZ,
+                                    unsigned long long numberOfLBnodes,
+                                    bool isEvenTimestep);
 
 __global__ void getSendFsPre27(real* DD,
-										  real* bufferFs,
-										  int* sendIndex,
+                                          real* bufferFs,
+                                          int* sendIndex,
                                           int buffmax,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           bool isEvenTimestep);
 
 __global__ void getSendFsPost27(real* DD,
-										   real* bufferFs,
-										   int* sendIndex,
+                                           real* bufferFs,
+                                           int* sendIndex,
                                            int buffmax,
                                            unsigned int* neighborX,
                                            unsigned int* neighborY,
                                            unsigned int* neighborZ,
-                                           unsigned int size_Mat,
+                                           unsigned long long numberOfLBnodes,
                                            bool isEvenTimestep);
 
 __global__ void setRecvFsPre27(real* DD,
-										  real* bufferFs,
-										  int* recvIndex,
+                                          real* bufferFs,
+                                          int* recvIndex,
                                           int buffmax,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           bool isEvenTimestep);
 
 __global__ void setRecvFsPost27(real* DD,
-										   real* bufferFs,
-										   int* recvIndex,
+                                           real* bufferFs,
+                                           int* recvIndex,
                                            int buffmax,
                                            unsigned int* neighborX,
                                            unsigned int* neighborY,
                                            unsigned int* neighborZ,
-                                           unsigned int size_Mat,
+                                           unsigned long long numberOfLBnodes,
                                            bool isEvenTimestep);
 
 __global__ void getSendGsF3(
-	real* G6,
-	real* bufferGs,
-	int* sendIndex,
-	int buffmax,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	unsigned int size_Mat,
-	bool isEvenTimestep);
+    real* G6,
+    real* bufferGs,
+    int* sendIndex,
+    int buffmax,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
 
 __global__ void setRecvGsF3(
-	real* G6,
-	real* bufferGs,
-	int* recvIndex,
-	int buffmax,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	unsigned int size_Mat,
-	bool isEvenTimestep);
+    real* G6,
+    real* bufferGs,
+    int* recvIndex,
+    int buffmax,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
 
 __global__ void WallFunction27( 	real* vx,
-											real* vy,
-											real* vz,
-											real* DD,
-											int* k_Q,
-											real* QQ,
-											unsigned int numberOfBCnodes,
-											real om1,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											bool isEvenTimestep);
+                                            real* vy,
+                                            real* vz,
+                                            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 LBSetOutputWallVelocitySP27( real* vxD,
-														real* vyD,
-														real* vzD,
-														real* vxWall,
-														real* vyWall,
-														real* vzWall,
-														int numberOfWallNodes,
-														int* kWallNodes,
-														real* rhoD,
-														real* pressD,
-														unsigned int* geoD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														unsigned int size_Mat,
-														real* DD,
-														bool isEvenTimestep);
+                                                        real* vyD,
+                                                        real* vzD,
+                                                        real* vxWall,
+                                                        real* vyWall,
+                                                        real* vzWall,
+                                                        int numberOfWallNodes,
+                                                        int* kWallNodes,
+                                                        real* rhoD,
+                                                        real* pressD,
+                                                        unsigned int* geoD,
+                                                        unsigned int* neighborX,
+                                                        unsigned int* neighborY,
+                                                        unsigned int* neighborZ,
+                                                        unsigned long long numberOfLBnodes,
+                                                        real* DD,
+                                                        bool isEvenTimestep);
 
 __global__ void GetVeloforForcing27( real* DD,
-												int* bcIndex,
-												int nonAtBC,
-												real* Vx,
-												real* Vy,
-												real* Vz,
-												unsigned int* neighborX,
-												unsigned int* neighborY,
-												unsigned int* neighborZ,
-												unsigned int size_Mat,
-												bool isEvenTimestep);
+                                                int* bcIndex,
+                                                int nonAtBC,
+                                                real* Vx,
+                                                real* Vy,
+                                                real* Vz,
+                                                unsigned int* neighborX,
+                                                unsigned int* neighborY,
+                                                unsigned int* neighborZ,
+                                                unsigned long long numberOfLBnodes,
+                                                bool isEvenTimestep);
 
 __global__ void InitParticles( real* coordX,
-										  real* coordY,
-										  real* coordZ,
-										  real* coordParticleXlocal,
-										  real* coordParticleYlocal,
-										  real* coordParticleZlocal,
-										  real* coordParticleXglobal,
-										  real* coordParticleYglobal,
-										  real* coordParticleZglobal,
-										  real* veloParticleX,
-										  real* veloParticleY,
-										  real* veloParticleZ,
-										  real* randArray,
-										  unsigned int* particleID,
-										  unsigned int* cellBaseID,
-										  unsigned int* bcMatD,
-										  unsigned int* neighborX,
-										  unsigned int* neighborY,
-										  unsigned int* neighborZ,
-										  unsigned int* neighborWSB,
-										  int level,
-									      unsigned int numberOfParticles,
-										  unsigned int size_Mat);
+                                          real* coordY,
+                                          real* coordZ,
+                                          real* coordParticleXlocal,
+                                          real* coordParticleYlocal,
+                                          real* coordParticleZlocal,
+                                          real* coordParticleXglobal,
+                                          real* coordParticleYglobal,
+                                          real* coordParticleZglobal,
+                                          real* veloParticleX,
+                                          real* veloParticleY,
+                                          real* veloParticleZ,
+                                          real* randArray,
+                                          unsigned int* particleID,
+                                          unsigned int* cellBaseID,
+                                          unsigned int* bcMatD,
+                                          unsigned int* neighborX,
+                                          unsigned int* neighborY,
+                                          unsigned int* neighborZ,
+                                          unsigned int* neighborWSB,
+                                          int level,
+                                          unsigned int numberOfParticles,
+                                          unsigned long long numberOfLBnodes);
 
 __global__ void MoveParticles( real* coordX,
-										  real* coordY,
-										  real* coordZ,
-										  real* coordParticleXlocal,
-										  real* coordParticleYlocal,
-										  real* coordParticleZlocal,
-										  real* coordParticleXglobal,
-										  real* coordParticleYglobal,
-										  real* coordParticleZglobal,
-										  real* veloParticleX,
-										  real* veloParticleY,
-										  real* veloParticleZ,
-										  real* DD,
-										  real  omega,
-										  unsigned int* particleID,
-										  unsigned int* cellBaseID,
-										  unsigned int* bcMatD,
-										  unsigned int* neighborX,
-										  unsigned int* neighborY,
-										  unsigned int* neighborZ,
-										  unsigned int* neighborWSB,
-										  int level,
-										  unsigned int timestep,
-										  unsigned int numberOfTimesteps,
-									      unsigned int numberOfParticles,
-										  unsigned int size_Mat,
-										  bool isEvenTimestep);
+                                          real* coordY,
+                                          real* coordZ,
+                                          real* coordParticleXlocal,
+                                          real* coordParticleYlocal,
+                                          real* coordParticleZlocal,
+                                          real* coordParticleXglobal,
+                                          real* coordParticleYglobal,
+                                          real* coordParticleZglobal,
+                                          real* veloParticleX,
+                                          real* veloParticleY,
+                                          real* veloParticleZ,
+                                          real* DD,
+                                          real  omega,
+                                          unsigned int* particleID,
+                                          unsigned int* cellBaseID,
+                                          unsigned int* bcMatD,
+                                          unsigned int* neighborX,
+                                          unsigned int* neighborY,
+                                          unsigned int* neighborZ,
+                                          unsigned int* neighborWSB,
+                                          int level,
+                                          unsigned int timestep,
+                                          unsigned int numberOfTimesteps,
+                                          unsigned int numberOfParticles,
+                                          unsigned long long numberOfLBnodes,
+                                          bool isEvenTimestep);
 
 __global__ void MoveParticlesWithoutBCs(   real* coordX,
-													  real* coordY,
-													  real* coordZ,
-													  real* coordParticleXlocal,
-													  real* coordParticleYlocal,
-													  real* coordParticleZlocal,
-													  real* coordParticleXglobal,
-													  real* coordParticleYglobal,
-													  real* coordParticleZglobal,
-													  real* veloParticleX,
-													  real* veloParticleY,
-													  real* veloParticleZ,
-													  real* DD,
-													  real  omega,
-													  unsigned int* particleID,
-													  unsigned int* cellBaseID,
-													  unsigned int* bcMatD,
-													  unsigned int* neighborX,
-													  unsigned int* neighborY,
-													  unsigned int* neighborZ,
-													  unsigned int* neighborWSB,
-													  int level,
-													  unsigned int timestep,
-													  unsigned int numberOfTimesteps,
-													  unsigned int numberOfParticles,
-													  unsigned int size_Mat,
-													  bool isEvenTimestep);
+                                                      real* coordY,
+                                                      real* coordZ,
+                                                      real* coordParticleXlocal,
+                                                      real* coordParticleYlocal,
+                                                      real* coordParticleZlocal,
+                                                      real* coordParticleXglobal,
+                                                      real* coordParticleYglobal,
+                                                      real* coordParticleZglobal,
+                                                      real* veloParticleX,
+                                                      real* veloParticleY,
+                                                      real* veloParticleZ,
+                                                      real* DD,
+                                                      real  omega,
+                                                      unsigned int* particleID,
+                                                      unsigned int* cellBaseID,
+                                                      unsigned int* bcMatD,
+                                                      unsigned int* neighborX,
+                                                      unsigned int* neighborY,
+                                                      unsigned int* neighborZ,
+                                                      unsigned int* neighborWSB,
+                                                      int level,
+                                                      unsigned int timestep,
+                                                      unsigned int numberOfTimesteps,
+                                                      unsigned int numberOfParticles,
+                                                      unsigned long long numberOfLBnodes,
+                                                      bool isEvenTimestep);
 
 __global__ void initRandom(curandState* state);
 
 __global__ void generateRandomValues(curandState* state,
-												real* randArray);
+                                                real* randArray);
 
 __global__ void CalcTurbulenceIntensity(
    real* vxx,
@@ -2641,7 +2645,7 @@ __global__ void CalcTurbulenceIntensity(
    unsigned int* neighborX,
    unsigned int* neighborY,
    unsigned int* neighborZ,
-   unsigned int size_Mat,
+   unsigned long long numberOfLBnodes,
    bool isEvenTimestep);
 
 #endif
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF27.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF27.cu
index 619d68c87d7a707e70be4c56d434191994144148..641d6519669b1522430fe88990c00d0630d00e9b 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF27.cu
@@ -22,8 +22,8 @@ __global__ void scaleCF_0817_comp_27( real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posCSWB, 
 												 unsigned int* posFSWB, 
@@ -43,33 +43,33 @@ __global__ void scaleCF_0817_comp_27( real* DC,
 		*f000dest, *fMMMdest, *fMMPdest, *fMPPdest, *fMPMdest, *fPPMdest, *fPPPdest, *fPMPdest, *fPMMdest;
 
 
-	fP00dest = &DF[DIR_P00   *size_MatF];
-	fM00dest = &DF[DIR_M00   *size_MatF];
-	f0P0dest = &DF[DIR_0P0   *size_MatF];
-	f0M0dest = &DF[DIR_0M0   *size_MatF];
-	f00Pdest = &DF[DIR_00P   *size_MatF];
-	f00Mdest = &DF[DIR_00M   *size_MatF];
-	fPP0dest = &DF[DIR_PP0  *size_MatF];
-	fMM0dest = &DF[DIR_MM0  *size_MatF];
-	fPM0dest = &DF[DIR_PM0  *size_MatF];
-	fMP0dest = &DF[DIR_MP0  *size_MatF];
-	fP0Pdest = &DF[DIR_P0P  *size_MatF];
-	fM0Mdest = &DF[DIR_M0M  *size_MatF];
-	fP0Mdest = &DF[DIR_P0M  *size_MatF];
-	fM0Pdest = &DF[DIR_M0P  *size_MatF];
-	f0PPdest = &DF[DIR_0PP  *size_MatF];
-	f0MMdest = &DF[DIR_0MM  *size_MatF];
-	f0PMdest = &DF[DIR_0PM  *size_MatF];
-	f0MPdest = &DF[DIR_0MP  *size_MatF];
-	f000dest = &DF[DIR_000*size_MatF];
-	fMMMdest = &DF[DIR_MMM *size_MatF];
-	fMMPdest = &DF[DIR_MMP *size_MatF];
-	fMPPdest = &DF[DIR_MPP *size_MatF];
-	fMPMdest = &DF[DIR_MPM *size_MatF];
-	fPPMdest = &DF[DIR_PPM *size_MatF];
-	fPPPdest = &DF[DIR_PPP *size_MatF];
-	fPMPdest = &DF[DIR_PMP *size_MatF];
-	fPMMdest = &DF[DIR_PMM *size_MatF];
+	fP00dest = &DF[DIR_P00 * numberOfLBnodesFine];
+	fM00dest = &DF[DIR_M00 * numberOfLBnodesFine];
+	f0P0dest = &DF[DIR_0P0 * numberOfLBnodesFine];
+	f0M0dest = &DF[DIR_0M0 * numberOfLBnodesFine];
+	f00Pdest = &DF[DIR_00P * numberOfLBnodesFine];
+	f00Mdest = &DF[DIR_00M * numberOfLBnodesFine];
+	fPP0dest = &DF[DIR_PP0 * numberOfLBnodesFine];
+	fMM0dest = &DF[DIR_MM0 * numberOfLBnodesFine];
+	fPM0dest = &DF[DIR_PM0 * numberOfLBnodesFine];
+	fMP0dest = &DF[DIR_MP0 * numberOfLBnodesFine];
+	fP0Pdest = &DF[DIR_P0P * numberOfLBnodesFine];
+	fM0Mdest = &DF[DIR_M0M * numberOfLBnodesFine];
+	fP0Mdest = &DF[DIR_P0M * numberOfLBnodesFine];
+	fM0Pdest = &DF[DIR_M0P * numberOfLBnodesFine];
+	f0PPdest = &DF[DIR_0PP * numberOfLBnodesFine];
+	f0MMdest = &DF[DIR_0MM * numberOfLBnodesFine];
+	f0PMdest = &DF[DIR_0PM * numberOfLBnodesFine];
+	f0MPdest = &DF[DIR_0MP * numberOfLBnodesFine];
+	f000dest = &DF[DIR_000 * numberOfLBnodesFine];
+	fMMMdest = &DF[DIR_MMM * numberOfLBnodesFine];
+	fMMPdest = &DF[DIR_MMP * numberOfLBnodesFine];
+	fMPPdest = &DF[DIR_MPP * numberOfLBnodesFine];
+	fMPMdest = &DF[DIR_MPM * numberOfLBnodesFine];
+	fPPMdest = &DF[DIR_PPM * numberOfLBnodesFine];
+	fPPPdest = &DF[DIR_PPP * numberOfLBnodesFine];
+	fPMPdest = &DF[DIR_PMP * numberOfLBnodesFine];
+	fPMMdest = &DF[DIR_PMM * numberOfLBnodesFine];
 
 	real
 		*fP00source, *fM00source, *f0P0source, *f0M0source, *f00Psource, *f00Msource, *fPP0source, *fMM0source, *fPM0source,
@@ -78,63 +78,63 @@ __global__ void scaleCF_0817_comp_27( real* DC,
 
 	if (isEvenTimestep == true)
 	{
-		fP00source = &DC[DIR_P00   *size_MatC];
-		fM00source = &DC[DIR_M00   *size_MatC];
-		f0P0source = &DC[DIR_0P0   *size_MatC];
-		f0M0source = &DC[DIR_0M0   *size_MatC];
-		f00Psource = &DC[DIR_00P   *size_MatC];
-		f00Msource = &DC[DIR_00M   *size_MatC];
-		fPP0source = &DC[DIR_PP0  *size_MatC];
-		fMM0source = &DC[DIR_MM0  *size_MatC];
-		fPM0source = &DC[DIR_PM0  *size_MatC];
-		fMP0source = &DC[DIR_MP0  *size_MatC];
-		fP0Psource = &DC[DIR_P0P  *size_MatC];
-		fM0Msource = &DC[DIR_M0M  *size_MatC];
-		fP0Msource = &DC[DIR_P0M  *size_MatC];
-		fM0Psource = &DC[DIR_M0P  *size_MatC];
-		f0PPsource = &DC[DIR_0PP  *size_MatC];
-		f0MMsource = &DC[DIR_0MM  *size_MatC];
-		f0PMsource = &DC[DIR_0PM  *size_MatC];
-		f0MPsource = &DC[DIR_0MP  *size_MatC];
-		f000source = &DC[DIR_000*size_MatC];
-		fMMMsource = &DC[DIR_MMM *size_MatC];
-		fMMPsource = &DC[DIR_MMP *size_MatC];
-		fMPPsource = &DC[DIR_MPP *size_MatC];
-		fMPMsource = &DC[DIR_MPM *size_MatC];
-		fPPMsource = &DC[DIR_PPM *size_MatC];
-		fPPPsource = &DC[DIR_PPP *size_MatC];
-		fPMPsource = &DC[DIR_PMP *size_MatC];
-		fPMMsource = &DC[DIR_PMM *size_MatC];
+		fP00source = &DC[DIR_P00 * numberOfLBnodesCoarse];
+		fM00source = &DC[DIR_M00 * numberOfLBnodesCoarse];
+		f0P0source = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+		f0M0source = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+		f00Psource = &DC[DIR_00P * numberOfLBnodesCoarse];
+		f00Msource = &DC[DIR_00M * numberOfLBnodesCoarse];
+		fPP0source = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+		fMM0source = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+		fPM0source = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+		fMP0source = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+		fP0Psource = &DC[DIR_P0P * numberOfLBnodesCoarse];
+		fM0Msource = &DC[DIR_M0M * numberOfLBnodesCoarse];
+		fP0Msource = &DC[DIR_P0M * numberOfLBnodesCoarse];
+		fM0Psource = &DC[DIR_M0P * numberOfLBnodesCoarse];
+		f0PPsource = &DC[DIR_0PP * numberOfLBnodesCoarse];
+		f0MMsource = &DC[DIR_0MM * numberOfLBnodesCoarse];
+		f0PMsource = &DC[DIR_0PM * numberOfLBnodesCoarse];
+		f0MPsource = &DC[DIR_0MP * numberOfLBnodesCoarse];
+		f000source = &DC[DIR_000 * numberOfLBnodesCoarse];
+		fMMMsource = &DC[DIR_MMM * numberOfLBnodesCoarse];
+		fMMPsource = &DC[DIR_MMP * numberOfLBnodesCoarse];
+		fMPPsource = &DC[DIR_MPP * numberOfLBnodesCoarse];
+		fMPMsource = &DC[DIR_MPM * numberOfLBnodesCoarse];
+		fPPMsource = &DC[DIR_PPM * numberOfLBnodesCoarse];
+		fPPPsource = &DC[DIR_PPP * numberOfLBnodesCoarse];
+		fPMPsource = &DC[DIR_PMP * numberOfLBnodesCoarse];
+		fPMMsource = &DC[DIR_PMM * numberOfLBnodesCoarse];
 	}
 	else
 	{
-		fP00source = &DC[DIR_M00   *size_MatC];
-		fM00source = &DC[DIR_P00   *size_MatC];
-		f0P0source = &DC[DIR_0M0   *size_MatC];
-		f0M0source = &DC[DIR_0P0   *size_MatC];
-		f00Psource = &DC[DIR_00M   *size_MatC];
-		f00Msource = &DC[DIR_00P   *size_MatC];
-		fPP0source = &DC[DIR_MM0  *size_MatC];
-		fMM0source = &DC[DIR_PP0  *size_MatC];
-		fPM0source = &DC[DIR_MP0  *size_MatC];
-		fMP0source = &DC[DIR_PM0  *size_MatC];
-		fP0Psource = &DC[DIR_M0M  *size_MatC];
-		fM0Msource = &DC[DIR_P0P  *size_MatC];
-		fP0Msource = &DC[DIR_M0P  *size_MatC];
-		fM0Psource = &DC[DIR_P0M  *size_MatC];
-		f0PPsource = &DC[DIR_0MM  *size_MatC];
-		f0MMsource = &DC[DIR_0PP  *size_MatC];
-		f0PMsource = &DC[DIR_0MP  *size_MatC];
-		f0MPsource = &DC[DIR_0PM  *size_MatC];
-		f000source = &DC[DIR_000*size_MatC];
-		fMMMsource = &DC[DIR_PPP *size_MatC];
-		fMMPsource = &DC[DIR_PPM *size_MatC];
-		fMPPsource = &DC[DIR_PMM *size_MatC];
-		fMPMsource = &DC[DIR_PMP *size_MatC];
-		fPPMsource = &DC[DIR_MMP *size_MatC];
-		fPPPsource = &DC[DIR_MMM *size_MatC];
-		fPMPsource = &DC[DIR_MPM *size_MatC];
-		fPMMsource = &DC[DIR_MPP *size_MatC];
+		fP00source = &DC[DIR_M00 * numberOfLBnodesCoarse];
+		fM00source = &DC[DIR_P00 * numberOfLBnodesCoarse];
+		f0P0source = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+		f0M0source = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+		f00Psource = &DC[DIR_00M * numberOfLBnodesCoarse];
+		f00Msource = &DC[DIR_00P * numberOfLBnodesCoarse];
+		fPP0source = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+		fMM0source = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+		fPM0source = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+		fMP0source = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+		fP0Psource = &DC[DIR_M0M * numberOfLBnodesCoarse];
+		fM0Msource = &DC[DIR_P0P * numberOfLBnodesCoarse];
+		fP0Msource = &DC[DIR_M0P * numberOfLBnodesCoarse];
+		fM0Psource = &DC[DIR_P0M * numberOfLBnodesCoarse];
+		f0PPsource = &DC[DIR_0MM * numberOfLBnodesCoarse];
+		f0MMsource = &DC[DIR_0PP * numberOfLBnodesCoarse];
+		f0PMsource = &DC[DIR_0MP * numberOfLBnodesCoarse];
+		f0MPsource = &DC[DIR_0PM * numberOfLBnodesCoarse];
+		f000source = &DC[DIR_000 * numberOfLBnodesCoarse];
+		fMMMsource = &DC[DIR_PPP * numberOfLBnodesCoarse];
+		fMMPsource = &DC[DIR_PPM * numberOfLBnodesCoarse];
+		fMPPsource = &DC[DIR_PMM * numberOfLBnodesCoarse];
+		fMPMsource = &DC[DIR_PMP * numberOfLBnodesCoarse];
+		fPPMsource = &DC[DIR_MMP * numberOfLBnodesCoarse];
+		fPPPsource = &DC[DIR_MMM * numberOfLBnodesCoarse];
+		fPMPsource = &DC[DIR_MPM * numberOfLBnodesCoarse];
+		fPMMsource = &DC[DIR_MPP * numberOfLBnodesCoarse];
 	}
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -4091,8 +4091,8 @@ __global__ void scaleCF_AA2016_comp_27(real* DC,
 												  unsigned int* neighborFX,
 												  unsigned int* neighborFY,
 												  unsigned int* neighborFZ,
-												  unsigned int size_MatC, 
-												  unsigned int size_MatF, 
+												  unsigned long long numberOfLBnodesCoarse, 
+												  unsigned long long numberOfLBnodesFine, 
 												  bool isEvenTimestep,
 												  unsigned int* posCSWB, 
 												  unsigned int* posFSWB, 
@@ -4109,96 +4109,96 @@ __global__ void scaleCF_AA2016_comp_27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -10974,8 +10974,8 @@ __global__ void scaleCF_RhoSq_3rdMom_comp_27(real* DC,
 														unsigned int* neighborFX,
 														unsigned int* neighborFY,
 														unsigned int* neighborFZ,
-														unsigned int size_MatC, 
-														unsigned int size_MatF, 
+														unsigned long long numberOfLBnodesCoarse, 
+														unsigned long long numberOfLBnodesFine, 
 														bool isEvenTimestep,
 														unsigned int* posCSWB, 
 														unsigned int* posFSWB, 
@@ -10992,96 +10992,96 @@ __global__ void scaleCF_RhoSq_3rdMom_comp_27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -17849,8 +17849,8 @@ __global__ void scaleCF_RhoSq_comp_27(real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posCSWB, 
 												 unsigned int* posFSWB, 
@@ -17867,96 +17867,96 @@ __global__ void scaleCF_RhoSq_comp_27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -22133,8 +22133,8 @@ __global__ void scaleCF_staggered_time_comp_27(   real* DC,
 															 unsigned int* neighborFX,
 															 unsigned int* neighborFY,
 															 unsigned int* neighborFZ,
-															 unsigned int size_MatC, 
-															 unsigned int size_MatF, 
+															 unsigned long long numberOfLBnodesCoarse, 
+															 unsigned long long numberOfLBnodesFine, 
 															 bool isEvenTimestep,
 															 unsigned int* posCSWB, 
 															 unsigned int* posFSWB, 
@@ -22151,96 +22151,96 @@ __global__ void scaleCF_staggered_time_comp_27(   real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -26369,8 +26369,8 @@ __global__ void scaleCF_Fix_comp_27(  real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posCSWB, 
 												 unsigned int* posFSWB, 
@@ -26387,96 +26387,96 @@ __global__ void scaleCF_Fix_comp_27(  real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -31136,8 +31136,8 @@ __global__ void scaleCF_NSPress_27(   real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posCSWB, 
 												 unsigned int* posFSWB, 
@@ -31154,96 +31154,96 @@ __global__ void scaleCF_NSPress_27(   real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -35080,8 +35080,8 @@ __global__ void scaleCF_Fix_27(   real* DC,
                                              unsigned int* neighborFX,
                                              unsigned int* neighborFY,
                                              unsigned int* neighborFZ,
-                                             unsigned int size_MatC, 
-                                             unsigned int size_MatF, 
+                                             unsigned long long numberOfLBnodesCoarse, 
+                                             unsigned long long numberOfLBnodesFine, 
                                              bool isEvenTimestep,
                                              unsigned int* posCSWB, 
                                              unsigned int* posFSWB, 
@@ -35098,96 +35098,96 @@ __global__ void scaleCF_Fix_27(   real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -39338,8 +39338,8 @@ __global__ void scaleCFpress27(   real* DC,
                                              unsigned int* neighborFX,
                                              unsigned int* neighborFY,
                                              unsigned int* neighborFZ,
-                                             unsigned int size_MatC, 
-                                             unsigned int size_MatF, 
+                                             unsigned long long numberOfLBnodesCoarse, 
+                                             unsigned long long numberOfLBnodesFine, 
                                              bool isEvenTimestep,
                                              unsigned int* posCSWB, 
                                              unsigned int* posFSWB, 
@@ -39356,96 +39356,96 @@ __global__ void scaleCFpress27(   real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -41012,8 +41012,8 @@ __global__ void scaleCFLast27( real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC, 
-                                          unsigned int size_MatF, 
+                                          unsigned long long numberOfLBnodesCoarse, 
+                                          unsigned long long numberOfLBnodesFine, 
                                           bool isEvenTimestep,
                                           unsigned int* posCSWB, 
                                           unsigned int* posFSWB, 
@@ -41030,96 +41030,96 @@ __global__ void scaleCFLast27( real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -43249,8 +43249,8 @@ __global__ void scaleCFThSMG7(    real* DC,
                                              unsigned int* neighborFX,
                                              unsigned int* neighborFY,
                                              unsigned int* neighborFZ,
-                                             unsigned int size_MatC, 
-                                             unsigned int size_MatF, 
+                                             unsigned long long numberOfLBnodesCoarse, 
+                                             unsigned long long numberOfLBnodesFine, 
                                              bool isEvenTimestep,
                                              unsigned int* posCSWB, 
                                              unsigned int* posFSWB, 
@@ -43261,128 +43261,128 @@ __global__ void scaleCFThSMG7(    real* DC,
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, /**fzeroF,*/ *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   //fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   //fzeroF = &DF[DIR_000 * size_MatF];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, //*fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      //fzeroC = &DC[DIR_000 * size_MatC];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      //fzeroC = &DC[DIR_000 * size_MatC];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
 
    Distributions7 D7F;
-   D7F.f[0] = &DD7F[0*size_MatF];
-   D7F.f[1] = &DD7F[1*size_MatF];
-   D7F.f[2] = &DD7F[2*size_MatF];
-   D7F.f[3] = &DD7F[3*size_MatF];
-   D7F.f[4] = &DD7F[4*size_MatF];
-   D7F.f[5] = &DD7F[5*size_MatF];
-   D7F.f[6] = &DD7F[6*size_MatF];
+   D7F.f[0] = &DD7F[0*numberOfLBnodesFine];
+   D7F.f[1] = &DD7F[1*numberOfLBnodesFine];
+   D7F.f[2] = &DD7F[2*numberOfLBnodesFine];
+   D7F.f[3] = &DD7F[3*numberOfLBnodesFine];
+   D7F.f[4] = &DD7F[4*numberOfLBnodesFine];
+   D7F.f[5] = &DD7F[5*numberOfLBnodesFine];
+   D7F.f[6] = &DD7F[6*numberOfLBnodesFine];
                       
    Distributions7 D7C;
    if (isEvenTimestep==true)
    {
-      D7C.f[0] = &DD7C[0*size_MatC];
-      D7C.f[1] = &DD7C[1*size_MatC];
-      D7C.f[2] = &DD7C[2*size_MatC];
-      D7C.f[3] = &DD7C[3*size_MatC];
-      D7C.f[4] = &DD7C[4*size_MatC];
-      D7C.f[5] = &DD7C[5*size_MatC];
-      D7C.f[6] = &DD7C[6*size_MatC];
+      D7C.f[0] = &DD7C[0*numberOfLBnodesCoarse];
+      D7C.f[1] = &DD7C[1*numberOfLBnodesCoarse];
+      D7C.f[2] = &DD7C[2*numberOfLBnodesCoarse];
+      D7C.f[3] = &DD7C[3*numberOfLBnodesCoarse];
+      D7C.f[4] = &DD7C[4*numberOfLBnodesCoarse];
+      D7C.f[5] = &DD7C[5*numberOfLBnodesCoarse];
+      D7C.f[6] = &DD7C[6*numberOfLBnodesCoarse];
    }
    else
    {
-      D7C.f[0] = &DD7C[0*size_MatC];
-      D7C.f[2] = &DD7C[1*size_MatC];
-      D7C.f[1] = &DD7C[2*size_MatC];
-      D7C.f[4] = &DD7C[3*size_MatC];
-      D7C.f[3] = &DD7C[4*size_MatC];
-      D7C.f[6] = &DD7C[5*size_MatC];
-      D7C.f[5] = &DD7C[6*size_MatC];
+      D7C.f[0] = &DD7C[0*numberOfLBnodesCoarse];
+      D7C.f[2] = &DD7C[1*numberOfLBnodesCoarse];
+      D7C.f[1] = &DD7C[2*numberOfLBnodesCoarse];
+      D7C.f[4] = &DD7C[3*numberOfLBnodesCoarse];
+      D7C.f[3] = &DD7C[4*numberOfLBnodesCoarse];
+      D7C.f[6] = &DD7C[5*numberOfLBnodesCoarse];
+      D7C.f[5] = &DD7C[6*numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -44476,8 +44476,8 @@ __global__ void scaleCFThS7(   real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC, 
-                                          unsigned int size_MatF, 
+                                          unsigned long long numberOfLBnodesCoarse, 
+                                          unsigned long long numberOfLBnodesFine, 
                                           bool isEvenTimestep,
                                           unsigned int* posCSWB, 
                                           unsigned int* posFSWB, 
@@ -44487,128 +44487,128 @@ __global__ void scaleCFThS7(   real* DC,
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, /**fzeroF,*/ *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   //fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   //fzeroF = &DF[DIR_000 * size_MatF];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, //*fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      //fzeroC = &DC[DIR_000 * size_MatC];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      //fzeroC = &DC[DIR_000 * size_MatC];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
 
    Distributions7 D7F;
-   D7F.f[0] = &DD7F[0*size_MatF];
-   D7F.f[1] = &DD7F[1*size_MatF];
-   D7F.f[2] = &DD7F[2*size_MatF];
-   D7F.f[3] = &DD7F[3*size_MatF];
-   D7F.f[4] = &DD7F[4*size_MatF];
-   D7F.f[5] = &DD7F[5*size_MatF];
-   D7F.f[6] = &DD7F[6*size_MatF];
+   D7F.f[0] = &DD7F[0*numberOfLBnodesFine];
+   D7F.f[1] = &DD7F[1*numberOfLBnodesFine];
+   D7F.f[2] = &DD7F[2*numberOfLBnodesFine];
+   D7F.f[3] = &DD7F[3*numberOfLBnodesFine];
+   D7F.f[4] = &DD7F[4*numberOfLBnodesFine];
+   D7F.f[5] = &DD7F[5*numberOfLBnodesFine];
+   D7F.f[6] = &DD7F[6*numberOfLBnodesFine];
                       
    Distributions7 D7C;
    if (isEvenTimestep==true)
    {
-      D7C.f[0] = &DD7C[0*size_MatC];
-      D7C.f[1] = &DD7C[1*size_MatC];
-      D7C.f[2] = &DD7C[2*size_MatC];
-      D7C.f[3] = &DD7C[3*size_MatC];
-      D7C.f[4] = &DD7C[4*size_MatC];
-      D7C.f[5] = &DD7C[5*size_MatC];
-      D7C.f[6] = &DD7C[6*size_MatC];
+      D7C.f[0] = &DD7C[0*numberOfLBnodesCoarse];
+      D7C.f[1] = &DD7C[1*numberOfLBnodesCoarse];
+      D7C.f[2] = &DD7C[2*numberOfLBnodesCoarse];
+      D7C.f[3] = &DD7C[3*numberOfLBnodesCoarse];
+      D7C.f[4] = &DD7C[4*numberOfLBnodesCoarse];
+      D7C.f[5] = &DD7C[5*numberOfLBnodesCoarse];
+      D7C.f[6] = &DD7C[6*numberOfLBnodesCoarse];
    }
    else
    {
-      D7C.f[0] = &DD7C[0*size_MatC];
-      D7C.f[2] = &DD7C[1*size_MatC];
-      D7C.f[1] = &DD7C[2*size_MatC];
-      D7C.f[4] = &DD7C[3*size_MatC];
-      D7C.f[3] = &DD7C[4*size_MatC];
-      D7C.f[6] = &DD7C[5*size_MatC];
-      D7C.f[5] = &DD7C[6*size_MatC];
+      D7C.f[0] = &DD7C[0*numberOfLBnodesCoarse];
+      D7C.f[2] = &DD7C[1*numberOfLBnodesCoarse];
+      D7C.f[1] = &DD7C[2*numberOfLBnodesCoarse];
+      D7C.f[4] = &DD7C[3*numberOfLBnodesCoarse];
+      D7C.f[3] = &DD7C[4*numberOfLBnodesCoarse];
+      D7C.f[6] = &DD7C[5*numberOfLBnodesCoarse];
+      D7C.f[5] = &DD7C[6*numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -45599,8 +45599,8 @@ __global__ void scaleCFThS27(     real* DC,
                                              unsigned int* neighborFX,
                                              unsigned int* neighborFY,
                                              unsigned int* neighborFZ,
-                                             unsigned int size_MatC, 
-                                             unsigned int size_MatF, 
+                                             unsigned long long numberOfLBnodesCoarse, 
+                                             unsigned long long numberOfLBnodesFine, 
                                              bool isEvenTimestep,
                                              unsigned int* posCSWB, 
                                              unsigned int* posFSWB, 
@@ -45611,188 +45611,188 @@ __global__ void scaleCFThS27(     real* DC,
 {
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, /**fzeroF,*/ *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   //fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   //fzeroF = &DF[DIR_000 * size_MatF];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, //*fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      //fzeroC = &DC[DIR_000 * size_MatC];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      //fzeroC = &DC[DIR_000 * size_MatC];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
 
    Distributions27 D27F;
-   D27F.f[DIR_P00   ] = &DD27F[DIR_P00   *size_MatF];
-   D27F.f[DIR_M00   ] = &DD27F[DIR_M00   *size_MatF];
-   D27F.f[DIR_0P0   ] = &DD27F[DIR_0P0   *size_MatF];
-   D27F.f[DIR_0M0   ] = &DD27F[DIR_0M0   *size_MatF];
-   D27F.f[DIR_00P   ] = &DD27F[DIR_00P   *size_MatF];
-   D27F.f[DIR_00M   ] = &DD27F[DIR_00M   *size_MatF];
-   D27F.f[DIR_PP0  ] = &DD27F[DIR_PP0  *size_MatF];
-   D27F.f[DIR_MM0  ] = &DD27F[DIR_MM0  *size_MatF];
-   D27F.f[DIR_PM0  ] = &DD27F[DIR_PM0  *size_MatF];
-   D27F.f[DIR_MP0  ] = &DD27F[DIR_MP0  *size_MatF];
-   D27F.f[DIR_P0P  ] = &DD27F[DIR_P0P  *size_MatF];
-   D27F.f[DIR_M0M  ] = &DD27F[DIR_M0M  *size_MatF];
-   D27F.f[DIR_P0M  ] = &DD27F[DIR_P0M  *size_MatF];
-   D27F.f[DIR_M0P  ] = &DD27F[DIR_M0P  *size_MatF];
-   D27F.f[DIR_0PP  ] = &DD27F[DIR_0PP  *size_MatF];
-   D27F.f[DIR_0MM  ] = &DD27F[DIR_0MM  *size_MatF];
-   D27F.f[DIR_0PM  ] = &DD27F[DIR_0PM  *size_MatF];
-   D27F.f[DIR_0MP  ] = &DD27F[DIR_0MP  *size_MatF];
-   D27F.f[DIR_000] = &DD27F[DIR_000*size_MatF];
-   D27F.f[DIR_PPP ] = &DD27F[DIR_PPP *size_MatF];
-   D27F.f[DIR_MMP ] = &DD27F[DIR_MMP *size_MatF];
-   D27F.f[DIR_PMP ] = &DD27F[DIR_PMP *size_MatF];
-   D27F.f[DIR_MPP ] = &DD27F[DIR_MPP *size_MatF];
-   D27F.f[DIR_PPM ] = &DD27F[DIR_PPM *size_MatF];
-   D27F.f[DIR_MMM ] = &DD27F[DIR_MMM *size_MatF];
-   D27F.f[DIR_PMM ] = &DD27F[DIR_PMM *size_MatF];
-   D27F.f[DIR_MPM ] = &DD27F[DIR_MPM *size_MatF];
+   D27F.f[DIR_P00] = &DD27F[DIR_P00 * numberOfLBnodesFine];
+   D27F.f[DIR_M00] = &DD27F[DIR_M00 * numberOfLBnodesFine];
+   D27F.f[DIR_0P0] = &DD27F[DIR_0P0 * numberOfLBnodesFine];
+   D27F.f[DIR_0M0] = &DD27F[DIR_0M0 * numberOfLBnodesFine];
+   D27F.f[DIR_00P] = &DD27F[DIR_00P * numberOfLBnodesFine];
+   D27F.f[DIR_00M] = &DD27F[DIR_00M * numberOfLBnodesFine];
+   D27F.f[DIR_PP0] = &DD27F[DIR_PP0 * numberOfLBnodesFine];
+   D27F.f[DIR_MM0] = &DD27F[DIR_MM0 * numberOfLBnodesFine];
+   D27F.f[DIR_PM0] = &DD27F[DIR_PM0 * numberOfLBnodesFine];
+   D27F.f[DIR_MP0] = &DD27F[DIR_MP0 * numberOfLBnodesFine];
+   D27F.f[DIR_P0P] = &DD27F[DIR_P0P * numberOfLBnodesFine];
+   D27F.f[DIR_M0M] = &DD27F[DIR_M0M * numberOfLBnodesFine];
+   D27F.f[DIR_P0M] = &DD27F[DIR_P0M * numberOfLBnodesFine];
+   D27F.f[DIR_M0P] = &DD27F[DIR_M0P * numberOfLBnodesFine];
+   D27F.f[DIR_0PP] = &DD27F[DIR_0PP * numberOfLBnodesFine];
+   D27F.f[DIR_0MM] = &DD27F[DIR_0MM * numberOfLBnodesFine];
+   D27F.f[DIR_0PM] = &DD27F[DIR_0PM * numberOfLBnodesFine];
+   D27F.f[DIR_0MP] = &DD27F[DIR_0MP * numberOfLBnodesFine];
+   D27F.f[DIR_000] = &DD27F[DIR_000 * numberOfLBnodesFine];
+   D27F.f[DIR_PPP] = &DD27F[DIR_PPP * numberOfLBnodesFine];
+   D27F.f[DIR_MMP] = &DD27F[DIR_MMP * numberOfLBnodesFine];
+   D27F.f[DIR_PMP] = &DD27F[DIR_PMP * numberOfLBnodesFine];
+   D27F.f[DIR_MPP] = &DD27F[DIR_MPP * numberOfLBnodesFine];
+   D27F.f[DIR_PPM] = &DD27F[DIR_PPM * numberOfLBnodesFine];
+   D27F.f[DIR_MMM] = &DD27F[DIR_MMM * numberOfLBnodesFine];
+   D27F.f[DIR_PMM] = &DD27F[DIR_PMM * numberOfLBnodesFine];
+   D27F.f[DIR_MPM] = &DD27F[DIR_MPM * numberOfLBnodesFine];
 
    Distributions27 D27C;
    if (isEvenTimestep==true)
    {
-      D27C.f[DIR_P00   ] = &DD27C[DIR_P00   *size_MatC];
-      D27C.f[DIR_M00   ] = &DD27C[DIR_M00   *size_MatC];
-      D27C.f[DIR_0P0   ] = &DD27C[DIR_0P0   *size_MatC];
-      D27C.f[DIR_0M0   ] = &DD27C[DIR_0M0   *size_MatC];
-      D27C.f[DIR_00P   ] = &DD27C[DIR_00P   *size_MatC];
-      D27C.f[DIR_00M   ] = &DD27C[DIR_00M   *size_MatC];
-      D27C.f[DIR_PP0  ] = &DD27C[DIR_PP0  *size_MatC];
-      D27C.f[DIR_MM0  ] = &DD27C[DIR_MM0  *size_MatC];
-      D27C.f[DIR_PM0  ] = &DD27C[DIR_PM0  *size_MatC];
-      D27C.f[DIR_MP0  ] = &DD27C[DIR_MP0  *size_MatC];
-      D27C.f[DIR_P0P  ] = &DD27C[DIR_P0P  *size_MatC];
-      D27C.f[DIR_M0M  ] = &DD27C[DIR_M0M  *size_MatC];
-      D27C.f[DIR_P0M  ] = &DD27C[DIR_P0M  *size_MatC];
-      D27C.f[DIR_M0P  ] = &DD27C[DIR_M0P  *size_MatC];
-      D27C.f[DIR_0PP  ] = &DD27C[DIR_0PP  *size_MatC];
-      D27C.f[DIR_0MM  ] = &DD27C[DIR_0MM  *size_MatC];
-      D27C.f[DIR_0PM  ] = &DD27C[DIR_0PM  *size_MatC];
-      D27C.f[DIR_0MP  ] = &DD27C[DIR_0MP  *size_MatC];
-      D27C.f[DIR_000] = &DD27C[DIR_000*size_MatC];
-      D27C.f[DIR_PPP ] = &DD27C[DIR_PPP *size_MatC];
-      D27C.f[DIR_MMP ] = &DD27C[DIR_MMP *size_MatC];
-      D27C.f[DIR_PMP ] = &DD27C[DIR_PMP *size_MatC];
-      D27C.f[DIR_MPP ] = &DD27C[DIR_MPP *size_MatC];
-      D27C.f[DIR_PPM ] = &DD27C[DIR_PPM *size_MatC];
-      D27C.f[DIR_MMM ] = &DD27C[DIR_MMM *size_MatC];
-      D27C.f[DIR_PMM ] = &DD27C[DIR_PMM *size_MatC];
-      D27C.f[DIR_MPM ] = &DD27C[DIR_MPM *size_MatC];
+      D27C.f[DIR_P00] = &DD27C[DIR_P00 * numberOfLBnodesCoarse];
+      D27C.f[DIR_M00] = &DD27C[DIR_M00 * numberOfLBnodesCoarse];
+      D27C.f[DIR_0P0] = &DD27C[DIR_0P0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_0M0] = &DD27C[DIR_0M0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_00P] = &DD27C[DIR_00P * numberOfLBnodesCoarse];
+      D27C.f[DIR_00M] = &DD27C[DIR_00M * numberOfLBnodesCoarse];
+      D27C.f[DIR_PP0] = &DD27C[DIR_PP0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_MM0] = &DD27C[DIR_MM0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_PM0] = &DD27C[DIR_PM0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_MP0] = &DD27C[DIR_MP0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_P0P] = &DD27C[DIR_P0P * numberOfLBnodesCoarse];
+      D27C.f[DIR_M0M] = &DD27C[DIR_M0M * numberOfLBnodesCoarse];
+      D27C.f[DIR_P0M] = &DD27C[DIR_P0M * numberOfLBnodesCoarse];
+      D27C.f[DIR_M0P] = &DD27C[DIR_M0P * numberOfLBnodesCoarse];
+      D27C.f[DIR_0PP] = &DD27C[DIR_0PP * numberOfLBnodesCoarse];
+      D27C.f[DIR_0MM] = &DD27C[DIR_0MM * numberOfLBnodesCoarse];
+      D27C.f[DIR_0PM] = &DD27C[DIR_0PM * numberOfLBnodesCoarse];
+      D27C.f[DIR_0MP] = &DD27C[DIR_0MP * numberOfLBnodesCoarse];
+      D27C.f[DIR_000] = &DD27C[DIR_000 * numberOfLBnodesCoarse];
+      D27C.f[DIR_PPP] = &DD27C[DIR_PPP * numberOfLBnodesCoarse];
+      D27C.f[DIR_MMP] = &DD27C[DIR_MMP * numberOfLBnodesCoarse];
+      D27C.f[DIR_PMP] = &DD27C[DIR_PMP * numberOfLBnodesCoarse];
+      D27C.f[DIR_MPP] = &DD27C[DIR_MPP * numberOfLBnodesCoarse];
+      D27C.f[DIR_PPM] = &DD27C[DIR_PPM * numberOfLBnodesCoarse];
+      D27C.f[DIR_MMM] = &DD27C[DIR_MMM * numberOfLBnodesCoarse];
+      D27C.f[DIR_PMM] = &DD27C[DIR_PMM * numberOfLBnodesCoarse];
+      D27C.f[DIR_MPM] = &DD27C[DIR_MPM * numberOfLBnodesCoarse];
    }
    else
    {
-      D27C.f[DIR_M00   ] = &DD27C[DIR_P00   *size_MatC];
-      D27C.f[DIR_P00   ] = &DD27C[DIR_M00   *size_MatC];
-      D27C.f[DIR_0M0   ] = &DD27C[DIR_0P0   *size_MatC];
-      D27C.f[DIR_0P0   ] = &DD27C[DIR_0M0   *size_MatC];
-      D27C.f[DIR_00M   ] = &DD27C[DIR_00P   *size_MatC];
-      D27C.f[DIR_00P   ] = &DD27C[DIR_00M   *size_MatC];
-      D27C.f[DIR_MM0  ] = &DD27C[DIR_PP0  *size_MatC];
-      D27C.f[DIR_PP0  ] = &DD27C[DIR_MM0  *size_MatC];
-      D27C.f[DIR_MP0  ] = &DD27C[DIR_PM0  *size_MatC];
-      D27C.f[DIR_PM0  ] = &DD27C[DIR_MP0  *size_MatC];
-      D27C.f[DIR_M0M  ] = &DD27C[DIR_P0P  *size_MatC];
-      D27C.f[DIR_P0P  ] = &DD27C[DIR_M0M  *size_MatC];
-      D27C.f[DIR_M0P  ] = &DD27C[DIR_P0M  *size_MatC];
-      D27C.f[DIR_P0M  ] = &DD27C[DIR_M0P  *size_MatC];
-      D27C.f[DIR_0MM  ] = &DD27C[DIR_0PP  *size_MatC];
-      D27C.f[DIR_0PP  ] = &DD27C[DIR_0MM  *size_MatC];
-      D27C.f[DIR_0MP  ] = &DD27C[DIR_0PM  *size_MatC];
-      D27C.f[DIR_0PM  ] = &DD27C[DIR_0MP  *size_MatC];
-      D27C.f[DIR_000] = &DD27C[DIR_000*size_MatC];
-      D27C.f[DIR_MMM ] = &DD27C[DIR_PPP *size_MatC];
-      D27C.f[DIR_PPM ] = &DD27C[DIR_MMP *size_MatC];
-      D27C.f[DIR_MPM ] = &DD27C[DIR_PMP *size_MatC];
-      D27C.f[DIR_PMM ] = &DD27C[DIR_MPP *size_MatC];
-      D27C.f[DIR_MMP ] = &DD27C[DIR_PPM *size_MatC];
-      D27C.f[DIR_PPP ] = &DD27C[DIR_MMM *size_MatC];
-      D27C.f[DIR_MPP ] = &DD27C[DIR_PMM *size_MatC];
-      D27C.f[DIR_PMP ] = &DD27C[DIR_MPM *size_MatC];
+      D27C.f[DIR_M00] = &DD27C[DIR_P00 * numberOfLBnodesCoarse];
+      D27C.f[DIR_P00] = &DD27C[DIR_M00 * numberOfLBnodesCoarse];
+      D27C.f[DIR_0M0] = &DD27C[DIR_0P0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_0P0] = &DD27C[DIR_0M0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_00M] = &DD27C[DIR_00P * numberOfLBnodesCoarse];
+      D27C.f[DIR_00P] = &DD27C[DIR_00M * numberOfLBnodesCoarse];
+      D27C.f[DIR_MM0] = &DD27C[DIR_PP0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_PP0] = &DD27C[DIR_MM0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_MP0] = &DD27C[DIR_PM0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_PM0] = &DD27C[DIR_MP0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_M0M] = &DD27C[DIR_P0P * numberOfLBnodesCoarse];
+      D27C.f[DIR_P0P] = &DD27C[DIR_M0M * numberOfLBnodesCoarse];
+      D27C.f[DIR_M0P] = &DD27C[DIR_P0M * numberOfLBnodesCoarse];
+      D27C.f[DIR_P0M] = &DD27C[DIR_M0P * numberOfLBnodesCoarse];
+      D27C.f[DIR_0MM] = &DD27C[DIR_0PP * numberOfLBnodesCoarse];
+      D27C.f[DIR_0PP] = &DD27C[DIR_0MM * numberOfLBnodesCoarse];
+      D27C.f[DIR_0MP] = &DD27C[DIR_0PM * numberOfLBnodesCoarse];
+      D27C.f[DIR_0PM] = &DD27C[DIR_0MP * numberOfLBnodesCoarse];
+      D27C.f[DIR_000] = &DD27C[DIR_000 * numberOfLBnodesCoarse];
+      D27C.f[DIR_MMM] = &DD27C[DIR_PPP * numberOfLBnodesCoarse];
+      D27C.f[DIR_PPM] = &DD27C[DIR_MMP * numberOfLBnodesCoarse];
+      D27C.f[DIR_MPM] = &DD27C[DIR_PMP * numberOfLBnodesCoarse];
+      D27C.f[DIR_PMM] = &DD27C[DIR_MPP * numberOfLBnodesCoarse];
+      D27C.f[DIR_MMP] = &DD27C[DIR_PPM * numberOfLBnodesCoarse];
+      D27C.f[DIR_PPP] = &DD27C[DIR_MMM * numberOfLBnodesCoarse];
+      D27C.f[DIR_MPP] = &DD27C[DIR_PMM * numberOfLBnodesCoarse];
+      D27C.f[DIR_PMP] = &DD27C[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -45892,33 +45892,33 @@ __global__ void scaleCFThS27(     real* DC,
       f_BSE  = fbseC[kbs];
       f_BNW  = fbnwC[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27C.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27C.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27C.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27C.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27C.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27C.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27C.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27C.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27C.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27C.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27C.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27C.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27C.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27C.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27C.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27C.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27C.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27C.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27C.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27C.f[DIR_M00])[kw   ];
+      f27N    =  (D27C.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27C.f[DIR_0M0])[ks   ];
+      f27T    =  (D27C.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27C.f[DIR_00M])[kb   ];
+      f27NE   =  (D27C.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27C.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27C.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27C.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27C.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27C.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27C.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27C.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27C.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27C.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27C.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27C.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27C.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27C.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27C.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27C.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27C.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27C.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27C.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27C.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27C.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27C.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27C.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27C.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27C.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27C.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27C.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27C.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27C.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_C_SWB = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -45979,33 +45979,33 @@ __global__ void scaleCFThS27(     real* DC,
       f_BSE  = fbseC[kbs];
       f_BNW  = fbnwC[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27C.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27C.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27C.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27C.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27C.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27C.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27C.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27C.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27C.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27C.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27C.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27C.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27C.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27C.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27C.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27C.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27C.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27C.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27C.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27C.f[DIR_M00])[kw   ];
+      f27N    =  (D27C.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27C.f[DIR_0M0])[ks   ];
+      f27T    =  (D27C.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27C.f[DIR_00M])[kb   ];
+      f27NE   =  (D27C.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27C.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27C.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27C.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27C.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27C.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27C.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27C.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27C.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27C.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27C.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27C.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27C.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27C.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27C.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27C.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27C.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27C.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27C.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27C.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27C.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27C.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27C.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27C.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27C.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27C.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27C.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27C.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27C.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_C_SWT = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -46066,33 +46066,33 @@ __global__ void scaleCFThS27(     real* DC,
       f_BSE  = fbseC[kbs];
       f_BNW  = fbnwC[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27C.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27C.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27C.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27C.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27C.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27C.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27C.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27C.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27C.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27C.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27C.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27C.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27C.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27C.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27C.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27C.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27C.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27C.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27C.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27C.f[DIR_M00])[kw   ];
+      f27N    =  (D27C.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27C.f[DIR_0M0])[ks   ];
+      f27T    =  (D27C.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27C.f[DIR_00M])[kb   ];
+      f27NE   =  (D27C.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27C.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27C.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27C.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27C.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27C.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27C.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27C.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27C.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27C.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27C.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27C.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27C.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27C.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27C.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27C.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27C.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27C.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27C.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27C.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27C.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27C.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27C.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27C.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27C.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27C.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27C.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27C.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27C.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_C_SET = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -46153,33 +46153,33 @@ __global__ void scaleCFThS27(     real* DC,
       f_BSE  = fbseC[kbs];
       f_BNW  = fbnwC[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27C.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27C.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27C.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27C.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27C.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27C.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27C.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27C.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27C.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27C.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27C.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27C.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27C.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27C.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27C.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27C.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27C.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27C.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27C.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27C.f[DIR_M00])[kw   ];
+      f27N    =  (D27C.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27C.f[DIR_0M0])[ks   ];
+      f27T    =  (D27C.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27C.f[DIR_00M])[kb   ];
+      f27NE   =  (D27C.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27C.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27C.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27C.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27C.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27C.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27C.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27C.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27C.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27C.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27C.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27C.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27C.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27C.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27C.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27C.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27C.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27C.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27C.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27C.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27C.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27C.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27C.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27C.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27C.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27C.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27C.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27C.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27C.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_C_SEB = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -46250,33 +46250,33 @@ __global__ void scaleCFThS27(     real* DC,
       f_BSE  = fbseC[kbs];
       f_BNW  = fbnwC[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27C.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27C.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27C.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27C.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27C.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27C.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27C.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27C.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27C.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27C.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27C.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27C.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27C.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27C.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27C.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27C.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27C.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27C.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27C.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27C.f[DIR_M00])[kw   ];
+      f27N    =  (D27C.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27C.f[DIR_0M0])[ks   ];
+      f27T    =  (D27C.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27C.f[DIR_00M])[kb   ];
+      f27NE   =  (D27C.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27C.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27C.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27C.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27C.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27C.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27C.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27C.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27C.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27C.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27C.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27C.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27C.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27C.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27C.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27C.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27C.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27C.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27C.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27C.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27C.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27C.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27C.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27C.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27C.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27C.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27C.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27C.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27C.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_C_NWB = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -46337,33 +46337,33 @@ __global__ void scaleCFThS27(     real* DC,
       f_BSE  = fbseC[kbs];
       f_BNW  = fbnwC[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27C.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27C.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27C.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27C.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27C.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27C.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27C.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27C.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27C.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27C.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27C.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27C.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27C.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27C.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27C.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27C.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27C.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27C.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27C.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27C.f[DIR_M00])[kw   ];
+      f27N    =  (D27C.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27C.f[DIR_0M0])[ks   ];
+      f27T    =  (D27C.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27C.f[DIR_00M])[kb   ];
+      f27NE   =  (D27C.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27C.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27C.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27C.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27C.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27C.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27C.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27C.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27C.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27C.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27C.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27C.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27C.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27C.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27C.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27C.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27C.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27C.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27C.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27C.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27C.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27C.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27C.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27C.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27C.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27C.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27C.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27C.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27C.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_C_NWT = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -46424,33 +46424,33 @@ __global__ void scaleCFThS27(     real* DC,
       f_BSE  = fbseC[kbs];
       f_BNW  = fbnwC[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27C.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27C.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27C.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27C.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27C.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27C.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27C.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27C.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27C.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27C.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27C.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27C.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27C.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27C.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27C.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27C.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27C.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27C.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27C.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27C.f[DIR_M00])[kw   ];
+      f27N    =  (D27C.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27C.f[DIR_0M0])[ks   ];
+      f27T    =  (D27C.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27C.f[DIR_00M])[kb   ];
+      f27NE   =  (D27C.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27C.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27C.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27C.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27C.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27C.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27C.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27C.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27C.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27C.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27C.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27C.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27C.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27C.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27C.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27C.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27C.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27C.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27C.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27C.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27C.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27C.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27C.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27C.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27C.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27C.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27C.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27C.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27C.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_C_NET = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -46511,33 +46511,33 @@ __global__ void scaleCFThS27(     real* DC,
       f_BSE  = fbseC[kbs];
       f_BNW  = fbnwC[kbw];
       ////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27C.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27C.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27C.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27C.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27C.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27C.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27C.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27C.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27C.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27C.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27C.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27C.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27C.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27C.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27C.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27C.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27C.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27C.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27C.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27C.f[DIR_M00])[kw   ];
+      f27N    =  (D27C.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27C.f[DIR_0M0])[ks   ];
+      f27T    =  (D27C.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27C.f[DIR_00M])[kb   ];
+      f27NE   =  (D27C.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27C.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27C.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27C.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27C.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27C.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27C.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27C.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27C.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27C.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27C.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27C.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27C.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27C.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27C.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27C.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27C.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27C.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27C.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27C.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27C.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27C.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27C.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27C.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27C.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27C.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27C.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27C.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27C.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_C_NEB = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -46656,32 +46656,32 @@ __global__ void scaleCFThS27(     real* DC,
       cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D27F.f[DIR_000])[kzero] =   c8o27* Conc_F*(c1o1-cu_sq);
-      (D27F.f[DIR_P00   ])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
-      (D27F.f[DIR_M00   ])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
-      (D27F.f[DIR_0P0   ])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
-      (D27F.f[DIR_0M0   ])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
-      (D27F.f[DIR_00P   ])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
-      (D27F.f[DIR_00M   ])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
-      (D27F.f[DIR_PP0  ])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_MM0  ])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_PM0  ])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_MP0  ])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_P0P  ])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_M0M  ])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_P0M  ])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_M0P  ])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_0PP  ])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
-      (D27F.f[DIR_0MM  ])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0PM  ])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0MP  ])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PPP ])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MMM ])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PPM ])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MMP ])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PMP ])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MPM ])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PMM ])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MPP ])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_P00])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
+      (D27F.f[DIR_M00])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
+      (D27F.f[DIR_0P0])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
+      (D27F.f[DIR_0M0])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
+      (D27F.f[DIR_00P])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
+      (D27F.f[DIR_00M])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
+      (D27F.f[DIR_PP0])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_MM0])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_PM0])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_MP0])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_P0P])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_M0M])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_P0M])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_M0P])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_0PP])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
+      (D27F.f[DIR_0MM])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0PM])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0MP])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PPP])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MMM])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PPM])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MMP])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PMP])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MPM])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PMM])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MPP])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
 
 
 
@@ -46734,32 +46734,32 @@ __global__ void scaleCFThS27(     real* DC,
       cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D27F.f[DIR_000])[kzero] =   c8o27* Conc_F*(c1o1-cu_sq);
-      (D27F.f[DIR_P00   ])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
-      (D27F.f[DIR_M00   ])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
-      (D27F.f[DIR_0P0   ])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
-      (D27F.f[DIR_0M0   ])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
-      (D27F.f[DIR_00P   ])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
-      (D27F.f[DIR_00M   ])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
-      (D27F.f[DIR_PP0  ])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_MM0  ])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_PM0  ])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_MP0  ])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_P0P  ])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_M0M  ])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_P0M  ])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_M0P  ])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_0PP  ])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
-      (D27F.f[DIR_0MM  ])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0PM  ])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0MP  ])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PPP ])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MMM ])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PPM ])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MMP ])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PMP ])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MPM ])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PMM ])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MPP ])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_P00])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
+      (D27F.f[DIR_M00])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
+      (D27F.f[DIR_0P0])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
+      (D27F.f[DIR_0M0])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
+      (D27F.f[DIR_00P])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
+      (D27F.f[DIR_00M])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
+      (D27F.f[DIR_PP0])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_MM0])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_PM0])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_MP0])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_P0P])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_M0M])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_P0M])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_M0P])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_0PP])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
+      (D27F.f[DIR_0MM])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0PM])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0MP])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PPP])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MMM])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PPM])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MMP])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PMP])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MPM])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PMM])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MPP])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
 
 
 
@@ -46812,32 +46812,32 @@ __global__ void scaleCFThS27(     real* DC,
       cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D27F.f[DIR_000])[kzero] =   c8o27* Conc_F*(c1o1-cu_sq);
-      (D27F.f[DIR_P00   ])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
-      (D27F.f[DIR_M00   ])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
-      (D27F.f[DIR_0P0   ])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
-      (D27F.f[DIR_0M0   ])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
-      (D27F.f[DIR_00P   ])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
-      (D27F.f[DIR_00M   ])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
-      (D27F.f[DIR_PP0  ])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_MM0  ])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_PM0  ])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_MP0  ])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_P0P  ])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_M0M  ])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_P0M  ])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_M0P  ])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_0PP  ])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
-      (D27F.f[DIR_0MM  ])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0PM  ])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0MP  ])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PPP ])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MMM ])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PPM ])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MMP ])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PMP ])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MPM ])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PMM ])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MPP ])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_P00])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
+      (D27F.f[DIR_M00])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
+      (D27F.f[DIR_0P0])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
+      (D27F.f[DIR_0M0])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
+      (D27F.f[DIR_00P])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
+      (D27F.f[DIR_00M])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
+      (D27F.f[DIR_PP0])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_MM0])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_PM0])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_MP0])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_P0P])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_M0M])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_P0M])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_M0P])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_0PP])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
+      (D27F.f[DIR_0MM])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0PM])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0MP])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PPP])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MMM])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PPM])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MMP])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PMP])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MPM])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PMM])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MPP])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
 
 
 
@@ -46890,32 +46890,32 @@ __global__ void scaleCFThS27(     real* DC,
       cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D27F.f[DIR_000])[kzero] =   c8o27* Conc_F*(c1o1-cu_sq);
-      (D27F.f[DIR_P00   ])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
-      (D27F.f[DIR_M00   ])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
-      (D27F.f[DIR_0P0   ])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
-      (D27F.f[DIR_0M0   ])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
-      (D27F.f[DIR_00P   ])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
-      (D27F.f[DIR_00M   ])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
-      (D27F.f[DIR_PP0  ])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_MM0  ])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_PM0  ])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_MP0  ])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_P0P  ])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_M0M  ])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_P0M  ])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_M0P  ])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_0PP  ])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
-      (D27F.f[DIR_0MM  ])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0PM  ])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0MP  ])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PPP ])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MMM ])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PPM ])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MMP ])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PMP ])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MPM ])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PMM ])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MPP ])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_P00])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
+      (D27F.f[DIR_M00])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
+      (D27F.f[DIR_0P0])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
+      (D27F.f[DIR_0M0])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
+      (D27F.f[DIR_00P])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
+      (D27F.f[DIR_00M])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
+      (D27F.f[DIR_PP0])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_MM0])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_PM0])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_MP0])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_P0P])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_M0M])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_P0M])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_M0P])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_0PP])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
+      (D27F.f[DIR_0MM])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0PM])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0MP])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PPP])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MMM])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PPM])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MMP])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PMP])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MPM])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PMM])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MPP])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
 
 
 
@@ -46978,32 +46978,32 @@ __global__ void scaleCFThS27(     real* DC,
       cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D27F.f[DIR_000])[kzero] =   c8o27* Conc_F*(c1o1-cu_sq);
-      (D27F.f[DIR_P00   ])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
-      (D27F.f[DIR_M00   ])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
-      (D27F.f[DIR_0P0   ])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
-      (D27F.f[DIR_0M0   ])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
-      (D27F.f[DIR_00P   ])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
-      (D27F.f[DIR_00M   ])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
-      (D27F.f[DIR_PP0  ])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_MM0  ])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_PM0  ])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_MP0  ])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_P0P  ])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_M0M  ])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_P0M  ])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_M0P  ])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_0PP  ])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
-      (D27F.f[DIR_0MM  ])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0PM  ])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0MP  ])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PPP ])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MMM ])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PPM ])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MMP ])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PMP ])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MPM ])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PMM ])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MPP ])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_P00])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
+      (D27F.f[DIR_M00])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
+      (D27F.f[DIR_0P0])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
+      (D27F.f[DIR_0M0])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
+      (D27F.f[DIR_00P])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
+      (D27F.f[DIR_00M])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
+      (D27F.f[DIR_PP0])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_MM0])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_PM0])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_MP0])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_P0P])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_M0M])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_P0M])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_M0P])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_0PP])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
+      (D27F.f[DIR_0MM])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0PM])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0MP])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PPP])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MMM])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PPM])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MMP])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PMP])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MPM])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PMM])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MPP])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
 
 
 
@@ -47056,32 +47056,32 @@ __global__ void scaleCFThS27(     real* DC,
       cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D27F.f[DIR_000])[kzero] =   c8o27* Conc_F*(c1o1-cu_sq);
-      (D27F.f[DIR_P00   ])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
-      (D27F.f[DIR_M00   ])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
-      (D27F.f[DIR_0P0   ])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
-      (D27F.f[DIR_0M0   ])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
-      (D27F.f[DIR_00P   ])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
-      (D27F.f[DIR_00M   ])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
-      (D27F.f[DIR_PP0  ])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_MM0  ])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_PM0  ])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_MP0  ])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_P0P  ])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_M0M  ])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_P0M  ])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_M0P  ])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_0PP  ])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
-      (D27F.f[DIR_0MM  ])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0PM  ])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0MP  ])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PPP ])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MMM ])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PPM ])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MMP ])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PMP ])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MPM ])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PMM ])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MPP ])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_P00])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
+      (D27F.f[DIR_M00])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
+      (D27F.f[DIR_0P0])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
+      (D27F.f[DIR_0M0])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
+      (D27F.f[DIR_00P])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
+      (D27F.f[DIR_00M])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
+      (D27F.f[DIR_PP0])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_MM0])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_PM0])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_MP0])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_P0P])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_M0M])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_P0M])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_M0P])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_0PP])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
+      (D27F.f[DIR_0MM])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0PM])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0MP])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PPP])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MMM])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PPM])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MMP])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PMP])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MPM])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PMM])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MPP])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
 
 
 
@@ -47134,32 +47134,32 @@ __global__ void scaleCFThS27(     real* DC,
       cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D27F.f[DIR_000])[kzero] =   c8o27* Conc_F*(c1o1-cu_sq);
-      (D27F.f[DIR_P00   ])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
-      (D27F.f[DIR_M00   ])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
-      (D27F.f[DIR_0P0   ])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
-      (D27F.f[DIR_0M0   ])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
-      (D27F.f[DIR_00P   ])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
-      (D27F.f[DIR_00M   ])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
-      (D27F.f[DIR_PP0  ])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_MM0  ])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_PM0  ])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_MP0  ])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_P0P  ])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_M0M  ])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_P0M  ])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_M0P  ])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_0PP  ])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
-      (D27F.f[DIR_0MM  ])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0PM  ])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0MP  ])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PPP ])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MMM ])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PPM ])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MMP ])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PMP ])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MPM ])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PMM ])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MPP ])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_P00])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
+      (D27F.f[DIR_M00])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
+      (D27F.f[DIR_0P0])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
+      (D27F.f[DIR_0M0])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
+      (D27F.f[DIR_00P])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
+      (D27F.f[DIR_00M])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
+      (D27F.f[DIR_PP0])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_MM0])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_PM0])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_MP0])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_P0P])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_M0M])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_P0M])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_M0P])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_0PP])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
+      (D27F.f[DIR_0MM])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0PM])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0MP])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PPP])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MMM])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PPM])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MMP])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PMP])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MPM])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PMM])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MPP])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
 
 
 
@@ -47212,32 +47212,32 @@ __global__ void scaleCFThS27(     real* DC,
       cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D27F.f[DIR_000])[kzero] =   c8o27* Conc_F*(c1o1-cu_sq);
-      (D27F.f[DIR_P00   ])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
-      (D27F.f[DIR_M00   ])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
-      (D27F.f[DIR_0P0   ])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
-      (D27F.f[DIR_0M0   ])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
-      (D27F.f[DIR_00P   ])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
-      (D27F.f[DIR_00M   ])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
-      (D27F.f[DIR_PP0  ])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_MM0  ])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_PM0  ])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
-      (D27F.f[DIR_MP0  ])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
-      (D27F.f[DIR_P0P  ])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_M0M  ])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_P0M  ])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
-      (D27F.f[DIR_M0P  ])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
-      (D27F.f[DIR_0PP  ])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
-      (D27F.f[DIR_0MM  ])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0PM  ])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
-      (D27F.f[DIR_0MP  ])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PPP ])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MMM ])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PPM ])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MMP ])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_PMP ])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
-      (D27F.f[DIR_MPM ])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
-      (D27F.f[DIR_PMM ])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
-      (D27F.f[DIR_MPP ])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_P00])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_F*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
+      (D27F.f[DIR_M00])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_F*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
+      (D27F.f[DIR_0P0])[kzero] =   c2o27* (c3o1*(     My    )+Conc_F*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
+      (D27F.f[DIR_0M0])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_F*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
+      (D27F.f[DIR_00P])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_F*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
+      (D27F.f[DIR_00M])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_F*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
+      (D27F.f[DIR_PP0])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_F*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_MM0])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_F*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_PM0])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_F*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
+      (D27F.f[DIR_MP0])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_F*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
+      (D27F.f[DIR_P0P])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_F*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_M0M])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_F*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_P0M])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_F*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
+      (D27F.f[DIR_M0P])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_F*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
+      (D27F.f[DIR_0PP])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_F*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
+      (D27F.f[DIR_0MM])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_F*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0PM])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_F*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
+      (D27F.f[DIR_0MP])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_F*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PPP])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MMM])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PPM])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_F*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MMP])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_F*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_PMP])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+      (D27F.f[DIR_MPM])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+      (D27F.f[DIR_PMM])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_F*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+      (D27F.f[DIR_MPP])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_F*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -47287,8 +47287,8 @@ __global__ void scaleCFEff27(real* DC,
                                         unsigned int* neighborFX,
                                         unsigned int* neighborFY,
                                         unsigned int* neighborFZ,
-									             unsigned int size_MatC, 
-									             unsigned int size_MatF, 
+									             unsigned long long numberOfLBnodesCoarse, 
+									             unsigned long long numberOfLBnodesFine, 
 									             bool isEvenTimestep,
                                         unsigned int* posCSWB, 
                                         unsigned int* posFSWB, 
@@ -47305,96 +47305,96 @@ __global__ void scaleCFEff27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -48997,8 +48997,8 @@ __global__ void scaleCF27(real* DC,
                                      unsigned int* neighborFX,
                                      unsigned int* neighborFY,
                                      unsigned int* neighborFZ,
-                                     unsigned int size_MatC, 
-                                     unsigned int size_MatF, 
+                                     unsigned long long numberOfLBnodesCoarse, 
+                                     unsigned long long numberOfLBnodesFine, 
                                      bool isEvenTimestep,
                                      unsigned int* posCSWB, 
                                      unsigned int* posFSWB, 
@@ -49014,96 +49014,96 @@ __global__ void scaleCF27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF_F3_27.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF_F3_27.cu
index cb8bd2a322cc9176cd0aa31625ee386e1f62d63d..386493280fd71fff93c117483e754a248bb0830d 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF_F3_27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleCF_F3_27.cu
@@ -23,8 +23,8 @@ __global__ void scaleCF_comp_D3Q27F3_2018(real* DC,
 													 unsigned int* neighborFX,
 													 unsigned int* neighborFY,
 													 unsigned int* neighborFZ,
-													 unsigned int size_MatC, 
-													 unsigned int size_MatF, 
+													 unsigned long long numberOfLBnodesCoarse, 
+													 unsigned long long numberOfLBnodesFine, 
 													 bool isEvenTimestep,
 													 unsigned int* posCSWB, 
 													 unsigned int* posFSWB, 
@@ -44,33 +44,33 @@ __global__ void scaleCF_comp_D3Q27F3_2018(real* DC,
 		*f000dest, *fMMMdest, *fMMPdest, *fMPPdest, *fMPMdest, *fPPMdest, *fPPPdest, *fPMPdest, *fPMMdest;
 
 
-	fP00dest = &DF[DIR_P00   *size_MatF];
-	fM00dest = &DF[DIR_M00   *size_MatF];
-	f0P0dest = &DF[DIR_0P0   *size_MatF];
-	f0M0dest = &DF[DIR_0M0   *size_MatF];
-	f00Pdest = &DF[DIR_00P   *size_MatF];
-	f00Mdest = &DF[DIR_00M   *size_MatF];
-	fPP0dest = &DF[DIR_PP0  *size_MatF];
-	fMM0dest = &DF[DIR_MM0  *size_MatF];
-	fPM0dest = &DF[DIR_PM0  *size_MatF];
-	fMP0dest = &DF[DIR_MP0  *size_MatF];
-	fP0Pdest = &DF[DIR_P0P  *size_MatF];
-	fM0Mdest = &DF[DIR_M0M  *size_MatF];
-	fP0Mdest = &DF[DIR_P0M  *size_MatF];
-	fM0Pdest = &DF[DIR_M0P  *size_MatF];
-	f0PPdest = &DF[DIR_0PP  *size_MatF];
-	f0MMdest = &DF[DIR_0MM  *size_MatF];
-	f0PMdest = &DF[DIR_0PM  *size_MatF];
-	f0MPdest = &DF[DIR_0MP  *size_MatF];
-	f000dest = &DF[DIR_000*size_MatF];
-	fMMMdest = &DF[DIR_MMM *size_MatF];
-	fMMPdest = &DF[DIR_MMP *size_MatF];
-	fMPPdest = &DF[DIR_MPP *size_MatF];
-	fMPMdest = &DF[DIR_MPM *size_MatF];
-	fPPMdest = &DF[DIR_PPM *size_MatF];
-	fPPPdest = &DF[DIR_PPP *size_MatF];
-	fPMPdest = &DF[DIR_PMP *size_MatF];
-	fPMMdest = &DF[DIR_PMM *size_MatF];
+	fP00dest = &DF[DIR_P00 * numberOfLBnodesFine];
+	fM00dest = &DF[DIR_M00 * numberOfLBnodesFine];
+	f0P0dest = &DF[DIR_0P0 * numberOfLBnodesFine];
+	f0M0dest = &DF[DIR_0M0 * numberOfLBnodesFine];
+	f00Pdest = &DF[DIR_00P * numberOfLBnodesFine];
+	f00Mdest = &DF[DIR_00M * numberOfLBnodesFine];
+	fPP0dest = &DF[DIR_PP0 * numberOfLBnodesFine];
+	fMM0dest = &DF[DIR_MM0 * numberOfLBnodesFine];
+	fPM0dest = &DF[DIR_PM0 * numberOfLBnodesFine];
+	fMP0dest = &DF[DIR_MP0 * numberOfLBnodesFine];
+	fP0Pdest = &DF[DIR_P0P * numberOfLBnodesFine];
+	fM0Mdest = &DF[DIR_M0M * numberOfLBnodesFine];
+	fP0Mdest = &DF[DIR_P0M * numberOfLBnodesFine];
+	fM0Pdest = &DF[DIR_M0P * numberOfLBnodesFine];
+	f0PPdest = &DF[DIR_0PP * numberOfLBnodesFine];
+	f0MMdest = &DF[DIR_0MM * numberOfLBnodesFine];
+	f0PMdest = &DF[DIR_0PM * numberOfLBnodesFine];
+	f0MPdest = &DF[DIR_0MP * numberOfLBnodesFine];
+	f000dest = &DF[DIR_000 * numberOfLBnodesFine];
+	fMMMdest = &DF[DIR_MMM * numberOfLBnodesFine];
+	fMMPdest = &DF[DIR_MMP * numberOfLBnodesFine];
+	fMPPdest = &DF[DIR_MPP * numberOfLBnodesFine];
+	fMPMdest = &DF[DIR_MPM * numberOfLBnodesFine];
+	fPPMdest = &DF[DIR_PPM * numberOfLBnodesFine];
+	fPPPdest = &DF[DIR_PPP * numberOfLBnodesFine];
+	fPMPdest = &DF[DIR_PMP * numberOfLBnodesFine];
+	fPMMdest = &DF[DIR_PMM * numberOfLBnodesFine];
 
 	real
 		*fP00source, *fM00source, *f0P0source, *f0M0source, *f00Psource, *f00Msource, *fPP0source, *fMM0source, *fPM0source,
@@ -79,72 +79,72 @@ __global__ void scaleCF_comp_D3Q27F3_2018(real* DC,
 
 	if (isEvenTimestep == true)
 	{
-		fP00source = &DC[DIR_P00   *size_MatC];
-		fM00source = &DC[DIR_M00   *size_MatC];
-		f0P0source = &DC[DIR_0P0   *size_MatC];
-		f0M0source = &DC[DIR_0M0   *size_MatC];
-		f00Psource = &DC[DIR_00P   *size_MatC];
-		f00Msource = &DC[DIR_00M   *size_MatC];
-		fPP0source = &DC[DIR_PP0  *size_MatC];
-		fMM0source = &DC[DIR_MM0  *size_MatC];
-		fPM0source = &DC[DIR_PM0  *size_MatC];
-		fMP0source = &DC[DIR_MP0  *size_MatC];
-		fP0Psource = &DC[DIR_P0P  *size_MatC];
-		fM0Msource = &DC[DIR_M0M  *size_MatC];
-		fP0Msource = &DC[DIR_P0M  *size_MatC];
-		fM0Psource = &DC[DIR_M0P  *size_MatC];
-		f0PPsource = &DC[DIR_0PP  *size_MatC];
-		f0MMsource = &DC[DIR_0MM  *size_MatC];
-		f0PMsource = &DC[DIR_0PM  *size_MatC];
-		f0MPsource = &DC[DIR_0MP  *size_MatC];
-		f000source = &DC[DIR_000*size_MatC];
-		fMMMsource = &DC[DIR_MMM *size_MatC];
-		fMMPsource = &DC[DIR_MMP *size_MatC];
-		fMPPsource = &DC[DIR_MPP *size_MatC];
-		fMPMsource = &DC[DIR_MPM *size_MatC];
-		fPPMsource = &DC[DIR_PPM *size_MatC];
-		fPPPsource = &DC[DIR_PPP *size_MatC];
-		fPMPsource = &DC[DIR_PMP *size_MatC];
-		fPMMsource = &DC[DIR_PMM *size_MatC];
+		fP00source = &DC[DIR_P00 * numberOfLBnodesCoarse];
+		fM00source = &DC[DIR_M00 * numberOfLBnodesCoarse];
+		f0P0source = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+		f0M0source = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+		f00Psource = &DC[DIR_00P * numberOfLBnodesCoarse];
+		f00Msource = &DC[DIR_00M * numberOfLBnodesCoarse];
+		fPP0source = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+		fMM0source = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+		fPM0source = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+		fMP0source = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+		fP0Psource = &DC[DIR_P0P * numberOfLBnodesCoarse];
+		fM0Msource = &DC[DIR_M0M * numberOfLBnodesCoarse];
+		fP0Msource = &DC[DIR_P0M * numberOfLBnodesCoarse];
+		fM0Psource = &DC[DIR_M0P * numberOfLBnodesCoarse];
+		f0PPsource = &DC[DIR_0PP * numberOfLBnodesCoarse];
+		f0MMsource = &DC[DIR_0MM * numberOfLBnodesCoarse];
+		f0PMsource = &DC[DIR_0PM * numberOfLBnodesCoarse];
+		f0MPsource = &DC[DIR_0MP * numberOfLBnodesCoarse];
+		f000source = &DC[DIR_000 * numberOfLBnodesCoarse];
+		fMMMsource = &DC[DIR_MMM * numberOfLBnodesCoarse];
+		fMMPsource = &DC[DIR_MMP * numberOfLBnodesCoarse];
+		fMPPsource = &DC[DIR_MPP * numberOfLBnodesCoarse];
+		fMPMsource = &DC[DIR_MPM * numberOfLBnodesCoarse];
+		fPPMsource = &DC[DIR_PPM * numberOfLBnodesCoarse];
+		fPPPsource = &DC[DIR_PPP * numberOfLBnodesCoarse];
+		fPMPsource = &DC[DIR_PMP * numberOfLBnodesCoarse];
+		fPMMsource = &DC[DIR_PMM * numberOfLBnodesCoarse];
 	}
 	else
 	{
-		fP00source = &DC[DIR_M00   *size_MatC];
-		fM00source = &DC[DIR_P00   *size_MatC];
-		f0P0source = &DC[DIR_0M0   *size_MatC];
-		f0M0source = &DC[DIR_0P0   *size_MatC];
-		f00Psource = &DC[DIR_00M   *size_MatC];
-		f00Msource = &DC[DIR_00P   *size_MatC];
-		fPP0source = &DC[DIR_MM0  *size_MatC];
-		fMM0source = &DC[DIR_PP0  *size_MatC];
-		fPM0source = &DC[DIR_MP0  *size_MatC];
-		fMP0source = &DC[DIR_PM0  *size_MatC];
-		fP0Psource = &DC[DIR_M0M  *size_MatC];
-		fM0Msource = &DC[DIR_P0P  *size_MatC];
-		fP0Msource = &DC[DIR_M0P  *size_MatC];
-		fM0Psource = &DC[DIR_P0M  *size_MatC];
-		f0PPsource = &DC[DIR_0MM  *size_MatC];
-		f0MMsource = &DC[DIR_0PP  *size_MatC];
-		f0PMsource = &DC[DIR_0MP  *size_MatC];
-		f0MPsource = &DC[DIR_0PM  *size_MatC];
-		f000source = &DC[DIR_000*size_MatC];
-		fMMMsource = &DC[DIR_PPP *size_MatC];
-		fMMPsource = &DC[DIR_PPM *size_MatC];
-		fMPPsource = &DC[DIR_PMM *size_MatC];
-		fMPMsource = &DC[DIR_PMP *size_MatC];
-		fPPMsource = &DC[DIR_MMP *size_MatC];
-		fPPPsource = &DC[DIR_MMM *size_MatC];
-		fPMPsource = &DC[DIR_MPM *size_MatC];
-		fPMMsource = &DC[DIR_MPP *size_MatC];
+		fP00source = &DC[DIR_M00 * numberOfLBnodesCoarse];
+		fM00source = &DC[DIR_P00 * numberOfLBnodesCoarse];
+		f0P0source = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+		f0M0source = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+		f00Psource = &DC[DIR_00M * numberOfLBnodesCoarse];
+		f00Msource = &DC[DIR_00P * numberOfLBnodesCoarse];
+		fPP0source = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+		fMM0source = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+		fPM0source = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+		fMP0source = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+		fP0Psource = &DC[DIR_M0M * numberOfLBnodesCoarse];
+		fM0Msource = &DC[DIR_P0P * numberOfLBnodesCoarse];
+		fP0Msource = &DC[DIR_M0P * numberOfLBnodesCoarse];
+		fM0Psource = &DC[DIR_P0M * numberOfLBnodesCoarse];
+		f0PPsource = &DC[DIR_0MM * numberOfLBnodesCoarse];
+		f0MMsource = &DC[DIR_0PP * numberOfLBnodesCoarse];
+		f0PMsource = &DC[DIR_0MP * numberOfLBnodesCoarse];
+		f0MPsource = &DC[DIR_0PM * numberOfLBnodesCoarse];
+		f000source = &DC[DIR_000 * numberOfLBnodesCoarse];
+		fMMMsource = &DC[DIR_PPP * numberOfLBnodesCoarse];
+		fMMPsource = &DC[DIR_PPM * numberOfLBnodesCoarse];
+		fMPPsource = &DC[DIR_PMM * numberOfLBnodesCoarse];
+		fMPMsource = &DC[DIR_PMP * numberOfLBnodesCoarse];
+		fPPMsource = &DC[DIR_MMP * numberOfLBnodesCoarse];
+		fPPPsource = &DC[DIR_MMM * numberOfLBnodesCoarse];
+		fPMPsource = &DC[DIR_MPM * numberOfLBnodesCoarse];
+		fPMMsource = &DC[DIR_MPP * numberOfLBnodesCoarse];
 	}
 
 	Distributions6 G;
-	G.g[DIR_P00] = &G6[DIR_P00   *size_MatF];
-	G.g[DIR_M00] = &G6[DIR_M00   *size_MatF];
-	G.g[DIR_0P0] = &G6[DIR_0P0   *size_MatF];
-	G.g[DIR_0M0] = &G6[DIR_0M0   *size_MatF];
-	G.g[DIR_00P] = &G6[DIR_00P   *size_MatF];
-	G.g[DIR_00M] = &G6[DIR_00M   *size_MatF];
+	G.g[DIR_P00] = &G6[DIR_P00 * numberOfLBnodesFine];
+	G.g[DIR_M00] = &G6[DIR_M00 * numberOfLBnodesFine];
+	G.g[DIR_0P0] = &G6[DIR_0P0 * numberOfLBnodesFine];
+	G.g[DIR_0M0] = &G6[DIR_0M0 * numberOfLBnodesFine];
+	G.g[DIR_00P] = &G6[DIR_00P * numberOfLBnodesFine];
+	G.g[DIR_00M] = &G6[DIR_00M * numberOfLBnodesFine];
 
 	////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -4370,8 +4370,8 @@ __global__ void scaleCF_comp_D3Q27F3( real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posCSWB, 
 												 unsigned int* posFSWB, 
@@ -4391,33 +4391,33 @@ __global__ void scaleCF_comp_D3Q27F3( real* DC,
 		*f000dest, *fMMMdest, *fMMPdest, *fMPPdest, *fMPMdest, *fPPMdest, *fPPPdest, *fPMPdest, *fPMMdest;
 
 
-	fP00dest = &DF[DIR_P00   *size_MatF];
-	fM00dest = &DF[DIR_M00   *size_MatF];
-	f0P0dest = &DF[DIR_0P0   *size_MatF];
-	f0M0dest = &DF[DIR_0M0   *size_MatF];
-	f00Pdest = &DF[DIR_00P   *size_MatF];
-	f00Mdest = &DF[DIR_00M   *size_MatF];
-	fPP0dest = &DF[DIR_PP0  *size_MatF];
-	fMM0dest = &DF[DIR_MM0  *size_MatF];
-	fPM0dest = &DF[DIR_PM0  *size_MatF];
-	fMP0dest = &DF[DIR_MP0  *size_MatF];
-	fP0Pdest = &DF[DIR_P0P  *size_MatF];
-	fM0Mdest = &DF[DIR_M0M  *size_MatF];
-	fP0Mdest = &DF[DIR_P0M  *size_MatF];
-	fM0Pdest = &DF[DIR_M0P  *size_MatF];
-	f0PPdest = &DF[DIR_0PP  *size_MatF];
-	f0MMdest = &DF[DIR_0MM  *size_MatF];
-	f0PMdest = &DF[DIR_0PM  *size_MatF];
-	f0MPdest = &DF[DIR_0MP  *size_MatF];
-	f000dest = &DF[DIR_000*size_MatF];
-	fMMMdest = &DF[DIR_MMM *size_MatF];
-	fMMPdest = &DF[DIR_MMP *size_MatF];
-	fMPPdest = &DF[DIR_MPP *size_MatF];
-	fMPMdest = &DF[DIR_MPM *size_MatF];
-	fPPMdest = &DF[DIR_PPM *size_MatF];
-	fPPPdest = &DF[DIR_PPP *size_MatF];
-	fPMPdest = &DF[DIR_PMP *size_MatF];
-	fPMMdest = &DF[DIR_PMM *size_MatF];
+	fP00dest = &DF[DIR_P00 * numberOfLBnodesFine];
+	fM00dest = &DF[DIR_M00 * numberOfLBnodesFine];
+	f0P0dest = &DF[DIR_0P0 * numberOfLBnodesFine];
+	f0M0dest = &DF[DIR_0M0 * numberOfLBnodesFine];
+	f00Pdest = &DF[DIR_00P * numberOfLBnodesFine];
+	f00Mdest = &DF[DIR_00M * numberOfLBnodesFine];
+	fPP0dest = &DF[DIR_PP0 * numberOfLBnodesFine];
+	fMM0dest = &DF[DIR_MM0 * numberOfLBnodesFine];
+	fPM0dest = &DF[DIR_PM0 * numberOfLBnodesFine];
+	fMP0dest = &DF[DIR_MP0 * numberOfLBnodesFine];
+	fP0Pdest = &DF[DIR_P0P * numberOfLBnodesFine];
+	fM0Mdest = &DF[DIR_M0M * numberOfLBnodesFine];
+	fP0Mdest = &DF[DIR_P0M * numberOfLBnodesFine];
+	fM0Pdest = &DF[DIR_M0P * numberOfLBnodesFine];
+	f0PPdest = &DF[DIR_0PP * numberOfLBnodesFine];
+	f0MMdest = &DF[DIR_0MM * numberOfLBnodesFine];
+	f0PMdest = &DF[DIR_0PM * numberOfLBnodesFine];
+	f0MPdest = &DF[DIR_0MP * numberOfLBnodesFine];
+	f000dest = &DF[DIR_000 * numberOfLBnodesFine];
+	fMMMdest = &DF[DIR_MMM * numberOfLBnodesFine];
+	fMMPdest = &DF[DIR_MMP * numberOfLBnodesFine];
+	fMPPdest = &DF[DIR_MPP * numberOfLBnodesFine];
+	fMPMdest = &DF[DIR_MPM * numberOfLBnodesFine];
+	fPPMdest = &DF[DIR_PPM * numberOfLBnodesFine];
+	fPPPdest = &DF[DIR_PPP * numberOfLBnodesFine];
+	fPMPdest = &DF[DIR_PMP * numberOfLBnodesFine];
+	fPMMdest = &DF[DIR_PMM * numberOfLBnodesFine];
 
 	real
 		*fP00source, *fM00source, *f0P0source, *f0M0source, *f00Psource, *f00Msource, *fPP0source, *fMM0source, *fPM0source,
@@ -4426,72 +4426,72 @@ __global__ void scaleCF_comp_D3Q27F3( real* DC,
 
 	if (isEvenTimestep == true)
 	{
-		fP00source = &DC[DIR_P00   *size_MatC];
-		fM00source = &DC[DIR_M00   *size_MatC];
-		f0P0source = &DC[DIR_0P0   *size_MatC];
-		f0M0source = &DC[DIR_0M0   *size_MatC];
-		f00Psource = &DC[DIR_00P   *size_MatC];
-		f00Msource = &DC[DIR_00M   *size_MatC];
-		fPP0source = &DC[DIR_PP0  *size_MatC];
-		fMM0source = &DC[DIR_MM0  *size_MatC];
-		fPM0source = &DC[DIR_PM0  *size_MatC];
-		fMP0source = &DC[DIR_MP0  *size_MatC];
-		fP0Psource = &DC[DIR_P0P  *size_MatC];
-		fM0Msource = &DC[DIR_M0M  *size_MatC];
-		fP0Msource = &DC[DIR_P0M  *size_MatC];
-		fM0Psource = &DC[DIR_M0P  *size_MatC];
-		f0PPsource = &DC[DIR_0PP  *size_MatC];
-		f0MMsource = &DC[DIR_0MM  *size_MatC];
-		f0PMsource = &DC[DIR_0PM  *size_MatC];
-		f0MPsource = &DC[DIR_0MP  *size_MatC];
-		f000source = &DC[DIR_000*size_MatC];
-		fMMMsource = &DC[DIR_MMM *size_MatC];
-		fMMPsource = &DC[DIR_MMP *size_MatC];
-		fMPPsource = &DC[DIR_MPP *size_MatC];
-		fMPMsource = &DC[DIR_MPM *size_MatC];
-		fPPMsource = &DC[DIR_PPM *size_MatC];
-		fPPPsource = &DC[DIR_PPP *size_MatC];
-		fPMPsource = &DC[DIR_PMP *size_MatC];
-		fPMMsource = &DC[DIR_PMM *size_MatC];
+		fP00source = &DC[DIR_P00 * numberOfLBnodesCoarse];
+		fM00source = &DC[DIR_M00 * numberOfLBnodesCoarse];
+		f0P0source = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+		f0M0source = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+		f00Psource = &DC[DIR_00P * numberOfLBnodesCoarse];
+		f00Msource = &DC[DIR_00M * numberOfLBnodesCoarse];
+		fPP0source = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+		fMM0source = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+		fPM0source = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+		fMP0source = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+		fP0Psource = &DC[DIR_P0P * numberOfLBnodesCoarse];
+		fM0Msource = &DC[DIR_M0M * numberOfLBnodesCoarse];
+		fP0Msource = &DC[DIR_P0M * numberOfLBnodesCoarse];
+		fM0Psource = &DC[DIR_M0P * numberOfLBnodesCoarse];
+		f0PPsource = &DC[DIR_0PP * numberOfLBnodesCoarse];
+		f0MMsource = &DC[DIR_0MM * numberOfLBnodesCoarse];
+		f0PMsource = &DC[DIR_0PM * numberOfLBnodesCoarse];
+		f0MPsource = &DC[DIR_0MP * numberOfLBnodesCoarse];
+		f000source = &DC[DIR_000 * numberOfLBnodesCoarse];
+		fMMMsource = &DC[DIR_MMM * numberOfLBnodesCoarse];
+		fMMPsource = &DC[DIR_MMP * numberOfLBnodesCoarse];
+		fMPPsource = &DC[DIR_MPP * numberOfLBnodesCoarse];
+		fMPMsource = &DC[DIR_MPM * numberOfLBnodesCoarse];
+		fPPMsource = &DC[DIR_PPM * numberOfLBnodesCoarse];
+		fPPPsource = &DC[DIR_PPP * numberOfLBnodesCoarse];
+		fPMPsource = &DC[DIR_PMP * numberOfLBnodesCoarse];
+		fPMMsource = &DC[DIR_PMM * numberOfLBnodesCoarse];
 	}
 	else
 	{
-		fP00source = &DC[DIR_M00   *size_MatC];
-		fM00source = &DC[DIR_P00   *size_MatC];
-		f0P0source = &DC[DIR_0M0   *size_MatC];
-		f0M0source = &DC[DIR_0P0   *size_MatC];
-		f00Psource = &DC[DIR_00M   *size_MatC];
-		f00Msource = &DC[DIR_00P   *size_MatC];
-		fPP0source = &DC[DIR_MM0  *size_MatC];
-		fMM0source = &DC[DIR_PP0  *size_MatC];
-		fPM0source = &DC[DIR_MP0  *size_MatC];
-		fMP0source = &DC[DIR_PM0  *size_MatC];
-		fP0Psource = &DC[DIR_M0M  *size_MatC];
-		fM0Msource = &DC[DIR_P0P  *size_MatC];
-		fP0Msource = &DC[DIR_M0P  *size_MatC];
-		fM0Psource = &DC[DIR_P0M  *size_MatC];
-		f0PPsource = &DC[DIR_0MM  *size_MatC];
-		f0MMsource = &DC[DIR_0PP  *size_MatC];
-		f0PMsource = &DC[DIR_0MP  *size_MatC];
-		f0MPsource = &DC[DIR_0PM  *size_MatC];
-		f000source = &DC[DIR_000*size_MatC];
-		fMMMsource = &DC[DIR_PPP *size_MatC];
-		fMMPsource = &DC[DIR_PPM *size_MatC];
-		fMPPsource = &DC[DIR_PMM *size_MatC];
-		fMPMsource = &DC[DIR_PMP *size_MatC];
-		fPPMsource = &DC[DIR_MMP *size_MatC];
-		fPPPsource = &DC[DIR_MMM *size_MatC];
-		fPMPsource = &DC[DIR_MPM *size_MatC];
-		fPMMsource = &DC[DIR_MPP *size_MatC];
+		fP00source = &DC[DIR_M00 * numberOfLBnodesCoarse];
+		fM00source = &DC[DIR_P00 * numberOfLBnodesCoarse];
+		f0P0source = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+		f0M0source = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+		f00Psource = &DC[DIR_00M * numberOfLBnodesCoarse];
+		f00Msource = &DC[DIR_00P * numberOfLBnodesCoarse];
+		fPP0source = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+		fMM0source = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+		fPM0source = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+		fMP0source = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+		fP0Psource = &DC[DIR_M0M * numberOfLBnodesCoarse];
+		fM0Msource = &DC[DIR_P0P * numberOfLBnodesCoarse];
+		fP0Msource = &DC[DIR_M0P * numberOfLBnodesCoarse];
+		fM0Psource = &DC[DIR_P0M * numberOfLBnodesCoarse];
+		f0PPsource = &DC[DIR_0MM * numberOfLBnodesCoarse];
+		f0MMsource = &DC[DIR_0PP * numberOfLBnodesCoarse];
+		f0PMsource = &DC[DIR_0MP * numberOfLBnodesCoarse];
+		f0MPsource = &DC[DIR_0PM * numberOfLBnodesCoarse];
+		f000source = &DC[DIR_000 * numberOfLBnodesCoarse];
+		fMMMsource = &DC[DIR_PPP * numberOfLBnodesCoarse];
+		fMMPsource = &DC[DIR_PPM * numberOfLBnodesCoarse];
+		fMPPsource = &DC[DIR_PMM * numberOfLBnodesCoarse];
+		fMPMsource = &DC[DIR_PMP * numberOfLBnodesCoarse];
+		fPPMsource = &DC[DIR_MMP * numberOfLBnodesCoarse];
+		fPPPsource = &DC[DIR_MMM * numberOfLBnodesCoarse];
+		fPMPsource = &DC[DIR_MPM * numberOfLBnodesCoarse];
+		fPMMsource = &DC[DIR_MPP * numberOfLBnodesCoarse];
 	}
 
 	Distributions6 G;
-	G.g[DIR_P00] = &G6[DIR_P00   *size_MatF];
-	G.g[DIR_M00] = &G6[DIR_M00   *size_MatF];
-	G.g[DIR_0P0] = &G6[DIR_0P0   *size_MatF];
-	G.g[DIR_0M0] = &G6[DIR_0M0   *size_MatF];
-	G.g[DIR_00P] = &G6[DIR_00P   *size_MatF];
-	G.g[DIR_00M] = &G6[DIR_00M   *size_MatF];
+	G.g[DIR_P00] = &G6[DIR_P00 * numberOfLBnodesFine];
+	G.g[DIR_M00] = &G6[DIR_M00 * numberOfLBnodesFine];
+	G.g[DIR_0P0] = &G6[DIR_0P0 * numberOfLBnodesFine];
+	G.g[DIR_0M0] = &G6[DIR_0M0 * numberOfLBnodesFine];
+	G.g[DIR_00P] = &G6[DIR_00P * numberOfLBnodesFine];
+	G.g[DIR_00M] = &G6[DIR_00M * numberOfLBnodesFine];
 
 	////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC27.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC27.cu
index f2a66876cf39e3519e22fc2b0e236514f05ce85a..b37ab44d81d15fbbde46c875c860acd7198b8041 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC27.cu
@@ -22,8 +22,8 @@ __global__ void scaleFC_0817_comp_27( real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posC, 
 												 unsigned int* posFSWB, 
@@ -43,33 +43,33 @@ __global__ void scaleFC_0817_comp_27( real* DC,
 	   *f000source, *fMMMsource, *fMMPsource, *fMPPsource, *fMPMsource, *fPPMsource, *fPPPsource, *fPMPsource, *fPMMsource;
 
 
-   fP00source = &DF[DIR_P00   *size_MatF];
-   fM00source = &DF[DIR_M00   *size_MatF];
-   f0P0source = &DF[DIR_0P0   *size_MatF];
-   f0M0source = &DF[DIR_0M0   *size_MatF];
-   f00Psource = &DF[DIR_00P   *size_MatF];
-   f00Msource = &DF[DIR_00M   *size_MatF];
-   fPP0source = &DF[DIR_PP0  *size_MatF];
-   fMM0source = &DF[DIR_MM0  *size_MatF];
-   fPM0source = &DF[DIR_PM0  *size_MatF];
-   fMP0source = &DF[DIR_MP0  *size_MatF];
-   fP0Psource = &DF[DIR_P0P  *size_MatF];
-   fM0Msource = &DF[DIR_M0M  *size_MatF];
-   fP0Msource = &DF[DIR_P0M  *size_MatF];
-   fM0Psource = &DF[DIR_M0P  *size_MatF];
-   f0PPsource = &DF[DIR_0PP  *size_MatF];
-   f0MMsource = &DF[DIR_0MM  *size_MatF];
-   f0PMsource = &DF[DIR_0PM  *size_MatF];
-   f0MPsource = &DF[DIR_0MP  *size_MatF];
-   f000source = &DF[DIR_000*size_MatF];
-   fMMMsource = &DF[DIR_MMM *size_MatF];
-   fMMPsource = &DF[DIR_MMP *size_MatF];
-   fMPPsource = &DF[DIR_MPP *size_MatF];
-   fMPMsource = &DF[DIR_MPM *size_MatF];
-   fPPMsource = &DF[DIR_PPM *size_MatF];
-   fPPPsource = &DF[DIR_PPP *size_MatF];
-   fPMPsource = &DF[DIR_PMP *size_MatF];
-   fPMMsource = &DF[DIR_PMM *size_MatF];
+   fP00source = &DF[DIR_P00 * numberOfLBnodesFine];
+   fM00source = &DF[DIR_M00 * numberOfLBnodesFine];
+   f0P0source = &DF[DIR_0P0 * numberOfLBnodesFine];
+   f0M0source = &DF[DIR_0M0 * numberOfLBnodesFine];
+   f00Psource = &DF[DIR_00P * numberOfLBnodesFine];
+   f00Msource = &DF[DIR_00M * numberOfLBnodesFine];
+   fPP0source = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fMM0source = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fPM0source = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fMP0source = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fP0Psource = &DF[DIR_P0P * numberOfLBnodesFine];
+   fM0Msource = &DF[DIR_M0M * numberOfLBnodesFine];
+   fP0Msource = &DF[DIR_P0M * numberOfLBnodesFine];
+   fM0Psource = &DF[DIR_M0P * numberOfLBnodesFine];
+   f0PPsource = &DF[DIR_0PP * numberOfLBnodesFine];
+   f0MMsource = &DF[DIR_0MM * numberOfLBnodesFine];
+   f0PMsource = &DF[DIR_0PM * numberOfLBnodesFine];
+   f0MPsource = &DF[DIR_0MP * numberOfLBnodesFine];
+   f000source = &DF[DIR_000 * numberOfLBnodesFine];
+   fMMMsource = &DF[DIR_MMM * numberOfLBnodesFine];
+   fMMPsource = &DF[DIR_MMP * numberOfLBnodesFine];
+   fMPPsource = &DF[DIR_MPP * numberOfLBnodesFine];
+   fMPMsource = &DF[DIR_MPM * numberOfLBnodesFine];
+   fPPMsource = &DF[DIR_PPM * numberOfLBnodesFine];
+   fPPPsource = &DF[DIR_PPP * numberOfLBnodesFine];
+   fPMPsource = &DF[DIR_PMP * numberOfLBnodesFine];
+   fPMMsource = &DF[DIR_PMM * numberOfLBnodesFine];
 
    real
 	   *fP00dest, *fM00dest, *f0P0dest, *f0M0dest, *f00Pdest, *f00Mdest, *fPP0dest, *fMM0dest, *fPM0dest,
@@ -78,63 +78,63 @@ __global__ void scaleFC_0817_comp_27( real* DC,
 
    if (isEvenTimestep==true)
    {
-	   fP00dest = &DC[DIR_P00   *size_MatC];
-	   fM00dest = &DC[DIR_M00   *size_MatC];
-	   f0P0dest = &DC[DIR_0P0   *size_MatC];
-	   f0M0dest = &DC[DIR_0M0   *size_MatC];
-	   f00Pdest = &DC[DIR_00P   *size_MatC];
-	   f00Mdest = &DC[DIR_00M   *size_MatC];
-	   fPP0dest = &DC[DIR_PP0  *size_MatC];
-	   fMM0dest = &DC[DIR_MM0  *size_MatC];
-	   fPM0dest = &DC[DIR_PM0  *size_MatC];
-	   fMP0dest = &DC[DIR_MP0  *size_MatC];
-	   fP0Pdest = &DC[DIR_P0P  *size_MatC];
-	   fM0Mdest = &DC[DIR_M0M  *size_MatC];
-	   fP0Mdest = &DC[DIR_P0M  *size_MatC];
-	   fM0Pdest = &DC[DIR_M0P  *size_MatC];
-	   f0PPdest = &DC[DIR_0PP  *size_MatC];
-	   f0MMdest = &DC[DIR_0MM  *size_MatC];
-	   f0PMdest = &DC[DIR_0PM  *size_MatC];
-	   f0MPdest = &DC[DIR_0MP  *size_MatC];
-	   f000dest = &DC[DIR_000*size_MatC];
-	   fMMMdest = &DC[DIR_MMM *size_MatC];
-	   fMMPdest = &DC[DIR_MMP *size_MatC];
-	   fMPPdest = &DC[DIR_MPP *size_MatC];
-	   fMPMdest = &DC[DIR_MPM *size_MatC];
-	   fPPMdest = &DC[DIR_PPM *size_MatC];
-	   fPPPdest = &DC[DIR_PPP *size_MatC];
-	   fPMPdest = &DC[DIR_PMP *size_MatC];
-	   fPMMdest = &DC[DIR_PMM *size_MatC];
+	   fP00dest = &DC[DIR_P00 * numberOfLBnodesCoarse];
+	   fM00dest = &DC[DIR_M00 * numberOfLBnodesCoarse];
+	   f0P0dest = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+	   f0M0dest = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+	   f00Pdest = &DC[DIR_00P * numberOfLBnodesCoarse];
+	   f00Mdest = &DC[DIR_00M * numberOfLBnodesCoarse];
+	   fPP0dest = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+	   fMM0dest = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+	   fPM0dest = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+	   fMP0dest = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+	   fP0Pdest = &DC[DIR_P0P * numberOfLBnodesCoarse];
+	   fM0Mdest = &DC[DIR_M0M * numberOfLBnodesCoarse];
+	   fP0Mdest = &DC[DIR_P0M * numberOfLBnodesCoarse];
+	   fM0Pdest = &DC[DIR_M0P * numberOfLBnodesCoarse];
+	   f0PPdest = &DC[DIR_0PP * numberOfLBnodesCoarse];
+	   f0MMdest = &DC[DIR_0MM * numberOfLBnodesCoarse];
+	   f0PMdest = &DC[DIR_0PM * numberOfLBnodesCoarse];
+	   f0MPdest = &DC[DIR_0MP * numberOfLBnodesCoarse];
+	   f000dest = &DC[DIR_000 * numberOfLBnodesCoarse];
+	   fMMMdest = &DC[DIR_MMM * numberOfLBnodesCoarse];
+	   fMMPdest = &DC[DIR_MMP * numberOfLBnodesCoarse];
+	   fMPPdest = &DC[DIR_MPP * numberOfLBnodesCoarse];
+	   fMPMdest = &DC[DIR_MPM * numberOfLBnodesCoarse];
+	   fPPMdest = &DC[DIR_PPM * numberOfLBnodesCoarse];
+	   fPPPdest = &DC[DIR_PPP * numberOfLBnodesCoarse];
+	   fPMPdest = &DC[DIR_PMP * numberOfLBnodesCoarse];
+	   fPMMdest = &DC[DIR_PMM * numberOfLBnodesCoarse];
    } 
    else
    {
-	   fP00dest = &DC[DIR_M00   *size_MatC];
-	   fM00dest = &DC[DIR_P00   *size_MatC];
-	   f0P0dest = &DC[DIR_0M0   *size_MatC];
-	   f0M0dest = &DC[DIR_0P0   *size_MatC];
-	   f00Pdest = &DC[DIR_00M   *size_MatC];
-	   f00Mdest = &DC[DIR_00P   *size_MatC];
-	   fPP0dest = &DC[DIR_MM0  *size_MatC];
-	   fMM0dest = &DC[DIR_PP0  *size_MatC];
-	   fPM0dest = &DC[DIR_MP0  *size_MatC];
-	   fMP0dest = &DC[DIR_PM0  *size_MatC];
-	   fP0Pdest = &DC[DIR_M0M  *size_MatC];
-	   fM0Mdest = &DC[DIR_P0P  *size_MatC];
-	   fP0Mdest = &DC[DIR_M0P  *size_MatC];
-	   fM0Pdest = &DC[DIR_P0M  *size_MatC];
-	   f0PPdest = &DC[DIR_0MM  *size_MatC];
-	   f0MMdest = &DC[DIR_0PP  *size_MatC];
-	   f0PMdest = &DC[DIR_0MP  *size_MatC];
-	   f0MPdest = &DC[DIR_0PM  *size_MatC];
-	   f000dest = &DC[DIR_000*size_MatC];
-	   fMMMdest = &DC[DIR_PPP *size_MatC];
-	   fMMPdest = &DC[DIR_PPM *size_MatC];
-	   fMPPdest = &DC[DIR_PMM *size_MatC];
-	   fMPMdest = &DC[DIR_PMP *size_MatC];
-	   fPPMdest = &DC[DIR_MMP *size_MatC];
-	   fPPPdest = &DC[DIR_MMM *size_MatC];
-	   fPMPdest = &DC[DIR_MPM *size_MatC];
-	   fPMMdest = &DC[DIR_MPP *size_MatC];
+	   fP00dest = &DC[DIR_M00 * numberOfLBnodesCoarse];
+	   fM00dest = &DC[DIR_P00 * numberOfLBnodesCoarse];
+	   f0P0dest = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+	   f0M0dest = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+	   f00Pdest = &DC[DIR_00M * numberOfLBnodesCoarse];
+	   f00Mdest = &DC[DIR_00P * numberOfLBnodesCoarse];
+	   fPP0dest = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+	   fMM0dest = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+	   fPM0dest = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+	   fMP0dest = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+	   fP0Pdest = &DC[DIR_M0M * numberOfLBnodesCoarse];
+	   fM0Mdest = &DC[DIR_P0P * numberOfLBnodesCoarse];
+	   fP0Mdest = &DC[DIR_M0P * numberOfLBnodesCoarse];
+	   fM0Pdest = &DC[DIR_P0M * numberOfLBnodesCoarse];
+	   f0PPdest = &DC[DIR_0MM * numberOfLBnodesCoarse];
+	   f0MMdest = &DC[DIR_0PP * numberOfLBnodesCoarse];
+	   f0PMdest = &DC[DIR_0MP * numberOfLBnodesCoarse];
+	   f0MPdest = &DC[DIR_0PM * numberOfLBnodesCoarse];
+	   f000dest = &DC[DIR_000 * numberOfLBnodesCoarse];
+	   fMMMdest = &DC[DIR_PPP * numberOfLBnodesCoarse];
+	   fMMPdest = &DC[DIR_PPM * numberOfLBnodesCoarse];
+	   fMPPdest = &DC[DIR_PMM * numberOfLBnodesCoarse];
+	   fMPMdest = &DC[DIR_PMP * numberOfLBnodesCoarse];
+	   fPPMdest = &DC[DIR_MMP * numberOfLBnodesCoarse];
+	   fPPPdest = &DC[DIR_MMM * numberOfLBnodesCoarse];
+	   fPMPdest = &DC[DIR_MPM * numberOfLBnodesCoarse];
+	   fPMMdest = &DC[DIR_MPP * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -1218,8 +1218,8 @@ __global__ void scaleFC_AA2016_comp_27(real* DC,
 												  unsigned int* neighborFX,
 												  unsigned int* neighborFY,
 												  unsigned int* neighborFZ,
-												  unsigned int size_MatC, 
-												  unsigned int size_MatF, 
+												  unsigned long long numberOfLBnodesCoarse, 
+												  unsigned long long numberOfLBnodesFine, 
 												  bool isEvenTimestep,
 												  unsigned int* posC, 
 												  unsigned int* posFSWB, 
@@ -1236,96 +1236,96 @@ __global__ void scaleFC_AA2016_comp_27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -5407,8 +5407,8 @@ __global__ void scaleFC_RhoSq_3rdMom_comp_27(real* DC,
 														unsigned int* neighborFX,
 														unsigned int* neighborFY,
 														unsigned int* neighborFZ,
-														unsigned int size_MatC, 
-														unsigned int size_MatF, 
+														unsigned long long numberOfLBnodesCoarse, 
+														unsigned long long numberOfLBnodesFine, 
 														bool isEvenTimestep,
 														unsigned int* posC, 
 														unsigned int* posFSWB, 
@@ -5425,96 +5425,96 @@ __global__ void scaleFC_RhoSq_3rdMom_comp_27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -9587,103 +9587,120 @@ __global__ void scaleFC_RhoSq_3rdMom_comp_27(real* DC,
 
 
 //////////////////////////////////////////////////////////////////////////
-__device__ void scaleFC_RhoSq_comp_27_Calculation(real *DC, real *DF, unsigned int *neighborCX, unsigned int *neighborCY,
-                                                  unsigned int *neighborCZ, unsigned int *neighborFX, unsigned int *neighborFY,
-                                                  unsigned int *neighborFZ, unsigned int size_MatC, unsigned int size_MatF,
-                                                  bool isEvenTimestep, unsigned int *posC, unsigned int *posFSWB, unsigned int kFC,
-                                                  real omCoarse, real omFine, real nu, unsigned int nxC, unsigned int nyC,
-                                                  unsigned int nxF, unsigned int nyF, OffFC offFC, const unsigned k)
+__device__ void scaleFC_RhoSq_comp_27_Calculation(
+    real *DC, real *DF, 
+    unsigned int *neighborCX,
+    unsigned int *neighborCY,
+    unsigned int *neighborCZ,
+    unsigned int *neighborFX,
+    unsigned int *neighborFY,
+    unsigned int *neighborFZ,
+    unsigned long long numberOfLBnodesCoarse,
+    unsigned long long numberOfLBnodesFine,
+    bool isEvenTimestep,
+    unsigned int *posC,
+    unsigned int *posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    OffFC offFC,
+    const unsigned k)
 {
     real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF,
         *fbnF, *ftsF, *fzeroF, *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-    feF    = &DF[DIR_P00 * size_MatF];
-    fwF    = &DF[DIR_M00 * size_MatF];
-    fnF    = &DF[DIR_0P0 * size_MatF];
-    fsF    = &DF[DIR_0M0 * size_MatF];
-    ftF    = &DF[DIR_00P * size_MatF];
-    fbF    = &DF[DIR_00M * size_MatF];
-    fneF   = &DF[DIR_PP0 * size_MatF];
-    fswF   = &DF[DIR_MM0 * size_MatF];
-    fseF   = &DF[DIR_PM0 * size_MatF];
-    fnwF   = &DF[DIR_MP0 * size_MatF];
-    fteF   = &DF[DIR_P0P * size_MatF];
-    fbwF   = &DF[DIR_M0M * size_MatF];
-    fbeF   = &DF[DIR_P0M * size_MatF];
-    ftwF   = &DF[DIR_M0P * size_MatF];
-    ftnF   = &DF[DIR_0PP * size_MatF];
-    fbsF   = &DF[DIR_0MM * size_MatF];
-    fbnF   = &DF[DIR_0PM * size_MatF];
-    ftsF   = &DF[DIR_0MP * size_MatF];
-    fzeroF = &DF[DIR_000 * size_MatF];
-    ftneF  = &DF[DIR_PPP * size_MatF];
-    ftswF  = &DF[DIR_MMP * size_MatF];
-    ftseF  = &DF[DIR_PMP * size_MatF];
-    ftnwF  = &DF[DIR_MPP * size_MatF];
-    fbneF  = &DF[DIR_PPM * size_MatF];
-    fbswF  = &DF[DIR_MMM * size_MatF];
-    fbseF  = &DF[DIR_PMM * size_MatF];
-    fbnwF  = &DF[DIR_MPM * size_MatF];
+    feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+    fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+    fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+    fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+    ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+    fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+    fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+    fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+    fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+    fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+    fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+    fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+    fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+    ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+    ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+    fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+    fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+    ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+    fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+    ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+    ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+    ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+    ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+    fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+    fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+    fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+    fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
     real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC,
         *fbnC, *ftsC, *fzeroC, *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
     if (isEvenTimestep == true) {
-        feC    = &DC[DIR_P00 * size_MatC];
-        fwC    = &DC[DIR_M00 * size_MatC];
-        fnC    = &DC[DIR_0P0 * size_MatC];
-        fsC    = &DC[DIR_0M0 * size_MatC];
-        ftC    = &DC[DIR_00P * size_MatC];
-        fbC    = &DC[DIR_00M * size_MatC];
-        fneC   = &DC[DIR_PP0 * size_MatC];
-        fswC   = &DC[DIR_MM0 * size_MatC];
-        fseC   = &DC[DIR_PM0 * size_MatC];
-        fnwC   = &DC[DIR_MP0 * size_MatC];
-        fteC   = &DC[DIR_P0P * size_MatC];
-        fbwC   = &DC[DIR_M0M * size_MatC];
-        fbeC   = &DC[DIR_P0M * size_MatC];
-        ftwC   = &DC[DIR_M0P * size_MatC];
-        ftnC   = &DC[DIR_0PP * size_MatC];
-        fbsC   = &DC[DIR_0MM * size_MatC];
-        fbnC   = &DC[DIR_0PM * size_MatC];
-        ftsC   = &DC[DIR_0MP * size_MatC];
-        fzeroC = &DC[DIR_000 * size_MatC];
-        ftneC  = &DC[DIR_PPP * size_MatC];
-        ftswC  = &DC[DIR_MMP * size_MatC];
-        ftseC  = &DC[DIR_PMP * size_MatC];
-        ftnwC  = &DC[DIR_MPP * size_MatC];
-        fbneC  = &DC[DIR_PPM * size_MatC];
-        fbswC  = &DC[DIR_MMM * size_MatC];
-        fbseC  = &DC[DIR_PMM * size_MatC];
-        fbnwC  = &DC[DIR_MPM * size_MatC];
+        feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+        fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+        fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+        fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+        ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+        fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+        fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+        fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+        fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+        fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+        fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+        fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+        fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+        ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+        ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+        fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+        fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+        ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+        fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+        ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+        ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+        ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+        ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+        fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+        fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+        fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+        fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
     } else {
-        fwC    = &DC[DIR_P00 * size_MatC];
-        feC    = &DC[DIR_M00 * size_MatC];
-        fsC    = &DC[DIR_0P0 * size_MatC];
-        fnC    = &DC[DIR_0M0 * size_MatC];
-        fbC    = &DC[DIR_00P * size_MatC];
-        ftC    = &DC[DIR_00M * size_MatC];
-        fswC   = &DC[DIR_PP0 * size_MatC];
-        fneC   = &DC[DIR_MM0 * size_MatC];
-        fnwC   = &DC[DIR_PM0 * size_MatC];
-        fseC   = &DC[DIR_MP0 * size_MatC];
-        fbwC   = &DC[DIR_P0P * size_MatC];
-        fteC   = &DC[DIR_M0M * size_MatC];
-        ftwC   = &DC[DIR_P0M * size_MatC];
-        fbeC   = &DC[DIR_M0P * size_MatC];
-        fbsC   = &DC[DIR_0PP * size_MatC];
-        ftnC   = &DC[DIR_0MM * size_MatC];
-        ftsC   = &DC[DIR_0PM * size_MatC];
-        fbnC   = &DC[DIR_0MP * size_MatC];
-        fzeroC = &DC[DIR_000 * size_MatC];
-        fbswC  = &DC[DIR_PPP * size_MatC];
-        fbneC  = &DC[DIR_MMP * size_MatC];
-        fbnwC  = &DC[DIR_PMP * size_MatC];
-        fbseC  = &DC[DIR_MPP * size_MatC];
-        ftswC  = &DC[DIR_PPM * size_MatC];
-        ftneC  = &DC[DIR_MMM * size_MatC];
-        ftnwC  = &DC[DIR_PMM * size_MatC];
-        ftseC  = &DC[DIR_MPM * size_MatC];
+        fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+        feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+        fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+        fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+        fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+        ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+        fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+        fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+        fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+        fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+        fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+        fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+        ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+        fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+        fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+        ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+        ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+        fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+        fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+        fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+        fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+        fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+        fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+        ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+        ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+        ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+        ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
     }
 
     ////////////////////////////////////////////////////////////////////////////////
@@ -11064,8 +11081,8 @@ __global__ void scaleFC_RhoSq_comp_27(real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posC, 
 												 unsigned int* posFSWB, 
@@ -11091,7 +11108,7 @@ __global__ void scaleFC_RhoSq_comp_27(real* DC,
    //////////////////////////////////////////////////////////////////////////
 
    scaleFC_RhoSq_comp_27_Calculation(DC, DF, neighborCX, neighborCY, neighborCZ, neighborFX, neighborFY, neighborFZ,
-                                     size_MatC, size_MatF, isEvenTimestep, posC, posFSWB, kFC, omCoarse, omFine, nu, nxC,
+                                     numberOfLBnodesCoarse, numberOfLBnodesFine, isEvenTimestep, posC, posFSWB, kFC, omCoarse, omFine, nu, nxC,
                                      nyC, nxF, nyF, offFC, k);
 }
 
@@ -11157,8 +11174,8 @@ __global__ void scaleFC_staggered_time_comp_27(   real* DC,
 															 unsigned int* neighborFX,
 															 unsigned int* neighborFY,
 															 unsigned int* neighborFZ,
-															 unsigned int size_MatC, 
-															 unsigned int size_MatF, 
+															 unsigned long long numberOfLBnodesCoarse, 
+															 unsigned long long numberOfLBnodesFine, 
 															 bool isEvenTimestep,
 															 unsigned int* posC, 
 															 unsigned int* posFSWB, 
@@ -11175,96 +11192,96 @@ __global__ void scaleFC_staggered_time_comp_27(   real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -11755,827 +11772,6 @@ __global__ void scaleFC_staggered_time_comp_27(   real* DC,
       kxxMyyFromfcNEQ_NEB = -c3o2*omegaS *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (c1o1 + drho_NEB) - ((vx1_NEB*vx1_NEB-vx2_NEB*vx2_NEB)));
       kxxMzzFromfcNEQ_NEB = -c3o2*omegaS *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (c1o1 + drho_NEB) - ((vx1_NEB*vx1_NEB-vx3_NEB*vx3_NEB)));
 
-   //   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	  ////pointertausch
-	  // if (isEvenTimestep==false)
-	  // {
-		 // feC    = &DC[DIR_P00   *size_MatC];
-		 // fwC    = &DC[DIR_M00   *size_MatC];
-		 // fnC    = &DC[DIR_0P0   *size_MatC];
-		 // fsC    = &DC[DIR_0M0   *size_MatC];
-		 // ftC    = &DC[DIR_00P   *size_MatC];
-		 // fbC    = &DC[DIR_00M   *size_MatC];
-		 // fneC   = &DC[DIR_PP0  *size_MatC];
-		 // fswC   = &DC[DIR_MM0  *size_MatC];
-		 // fseC   = &DC[DIR_PM0  *size_MatC];
-		 // fnwC   = &DC[DIR_MP0  *size_MatC];
-		 // fteC   = &DC[DIR_P0P  *size_MatC];
-		 // fbwC   = &DC[DIR_M0M  *size_MatC];
-		 // fbeC   = &DC[DIR_P0M  *size_MatC];
-		 // ftwC   = &DC[DIR_M0P  *size_MatC];
-		 // ftnC   = &DC[DIR_0PP  *size_MatC];
-		 // fbsC   = &DC[DIR_0MM  *size_MatC];
-		 // fbnC   = &DC[DIR_0PM  *size_MatC];
-		 // ftsC   = &DC[DIR_0MP  *size_MatC];
-		 // fzeroC = &DC[DIR_000*size_MatC];
-		 // ftneC  = &DC[DIR_PPP *size_MatC];
-		 // ftswC  = &DC[DIR_MMP *size_MatC];
-		 // ftseC  = &DC[DIR_PMP *size_MatC];
-		 // ftnwC  = &DC[DIR_MPP *size_MatC];
-		 // fbneC  = &DC[DIR_PPM *size_MatC];
-		 // fbswC  = &DC[DIR_MMM *size_MatC];
-		 // fbseC  = &DC[DIR_PMM *size_MatC];
-		 // fbnwC  = &DC[DIR_MPM *size_MatC];
-	  // } 
-	  // else
-	  // {
-		 // fwC    = &DC[DIR_P00   *size_MatC];
-		 // feC    = &DC[DIR_M00   *size_MatC];
-		 // fsC    = &DC[DIR_0P0   *size_MatC];
-		 // fnC    = &DC[DIR_0M0   *size_MatC];
-		 // fbC    = &DC[DIR_00P   *size_MatC];
-		 // ftC    = &DC[DIR_00M   *size_MatC];
-		 // fswC   = &DC[DIR_PP0  *size_MatC];
-		 // fneC   = &DC[DIR_MM0  *size_MatC];
-		 // fnwC   = &DC[DIR_PM0  *size_MatC];
-		 // fseC   = &DC[DIR_MP0  *size_MatC];
-		 // fbwC   = &DC[DIR_P0P  *size_MatC];
-		 // fteC   = &DC[DIR_M0M  *size_MatC];
-		 // ftwC   = &DC[DIR_P0M  *size_MatC];
-		 // fbeC   = &DC[DIR_M0P  *size_MatC];
-		 // fbsC   = &DC[DIR_0PP  *size_MatC];
-		 // ftnC   = &DC[DIR_0MM  *size_MatC];
-		 // ftsC   = &DC[DIR_0PM  *size_MatC];
-		 // fbnC   = &DC[DIR_0MP  *size_MatC];
-		 // fzeroC = &DC[DIR_000*size_MatC];
-		 // fbswC  = &DC[DIR_PPP *size_MatC];
-		 // fbneC  = &DC[DIR_MMP *size_MatC];
-		 // fbnwC  = &DC[DIR_PMP *size_MatC];
-		 // fbseC  = &DC[DIR_MPP *size_MatC];
-		 // ftswC  = &DC[DIR_PPM *size_MatC];
-		 // ftneC  = &DC[DIR_MMM *size_MatC];
-		 // ftnwC  = &DC[DIR_PMM *size_MatC];
-		 // ftseC  = &DC[DIR_MPM *size_MatC];
-	  // }
-
- 	 // real rho_tmp;
-	  //real vx1_tmp;
-	  //real vx2_tmp;
-	  //real vx3_tmp;
-
-   //  //////////////////////////////////////////////////////////////////////////
-   //   xoff = offFC.xOffFC[k];
-   //   yoff = offFC.yOffFC[k];
-   //   zoff = offFC.zOffFC[k];      
-   //   xoff_sq = xoff * xoff;
-   //   yoff_sq = yoff * yoff;
-   //   zoff_sq = zoff * zoff;
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //SWB//
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 0
-   //   k0zero= posFSWB[k];
-   //   k0w   = neighborFX[k0zero];
-   //   k0s   = neighborFY[k0zero];
-   //   k0b   = neighborFZ[k0zero];
-   //   k0sw  = neighborFY[k0w];
-   //   k0bw  = neighborFZ[k0w];
-   //   k0bs  = neighborFZ[k0s];
-   //   k0bsw = neighborFZ[k0sw];
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 
-   //   kzero= k0zero;
-   //   kw   = k0w;   
-   //   ks   = k0s;   
-   //   kb   = k0b;   
-   //   ksw  = k0sw;  
-   //   kbw  = k0bw;  
-   //   kbs  = k0bs;  
-   //   kbsw = k0bsw; 
-   //   ////////////////////////////////////////////////////////////////////////////////
-   //   f_E    = fwF[kw];
-   //   f_W    = feF[kzero];
-   //   f_N    = fsF[ks];
-   //   f_S    = fnF[kzero];
-   //   f_T    = fbF[kb];
-   //   f_B    = ftF[kzero];
-   //   f_NE   = fswF[ksw];
-   //   f_SW   = fneF[kzero];
-   //   f_SE   = fnwF[kw];
-   //   f_NW   = fseF[ks];
-   //   f_TE   = fbwF[kbw];
-   //   f_BW   = fteF[kzero];
-   //   f_BE   = ftwF[kw];
-   //   f_TW   = fbeF[kb];
-   //   f_TN   = fbsF[kbs];
-   //   f_BS   = ftnF[kzero];
-   //   f_BN   = ftsF[ks];
-   //   f_TS   = fbnF[kb];
-   //   f_ZERO = fzeroF[kzero];
-   //   f_TNE  = fbswF[kbsw];
-   //   f_TSW  = fbneF[kb];
-   //   f_TSE  = fbnwF[kbw];
-   //   f_TNW  = fbseF[kbs];
-   //   f_BNE  = ftswF[ksw];
-   //   f_BSW  = ftneF[kzero];
-   //   f_BSE  = ftnwF[kw];
-   //   f_BNW  = ftseF[ks];
-
-   //   //drho_SWB = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-   //   //vx1_SWB  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + drho_SWB);
-	  ////vx2_SWB  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + drho_SWB);
-	  ////vx3_SWB  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + drho_SWB);
-
-   //   //kxyFromfcNEQ_SWB    = -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + drho_SWB) - ((vx1_SWB*vx2_SWB)));
-   //   //kyzFromfcNEQ_SWB    = -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + drho_SWB) - ((vx2_SWB*vx3_SWB)));
-   //   //kxzFromfcNEQ_SWB    = -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + drho_SWB) - ((vx1_SWB*vx3_SWB)));
-   //   //kxxMyyFromfcNEQ_SWB = -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + drho_SWB) - ((vx1_SWB*vx1_SWB-vx2_SWB*vx2_SWB)));
-   //   //kxxMzzFromfcNEQ_SWB = -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + drho_SWB) - ((vx1_SWB*vx1_SWB-vx3_SWB*vx3_SWB)));
-
-	  //rho_tmp = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-	  //
-	  //drho_SWB += rho_tmp;
-
-	  //vx1_tmp  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + rho_tmp);
-	  //vx2_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + rho_tmp);
-	  //vx3_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + rho_tmp);
-
-   //   vx1_SWB  += vx1_tmp;
-	  //vx2_SWB  += vx2_tmp;
-	  //vx3_SWB  += vx3_tmp;
-
-   //   drho_SWB *= c1o2;
-   //   vx1_SWB  *= c1o2;
-	  //vx2_SWB  *= c1o2;
-	  //vx3_SWB  *= c1o2;
-
-   //   kxyFromfcNEQ_SWB    += -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx2_tmp)));
-   //   kyzFromfcNEQ_SWB    += -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + rho_tmp) - ((vx2_tmp*vx3_tmp)));
-   //   kxzFromfcNEQ_SWB    += -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx3_tmp)));
-   //   kxxMyyFromfcNEQ_SWB += -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx2_tmp*vx2_tmp)));
-   //   kxxMzzFromfcNEQ_SWB += -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx3_tmp*vx3_tmp)));
-
-	  //kxyFromfcNEQ_SWB    *= c1o2;
-	  //kyzFromfcNEQ_SWB    *= c1o2;
-	  //kxzFromfcNEQ_SWB    *= c1o2;
-	  //kxxMyyFromfcNEQ_SWB *= c1o2;
-	  //kxxMzzFromfcNEQ_SWB *= c1o2;
-
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //SWT//
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 
-   //   kzero= kb;
-   //   kw   = kbw;   
-   //   ks   = kbs;   
-   //   kb   = neighborFZ[kb];   
-   //   ksw  = kbsw;  
-   //   kbw  = neighborFZ[kbw];  
-   //   kbs  = neighborFZ[kbs];  
-   //   kbsw = neighborFZ[kbsw]; 
-   //   ////////////////////////////////////////////////////////////////////////////////
-   //   f_E    = fwF[kw];
-   //   f_W    = feF[kzero];
-   //   f_N    = fsF[ks];
-   //   f_S    = fnF[kzero];
-   //   f_T    = fbF[kb];
-   //   f_B    = ftF[kzero];
-   //   f_NE   = fswF[ksw];
-   //   f_SW   = fneF[kzero];
-   //   f_SE   = fnwF[kw];
-   //   f_NW   = fseF[ks];
-   //   f_TE   = fbwF[kbw];
-   //   f_BW   = fteF[kzero];
-   //   f_BE   = ftwF[kw];
-   //   f_TW   = fbeF[kb];
-   //   f_TN   = fbsF[kbs];
-   //   f_BS   = ftnF[kzero];
-   //   f_BN   = ftsF[ks];
-   //   f_TS   = fbnF[kb];
-   //   f_ZERO = fzeroF[kzero];
-   //   f_TNE  = fbswF[kbsw];
-   //   f_TSW  = fbneF[kb];
-   //   f_TSE  = fbnwF[kbw];
-   //   f_TNW  = fbseF[kbs];
-   //   f_BNE  = ftswF[ksw];
-   //   f_BSW  = ftneF[kzero];
-   //   f_BSE  = ftnwF[kw];
-   //   f_BNW  = ftseF[ks];
-
-   //   //drho_SWT = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-   //   //vx1_SWT  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + drho_SWT);
-	  ////vx2_SWT  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + drho_SWT);
-	  ////vx3_SWT  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + drho_SWT);
-
-   //   //kxyFromfcNEQ_SWT    = -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + drho_SWT) - ((vx1_SWT*vx2_SWT)));
-   //   //kyzFromfcNEQ_SWT    = -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + drho_SWT) - ((vx2_SWT*vx3_SWT)));
-   //   //kxzFromfcNEQ_SWT    = -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + drho_SWT) - ((vx1_SWT*vx3_SWT)));
-   //   //kxxMyyFromfcNEQ_SWT = -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + drho_SWT) - ((vx1_SWT*vx1_SWT-vx2_SWT*vx2_SWT)));
-   //   //kxxMzzFromfcNEQ_SWT = -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + drho_SWT) - ((vx1_SWT*vx1_SWT-vx3_SWT*vx3_SWT)));
-
-	  //rho_tmp = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-	  //
-	  //drho_SWT += rho_tmp;
-
-	  //vx1_tmp  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + rho_tmp);
-	  //vx2_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + rho_tmp);
-	  //vx3_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + rho_tmp);
-
-   //   vx1_SWT  += vx1_tmp;
-	  //vx2_SWT  += vx2_tmp;
-	  //vx3_SWT  += vx3_tmp;
-
-   //   drho_SWT *= c1o2;
-   //   vx1_SWT  *= c1o2;
-	  //vx2_SWT  *= c1o2;
-	  //vx3_SWT  *= c1o2;
-
-   //   kxyFromfcNEQ_SWT    += -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx2_tmp)));
-   //   kyzFromfcNEQ_SWT    += -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + rho_tmp) - ((vx2_tmp*vx3_tmp)));
-   //   kxzFromfcNEQ_SWT    += -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx3_tmp)));
-   //   kxxMyyFromfcNEQ_SWT += -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx2_tmp*vx2_tmp)));
-   //   kxxMzzFromfcNEQ_SWT += -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx3_tmp*vx3_tmp)));
-
-	  //kxyFromfcNEQ_SWT    *= c1o2;
-	  //kyzFromfcNEQ_SWT    *= c1o2;
-	  //kxzFromfcNEQ_SWT    *= c1o2;
-	  //kxxMyyFromfcNEQ_SWT *= c1o2;
-	  //kxxMzzFromfcNEQ_SWT *= c1o2;
-
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //SET//
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 
-   //   kzero= kw;
-   //   kw   = neighborFX[kw];   
-   //   ks   = ksw;   
-   //   kb   = kbw;   
-   //   ksw  = neighborFX[ksw];  
-   //   kbw  = neighborFX[kbw];  
-   //   kbs  = kbsw;  
-   //   kbsw = neighborFX[kbsw]; 
-   //   ////////////////////////////////////////////////////////////////////////////////
-   //   f_E    = fwF[kw];
-   //   f_W    = feF[kzero];
-   //   f_N    = fsF[ks];
-   //   f_S    = fnF[kzero];
-   //   f_T    = fbF[kb];
-   //   f_B    = ftF[kzero];
-   //   f_NE   = fswF[ksw];
-   //   f_SW   = fneF[kzero];
-   //   f_SE   = fnwF[kw];
-   //   f_NW   = fseF[ks];
-   //   f_TE   = fbwF[kbw];
-   //   f_BW   = fteF[kzero];
-   //   f_BE   = ftwF[kw];
-   //   f_TW   = fbeF[kb];
-   //   f_TN   = fbsF[kbs];
-   //   f_BS   = ftnF[kzero];
-   //   f_BN   = ftsF[ks];
-   //   f_TS   = fbnF[kb];
-   //   f_ZERO = fzeroF[kzero];
-   //   f_TNE  = fbswF[kbsw];
-   //   f_TSW  = fbneF[kb];
-   //   f_TSE  = fbnwF[kbw];
-   //   f_TNW  = fbseF[kbs];
-   //   f_BNE  = ftswF[ksw];
-   //   f_BSW  = ftneF[kzero];
-   //   f_BSE  = ftnwF[kw];
-   //   f_BNW  = ftseF[ks];
-
-   //   //drho_SET = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-   //   //vx1_SET  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + drho_SET);
-	  ////vx2_SET  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + drho_SET);
-	  ////vx3_SET  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + drho_SET);
-
-   //   //kxyFromfcNEQ_SET    = -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + drho_SET) - ((vx1_SET*vx2_SET)));
-   //   //kyzFromfcNEQ_SET    = -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + drho_SET) - ((vx2_SET*vx3_SET)));
-   //   //kxzFromfcNEQ_SET    = -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + drho_SET) - ((vx1_SET*vx3_SET)));
-   //   //kxxMyyFromfcNEQ_SET = -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + drho_SET) - ((vx1_SET*vx1_SET-vx2_SET*vx2_SET)));
-   //   //kxxMzzFromfcNEQ_SET = -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + drho_SET) - ((vx1_SET*vx1_SET-vx3_SET*vx3_SET)));
-
-	  //rho_tmp = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-	  //
-	  //drho_SET += rho_tmp;
-
-	  //vx1_tmp  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + rho_tmp);
-	  //vx2_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + rho_tmp);
-	  //vx3_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + rho_tmp);
-
-   //   vx1_SET  += vx1_tmp;
-	  //vx2_SET  += vx2_tmp;
-	  //vx3_SET  += vx3_tmp;
-
-   //   drho_SET *= c1o2;
-   //   vx1_SET  *= c1o2;
-	  //vx2_SET  *= c1o2;
-	  //vx3_SET  *= c1o2;
-
-   //   kxyFromfcNEQ_SET    += -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx2_tmp)));
-   //   kyzFromfcNEQ_SET    += -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + rho_tmp) - ((vx2_tmp*vx3_tmp)));
-   //   kxzFromfcNEQ_SET    += -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx3_tmp)));
-   //   kxxMyyFromfcNEQ_SET += -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx2_tmp*vx2_tmp)));
-   //   kxxMzzFromfcNEQ_SET += -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx3_tmp*vx3_tmp)));
-
-	  //kxyFromfcNEQ_SET    *= c1o2;
-	  //kyzFromfcNEQ_SET    *= c1o2;
-	  //kxzFromfcNEQ_SET    *= c1o2;
-	  //kxxMyyFromfcNEQ_SET *= c1o2;
-	  //kxxMzzFromfcNEQ_SET *= c1o2;
-
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //SEB//
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 
-   //   kb   = kzero;   
-   //   kbw  = kw;  
-   //   kbs  = ks;  
-   //   kbsw = ksw; 
-   //   kzero= k0w;
-   //   kw   = neighborFX[k0w];   
-   //   ks   = k0sw;   
-   //   ksw  = neighborFX[k0sw];  
-   //   ////////////////////////////////////////////////////////////////////////////////
-   //   f_E    = fwF[kw];
-   //   f_W    = feF[kzero];
-   //   f_N    = fsF[ks];
-   //   f_S    = fnF[kzero];
-   //   f_T    = fbF[kb];
-   //   f_B    = ftF[kzero];
-   //   f_NE   = fswF[ksw];
-   //   f_SW   = fneF[kzero];
-   //   f_SE   = fnwF[kw];
-   //   f_NW   = fseF[ks];
-   //   f_TE   = fbwF[kbw];
-   //   f_BW   = fteF[kzero];
-   //   f_BE   = ftwF[kw];
-   //   f_TW   = fbeF[kb];
-   //   f_TN   = fbsF[kbs];
-   //   f_BS   = ftnF[kzero];
-   //   f_BN   = ftsF[ks];
-   //   f_TS   = fbnF[kb];
-   //   f_ZERO = fzeroF[kzero];
-   //   f_TNE  = fbswF[kbsw];
-   //   f_TSW  = fbneF[kb];
-   //   f_TSE  = fbnwF[kbw];
-   //   f_TNW  = fbseF[kbs];
-   //   f_BNE  = ftswF[ksw];
-   //   f_BSW  = ftneF[kzero];
-   //   f_BSE  = ftnwF[kw];
-   //   f_BNW  = ftseF[ks];
-
-   //   //drho_SEB = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-   //   //vx1_SEB  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + drho_SEB);
-	  ////vx2_SEB  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + drho_SEB);
-	  ////vx3_SEB  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + drho_SEB);
-
-   //   //kxyFromfcNEQ_SEB    = -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + drho_SEB) - ((vx1_SEB*vx2_SEB)));
-   //   //kyzFromfcNEQ_SEB    = -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + drho_SEB) - ((vx2_SEB*vx3_SEB)));
-   //   //kxzFromfcNEQ_SEB    = -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + drho_SEB) - ((vx1_SEB*vx3_SEB)));
-   //   //kxxMyyFromfcNEQ_SEB = -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + drho_SEB) - ((vx1_SEB*vx1_SEB-vx2_SEB*vx2_SEB)));
-   //   //kxxMzzFromfcNEQ_SEB = -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + drho_SEB) - ((vx1_SEB*vx1_SEB-vx3_SEB*vx3_SEB)));
-
-	  //rho_tmp = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-	  //
-	  //drho_SEB += rho_tmp;
-
-	  //vx1_tmp  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + rho_tmp);
-	  //vx2_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + rho_tmp);
-	  //vx3_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + rho_tmp);
-
-   //   vx1_SEB  += vx1_tmp;
-	  //vx2_SEB  += vx2_tmp;
-	  //vx3_SEB  += vx3_tmp;
-
-   //   drho_SEB *= c1o2;
-   //   vx1_SEB  *= c1o2;
-	  //vx2_SEB  *= c1o2;
-	  //vx3_SEB  *= c1o2;
-
-   //   kxyFromfcNEQ_SEB    += -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx2_tmp)));
-   //   kyzFromfcNEQ_SEB    += -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + rho_tmp) - ((vx2_tmp*vx3_tmp)));
-   //   kxzFromfcNEQ_SEB    += -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx3_tmp)));
-   //   kxxMyyFromfcNEQ_SEB += -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx2_tmp*vx2_tmp)));
-   //   kxxMzzFromfcNEQ_SEB += -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx3_tmp*vx3_tmp)));
-
-	  //kxyFromfcNEQ_SEB    *= c1o2;
-	  //kyzFromfcNEQ_SEB    *= c1o2;
-	  //kxzFromfcNEQ_SEB    *= c1o2;
-	  //kxxMyyFromfcNEQ_SEB *= c1o2;
-	  //kxxMzzFromfcNEQ_SEB *= c1o2;
-
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //NWB//
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 0
-   //   k0zero= k0s;
-   //   k0w   = k0sw;
-   //   k0s   = neighborFY[k0s];
-   //   k0b   = k0bs;
-   //   k0sw  = neighborFY[k0sw];
-   //   k0bw  = k0bsw;
-   //   k0bs  = neighborFY[k0bs];
-   //   k0bsw = neighborFY[k0bsw];
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 
-   //   kzero= k0zero;
-   //   kw   = k0w;   
-   //   ks   = k0s;   
-   //   kb   = k0b;   
-   //   ksw  = k0sw;  
-   //   kbw  = k0bw;  
-   //   kbs  = k0bs;  
-   //   kbsw = k0bsw; 
-   //   ////////////////////////////////////////////////////////////////////////////////
-   //   f_E    = fwF[kw];
-   //   f_W    = feF[kzero];
-   //   f_N    = fsF[ks];
-   //   f_S    = fnF[kzero];
-   //   f_T    = fbF[kb];
-   //   f_B    = ftF[kzero];
-   //   f_NE   = fswF[ksw];
-   //   f_SW   = fneF[kzero];
-   //   f_SE   = fnwF[kw];
-   //   f_NW   = fseF[ks];
-   //   f_TE   = fbwF[kbw];
-   //   f_BW   = fteF[kzero];
-   //   f_BE   = ftwF[kw];
-   //   f_TW   = fbeF[kb];
-   //   f_TN   = fbsF[kbs];
-   //   f_BS   = ftnF[kzero];
-   //   f_BN   = ftsF[ks];
-   //   f_TS   = fbnF[kb];
-   //   f_ZERO = fzeroF[kzero];
-   //   f_TNE  = fbswF[kbsw];
-   //   f_TSW  = fbneF[kb];
-   //   f_TSE  = fbnwF[kbw];
-   //   f_TNW  = fbseF[kbs];
-   //   f_BNE  = ftswF[ksw];
-   //   f_BSW  = ftneF[kzero];
-   //   f_BSE  = ftnwF[kw];
-   //   f_BNW  = ftseF[ks];
-
-   //   //drho_NWB = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-   //   //vx1_NWB  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + drho_NWB);
-	  ////vx2_NWB  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + drho_NWB);
-	  ////vx3_NWB  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + drho_NWB);
-
-   //   //kxyFromfcNEQ_NWB    = -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + drho_NWB) - ((vx1_NWB*vx2_NWB)));
-   //   //kyzFromfcNEQ_NWB    = -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + drho_NWB) - ((vx2_NWB*vx3_NWB)));
-   //   //kxzFromfcNEQ_NWB    = -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + drho_NWB) - ((vx1_NWB*vx3_NWB)));
-   //   //kxxMyyFromfcNEQ_NWB = -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + drho_NWB) - ((vx1_NWB*vx1_NWB-vx2_NWB*vx2_NWB)));
-   //   //kxxMzzFromfcNEQ_NWB = -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + drho_NWB) - ((vx1_NWB*vx1_NWB-vx3_NWB*vx3_NWB)));
-
-	  //rho_tmp = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-	  //
-	  //drho_NWB += rho_tmp;
-
-	  //vx1_tmp  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + rho_tmp);
-	  //vx2_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + rho_tmp);
-	  //vx3_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + rho_tmp);
-
-   //   vx1_NWB  += vx1_tmp;
-	  //vx2_NWB  += vx2_tmp;
-	  //vx3_NWB  += vx3_tmp;
-
-   //   drho_NWB *= c1o2;
-   //   vx1_NWB  *= c1o2;
-	  //vx2_NWB  *= c1o2;
-	  //vx3_NWB  *= c1o2;
-
-   //   kxyFromfcNEQ_NWB    += -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx2_tmp)));
-   //   kyzFromfcNEQ_NWB    += -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + rho_tmp) - ((vx2_tmp*vx3_tmp)));
-   //   kxzFromfcNEQ_NWB    += -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx3_tmp)));
-   //   kxxMyyFromfcNEQ_NWB += -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx2_tmp*vx2_tmp)));
-   //   kxxMzzFromfcNEQ_NWB += -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx3_tmp*vx3_tmp)));
-
-	  //kxyFromfcNEQ_NWB    *= c1o2;
-	  //kyzFromfcNEQ_NWB    *= c1o2;
-	  //kxzFromfcNEQ_NWB    *= c1o2;
-	  //kxxMyyFromfcNEQ_NWB *= c1o2;
-	  //kxxMzzFromfcNEQ_NWB *= c1o2;
-
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //NWT//
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 
-   //   kzero= kb;
-   //   kw   = kbw;   
-   //   ks   = kbs;   
-   //   kb   = neighborFZ[kb];   
-   //   ksw  = kbsw;  
-   //   kbw  = neighborFZ[kbw];  
-   //   kbs  = neighborFZ[kbs];  
-   //   kbsw = neighborFZ[kbsw]; 
-   //   ////////////////////////////////////////////////////////////////////////////////
-   //   f_E    = fwF[kw];
-   //   f_W    = feF[kzero];
-   //   f_N    = fsF[ks];
-   //   f_S    = fnF[kzero];
-   //   f_T    = fbF[kb];
-   //   f_B    = ftF[kzero];
-   //   f_NE   = fswF[ksw];
-   //   f_SW   = fneF[kzero];
-   //   f_SE   = fnwF[kw];
-   //   f_NW   = fseF[ks];
-   //   f_TE   = fbwF[kbw];
-   //   f_BW   = fteF[kzero];
-   //   f_BE   = ftwF[kw];
-   //   f_TW   = fbeF[kb];
-   //   f_TN   = fbsF[kbs];
-   //   f_BS   = ftnF[kzero];
-   //   f_BN   = ftsF[ks];
-   //   f_TS   = fbnF[kb];
-   //   f_ZERO = fzeroF[kzero];
-   //   f_TNE  = fbswF[kbsw];
-   //   f_TSW  = fbneF[kb];
-   //   f_TSE  = fbnwF[kbw];
-   //   f_TNW  = fbseF[kbs];
-   //   f_BNE  = ftswF[ksw];
-   //   f_BSW  = ftneF[kzero];
-   //   f_BSE  = ftnwF[kw];
-   //   f_BNW  = ftseF[ks];
-
-   //   //drho_NWT = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-   //   //vx1_NWT  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + drho_NWT);
-	  ////vx2_NWT  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + drho_NWT);
-	  ////vx3_NWT  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + drho_NWT);
-
-   //   //kxyFromfcNEQ_NWT    = -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + drho_NWT) - ((vx1_NWT*vx2_NWT)));
-   //   //kyzFromfcNEQ_NWT    = -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + drho_NWT) - ((vx2_NWT*vx3_NWT)));
-   //   //kxzFromfcNEQ_NWT    = -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + drho_NWT) - ((vx1_NWT*vx3_NWT)));
-   //   //kxxMyyFromfcNEQ_NWT = -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + drho_NWT) - ((vx1_NWT*vx1_NWT-vx2_NWT*vx2_NWT)));
-   //   //kxxMzzFromfcNEQ_NWT = -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + drho_NWT) - ((vx1_NWT*vx1_NWT-vx3_NWT*vx3_NWT)));
-
-	  //rho_tmp = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-	  //
-	  //drho_NWT += rho_tmp;
-
-	  //vx1_tmp  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + rho_tmp);
-	  //vx2_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + rho_tmp);
-	  //vx3_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + rho_tmp);
-
-   //   vx1_NWT  += vx1_tmp;
-	  //vx2_NWT  += vx2_tmp;
-	  //vx3_NWT  += vx3_tmp;
-
-   //   drho_NWT *= c1o2;
-   //   vx1_NWT  *= c1o2;
-	  //vx2_NWT  *= c1o2;
-	  //vx3_NWT  *= c1o2;
-
-   //   kxyFromfcNEQ_NWT    += -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx2_tmp)));
-   //   kyzFromfcNEQ_NWT    += -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + rho_tmp) - ((vx2_tmp*vx3_tmp)));
-   //   kxzFromfcNEQ_NWT    += -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx3_tmp)));
-   //   kxxMyyFromfcNEQ_NWT += -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx2_tmp*vx2_tmp)));
-   //   kxxMzzFromfcNEQ_NWT += -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx3_tmp*vx3_tmp)));
-
-	  //kxyFromfcNEQ_NWT    *= c1o2;
-	  //kyzFromfcNEQ_NWT    *= c1o2;
-	  //kxzFromfcNEQ_NWT    *= c1o2;
-	  //kxxMyyFromfcNEQ_NWT *= c1o2;
-	  //kxxMzzFromfcNEQ_NWT *= c1o2;
-
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //NET//
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 
-   //   kzero= kw;
-   //   kw   = neighborFX[kw];   
-   //   ks   = ksw;   
-   //   kb   = kbw;   
-   //   ksw  = neighborFX[ksw];  
-   //   kbw  = neighborFX[kbw];  
-   //   kbs  = kbsw;  
-   //   kbsw = neighborFX[kbsw]; 
-   //   ////////////////////////////////////////////////////////////////////////////////
-   //   f_E    = fwF[kw];
-   //   f_W    = feF[kzero];
-   //   f_N    = fsF[ks];
-   //   f_S    = fnF[kzero];
-   //   f_T    = fbF[kb];
-   //   f_B    = ftF[kzero];
-   //   f_NE   = fswF[ksw];
-   //   f_SW   = fneF[kzero];
-   //   f_SE   = fnwF[kw];
-   //   f_NW   = fseF[ks];
-   //   f_TE   = fbwF[kbw];
-   //   f_BW   = fteF[kzero];
-   //   f_BE   = ftwF[kw];
-   //   f_TW   = fbeF[kb];
-   //   f_TN   = fbsF[kbs];
-   //   f_BS   = ftnF[kzero];
-   //   f_BN   = ftsF[ks];
-   //   f_TS   = fbnF[kb];
-   //   f_ZERO = fzeroF[kzero];
-   //   f_TNE  = fbswF[kbsw];
-   //   f_TSW  = fbneF[kb];
-   //   f_TSE  = fbnwF[kbw];
-   //   f_TNW  = fbseF[kbs];
-   //   f_BNE  = ftswF[ksw];
-   //   f_BSW  = ftneF[kzero];
-   //   f_BSE  = ftnwF[kw];
-   //   f_BNW  = ftseF[ks];
-
-   //   //drho_NET = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-   //   //vx1_NET  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + drho_NET);
-	  ////vx2_NET  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + drho_NET);
-	  ////vx3_NET  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + drho_NET);
-
-   //   //kxyFromfcNEQ_NET    = -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + drho_NET) - ((vx1_NET*vx2_NET)));
-   //   //kyzFromfcNEQ_NET    = -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + drho_NET) - ((vx2_NET*vx3_NET)));
-   //   //kxzFromfcNEQ_NET    = -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + drho_NET) - ((vx1_NET*vx3_NET)));
-   //   //kxxMyyFromfcNEQ_NET = -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + drho_NET) - ((vx1_NET*vx1_NET-vx2_NET*vx2_NET)));
-   //   //kxxMzzFromfcNEQ_NET = -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + drho_NET) - ((vx1_NET*vx1_NET-vx3_NET*vx3_NET)));
-
-	  //rho_tmp = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-	  //
-	  //drho_NET += rho_tmp;
-
-	  //vx1_tmp  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + rho_tmp);
-	  //vx2_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + rho_tmp);
-	  //vx3_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + rho_tmp);
-
-   //   vx1_NET  += vx1_tmp;
-	  //vx2_NET  += vx2_tmp;
-	  //vx3_NET  += vx3_tmp;
-
-   //   drho_NET *= c1o2;
-   //   vx1_NET  *= c1o2;
-	  //vx2_NET  *= c1o2;
-	  //vx3_NET  *= c1o2;
-
-   //   kxyFromfcNEQ_NET    += -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx2_tmp)));
-   //   kyzFromfcNEQ_NET    += -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + rho_tmp) - ((vx2_tmp*vx3_tmp)));
-   //   kxzFromfcNEQ_NET    += -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx3_tmp)));
-   //   kxxMyyFromfcNEQ_NET += -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx2_tmp*vx2_tmp)));
-   //   kxxMzzFromfcNEQ_NET += -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx3_tmp*vx3_tmp)));
-
-	  //kxyFromfcNEQ_NET    *= c1o2;
-	  //kyzFromfcNEQ_NET    *= c1o2;
-	  //kxzFromfcNEQ_NET    *= c1o2;
-	  //kxxMyyFromfcNEQ_NET *= c1o2;
-	  //kxxMzzFromfcNEQ_NET *= c1o2;
-
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //NEB//
-   //   //////////////////////////////////////////////////////////////////////////
-   //   //index 
-   //   kb   = kzero;   
-   //   kbw  = kw;  
-   //   kbs  = ks;  
-   //   kbsw = ksw; 
-   //   kzero= k0w;
-   //   kw   = neighborFX[k0w];   
-   //   ks   = k0sw;   
-   //   ksw  = neighborFX[k0sw];  
-   //   ////////////////////////////////////////////////////////////////////////////////
-   //   f_E    = fwF[kw];
-   //   f_W    = feF[kzero];
-   //   f_N    = fsF[ks];
-   //   f_S    = fnF[kzero];
-   //   f_T    = fbF[kb];
-   //   f_B    = ftF[kzero];
-   //   f_NE   = fswF[ksw];
-   //   f_SW   = fneF[kzero];
-   //   f_SE   = fnwF[kw];
-   //   f_NW   = fseF[ks];
-   //   f_TE   = fbwF[kbw];
-   //   f_BW   = fteF[kzero];
-   //   f_BE   = ftwF[kw];
-   //   f_TW   = fbeF[kb];
-   //   f_TN   = fbsF[kbs];
-   //   f_BS   = ftnF[kzero];
-   //   f_BN   = ftsF[ks];
-   //   f_TS   = fbnF[kb];
-   //   f_ZERO = fzeroF[kzero];
-   //   f_TNE  = fbswF[kbsw];
-   //   f_TSW  = fbneF[kb];
-   //   f_TSE  = fbnwF[kbw];
-   //   f_TNW  = fbseF[kbs];
-   //   f_BNE  = ftswF[ksw];
-   //   f_BSW  = ftneF[kzero];
-   //   f_BSE  = ftnwF[kw];
-   //   f_BNW  = ftseF[ks];
-
-   //   //drho_NEB = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-   //   //vx1_NEB  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + drho_NEB);
-	  ////vx2_NEB  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + drho_NEB);
-	  ////vx3_NEB  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + drho_NEB);
-
-   //   //kxyFromfcNEQ_NEB    = -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + drho_NEB) - ((vx1_NEB*vx2_NEB)));
-   //   //kyzFromfcNEQ_NEB    = -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + drho_NEB) - ((vx2_NEB*vx3_NEB)));
-   //   //kxzFromfcNEQ_NEB    = -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + drho_NEB) - ((vx1_NEB*vx3_NEB)));
-   //   //kxxMyyFromfcNEQ_NEB = -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + drho_NEB) - ((vx1_NEB*vx1_NEB-vx2_NEB*vx2_NEB)));
-   //   //kxxMzzFromfcNEQ_NEB = -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + drho_NEB) - ((vx1_NEB*vx1_NEB-vx3_NEB*vx3_NEB)));
-
-	  //rho_tmp = f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+f_ZERO+f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
-	  //
-	  //drho_NEB += rho_tmp;
-
-	  //vx1_tmp  = (((f_TNE-f_BSW)+(f_TSE-f_BNW)+(f_BNE-f_TSW)+(f_BSE-f_TNW)) + (((f_NE-f_SW)+(f_TE-f_BW))+((f_SE-f_NW)+(f_BE-f_TW))) + (f_E-f_W))/(one + rho_tmp);
-	  //vx2_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_BNE-f_TSW)+(f_BNW-f_TSE)) + (((f_NE-f_SW)+(f_TN-f_BS))+((f_BN-f_TS)+(f_NW-f_SE))) + (f_N-f_S))/(one + rho_tmp);
-	  //vx3_tmp  = (((f_TNE-f_BSW)+(f_TNW-f_BSE)+(f_TSE-f_BNW)+(f_TSW-f_BNE)) + (((f_TE-f_BW)+(f_TN-f_BS))+((f_TW-f_BE)+(f_TS-f_BN))) + (f_T-f_B))/(one + rho_tmp);
-
-   //   vx1_NEB  += vx1_tmp;
-	  //vx2_NEB  += vx2_tmp;
-	  //vx3_NEB  += vx3_tmp;
-
-   //   drho_NEB *= c1o2;
-   //   vx1_NEB  *= c1o2;
-	  //vx2_NEB  *= c1o2;
-	  //vx3_NEB  *= c1o2;
-
-   //   kxyFromfcNEQ_NEB    += -three*omegaS/(one-omegaS)*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx2_tmp)));
-   //   kyzFromfcNEQ_NEB    += -three*omegaS/(one-omegaS)*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (one + rho_tmp) - ((vx2_tmp*vx3_tmp)));
-   //   kxzFromfcNEQ_NEB    += -three*omegaS/(one-omegaS)*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (one + rho_tmp) - ((vx1_tmp*vx3_tmp)));
-   //   kxxMyyFromfcNEQ_NEB += -c3o2*omegaS/(one-omegaS) *((f_BW+f_W+f_TW-f_BS-f_S-f_TS-f_BN-f_N-f_TN+f_BE+f_E+f_TE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx2_tmp*vx2_tmp)));
-   //   kxxMzzFromfcNEQ_NEB += -c3o2*omegaS/(one-omegaS) *((f_SW+f_W+f_NW-f_BS-f_TS-f_B-f_T-f_BN-f_TN+f_SE+f_E+f_NE             ) / (one + rho_tmp) - ((vx1_tmp*vx1_tmp-vx3_tmp*vx3_tmp)));
-
-	  //kxyFromfcNEQ_NEB    *= c1o2;
-	  //kyzFromfcNEQ_NEB    *= c1o2;
-	  //kxzFromfcNEQ_NEB    *= c1o2;
-	  //kxxMyyFromfcNEQ_NEB *= c1o2;
-	  //kxxMzzFromfcNEQ_NEB *= c1o2;
-	  //
-	  //
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  
-	  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	  //kxyFromfcNEQ_SWB    = zero;
-	  //kyzFromfcNEQ_SWB    = zero;
-	  //kxzFromfcNEQ_SWB    = zero;
-	  //kxxMyyFromfcNEQ_SWB = zero;
-	  //kxxMzzFromfcNEQ_SWB = zero;
-	  //kxyFromfcNEQ_SWT    = zero;
-	  //kyzFromfcNEQ_SWT    = zero;
-	  //kxzFromfcNEQ_SWT    = zero;
-	  //kxxMyyFromfcNEQ_SWT = zero;
-	  //kxxMzzFromfcNEQ_SWT = zero;
-	  //kxyFromfcNEQ_SET    = zero;
-	  //kyzFromfcNEQ_SET    = zero;
-	  //kxzFromfcNEQ_SET    = zero;
-	  //kxxMyyFromfcNEQ_SET = zero;
-	  //kxxMzzFromfcNEQ_SET = zero;
-	  //kxyFromfcNEQ_SEB    = zero;
-	  //kyzFromfcNEQ_SEB    = zero;
-	  //kxzFromfcNEQ_SEB    = zero;
-	  //kxxMyyFromfcNEQ_SEB = zero;
-	  //kxxMzzFromfcNEQ_SEB = zero;
-	  //kxyFromfcNEQ_NWB    = zero;
-	  //kyzFromfcNEQ_NWB    = zero;
-	  //kxzFromfcNEQ_NWB    = zero;
-	  //kxxMyyFromfcNEQ_NWB = zero;
-	  //kxxMzzFromfcNEQ_NWB = zero;
-	  //kxyFromfcNEQ_NWT    = zero;
-	  //kyzFromfcNEQ_NWT    = zero;
-	  //kxzFromfcNEQ_NWT    = zero;
-	  //kxxMyyFromfcNEQ_NWT = zero;
-	  //kxxMzzFromfcNEQ_NWT = zero;
-	  //kxyFromfcNEQ_NET    = zero;
-	  //kyzFromfcNEQ_NET    = zero;
-	  //kxzFromfcNEQ_NET    = zero;
-	  //kxxMyyFromfcNEQ_NET = zero;
-	  //kxxMzzFromfcNEQ_NET = zero;
-	  //kxyFromfcNEQ_NEB    = zero;
-	  //kyzFromfcNEQ_NEB    = zero;
-	  //kxzFromfcNEQ_NEB    = zero;
-	  //kxxMyyFromfcNEQ_NEB = zero;
-	  //kxxMzzFromfcNEQ_NEB = zero;
       //////////////////////////////////////////////////////////////////////////
       //3
       //////////////////////////////////////////////////////////////////////////
@@ -13278,8 +12474,8 @@ __global__ void scaleFC_Fix_comp_27(  real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posC, 
 												 unsigned int* posFSWB, 
@@ -13296,96 +12492,96 @@ __global__ void scaleFC_Fix_comp_27(  real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -15138,8 +14334,8 @@ __global__ void scaleFC_NSPress_27(   real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posC, 
 												 unsigned int* posFSWB, 
@@ -15156,96 +14352,96 @@ __global__ void scaleFC_NSPress_27(   real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -16344,8 +15540,8 @@ __global__ void scaleFC_Fix_27(   real* DC,
                                              unsigned int* neighborFX,
                                              unsigned int* neighborFY,
                                              unsigned int* neighborFZ,
-                                             unsigned int size_MatC, 
-                                             unsigned int size_MatF, 
+                                             unsigned long long numberOfLBnodesCoarse, 
+                                             unsigned long long numberOfLBnodesFine, 
                                              bool isEvenTimestep,
                                              unsigned int* posC, 
                                              unsigned int* posFSWB, 
@@ -16362,96 +15558,96 @@ __global__ void scaleFC_Fix_27(   real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -17704,8 +16900,8 @@ __global__ void scaleFCpress27(real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC, 
-                                          unsigned int size_MatF, 
+                                          unsigned long long numberOfLBnodesCoarse, 
+                                          unsigned long long numberOfLBnodesFine, 
                                           bool isEvenTimestep,
                                           unsigned int* posC, 
                                           unsigned int* posFSWB, 
@@ -17722,96 +16918,96 @@ __global__ void scaleFCpress27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -18629,8 +17825,8 @@ __global__ void scaleFCLast27( real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC, 
-                                          unsigned int size_MatF, 
+                                          unsigned long long numberOfLBnodesCoarse, 
+                                          unsigned long long numberOfLBnodesFine, 
                                           bool isEvenTimestep,
                                           unsigned int* posC, 
                                           unsigned int* posFSWB, 
@@ -18647,96 +17843,96 @@ __global__ void scaleFCLast27( real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -20027,8 +19223,8 @@ __global__ void scaleFCThSMG7(    real* DC,
                                              unsigned int* neighborFX,
                                              unsigned int* neighborFY,
                                              unsigned int* neighborFZ,
-                                             unsigned int size_MatC, 
-                                             unsigned int size_MatF, 
+                                             unsigned long long numberOfLBnodesCoarse, 
+                                             unsigned long long numberOfLBnodesFine, 
                                              bool isEvenTimestep,
                                              unsigned int* posC, 
                                              unsigned int* posFSWB, 
@@ -20040,127 +19236,124 @@ __global__ void scaleFCThSMG7(    real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, //*fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   //fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, //*fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    Distributions7 D7F;
-   D7F.f[0] = &DD7F[0*size_MatF];
-   D7F.f[1] = &DD7F[1*size_MatF];
-   D7F.f[2] = &DD7F[2*size_MatF];
-   D7F.f[3] = &DD7F[3*size_MatF];
-   D7F.f[4] = &DD7F[4*size_MatF];
-   D7F.f[5] = &DD7F[5*size_MatF];
-   D7F.f[6] = &DD7F[6*size_MatF];
+   D7F.f[0] = &DD7F[0*numberOfLBnodesFine];
+   D7F.f[1] = &DD7F[1*numberOfLBnodesFine];
+   D7F.f[2] = &DD7F[2*numberOfLBnodesFine];
+   D7F.f[3] = &DD7F[3*numberOfLBnodesFine];
+   D7F.f[4] = &DD7F[4*numberOfLBnodesFine];
+   D7F.f[5] = &DD7F[5*numberOfLBnodesFine];
+   D7F.f[6] = &DD7F[6*numberOfLBnodesFine];
 
    Distributions7 D7C;
    if (isEvenTimestep==true)
    {
-      D7C.f[0] = &DD7C[0*size_MatC];
-      D7C.f[1] = &DD7C[1*size_MatC];
-      D7C.f[2] = &DD7C[2*size_MatC];
-      D7C.f[3] = &DD7C[3*size_MatC];
-      D7C.f[4] = &DD7C[4*size_MatC];
-      D7C.f[5] = &DD7C[5*size_MatC];
-      D7C.f[6] = &DD7C[6*size_MatC];
+      D7C.f[0] = &DD7C[0*numberOfLBnodesCoarse];
+      D7C.f[1] = &DD7C[1*numberOfLBnodesCoarse];
+      D7C.f[2] = &DD7C[2*numberOfLBnodesCoarse];
+      D7C.f[3] = &DD7C[3*numberOfLBnodesCoarse];
+      D7C.f[4] = &DD7C[4*numberOfLBnodesCoarse];
+      D7C.f[5] = &DD7C[5*numberOfLBnodesCoarse];
+      D7C.f[6] = &DD7C[6*numberOfLBnodesCoarse];
    }
    else
    {
-      D7C.f[0] = &DD7C[0*size_MatC];
-      D7C.f[2] = &DD7C[1*size_MatC];
-      D7C.f[1] = &DD7C[2*size_MatC];
-      D7C.f[4] = &DD7C[3*size_MatC];
-      D7C.f[3] = &DD7C[4*size_MatC];
-      D7C.f[6] = &DD7C[5*size_MatC];
-      D7C.f[5] = &DD7C[6*size_MatC];
+      D7C.f[0] = &DD7C[0*numberOfLBnodesCoarse];
+      D7C.f[2] = &DD7C[1*numberOfLBnodesCoarse];
+      D7C.f[1] = &DD7C[2*numberOfLBnodesCoarse];
+      D7C.f[4] = &DD7C[3*numberOfLBnodesCoarse];
+      D7C.f[3] = &DD7C[4*numberOfLBnodesCoarse];
+      D7C.f[6] = &DD7C[5*numberOfLBnodesCoarse];
+      D7C.f[5] = &DD7C[6*numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -20900,8 +20093,8 @@ __global__ void scaleFCThS7(   real* DC,
                                           unsigned int* neighborFX,
                                           unsigned int* neighborFY,
                                           unsigned int* neighborFZ,
-                                          unsigned int size_MatC, 
-                                          unsigned int size_MatF, 
+                                          unsigned long long numberOfLBnodesCoarse, 
+                                          unsigned long long numberOfLBnodesFine, 
                                           bool isEvenTimestep,
                                           unsigned int* posC, 
                                           unsigned int* posFSWB, 
@@ -20912,127 +20105,124 @@ __global__ void scaleFCThS7(   real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, //*fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   //fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, //*fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    Distributions7 D7F;
-   D7F.f[0] = &DD7F[0*size_MatF];
-   D7F.f[1] = &DD7F[1*size_MatF];
-   D7F.f[2] = &DD7F[2*size_MatF];
-   D7F.f[3] = &DD7F[3*size_MatF];
-   D7F.f[4] = &DD7F[4*size_MatF];
-   D7F.f[5] = &DD7F[5*size_MatF];
-   D7F.f[6] = &DD7F[6*size_MatF];
+   D7F.f[0] = &DD7F[0*numberOfLBnodesFine];
+   D7F.f[1] = &DD7F[1*numberOfLBnodesFine];
+   D7F.f[2] = &DD7F[2*numberOfLBnodesFine];
+   D7F.f[3] = &DD7F[3*numberOfLBnodesFine];
+   D7F.f[4] = &DD7F[4*numberOfLBnodesFine];
+   D7F.f[5] = &DD7F[5*numberOfLBnodesFine];
+   D7F.f[6] = &DD7F[6*numberOfLBnodesFine];
 
    Distributions7 D7C;
    if (isEvenTimestep==true)
    {
-      D7C.f[0] = &DD7C[0*size_MatC];
-      D7C.f[1] = &DD7C[1*size_MatC];
-      D7C.f[2] = &DD7C[2*size_MatC];
-      D7C.f[3] = &DD7C[3*size_MatC];
-      D7C.f[4] = &DD7C[4*size_MatC];
-      D7C.f[5] = &DD7C[5*size_MatC];
-      D7C.f[6] = &DD7C[6*size_MatC];
+      D7C.f[0] = &DD7C[0*numberOfLBnodesCoarse];
+      D7C.f[1] = &DD7C[1*numberOfLBnodesCoarse];
+      D7C.f[2] = &DD7C[2*numberOfLBnodesCoarse];
+      D7C.f[3] = &DD7C[3*numberOfLBnodesCoarse];
+      D7C.f[4] = &DD7C[4*numberOfLBnodesCoarse];
+      D7C.f[5] = &DD7C[5*numberOfLBnodesCoarse];
+      D7C.f[6] = &DD7C[6*numberOfLBnodesCoarse];
    }
    else
    {
-      D7C.f[0] = &DD7C[0*size_MatC];
-      D7C.f[2] = &DD7C[1*size_MatC];
-      D7C.f[1] = &DD7C[2*size_MatC];
-      D7C.f[4] = &DD7C[3*size_MatC];
-      D7C.f[3] = &DD7C[4*size_MatC];
-      D7C.f[6] = &DD7C[5*size_MatC];
-      D7C.f[5] = &DD7C[6*size_MatC];
+      D7C.f[0] = &DD7C[0*numberOfLBnodesCoarse];
+      D7C.f[2] = &DD7C[1*numberOfLBnodesCoarse];
+      D7C.f[1] = &DD7C[2*numberOfLBnodesCoarse];
+      D7C.f[4] = &DD7C[3*numberOfLBnodesCoarse];
+      D7C.f[3] = &DD7C[4*numberOfLBnodesCoarse];
+      D7C.f[6] = &DD7C[5*numberOfLBnodesCoarse];
+      D7C.f[5] = &DD7C[6*numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -21691,8 +20881,8 @@ __global__ void scaleFCThS27(     real* DC,
                                              unsigned int* neighborFX,
                                              unsigned int* neighborFY,
                                              unsigned int* neighborFZ,
-                                             unsigned int size_MatC, 
-                                             unsigned int size_MatF, 
+                                             unsigned long long numberOfLBnodesCoarse, 
+                                             unsigned long long numberOfLBnodesFine, 
                                              bool isEvenTimestep,
                                              unsigned int* posC, 
                                              unsigned int* posFSWB, 
@@ -21704,187 +20894,184 @@ __global__ void scaleFCThS27(     real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, //*fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   //fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, //*fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      //fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    Distributions27 D27F;
-   D27F.f[DIR_P00   ] = &DD27F[DIR_P00   *size_MatF];
-   D27F.f[DIR_M00   ] = &DD27F[DIR_M00   *size_MatF];
-   D27F.f[DIR_0P0   ] = &DD27F[DIR_0P0   *size_MatF];
-   D27F.f[DIR_0M0   ] = &DD27F[DIR_0M0   *size_MatF];
-   D27F.f[DIR_00P   ] = &DD27F[DIR_00P   *size_MatF];
-   D27F.f[DIR_00M   ] = &DD27F[DIR_00M   *size_MatF];
-   D27F.f[DIR_PP0  ] = &DD27F[DIR_PP0  *size_MatF];
-   D27F.f[DIR_MM0  ] = &DD27F[DIR_MM0  *size_MatF];
-   D27F.f[DIR_PM0  ] = &DD27F[DIR_PM0  *size_MatF];
-   D27F.f[DIR_MP0  ] = &DD27F[DIR_MP0  *size_MatF];
-   D27F.f[DIR_P0P  ] = &DD27F[DIR_P0P  *size_MatF];
-   D27F.f[DIR_M0M  ] = &DD27F[DIR_M0M  *size_MatF];
-   D27F.f[DIR_P0M  ] = &DD27F[DIR_P0M  *size_MatF];
-   D27F.f[DIR_M0P  ] = &DD27F[DIR_M0P  *size_MatF];
-   D27F.f[DIR_0PP  ] = &DD27F[DIR_0PP  *size_MatF];
-   D27F.f[DIR_0MM  ] = &DD27F[DIR_0MM  *size_MatF];
-   D27F.f[DIR_0PM  ] = &DD27F[DIR_0PM  *size_MatF];
-   D27F.f[DIR_0MP  ] = &DD27F[DIR_0MP  *size_MatF];
-   D27F.f[DIR_000] = &DD27F[DIR_000*size_MatF];
-   D27F.f[DIR_PPP ] = &DD27F[DIR_PPP *size_MatF];
-   D27F.f[DIR_MMP ] = &DD27F[DIR_MMP *size_MatF];
-   D27F.f[DIR_PMP ] = &DD27F[DIR_PMP *size_MatF];
-   D27F.f[DIR_MPP ] = &DD27F[DIR_MPP *size_MatF];
-   D27F.f[DIR_PPM ] = &DD27F[DIR_PPM *size_MatF];
-   D27F.f[DIR_MMM ] = &DD27F[DIR_MMM *size_MatF];
-   D27F.f[DIR_PMM ] = &DD27F[DIR_PMM *size_MatF];
-   D27F.f[DIR_MPM ] = &DD27F[DIR_MPM *size_MatF];
+   D27F.f[DIR_P00] = &DD27F[DIR_P00 * numberOfLBnodesFine];
+   D27F.f[DIR_M00] = &DD27F[DIR_M00 * numberOfLBnodesFine];
+   D27F.f[DIR_0P0] = &DD27F[DIR_0P0 * numberOfLBnodesFine];
+   D27F.f[DIR_0M0] = &DD27F[DIR_0M0 * numberOfLBnodesFine];
+   D27F.f[DIR_00P] = &DD27F[DIR_00P * numberOfLBnodesFine];
+   D27F.f[DIR_00M] = &DD27F[DIR_00M * numberOfLBnodesFine];
+   D27F.f[DIR_PP0] = &DD27F[DIR_PP0 * numberOfLBnodesFine];
+   D27F.f[DIR_MM0] = &DD27F[DIR_MM0 * numberOfLBnodesFine];
+   D27F.f[DIR_PM0] = &DD27F[DIR_PM0 * numberOfLBnodesFine];
+   D27F.f[DIR_MP0] = &DD27F[DIR_MP0 * numberOfLBnodesFine];
+   D27F.f[DIR_P0P] = &DD27F[DIR_P0P * numberOfLBnodesFine];
+   D27F.f[DIR_M0M] = &DD27F[DIR_M0M * numberOfLBnodesFine];
+   D27F.f[DIR_P0M] = &DD27F[DIR_P0M * numberOfLBnodesFine];
+   D27F.f[DIR_M0P] = &DD27F[DIR_M0P * numberOfLBnodesFine];
+   D27F.f[DIR_0PP] = &DD27F[DIR_0PP * numberOfLBnodesFine];
+   D27F.f[DIR_0MM] = &DD27F[DIR_0MM * numberOfLBnodesFine];
+   D27F.f[DIR_0PM] = &DD27F[DIR_0PM * numberOfLBnodesFine];
+   D27F.f[DIR_0MP] = &DD27F[DIR_0MP * numberOfLBnodesFine];
+   D27F.f[DIR_000] = &DD27F[DIR_000 * numberOfLBnodesFine];
+   D27F.f[DIR_PPP] = &DD27F[DIR_PPP * numberOfLBnodesFine];
+   D27F.f[DIR_MMP] = &DD27F[DIR_MMP * numberOfLBnodesFine];
+   D27F.f[DIR_PMP] = &DD27F[DIR_PMP * numberOfLBnodesFine];
+   D27F.f[DIR_MPP] = &DD27F[DIR_MPP * numberOfLBnodesFine];
+   D27F.f[DIR_PPM] = &DD27F[DIR_PPM * numberOfLBnodesFine];
+   D27F.f[DIR_MMM] = &DD27F[DIR_MMM * numberOfLBnodesFine];
+   D27F.f[DIR_PMM] = &DD27F[DIR_PMM * numberOfLBnodesFine];
+   D27F.f[DIR_MPM] = &DD27F[DIR_MPM * numberOfLBnodesFine];
 
    Distributions27 D27C;
    if (isEvenTimestep==true)
    {
-      D27C.f[DIR_P00   ] = &DD27C[DIR_P00   *size_MatC];
-      D27C.f[DIR_M00   ] = &DD27C[DIR_M00   *size_MatC];
-      D27C.f[DIR_0P0   ] = &DD27C[DIR_0P0   *size_MatC];
-      D27C.f[DIR_0M0   ] = &DD27C[DIR_0M0   *size_MatC];
-      D27C.f[DIR_00P   ] = &DD27C[DIR_00P   *size_MatC];
-      D27C.f[DIR_00M   ] = &DD27C[DIR_00M   *size_MatC];
-      D27C.f[DIR_PP0  ] = &DD27C[DIR_PP0  *size_MatC];
-      D27C.f[DIR_MM0  ] = &DD27C[DIR_MM0  *size_MatC];
-      D27C.f[DIR_PM0  ] = &DD27C[DIR_PM0  *size_MatC];
-      D27C.f[DIR_MP0  ] = &DD27C[DIR_MP0  *size_MatC];
-      D27C.f[DIR_P0P  ] = &DD27C[DIR_P0P  *size_MatC];
-      D27C.f[DIR_M0M  ] = &DD27C[DIR_M0M  *size_MatC];
-      D27C.f[DIR_P0M  ] = &DD27C[DIR_P0M  *size_MatC];
-      D27C.f[DIR_M0P  ] = &DD27C[DIR_M0P  *size_MatC];
-      D27C.f[DIR_0PP  ] = &DD27C[DIR_0PP  *size_MatC];
-      D27C.f[DIR_0MM  ] = &DD27C[DIR_0MM  *size_MatC];
-      D27C.f[DIR_0PM  ] = &DD27C[DIR_0PM  *size_MatC];
-      D27C.f[DIR_0MP  ] = &DD27C[DIR_0MP  *size_MatC];
-      D27C.f[DIR_000] = &DD27C[DIR_000*size_MatC];
-      D27C.f[DIR_PPP ] = &DD27C[DIR_PPP *size_MatC];
-      D27C.f[DIR_MMP ] = &DD27C[DIR_MMP *size_MatC];
-      D27C.f[DIR_PMP ] = &DD27C[DIR_PMP *size_MatC];
-      D27C.f[DIR_MPP ] = &DD27C[DIR_MPP *size_MatC];
-      D27C.f[DIR_PPM ] = &DD27C[DIR_PPM *size_MatC];
-      D27C.f[DIR_MMM ] = &DD27C[DIR_MMM *size_MatC];
-      D27C.f[DIR_PMM ] = &DD27C[DIR_PMM *size_MatC];
-      D27C.f[DIR_MPM ] = &DD27C[DIR_MPM *size_MatC];
+      D27C.f[DIR_P00] = &DD27C[DIR_P00 * numberOfLBnodesCoarse];
+      D27C.f[DIR_M00] = &DD27C[DIR_M00 * numberOfLBnodesCoarse];
+      D27C.f[DIR_0P0] = &DD27C[DIR_0P0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_0M0] = &DD27C[DIR_0M0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_00P] = &DD27C[DIR_00P * numberOfLBnodesCoarse];
+      D27C.f[DIR_00M] = &DD27C[DIR_00M * numberOfLBnodesCoarse];
+      D27C.f[DIR_PP0] = &DD27C[DIR_PP0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_MM0] = &DD27C[DIR_MM0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_PM0] = &DD27C[DIR_PM0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_MP0] = &DD27C[DIR_MP0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_P0P] = &DD27C[DIR_P0P * numberOfLBnodesCoarse];
+      D27C.f[DIR_M0M] = &DD27C[DIR_M0M * numberOfLBnodesCoarse];
+      D27C.f[DIR_P0M] = &DD27C[DIR_P0M * numberOfLBnodesCoarse];
+      D27C.f[DIR_M0P] = &DD27C[DIR_M0P * numberOfLBnodesCoarse];
+      D27C.f[DIR_0PP] = &DD27C[DIR_0PP * numberOfLBnodesCoarse];
+      D27C.f[DIR_0MM] = &DD27C[DIR_0MM * numberOfLBnodesCoarse];
+      D27C.f[DIR_0PM] = &DD27C[DIR_0PM * numberOfLBnodesCoarse];
+      D27C.f[DIR_0MP] = &DD27C[DIR_0MP * numberOfLBnodesCoarse];
+      D27C.f[DIR_000] = &DD27C[DIR_000 * numberOfLBnodesCoarse];
+      D27C.f[DIR_PPP] = &DD27C[DIR_PPP * numberOfLBnodesCoarse];
+      D27C.f[DIR_MMP] = &DD27C[DIR_MMP * numberOfLBnodesCoarse];
+      D27C.f[DIR_PMP] = &DD27C[DIR_PMP * numberOfLBnodesCoarse];
+      D27C.f[DIR_MPP] = &DD27C[DIR_MPP * numberOfLBnodesCoarse];
+      D27C.f[DIR_PPM] = &DD27C[DIR_PPM * numberOfLBnodesCoarse];
+      D27C.f[DIR_MMM] = &DD27C[DIR_MMM * numberOfLBnodesCoarse];
+      D27C.f[DIR_PMM] = &DD27C[DIR_PMM * numberOfLBnodesCoarse];
+      D27C.f[DIR_MPM] = &DD27C[DIR_MPM * numberOfLBnodesCoarse];
    }
    else
    {
-      D27C.f[DIR_M00   ] = &DD27C[DIR_P00   *size_MatC];
-      D27C.f[DIR_P00   ] = &DD27C[DIR_M00   *size_MatC];
-      D27C.f[DIR_0M0   ] = &DD27C[DIR_0P0   *size_MatC];
-      D27C.f[DIR_0P0   ] = &DD27C[DIR_0M0   *size_MatC];
-      D27C.f[DIR_00M   ] = &DD27C[DIR_00P   *size_MatC];
-      D27C.f[DIR_00P   ] = &DD27C[DIR_00M   *size_MatC];
-      D27C.f[DIR_MM0  ] = &DD27C[DIR_PP0  *size_MatC];
-      D27C.f[DIR_PP0  ] = &DD27C[DIR_MM0  *size_MatC];
-      D27C.f[DIR_MP0  ] = &DD27C[DIR_PM0  *size_MatC];
-      D27C.f[DIR_PM0  ] = &DD27C[DIR_MP0  *size_MatC];
-      D27C.f[DIR_M0M  ] = &DD27C[DIR_P0P  *size_MatC];
-      D27C.f[DIR_P0P  ] = &DD27C[DIR_M0M  *size_MatC];
-      D27C.f[DIR_M0P  ] = &DD27C[DIR_P0M  *size_MatC];
-      D27C.f[DIR_P0M  ] = &DD27C[DIR_M0P  *size_MatC];
-      D27C.f[DIR_0MM  ] = &DD27C[DIR_0PP  *size_MatC];
-      D27C.f[DIR_0PP  ] = &DD27C[DIR_0MM  *size_MatC];
-      D27C.f[DIR_0MP  ] = &DD27C[DIR_0PM  *size_MatC];
-      D27C.f[DIR_0PM  ] = &DD27C[DIR_0MP  *size_MatC];
-      D27C.f[DIR_000] = &DD27C[DIR_000*size_MatC];
-      D27C.f[DIR_MMM ] = &DD27C[DIR_PPP *size_MatC];
-      D27C.f[DIR_PPM ] = &DD27C[DIR_MMP *size_MatC];
-      D27C.f[DIR_MPM ] = &DD27C[DIR_PMP *size_MatC];
-      D27C.f[DIR_PMM ] = &DD27C[DIR_MPP *size_MatC];
-      D27C.f[DIR_MMP ] = &DD27C[DIR_PPM *size_MatC];
-      D27C.f[DIR_PPP ] = &DD27C[DIR_MMM *size_MatC];
-      D27C.f[DIR_MPP ] = &DD27C[DIR_PMM *size_MatC];
-      D27C.f[DIR_PMP ] = &DD27C[DIR_MPM *size_MatC];
+      D27C.f[DIR_M00] = &DD27C[DIR_P00 * numberOfLBnodesCoarse];
+      D27C.f[DIR_P00] = &DD27C[DIR_M00 * numberOfLBnodesCoarse];
+      D27C.f[DIR_0M0] = &DD27C[DIR_0P0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_0P0] = &DD27C[DIR_0M0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_00M] = &DD27C[DIR_00P * numberOfLBnodesCoarse];
+      D27C.f[DIR_00P] = &DD27C[DIR_00M * numberOfLBnodesCoarse];
+      D27C.f[DIR_MM0] = &DD27C[DIR_PP0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_PP0] = &DD27C[DIR_MM0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_MP0] = &DD27C[DIR_PM0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_PM0] = &DD27C[DIR_MP0 * numberOfLBnodesCoarse];
+      D27C.f[DIR_M0M] = &DD27C[DIR_P0P * numberOfLBnodesCoarse];
+      D27C.f[DIR_P0P] = &DD27C[DIR_M0M * numberOfLBnodesCoarse];
+      D27C.f[DIR_M0P] = &DD27C[DIR_P0M * numberOfLBnodesCoarse];
+      D27C.f[DIR_P0M] = &DD27C[DIR_M0P * numberOfLBnodesCoarse];
+      D27C.f[DIR_0MM] = &DD27C[DIR_0PP * numberOfLBnodesCoarse];
+      D27C.f[DIR_0PP] = &DD27C[DIR_0MM * numberOfLBnodesCoarse];
+      D27C.f[DIR_0MP] = &DD27C[DIR_0PM * numberOfLBnodesCoarse];
+      D27C.f[DIR_0PM] = &DD27C[DIR_0MP * numberOfLBnodesCoarse];
+      D27C.f[DIR_000] = &DD27C[DIR_000 * numberOfLBnodesCoarse];
+      D27C.f[DIR_MMM] = &DD27C[DIR_PPP * numberOfLBnodesCoarse];
+      D27C.f[DIR_PPM] = &DD27C[DIR_MMP * numberOfLBnodesCoarse];
+      D27C.f[DIR_MPM] = &DD27C[DIR_PMP * numberOfLBnodesCoarse];
+      D27C.f[DIR_PMM] = &DD27C[DIR_MPP * numberOfLBnodesCoarse];
+      D27C.f[DIR_MMP] = &DD27C[DIR_PPM * numberOfLBnodesCoarse];
+      D27C.f[DIR_PPP] = &DD27C[DIR_MMM * numberOfLBnodesCoarse];
+      D27C.f[DIR_MPP] = &DD27C[DIR_PMM * numberOfLBnodesCoarse];
+      D27C.f[DIR_PMP] = &DD27C[DIR_MPM * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -21980,33 +21167,33 @@ __global__ void scaleFCThS27(     real* DC,
       f_BSE  = fbseF[kbs];
       f_BNW  = fbnwF[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27F.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27F.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27F.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27F.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27F.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27F.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27F.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27F.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27F.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27F.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27F.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27F.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27F.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27F.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27F.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27F.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27F.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27F.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27F.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27F.f[DIR_M00])[kw   ];
+      f27N    =  (D27F.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27F.f[DIR_0M0])[ks   ];
+      f27T    =  (D27F.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27F.f[DIR_00M])[kb   ];
+      f27NE   =  (D27F.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27F.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27F.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27F.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27F.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27F.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27F.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27F.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27F.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27F.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27F.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27F.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27F.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27F.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27F.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27F.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27F.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27F.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27F.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27F.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27F.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27F.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27F.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27F.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27F.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27F.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27F.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27F.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27F.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_F_SWB = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -22067,33 +21254,33 @@ __global__ void scaleFCThS27(     real* DC,
       f_BSE  = fbseF[kbs];
       f_BNW  = fbnwF[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27F.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27F.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27F.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27F.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27F.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27F.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27F.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27F.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27F.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27F.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27F.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27F.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27F.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27F.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27F.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27F.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27F.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27F.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27F.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27F.f[DIR_M00])[kw   ];
+      f27N    =  (D27F.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27F.f[DIR_0M0])[ks   ];
+      f27T    =  (D27F.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27F.f[DIR_00M])[kb   ];
+      f27NE   =  (D27F.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27F.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27F.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27F.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27F.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27F.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27F.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27F.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27F.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27F.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27F.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27F.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27F.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27F.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27F.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27F.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27F.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27F.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27F.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27F.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27F.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27F.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27F.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27F.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27F.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27F.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27F.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27F.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27F.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_F_SWT = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -22154,33 +21341,33 @@ __global__ void scaleFCThS27(     real* DC,
       f_BSE  = fbseF[kbs];
       f_BNW  = fbnwF[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27F.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27F.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27F.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27F.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27F.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27F.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27F.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27F.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27F.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27F.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27F.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27F.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27F.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27F.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27F.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27F.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27F.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27F.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27F.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27F.f[DIR_M00])[kw   ];
+      f27N    =  (D27F.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27F.f[DIR_0M0])[ks   ];
+      f27T    =  (D27F.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27F.f[DIR_00M])[kb   ];
+      f27NE   =  (D27F.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27F.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27F.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27F.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27F.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27F.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27F.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27F.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27F.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27F.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27F.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27F.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27F.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27F.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27F.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27F.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27F.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27F.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27F.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27F.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27F.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27F.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27F.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27F.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27F.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27F.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27F.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27F.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27F.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_F_SET = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -22241,33 +21428,33 @@ __global__ void scaleFCThS27(     real* DC,
       f_BSE  = fbseF[kbs];
       f_BNW  = fbnwF[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27F.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27F.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27F.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27F.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27F.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27F.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27F.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27F.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27F.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27F.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27F.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27F.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27F.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27F.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27F.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27F.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27F.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27F.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27F.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27F.f[DIR_M00])[kw   ];
+      f27N    =  (D27F.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27F.f[DIR_0M0])[ks   ];
+      f27T    =  (D27F.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27F.f[DIR_00M])[kb   ];
+      f27NE   =  (D27F.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27F.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27F.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27F.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27F.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27F.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27F.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27F.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27F.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27F.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27F.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27F.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27F.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27F.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27F.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27F.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27F.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27F.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27F.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27F.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27F.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27F.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27F.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27F.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27F.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27F.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27F.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27F.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27F.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_F_SEB = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -22338,33 +21525,33 @@ __global__ void scaleFCThS27(     real* DC,
       f_BSE  = fbseF[kbs];
       f_BNW  = fbnwF[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27F.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27F.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27F.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27F.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27F.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27F.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27F.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27F.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27F.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27F.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27F.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27F.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27F.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27F.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27F.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27F.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27F.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27F.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27F.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27F.f[DIR_M00])[kw   ];
+      f27N    =  (D27F.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27F.f[DIR_0M0])[ks   ];
+      f27T    =  (D27F.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27F.f[DIR_00M])[kb   ];
+      f27NE   =  (D27F.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27F.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27F.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27F.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27F.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27F.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27F.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27F.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27F.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27F.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27F.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27F.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27F.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27F.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27F.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27F.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27F.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27F.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27F.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27F.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27F.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27F.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27F.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27F.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27F.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27F.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27F.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27F.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27F.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_F_NWB = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -22425,33 +21612,33 @@ __global__ void scaleFCThS27(     real* DC,
       f_BSE  = fbseF[kbs];
       f_BNW  = fbnwF[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27F.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27F.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27F.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27F.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27F.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27F.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27F.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27F.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27F.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27F.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27F.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27F.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27F.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27F.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27F.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27F.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27F.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27F.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27F.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27F.f[DIR_M00])[kw   ];
+      f27N    =  (D27F.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27F.f[DIR_0M0])[ks   ];
+      f27T    =  (D27F.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27F.f[DIR_00M])[kb   ];
+      f27NE   =  (D27F.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27F.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27F.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27F.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27F.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27F.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27F.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27F.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27F.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27F.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27F.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27F.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27F.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27F.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27F.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27F.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27F.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27F.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27F.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27F.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27F.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27F.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27F.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27F.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27F.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27F.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27F.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27F.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27F.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_F_NWT = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -22512,33 +21699,33 @@ __global__ void scaleFCThS27(     real* DC,
       f_BSE  = fbseF[kbs];
       f_BNW  = fbnwF[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27F.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27F.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27F.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27F.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27F.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27F.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27F.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27F.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27F.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27F.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27F.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27F.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27F.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27F.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27F.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27F.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27F.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27F.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27F.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27F.f[DIR_M00])[kw   ];
+      f27N    =  (D27F.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27F.f[DIR_0M0])[ks   ];
+      f27T    =  (D27F.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27F.f[DIR_00M])[kb   ];
+      f27NE   =  (D27F.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27F.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27F.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27F.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27F.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27F.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27F.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27F.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27F.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27F.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27F.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27F.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27F.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27F.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27F.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27F.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27F.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27F.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27F.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27F.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27F.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27F.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27F.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27F.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27F.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27F.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27F.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27F.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27F.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_F_NET = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -22599,33 +21786,33 @@ __global__ void scaleFCThS27(     real* DC,
       f_BSE  = fbseF[kbs];
       f_BNW  = fbnwF[kbw];
       //////////////////////////////////////////////////////////////////////////////////
-      f27E    =  (D27F.f[DIR_P00   ])[kzero];//ke
-      f27W    =  (D27F.f[DIR_M00   ])[kw   ];
-      f27N    =  (D27F.f[DIR_0P0   ])[kzero];//kn
-      f27S    =  (D27F.f[DIR_0M0   ])[ks   ];
-      f27T    =  (D27F.f[DIR_00P   ])[kzero];//kt
-      f27B    =  (D27F.f[DIR_00M   ])[kb   ];
-      f27NE   =  (D27F.f[DIR_PP0  ])[kzero];//kne
-      f27SW   =  (D27F.f[DIR_MM0  ])[ksw  ];
-      f27SE   =  (D27F.f[DIR_PM0  ])[ks   ];//kse
-      f27NW   =  (D27F.f[DIR_MP0  ])[kw   ];//knw
-      f27TE   =  (D27F.f[DIR_P0P  ])[kzero];//kte
-      f27BW   =  (D27F.f[DIR_M0M  ])[kbw  ];
-      f27BE   =  (D27F.f[DIR_P0M  ])[kb   ];//kbe
-      f27TW   =  (D27F.f[DIR_M0P  ])[kw   ];//ktw
-      f27TN   =  (D27F.f[DIR_0PP  ])[kzero];//ktn
-      f27BS   =  (D27F.f[DIR_0MM  ])[kbs  ];
-      f27BN   =  (D27F.f[DIR_0PM  ])[kb   ];//kbn
-      f27TS   =  (D27F.f[DIR_0MP  ])[ks   ];//kts
+      f27E    =  (D27F.f[DIR_P00])[kzero];//ke
+      f27W    =  (D27F.f[DIR_M00])[kw   ];
+      f27N    =  (D27F.f[DIR_0P0])[kzero];//kn
+      f27S    =  (D27F.f[DIR_0M0])[ks   ];
+      f27T    =  (D27F.f[DIR_00P])[kzero];//kt
+      f27B    =  (D27F.f[DIR_00M])[kb   ];
+      f27NE   =  (D27F.f[DIR_PP0])[kzero];//kne
+      f27SW   =  (D27F.f[DIR_MM0])[ksw  ];
+      f27SE   =  (D27F.f[DIR_PM0])[ks   ];//kse
+      f27NW   =  (D27F.f[DIR_MP0])[kw   ];//knw
+      f27TE   =  (D27F.f[DIR_P0P])[kzero];//kte
+      f27BW   =  (D27F.f[DIR_M0M])[kbw  ];
+      f27BE   =  (D27F.f[DIR_P0M])[kb   ];//kbe
+      f27TW   =  (D27F.f[DIR_M0P])[kw   ];//ktw
+      f27TN   =  (D27F.f[DIR_0PP])[kzero];//ktn
+      f27BS   =  (D27F.f[DIR_0MM])[kbs  ];
+      f27BN   =  (D27F.f[DIR_0PM])[kb   ];//kbn
+      f27TS   =  (D27F.f[DIR_0MP])[ks   ];//kts
       f27ZERO =  (D27F.f[DIR_000])[kzero];//kzero
-      f27TNE   = (D27F.f[DIR_PPP ])[kzero];//ktne
-      f27TSW   = (D27F.f[DIR_MMP ])[ksw  ];//ktsw
-      f27TSE   = (D27F.f[DIR_PMP ])[ks   ];//ktse
-      f27TNW   = (D27F.f[DIR_MPP ])[kw   ];//ktnw
-      f27BNE   = (D27F.f[DIR_PPM ])[kb   ];//kbne
-      f27BSW   = (D27F.f[DIR_MMM ])[kbsw ];
-      f27BSE   = (D27F.f[DIR_PMM ])[kbs  ];//kbse
-      f27BNW   = (D27F.f[DIR_MPM ])[kbw  ];//kbnw
+      f27TNE   = (D27F.f[DIR_PPP])[kzero];//ktne
+      f27TSW   = (D27F.f[DIR_MMP])[ksw  ];//ktsw
+      f27TSE   = (D27F.f[DIR_PMP])[ks   ];//ktse
+      f27TNW   = (D27F.f[DIR_MPP])[kw   ];//ktnw
+      f27BNE   = (D27F.f[DIR_PPM])[kb   ];//kbne
+      f27BSW   = (D27F.f[DIR_MMM])[kbsw ];
+      f27BSE   = (D27F.f[DIR_PMM])[kbs  ];//kbse
+      f27BNW   = (D27F.f[DIR_MPM])[kbw  ];//kbnw
 
       Conc_F_NEB = f27E + f27W + f27N + f27S + f27T + f27B + f27NE + f27SW + f27SE + f27NW + 
                    f27TE + f27BW + f27BE + f27TW + f27TN + f27BS + f27BN + f27TS + f27ZERO + 
@@ -22739,32 +21926,32 @@ __global__ void scaleFCThS27(     real* DC,
       cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D27C.f[DIR_000])[kzero] =   c8o27* Conc_C*(c1o1-cu_sq);
-      (D27C.f[DIR_P00   ])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_C*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
-      (D27C.f[DIR_M00   ])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_C*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
-      (D27C.f[DIR_0P0   ])[kzero] =   c2o27* (c3o1*(     My    )+Conc_C*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
-      (D27C.f[DIR_0M0   ])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_C*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
-      (D27C.f[DIR_00P   ])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_C*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
-      (D27C.f[DIR_00M   ])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_C*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
-      (D27C.f[DIR_PP0  ])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_C*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
-      (D27C.f[DIR_MM0  ])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_C*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
-      (D27C.f[DIR_PM0  ])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_C*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
-      (D27C.f[DIR_MP0  ])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_C*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
-      (D27C.f[DIR_P0P  ])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_C*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
-      (D27C.f[DIR_M0M  ])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_C*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
-      (D27C.f[DIR_P0M  ])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_C*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
-      (D27C.f[DIR_M0P  ])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_C*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
-      (D27C.f[DIR_0PP  ])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_C*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
-      (D27C.f[DIR_0MM  ])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_C*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
-      (D27C.f[DIR_0PM  ])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_C*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
-      (D27C.f[DIR_0MP  ])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_C*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
-      (D27C.f[DIR_PPP ])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_C*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
-      (D27C.f[DIR_MMM ])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_C*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
-      (D27C.f[DIR_PPM ])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_C*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
-      (D27C.f[DIR_MMP ])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_C*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
-      (D27C.f[DIR_PMP ])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_C*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
-      (D27C.f[DIR_MPM ])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_C*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
-      (D27C.f[DIR_PMM ])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_C*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
-      (D27C.f[DIR_MPP ])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_C*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+      (D27C.f[DIR_P00])[kzero] =   c2o27* (c3o1*( Mx        )+Conc_C*(c1o1+c9o2*( vx1        )*( vx1        )-cu_sq));
+      (D27C.f[DIR_M00])[kw   ] =   c2o27* (c3o1*(-Mx        )+Conc_C*(c1o1+c9o2*(-vx1        )*(-vx1        )-cu_sq));
+      (D27C.f[DIR_0P0])[kzero] =   c2o27* (c3o1*(     My    )+Conc_C*(c1o1+c9o2*(     vx2    )*(     vx2    )-cu_sq));
+      (D27C.f[DIR_0M0])[ks   ] =   c2o27* (c3o1*(    -My    )+Conc_C*(c1o1+c9o2*(    -vx2    )*(    -vx2    )-cu_sq));
+      (D27C.f[DIR_00P])[kzero] =   c2o27* (c3o1*(         Mz)+Conc_C*(c1o1+c9o2*(         vx3)*(         vx3)-cu_sq));
+      (D27C.f[DIR_00M])[kb   ] =   c2o27* (c3o1*(        -Mz)+Conc_C*(c1o1+c9o2*(        -vx3)*(        -vx3)-cu_sq));
+      (D27C.f[DIR_PP0])[kzero] =   c1o54* (c3o1*( Mx +My    )+Conc_C*(c1o1+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq));
+      (D27C.f[DIR_MM0])[ksw  ] =   c1o54* (c3o1*(-Mx -My    )+Conc_C*(c1o1+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq));
+      (D27C.f[DIR_PM0])[ks   ] =   c1o54* (c3o1*( Mx -My    )+Conc_C*(c1o1+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq));
+      (D27C.f[DIR_MP0])[kw   ] =   c1o54* (c3o1*(-Mx +My    )+Conc_C*(c1o1+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq));
+      (D27C.f[DIR_P0P])[kzero] =   c1o54* (c3o1*( Mx     +Mz)+Conc_C*(c1o1+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq));
+      (D27C.f[DIR_M0M])[kbw  ] =   c1o54* (c3o1*(-Mx     -Mz)+Conc_C*(c1o1+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq));
+      (D27C.f[DIR_P0M])[kb   ] =   c1o54* (c3o1*( Mx     -Mz)+Conc_C*(c1o1+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq));
+      (D27C.f[DIR_M0P])[kw   ] =   c1o54* (c3o1*(-Mx     +Mz)+Conc_C*(c1o1+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq));
+      (D27C.f[DIR_0PP])[kzero] =   c1o54* (c3o1*(     My +Mz)+Conc_C*(c1o1+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq));
+      (D27C.f[DIR_0MM])[kbs  ] =   c1o54* (c3o1*(    -My -Mz)+Conc_C*(c1o1+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq));
+      (D27C.f[DIR_0PM])[kb   ] =   c1o54* (c3o1*(     My -Mz)+Conc_C*(c1o1+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq));
+      (D27C.f[DIR_0MP])[ks   ] =   c1o54* (c3o1*(    -My +Mz)+Conc_C*(c1o1+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq));
+      (D27C.f[DIR_PPP])[kzero] =   c1o216*(c3o1*( Mx +My +Mz)+Conc_C*(c1o1+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+      (D27C.f[DIR_MMM])[kbsw ] =   c1o216*(c3o1*(-Mx -My -Mz)+Conc_C*(c1o1+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+      (D27C.f[DIR_PPM])[kb   ] =   c1o216*(c3o1*( Mx +My -Mz)+Conc_C*(c1o1+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+      (D27C.f[DIR_MMP])[ksw  ] =   c1o216*(c3o1*(-Mx -My +Mz)+Conc_C*(c1o1+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+      (D27C.f[DIR_PMP])[ks   ] =   c1o216*(c3o1*( Mx -My +Mz)+Conc_C*(c1o1+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+      (D27C.f[DIR_MPM])[kbw  ] =   c1o216*(c3o1*(-Mx +My -Mz)+Conc_C*(c1o1+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+      (D27C.f[DIR_PMM])[kbs  ] =   c1o216*(c3o1*( Mx -My -Mz)+Conc_C*(c1o1+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+      (D27C.f[DIR_MPP])[kw   ] =   c1o216*(c3o1*(-Mx +My +Mz)+Conc_C*(c1o1+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
 
    }
 }
@@ -22812,8 +21999,8 @@ __global__ void scaleFCEff27(real* DC,
                                         unsigned int* neighborFX,
                                         unsigned int* neighborFY,
                                         unsigned int* neighborFZ,
-                                        unsigned int size_MatC, 
-                                        unsigned int size_MatF, 
+                                        unsigned long long numberOfLBnodesCoarse, 
+                                        unsigned long long numberOfLBnodesFine, 
                                         bool isEvenTimestep,
                                         unsigned int* posC, 
                                         unsigned int* posFSWB, 
@@ -22830,96 +22017,96 @@ __global__ void scaleFCEff27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
       *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
       *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
@@ -23791,8 +22978,8 @@ __global__ void scaleFC27(real* DC,
                                      unsigned int* neighborFX,
                                      unsigned int* neighborFY,
                                      unsigned int* neighborFZ,
-										       unsigned int size_MatC, 
-										       unsigned int size_MatF, 
+										       unsigned long long numberOfLBnodesCoarse, 
+										       unsigned long long numberOfLBnodesFine, 
 										       bool isEvenTimestep,
                                      unsigned int* posC, 
                                      unsigned int* posFSWB, 
@@ -23808,96 +22995,96 @@ __global__ void scaleFC27(real* DC,
    real *feF, *fwF, *fnF, *fsF, *ftF, *fbF, *fneF, *fswF, *fseF, *fnwF, *fteF, *fbwF, *fbeF, *ftwF, *ftnF, *fbsF, *fbnF, *ftsF, *fzeroF, 
          *ftneF, *ftswF, *ftseF, *ftnwF, *fbneF, *fbswF, *fbseF, *fbnwF;
 
-   feF    = &DF[DIR_P00   *size_MatF];
-   fwF    = &DF[DIR_M00   *size_MatF];
-   fnF    = &DF[DIR_0P0   *size_MatF];
-   fsF    = &DF[DIR_0M0   *size_MatF];
-   ftF    = &DF[DIR_00P   *size_MatF];
-   fbF    = &DF[DIR_00M   *size_MatF];
-   fneF   = &DF[DIR_PP0  *size_MatF];
-   fswF   = &DF[DIR_MM0  *size_MatF];
-   fseF   = &DF[DIR_PM0  *size_MatF];
-   fnwF   = &DF[DIR_MP0  *size_MatF];
-   fteF   = &DF[DIR_P0P  *size_MatF];
-   fbwF   = &DF[DIR_M0M  *size_MatF];
-   fbeF   = &DF[DIR_P0M  *size_MatF];
-   ftwF   = &DF[DIR_M0P  *size_MatF];
-   ftnF   = &DF[DIR_0PP  *size_MatF];
-   fbsF   = &DF[DIR_0MM  *size_MatF];
-   fbnF   = &DF[DIR_0PM  *size_MatF];
-   ftsF   = &DF[DIR_0MP  *size_MatF];
-   fzeroF = &DF[DIR_000*size_MatF];
-   ftneF  = &DF[DIR_PPP *size_MatF];
-   ftswF  = &DF[DIR_MMP *size_MatF];
-   ftseF  = &DF[DIR_PMP *size_MatF];
-   ftnwF  = &DF[DIR_MPP *size_MatF];
-   fbneF  = &DF[DIR_PPM *size_MatF];
-   fbswF  = &DF[DIR_MMM *size_MatF];
-   fbseF  = &DF[DIR_PMM *size_MatF];
-   fbnwF  = &DF[DIR_MPM *size_MatF];
+   feF    = &DF[DIR_P00 * numberOfLBnodesFine];
+   fwF    = &DF[DIR_M00 * numberOfLBnodesFine];
+   fnF    = &DF[DIR_0P0 * numberOfLBnodesFine];
+   fsF    = &DF[DIR_0M0 * numberOfLBnodesFine];
+   ftF    = &DF[DIR_00P * numberOfLBnodesFine];
+   fbF    = &DF[DIR_00M * numberOfLBnodesFine];
+   fneF   = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fswF   = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fseF   = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fnwF   = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fteF   = &DF[DIR_P0P * numberOfLBnodesFine];
+   fbwF   = &DF[DIR_M0M * numberOfLBnodesFine];
+   fbeF   = &DF[DIR_P0M * numberOfLBnodesFine];
+   ftwF   = &DF[DIR_M0P * numberOfLBnodesFine];
+   ftnF   = &DF[DIR_0PP * numberOfLBnodesFine];
+   fbsF   = &DF[DIR_0MM * numberOfLBnodesFine];
+   fbnF   = &DF[DIR_0PM * numberOfLBnodesFine];
+   ftsF   = &DF[DIR_0MP * numberOfLBnodesFine];
+   fzeroF = &DF[DIR_000 * numberOfLBnodesFine];
+   ftneF  = &DF[DIR_PPP * numberOfLBnodesFine];
+   ftswF  = &DF[DIR_MMP * numberOfLBnodesFine];
+   ftseF  = &DF[DIR_PMP * numberOfLBnodesFine];
+   ftnwF  = &DF[DIR_MPP * numberOfLBnodesFine];
+   fbneF  = &DF[DIR_PPM * numberOfLBnodesFine];
+   fbswF  = &DF[DIR_MMM * numberOfLBnodesFine];
+   fbseF  = &DF[DIR_PMM * numberOfLBnodesFine];
+   fbnwF  = &DF[DIR_MPM * numberOfLBnodesFine];
 
    real *feC, *fwC, *fnC, *fsC, *ftC, *fbC, *fneC, *fswC, *fseC, *fnwC, *fteC, *fbwC, *fbeC, *ftwC, *ftnC, *fbsC, *fbnC, *ftsC, *fzeroC,
          *ftneC, *ftswC, *ftseC, *ftnwC, *fbneC, *fbswC, *fbseC, *fbnwC;
 
    if (isEvenTimestep==true)
    {
-      feC    = &DC[DIR_P00   *size_MatC];
-      fwC    = &DC[DIR_M00   *size_MatC];
-      fnC    = &DC[DIR_0P0   *size_MatC];
-      fsC    = &DC[DIR_0M0   *size_MatC];
-      ftC    = &DC[DIR_00P   *size_MatC];
-      fbC    = &DC[DIR_00M   *size_MatC];
-      fneC   = &DC[DIR_PP0  *size_MatC];
-      fswC   = &DC[DIR_MM0  *size_MatC];
-      fseC   = &DC[DIR_PM0  *size_MatC];
-      fnwC   = &DC[DIR_MP0  *size_MatC];
-      fteC   = &DC[DIR_P0P  *size_MatC];
-      fbwC   = &DC[DIR_M0M  *size_MatC];
-      fbeC   = &DC[DIR_P0M  *size_MatC];
-      ftwC   = &DC[DIR_M0P  *size_MatC];
-      ftnC   = &DC[DIR_0PP  *size_MatC];
-      fbsC   = &DC[DIR_0MM  *size_MatC];
-      fbnC   = &DC[DIR_0PM  *size_MatC];
-      ftsC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      ftneC  = &DC[DIR_PPP *size_MatC];
-      ftswC  = &DC[DIR_MMP *size_MatC];
-      ftseC  = &DC[DIR_PMP *size_MatC];
-      ftnwC  = &DC[DIR_MPP *size_MatC];
-      fbneC  = &DC[DIR_PPM *size_MatC];
-      fbswC  = &DC[DIR_MMM *size_MatC];
-      fbseC  = &DC[DIR_PMM *size_MatC];
-      fbnwC  = &DC[DIR_MPM *size_MatC];
+      feC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      fwC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    } 
    else
    {
-      fwC    = &DC[DIR_P00   *size_MatC];
-      feC    = &DC[DIR_M00   *size_MatC];
-      fsC    = &DC[DIR_0P0   *size_MatC];
-      fnC    = &DC[DIR_0M0   *size_MatC];
-      fbC    = &DC[DIR_00P   *size_MatC];
-      ftC    = &DC[DIR_00M   *size_MatC];
-      fswC   = &DC[DIR_PP0  *size_MatC];
-      fneC   = &DC[DIR_MM0  *size_MatC];
-      fnwC   = &DC[DIR_PM0  *size_MatC];
-      fseC   = &DC[DIR_MP0  *size_MatC];
-      fbwC   = &DC[DIR_P0P  *size_MatC];
-      fteC   = &DC[DIR_M0M  *size_MatC];
-      ftwC   = &DC[DIR_P0M  *size_MatC];
-      fbeC   = &DC[DIR_M0P  *size_MatC];
-      fbsC   = &DC[DIR_0PP  *size_MatC];
-      ftnC   = &DC[DIR_0MM  *size_MatC];
-      ftsC   = &DC[DIR_0PM  *size_MatC];
-      fbnC   = &DC[DIR_0MP  *size_MatC];
-      fzeroC = &DC[DIR_000*size_MatC];
-      fbswC  = &DC[DIR_PPP *size_MatC];
-      fbneC  = &DC[DIR_MMP *size_MatC];
-      fbnwC  = &DC[DIR_PMP *size_MatC];
-      fbseC  = &DC[DIR_MPP *size_MatC];
-      ftswC  = &DC[DIR_PPM *size_MatC];
-      ftneC  = &DC[DIR_MMM *size_MatC];
-      ftnwC  = &DC[DIR_PMM *size_MatC];
-      ftseC  = &DC[DIR_MPM *size_MatC];
+      fwC    = &DC[DIR_P00 * numberOfLBnodesCoarse];
+      feC    = &DC[DIR_M00 * numberOfLBnodesCoarse];
+      fsC    = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+      fnC    = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+      fbC    = &DC[DIR_00P * numberOfLBnodesCoarse];
+      ftC    = &DC[DIR_00M * numberOfLBnodesCoarse];
+      fswC   = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+      fneC   = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+      fnwC   = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+      fseC   = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+      fbwC   = &DC[DIR_P0P * numberOfLBnodesCoarse];
+      fteC   = &DC[DIR_M0M * numberOfLBnodesCoarse];
+      ftwC   = &DC[DIR_P0M * numberOfLBnodesCoarse];
+      fbeC   = &DC[DIR_M0P * numberOfLBnodesCoarse];
+      fbsC   = &DC[DIR_0PP * numberOfLBnodesCoarse];
+      ftnC   = &DC[DIR_0MM * numberOfLBnodesCoarse];
+      ftsC   = &DC[DIR_0PM * numberOfLBnodesCoarse];
+      fbnC   = &DC[DIR_0MP * numberOfLBnodesCoarse];
+      fzeroC = &DC[DIR_000 * numberOfLBnodesCoarse];
+      fbswC  = &DC[DIR_PPP * numberOfLBnodesCoarse];
+      fbneC  = &DC[DIR_MMP * numberOfLBnodesCoarse];
+      fbnwC  = &DC[DIR_PMP * numberOfLBnodesCoarse];
+      fbseC  = &DC[DIR_MPP * numberOfLBnodesCoarse];
+      ftswC  = &DC[DIR_PPM * numberOfLBnodesCoarse];
+      ftneC  = &DC[DIR_MMM * numberOfLBnodesCoarse];
+      ftnwC  = &DC[DIR_PMM * numberOfLBnodesCoarse];
+      ftseC  = &DC[DIR_MPM * numberOfLBnodesCoarse];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  ix = threadIdx.x;  // Globaler x-Index 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC_F3_27.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC_F3_27.cu
index e7fe8b50637e97b9c8cc34025216f4d02e684c55..3b108ad4ae43bd63698f3516a207630214695797 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC_F3_27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/ScaleFC_F3_27.cu
@@ -23,8 +23,8 @@ __global__ void scaleFC_comp_D3Q27F3_2018(real* DC,
 													 unsigned int* neighborFX,
 													 unsigned int* neighborFY,
 													 unsigned int* neighborFZ,
-													 unsigned int size_MatC, 
-													 unsigned int size_MatF, 
+													 unsigned long long numberOfLBnodesCoarse, 
+													 unsigned long long numberOfLBnodesFine, 
 													 bool isEvenTimestep,
 													 unsigned int* posC, 
 													 unsigned int* posFSWB, 
@@ -44,33 +44,33 @@ __global__ void scaleFC_comp_D3Q27F3_2018(real* DC,
 	   *f000source, *fMMMsource, *fMMPsource, *fMPPsource, *fMPMsource, *fPPMsource, *fPPPsource, *fPMPsource, *fPMMsource;
 
 
-   fP00source = &DF[DIR_P00   *size_MatF];
-   fM00source = &DF[DIR_M00   *size_MatF];
-   f0P0source = &DF[DIR_0P0   *size_MatF];
-   f0M0source = &DF[DIR_0M0   *size_MatF];
-   f00Psource = &DF[DIR_00P   *size_MatF];
-   f00Msource = &DF[DIR_00M   *size_MatF];
-   fPP0source = &DF[DIR_PP0  *size_MatF];
-   fMM0source = &DF[DIR_MM0  *size_MatF];
-   fPM0source = &DF[DIR_PM0  *size_MatF];
-   fMP0source = &DF[DIR_MP0  *size_MatF];
-   fP0Psource = &DF[DIR_P0P  *size_MatF];
-   fM0Msource = &DF[DIR_M0M  *size_MatF];
-   fP0Msource = &DF[DIR_P0M  *size_MatF];
-   fM0Psource = &DF[DIR_M0P  *size_MatF];
-   f0PPsource = &DF[DIR_0PP  *size_MatF];
-   f0MMsource = &DF[DIR_0MM  *size_MatF];
-   f0PMsource = &DF[DIR_0PM  *size_MatF];
-   f0MPsource = &DF[DIR_0MP  *size_MatF];
-   f000source = &DF[DIR_000*size_MatF];
-   fMMMsource = &DF[DIR_MMM *size_MatF];
-   fMMPsource = &DF[DIR_MMP *size_MatF];
-   fMPPsource = &DF[DIR_MPP *size_MatF];
-   fMPMsource = &DF[DIR_MPM *size_MatF];
-   fPPMsource = &DF[DIR_PPM *size_MatF];
-   fPPPsource = &DF[DIR_PPP *size_MatF];
-   fPMPsource = &DF[DIR_PMP *size_MatF];
-   fPMMsource = &DF[DIR_PMM *size_MatF];
+   fP00source = &DF[DIR_P00 * numberOfLBnodesFine];
+   fM00source = &DF[DIR_M00 * numberOfLBnodesFine];
+   f0P0source = &DF[DIR_0P0 * numberOfLBnodesFine];
+   f0M0source = &DF[DIR_0M0 * numberOfLBnodesFine];
+   f00Psource = &DF[DIR_00P * numberOfLBnodesFine];
+   f00Msource = &DF[DIR_00M * numberOfLBnodesFine];
+   fPP0source = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fMM0source = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fPM0source = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fMP0source = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fP0Psource = &DF[DIR_P0P * numberOfLBnodesFine];
+   fM0Msource = &DF[DIR_M0M * numberOfLBnodesFine];
+   fP0Msource = &DF[DIR_P0M * numberOfLBnodesFine];
+   fM0Psource = &DF[DIR_M0P * numberOfLBnodesFine];
+   f0PPsource = &DF[DIR_0PP * numberOfLBnodesFine];
+   f0MMsource = &DF[DIR_0MM * numberOfLBnodesFine];
+   f0PMsource = &DF[DIR_0PM * numberOfLBnodesFine];
+   f0MPsource = &DF[DIR_0MP * numberOfLBnodesFine];
+   f000source = &DF[DIR_000 * numberOfLBnodesFine];
+   fMMMsource = &DF[DIR_MMM * numberOfLBnodesFine];
+   fMMPsource = &DF[DIR_MMP * numberOfLBnodesFine];
+   fMPPsource = &DF[DIR_MPP * numberOfLBnodesFine];
+   fMPMsource = &DF[DIR_MPM * numberOfLBnodesFine];
+   fPPMsource = &DF[DIR_PPM * numberOfLBnodesFine];
+   fPPPsource = &DF[DIR_PPP * numberOfLBnodesFine];
+   fPMPsource = &DF[DIR_PMP * numberOfLBnodesFine];
+   fPMMsource = &DF[DIR_PMM * numberOfLBnodesFine];
 
    real
 	   *fP00dest, *fM00dest, *f0P0dest, *f0M0dest, *f00Pdest, *f00Mdest, *fPP0dest, *fMM0dest, *fPM0dest,
@@ -79,83 +79,83 @@ __global__ void scaleFC_comp_D3Q27F3_2018(real* DC,
 
    if (isEvenTimestep==true)
    {
-	   fP00dest = &DC[DIR_P00   *size_MatC];
-	   fM00dest = &DC[DIR_M00   *size_MatC];
-	   f0P0dest = &DC[DIR_0P0   *size_MatC];
-	   f0M0dest = &DC[DIR_0M0   *size_MatC];
-	   f00Pdest = &DC[DIR_00P   *size_MatC];
-	   f00Mdest = &DC[DIR_00M   *size_MatC];
-	   fPP0dest = &DC[DIR_PP0  *size_MatC];
-	   fMM0dest = &DC[DIR_MM0  *size_MatC];
-	   fPM0dest = &DC[DIR_PM0  *size_MatC];
-	   fMP0dest = &DC[DIR_MP0  *size_MatC];
-	   fP0Pdest = &DC[DIR_P0P  *size_MatC];
-	   fM0Mdest = &DC[DIR_M0M  *size_MatC];
-	   fP0Mdest = &DC[DIR_P0M  *size_MatC];
-	   fM0Pdest = &DC[DIR_M0P  *size_MatC];
-	   f0PPdest = &DC[DIR_0PP  *size_MatC];
-	   f0MMdest = &DC[DIR_0MM  *size_MatC];
-	   f0PMdest = &DC[DIR_0PM  *size_MatC];
-	   f0MPdest = &DC[DIR_0MP  *size_MatC];
-	   f000dest = &DC[DIR_000*size_MatC];
-	   fMMMdest = &DC[DIR_MMM *size_MatC];
-	   fMMPdest = &DC[DIR_MMP *size_MatC];
-	   fMPPdest = &DC[DIR_MPP *size_MatC];
-	   fMPMdest = &DC[DIR_MPM *size_MatC];
-	   fPPMdest = &DC[DIR_PPM *size_MatC];
-	   fPPPdest = &DC[DIR_PPP *size_MatC];
-	   fPMPdest = &DC[DIR_PMP *size_MatC];
-	   fPMMdest = &DC[DIR_PMM *size_MatC];
+	   fP00dest = &DC[DIR_P00 * numberOfLBnodesCoarse];
+	   fM00dest = &DC[DIR_M00 * numberOfLBnodesCoarse];
+	   f0P0dest = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+	   f0M0dest = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+	   f00Pdest = &DC[DIR_00P * numberOfLBnodesCoarse];
+	   f00Mdest = &DC[DIR_00M * numberOfLBnodesCoarse];
+	   fPP0dest = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+	   fMM0dest = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+	   fPM0dest = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+	   fMP0dest = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+	   fP0Pdest = &DC[DIR_P0P * numberOfLBnodesCoarse];
+	   fM0Mdest = &DC[DIR_M0M * numberOfLBnodesCoarse];
+	   fP0Mdest = &DC[DIR_P0M * numberOfLBnodesCoarse];
+	   fM0Pdest = &DC[DIR_M0P * numberOfLBnodesCoarse];
+	   f0PPdest = &DC[DIR_0PP * numberOfLBnodesCoarse];
+	   f0MMdest = &DC[DIR_0MM * numberOfLBnodesCoarse];
+	   f0PMdest = &DC[DIR_0PM * numberOfLBnodesCoarse];
+	   f0MPdest = &DC[DIR_0MP * numberOfLBnodesCoarse];
+	   f000dest = &DC[DIR_000 * numberOfLBnodesCoarse];
+	   fMMMdest = &DC[DIR_MMM * numberOfLBnodesCoarse];
+	   fMMPdest = &DC[DIR_MMP * numberOfLBnodesCoarse];
+	   fMPPdest = &DC[DIR_MPP * numberOfLBnodesCoarse];
+	   fMPMdest = &DC[DIR_MPM * numberOfLBnodesCoarse];
+	   fPPMdest = &DC[DIR_PPM * numberOfLBnodesCoarse];
+	   fPPPdest = &DC[DIR_PPP * numberOfLBnodesCoarse];
+	   fPMPdest = &DC[DIR_PMP * numberOfLBnodesCoarse];
+	   fPMMdest = &DC[DIR_PMM * numberOfLBnodesCoarse];
    } 
    else
    {
-	   fP00dest = &DC[DIR_M00   *size_MatC];
-	   fM00dest = &DC[DIR_P00   *size_MatC];
-	   f0P0dest = &DC[DIR_0M0   *size_MatC];
-	   f0M0dest = &DC[DIR_0P0   *size_MatC];
-	   f00Pdest = &DC[DIR_00M   *size_MatC];
-	   f00Mdest = &DC[DIR_00P   *size_MatC];
-	   fPP0dest = &DC[DIR_MM0  *size_MatC];
-	   fMM0dest = &DC[DIR_PP0  *size_MatC];
-	   fPM0dest = &DC[DIR_MP0  *size_MatC];
-	   fMP0dest = &DC[DIR_PM0  *size_MatC];
-	   fP0Pdest = &DC[DIR_M0M  *size_MatC];
-	   fM0Mdest = &DC[DIR_P0P  *size_MatC];
-	   fP0Mdest = &DC[DIR_M0P  *size_MatC];
-	   fM0Pdest = &DC[DIR_P0M  *size_MatC];
-	   f0PPdest = &DC[DIR_0MM  *size_MatC];
-	   f0MMdest = &DC[DIR_0PP  *size_MatC];
-	   f0PMdest = &DC[DIR_0MP  *size_MatC];
-	   f0MPdest = &DC[DIR_0PM  *size_MatC];
-	   f000dest = &DC[DIR_000*size_MatC];
-	   fMMMdest = &DC[DIR_PPP *size_MatC];
-	   fMMPdest = &DC[DIR_PPM *size_MatC];
-	   fMPPdest = &DC[DIR_PMM *size_MatC];
-	   fMPMdest = &DC[DIR_PMP *size_MatC];
-	   fPPMdest = &DC[DIR_MMP *size_MatC];
-	   fPPPdest = &DC[DIR_MMM *size_MatC];
-	   fPMPdest = &DC[DIR_MPM *size_MatC];
-	   fPMMdest = &DC[DIR_MPP *size_MatC];
+	   fP00dest = &DC[DIR_M00 * numberOfLBnodesCoarse];
+	   fM00dest = &DC[DIR_P00 * numberOfLBnodesCoarse];
+	   f0P0dest = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+	   f0M0dest = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+	   f00Pdest = &DC[DIR_00M * numberOfLBnodesCoarse];
+	   f00Mdest = &DC[DIR_00P * numberOfLBnodesCoarse];
+	   fPP0dest = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+	   fMM0dest = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+	   fPM0dest = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+	   fMP0dest = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+	   fP0Pdest = &DC[DIR_M0M * numberOfLBnodesCoarse];
+	   fM0Mdest = &DC[DIR_P0P * numberOfLBnodesCoarse];
+	   fP0Mdest = &DC[DIR_M0P * numberOfLBnodesCoarse];
+	   fM0Pdest = &DC[DIR_P0M * numberOfLBnodesCoarse];
+	   f0PPdest = &DC[DIR_0MM * numberOfLBnodesCoarse];
+	   f0MMdest = &DC[DIR_0PP * numberOfLBnodesCoarse];
+	   f0PMdest = &DC[DIR_0MP * numberOfLBnodesCoarse];
+	   f0MPdest = &DC[DIR_0PM * numberOfLBnodesCoarse];
+	   f000dest = &DC[DIR_000 * numberOfLBnodesCoarse];
+	   fMMMdest = &DC[DIR_PPP * numberOfLBnodesCoarse];
+	   fMMPdest = &DC[DIR_PPM * numberOfLBnodesCoarse];
+	   fMPPdest = &DC[DIR_PMM * numberOfLBnodesCoarse];
+	   fMPMdest = &DC[DIR_PMP * numberOfLBnodesCoarse];
+	   fPPMdest = &DC[DIR_MMP * numberOfLBnodesCoarse];
+	   fPPPdest = &DC[DIR_MMM * numberOfLBnodesCoarse];
+	   fPMPdest = &DC[DIR_MPM * numberOfLBnodesCoarse];
+	   fPMMdest = &DC[DIR_MPP * numberOfLBnodesCoarse];
    }
 
    Distributions6 G;
    if (isEvenTimestep == true)
    {
-	   G.g[DIR_P00] = &G6[DIR_P00   *size_MatC];
-	   G.g[DIR_M00] = &G6[DIR_M00   *size_MatC];
-	   G.g[DIR_0P0] = &G6[DIR_0P0   *size_MatC];
-	   G.g[DIR_0M0] = &G6[DIR_0M0   *size_MatC];
-	   G.g[DIR_00P] = &G6[DIR_00P   *size_MatC];
-	   G.g[DIR_00M] = &G6[DIR_00M   *size_MatC];
+	   G.g[DIR_P00] = &G6[DIR_P00 * numberOfLBnodesCoarse];
+	   G.g[DIR_M00] = &G6[DIR_M00 * numberOfLBnodesCoarse];
+	   G.g[DIR_0P0] = &G6[DIR_0P0 * numberOfLBnodesCoarse];
+	   G.g[DIR_0M0] = &G6[DIR_0M0 * numberOfLBnodesCoarse];
+	   G.g[DIR_00P] = &G6[DIR_00P * numberOfLBnodesCoarse];
+	   G.g[DIR_00M] = &G6[DIR_00M * numberOfLBnodesCoarse];
    }
    else
    {
-	   G.g[DIR_M00] = &G6[DIR_P00   *size_MatC];
-	   G.g[DIR_P00] = &G6[DIR_M00   *size_MatC];
-	   G.g[DIR_0M0] = &G6[DIR_0P0   *size_MatC];
-	   G.g[DIR_0P0] = &G6[DIR_0M0   *size_MatC];
-	   G.g[DIR_00M] = &G6[DIR_00P   *size_MatC];
-	   G.g[DIR_00P] = &G6[DIR_00M   *size_MatC];
+	   G.g[DIR_M00] = &G6[DIR_P00 * numberOfLBnodesCoarse];
+	   G.g[DIR_P00] = &G6[DIR_M00 * numberOfLBnodesCoarse];
+	   G.g[DIR_0M0] = &G6[DIR_0P0 * numberOfLBnodesCoarse];
+	   G.g[DIR_0P0] = &G6[DIR_0M0 * numberOfLBnodesCoarse];
+	   G.g[DIR_00M] = &G6[DIR_00P * numberOfLBnodesCoarse];
+	   G.g[DIR_00P] = &G6[DIR_00M * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
@@ -1270,8 +1270,8 @@ __global__ void scaleFC_comp_D3Q27F3( real* DC,
 												 unsigned int* neighborFX,
 												 unsigned int* neighborFY,
 												 unsigned int* neighborFZ,
-												 unsigned int size_MatC, 
-												 unsigned int size_MatF, 
+												 unsigned long long numberOfLBnodesCoarse, 
+												 unsigned long long numberOfLBnodesFine, 
 												 bool isEvenTimestep,
 												 unsigned int* posC, 
 												 unsigned int* posFSWB, 
@@ -1291,33 +1291,33 @@ __global__ void scaleFC_comp_D3Q27F3( real* DC,
 	   *f000source, *fMMMsource, *fMMPsource, *fMPPsource, *fMPMsource, *fPPMsource, *fPPPsource, *fPMPsource, *fPMMsource;
 
 
-   fP00source = &DF[DIR_P00   *size_MatF];
-   fM00source = &DF[DIR_M00   *size_MatF];
-   f0P0source = &DF[DIR_0P0   *size_MatF];
-   f0M0source = &DF[DIR_0M0   *size_MatF];
-   f00Psource = &DF[DIR_00P   *size_MatF];
-   f00Msource = &DF[DIR_00M   *size_MatF];
-   fPP0source = &DF[DIR_PP0  *size_MatF];
-   fMM0source = &DF[DIR_MM0  *size_MatF];
-   fPM0source = &DF[DIR_PM0  *size_MatF];
-   fMP0source = &DF[DIR_MP0  *size_MatF];
-   fP0Psource = &DF[DIR_P0P  *size_MatF];
-   fM0Msource = &DF[DIR_M0M  *size_MatF];
-   fP0Msource = &DF[DIR_P0M  *size_MatF];
-   fM0Psource = &DF[DIR_M0P  *size_MatF];
-   f0PPsource = &DF[DIR_0PP  *size_MatF];
-   f0MMsource = &DF[DIR_0MM  *size_MatF];
-   f0PMsource = &DF[DIR_0PM  *size_MatF];
-   f0MPsource = &DF[DIR_0MP  *size_MatF];
-   f000source = &DF[DIR_000*size_MatF];
-   fMMMsource = &DF[DIR_MMM *size_MatF];
-   fMMPsource = &DF[DIR_MMP *size_MatF];
-   fMPPsource = &DF[DIR_MPP *size_MatF];
-   fMPMsource = &DF[DIR_MPM *size_MatF];
-   fPPMsource = &DF[DIR_PPM *size_MatF];
-   fPPPsource = &DF[DIR_PPP *size_MatF];
-   fPMPsource = &DF[DIR_PMP *size_MatF];
-   fPMMsource = &DF[DIR_PMM *size_MatF];
+   fP00source = &DF[DIR_P00 * numberOfLBnodesFine];
+   fM00source = &DF[DIR_M00 * numberOfLBnodesFine];
+   f0P0source = &DF[DIR_0P0 * numberOfLBnodesFine];
+   f0M0source = &DF[DIR_0M0 * numberOfLBnodesFine];
+   f00Psource = &DF[DIR_00P * numberOfLBnodesFine];
+   f00Msource = &DF[DIR_00M * numberOfLBnodesFine];
+   fPP0source = &DF[DIR_PP0 * numberOfLBnodesFine];
+   fMM0source = &DF[DIR_MM0 * numberOfLBnodesFine];
+   fPM0source = &DF[DIR_PM0 * numberOfLBnodesFine];
+   fMP0source = &DF[DIR_MP0 * numberOfLBnodesFine];
+   fP0Psource = &DF[DIR_P0P * numberOfLBnodesFine];
+   fM0Msource = &DF[DIR_M0M * numberOfLBnodesFine];
+   fP0Msource = &DF[DIR_P0M * numberOfLBnodesFine];
+   fM0Psource = &DF[DIR_M0P * numberOfLBnodesFine];
+   f0PPsource = &DF[DIR_0PP * numberOfLBnodesFine];
+   f0MMsource = &DF[DIR_0MM * numberOfLBnodesFine];
+   f0PMsource = &DF[DIR_0PM * numberOfLBnodesFine];
+   f0MPsource = &DF[DIR_0MP * numberOfLBnodesFine];
+   f000source = &DF[DIR_000 * numberOfLBnodesFine];
+   fMMMsource = &DF[DIR_MMM * numberOfLBnodesFine];
+   fMMPsource = &DF[DIR_MMP * numberOfLBnodesFine];
+   fMPPsource = &DF[DIR_MPP * numberOfLBnodesFine];
+   fMPMsource = &DF[DIR_MPM * numberOfLBnodesFine];
+   fPPMsource = &DF[DIR_PPM * numberOfLBnodesFine];
+   fPPPsource = &DF[DIR_PPP * numberOfLBnodesFine];
+   fPMPsource = &DF[DIR_PMP * numberOfLBnodesFine];
+   fPMMsource = &DF[DIR_PMM * numberOfLBnodesFine];
 
    real
 	   *fP00dest, *fM00dest, *f0P0dest, *f0M0dest, *f00Pdest, *f00Mdest, *fPP0dest, *fMM0dest, *fPM0dest,
@@ -1326,83 +1326,83 @@ __global__ void scaleFC_comp_D3Q27F3( real* DC,
 
    if (isEvenTimestep==true)
    {
-	   fP00dest = &DC[DIR_P00   *size_MatC];
-	   fM00dest = &DC[DIR_M00   *size_MatC];
-	   f0P0dest = &DC[DIR_0P0   *size_MatC];
-	   f0M0dest = &DC[DIR_0M0   *size_MatC];
-	   f00Pdest = &DC[DIR_00P   *size_MatC];
-	   f00Mdest = &DC[DIR_00M   *size_MatC];
-	   fPP0dest = &DC[DIR_PP0  *size_MatC];
-	   fMM0dest = &DC[DIR_MM0  *size_MatC];
-	   fPM0dest = &DC[DIR_PM0  *size_MatC];
-	   fMP0dest = &DC[DIR_MP0  *size_MatC];
-	   fP0Pdest = &DC[DIR_P0P  *size_MatC];
-	   fM0Mdest = &DC[DIR_M0M  *size_MatC];
-	   fP0Mdest = &DC[DIR_P0M  *size_MatC];
-	   fM0Pdest = &DC[DIR_M0P  *size_MatC];
-	   f0PPdest = &DC[DIR_0PP  *size_MatC];
-	   f0MMdest = &DC[DIR_0MM  *size_MatC];
-	   f0PMdest = &DC[DIR_0PM  *size_MatC];
-	   f0MPdest = &DC[DIR_0MP  *size_MatC];
-	   f000dest = &DC[DIR_000*size_MatC];
-	   fMMMdest = &DC[DIR_MMM *size_MatC];
-	   fMMPdest = &DC[DIR_MMP *size_MatC];
-	   fMPPdest = &DC[DIR_MPP *size_MatC];
-	   fMPMdest = &DC[DIR_MPM *size_MatC];
-	   fPPMdest = &DC[DIR_PPM *size_MatC];
-	   fPPPdest = &DC[DIR_PPP *size_MatC];
-	   fPMPdest = &DC[DIR_PMP *size_MatC];
-	   fPMMdest = &DC[DIR_PMM *size_MatC];
+	   fP00dest = &DC[DIR_P00 * numberOfLBnodesCoarse];
+	   fM00dest = &DC[DIR_M00 * numberOfLBnodesCoarse];
+	   f0P0dest = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+	   f0M0dest = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+	   f00Pdest = &DC[DIR_00P * numberOfLBnodesCoarse];
+	   f00Mdest = &DC[DIR_00M * numberOfLBnodesCoarse];
+	   fPP0dest = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+	   fMM0dest = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+	   fPM0dest = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+	   fMP0dest = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+	   fP0Pdest = &DC[DIR_P0P * numberOfLBnodesCoarse];
+	   fM0Mdest = &DC[DIR_M0M * numberOfLBnodesCoarse];
+	   fP0Mdest = &DC[DIR_P0M * numberOfLBnodesCoarse];
+	   fM0Pdest = &DC[DIR_M0P * numberOfLBnodesCoarse];
+	   f0PPdest = &DC[DIR_0PP * numberOfLBnodesCoarse];
+	   f0MMdest = &DC[DIR_0MM * numberOfLBnodesCoarse];
+	   f0PMdest = &DC[DIR_0PM * numberOfLBnodesCoarse];
+	   f0MPdest = &DC[DIR_0MP * numberOfLBnodesCoarse];
+	   f000dest = &DC[DIR_000 * numberOfLBnodesCoarse];
+	   fMMMdest = &DC[DIR_MMM * numberOfLBnodesCoarse];
+	   fMMPdest = &DC[DIR_MMP * numberOfLBnodesCoarse];
+	   fMPPdest = &DC[DIR_MPP * numberOfLBnodesCoarse];
+	   fMPMdest = &DC[DIR_MPM * numberOfLBnodesCoarse];
+	   fPPMdest = &DC[DIR_PPM * numberOfLBnodesCoarse];
+	   fPPPdest = &DC[DIR_PPP * numberOfLBnodesCoarse];
+	   fPMPdest = &DC[DIR_PMP * numberOfLBnodesCoarse];
+	   fPMMdest = &DC[DIR_PMM * numberOfLBnodesCoarse];
    } 
    else
    {
-	   fP00dest = &DC[DIR_M00   *size_MatC];
-	   fM00dest = &DC[DIR_P00   *size_MatC];
-	   f0P0dest = &DC[DIR_0M0   *size_MatC];
-	   f0M0dest = &DC[DIR_0P0   *size_MatC];
-	   f00Pdest = &DC[DIR_00M   *size_MatC];
-	   f00Mdest = &DC[DIR_00P   *size_MatC];
-	   fPP0dest = &DC[DIR_MM0  *size_MatC];
-	   fMM0dest = &DC[DIR_PP0  *size_MatC];
-	   fPM0dest = &DC[DIR_MP0  *size_MatC];
-	   fMP0dest = &DC[DIR_PM0  *size_MatC];
-	   fP0Pdest = &DC[DIR_M0M  *size_MatC];
-	   fM0Mdest = &DC[DIR_P0P  *size_MatC];
-	   fP0Mdest = &DC[DIR_M0P  *size_MatC];
-	   fM0Pdest = &DC[DIR_P0M  *size_MatC];
-	   f0PPdest = &DC[DIR_0MM  *size_MatC];
-	   f0MMdest = &DC[DIR_0PP  *size_MatC];
-	   f0PMdest = &DC[DIR_0MP  *size_MatC];
-	   f0MPdest = &DC[DIR_0PM  *size_MatC];
-	   f000dest = &DC[DIR_000*size_MatC];
-	   fMMMdest = &DC[DIR_PPP *size_MatC];
-	   fMMPdest = &DC[DIR_PPM *size_MatC];
-	   fMPPdest = &DC[DIR_PMM *size_MatC];
-	   fMPMdest = &DC[DIR_PMP *size_MatC];
-	   fPPMdest = &DC[DIR_MMP *size_MatC];
-	   fPPPdest = &DC[DIR_MMM *size_MatC];
-	   fPMPdest = &DC[DIR_MPM *size_MatC];
-	   fPMMdest = &DC[DIR_MPP *size_MatC];
+	   fP00dest = &DC[DIR_M00 * numberOfLBnodesCoarse];
+	   fM00dest = &DC[DIR_P00 * numberOfLBnodesCoarse];
+	   f0P0dest = &DC[DIR_0M0 * numberOfLBnodesCoarse];
+	   f0M0dest = &DC[DIR_0P0 * numberOfLBnodesCoarse];
+	   f00Pdest = &DC[DIR_00M * numberOfLBnodesCoarse];
+	   f00Mdest = &DC[DIR_00P * numberOfLBnodesCoarse];
+	   fPP0dest = &DC[DIR_MM0 * numberOfLBnodesCoarse];
+	   fMM0dest = &DC[DIR_PP0 * numberOfLBnodesCoarse];
+	   fPM0dest = &DC[DIR_MP0 * numberOfLBnodesCoarse];
+	   fMP0dest = &DC[DIR_PM0 * numberOfLBnodesCoarse];
+	   fP0Pdest = &DC[DIR_M0M * numberOfLBnodesCoarse];
+	   fM0Mdest = &DC[DIR_P0P * numberOfLBnodesCoarse];
+	   fP0Mdest = &DC[DIR_M0P * numberOfLBnodesCoarse];
+	   fM0Pdest = &DC[DIR_P0M * numberOfLBnodesCoarse];
+	   f0PPdest = &DC[DIR_0MM * numberOfLBnodesCoarse];
+	   f0MMdest = &DC[DIR_0PP * numberOfLBnodesCoarse];
+	   f0PMdest = &DC[DIR_0MP * numberOfLBnodesCoarse];
+	   f0MPdest = &DC[DIR_0PM * numberOfLBnodesCoarse];
+	   f000dest = &DC[DIR_000 * numberOfLBnodesCoarse];
+	   fMMMdest = &DC[DIR_PPP * numberOfLBnodesCoarse];
+	   fMMPdest = &DC[DIR_PPM * numberOfLBnodesCoarse];
+	   fMPPdest = &DC[DIR_PMM * numberOfLBnodesCoarse];
+	   fMPMdest = &DC[DIR_PMP * numberOfLBnodesCoarse];
+	   fPPMdest = &DC[DIR_MMP * numberOfLBnodesCoarse];
+	   fPPPdest = &DC[DIR_MMM * numberOfLBnodesCoarse];
+	   fPMPdest = &DC[DIR_MPM * numberOfLBnodesCoarse];
+	   fPMMdest = &DC[DIR_MPP * numberOfLBnodesCoarse];
    }
 
    Distributions6 G;
    if (isEvenTimestep == true)
    {
-	   G.g[DIR_P00] = &G6[DIR_P00   *size_MatC];
-	   G.g[DIR_M00] = &G6[DIR_M00   *size_MatC];
-	   G.g[DIR_0P0] = &G6[DIR_0P0   *size_MatC];
-	   G.g[DIR_0M0] = &G6[DIR_0M0   *size_MatC];
-	   G.g[DIR_00P] = &G6[DIR_00P   *size_MatC];
-	   G.g[DIR_00M] = &G6[DIR_00M   *size_MatC];
+	   G.g[DIR_P00] = &G6[DIR_P00 * numberOfLBnodesCoarse];
+	   G.g[DIR_M00] = &G6[DIR_M00 * numberOfLBnodesCoarse];
+	   G.g[DIR_0P0] = &G6[DIR_0P0 * numberOfLBnodesCoarse];
+	   G.g[DIR_0M0] = &G6[DIR_0M0 * numberOfLBnodesCoarse];
+	   G.g[DIR_00P] = &G6[DIR_00P * numberOfLBnodesCoarse];
+	   G.g[DIR_00M] = &G6[DIR_00M * numberOfLBnodesCoarse];
    }
    else
    {
-	   G.g[DIR_M00] = &G6[DIR_P00   *size_MatC];
-	   G.g[DIR_P00] = &G6[DIR_M00   *size_MatC];
-	   G.g[DIR_0M0] = &G6[DIR_0P0   *size_MatC];
-	   G.g[DIR_0P0] = &G6[DIR_0M0   *size_MatC];
-	   G.g[DIR_00M] = &G6[DIR_00P   *size_MatC];
-	   G.g[DIR_00P] = &G6[DIR_00M   *size_MatC];
+	   G.g[DIR_M00] = &G6[DIR_P00 * numberOfLBnodesCoarse];
+	   G.g[DIR_P00] = &G6[DIR_M00 * numberOfLBnodesCoarse];
+	   G.g[DIR_0M0] = &G6[DIR_0P0 * numberOfLBnodesCoarse];
+	   G.g[DIR_0P0] = &G6[DIR_0M0 * numberOfLBnodesCoarse];
+	   G.g[DIR_00M] = &G6[DIR_00P * numberOfLBnodesCoarse];
+	   G.g[DIR_00P] = &G6[DIR_00M * numberOfLBnodesCoarse];
    }
 
    ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleCF_compressible.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleCF_compressible.cu
index f4160b89c047a7e6244a5579baae03d30b3c89cb..43d3f9c6d98e503680f6d4e0b613116baa320ef7 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleCF_compressible.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleCF_compressible.cu
@@ -217,7 +217,7 @@ __device__ __inline__ void interpolateDistributions(
 //!
 
 // based on scaleCF_RhoSq_comp_27
-__global__ void scaleCF_compressible(
+template<bool hasTurbulentViscosity> __global__ void scaleCF_compressible(
     real* distributionsCoarse, 
     real* distributionsFine, 
     unsigned int* neighborXcoarse,
@@ -226,14 +226,16 @@ __global__ void scaleCF_compressible(
     unsigned int* neighborXfine,
     unsigned int* neighborYfine,
     unsigned int* neighborZfine,
-    unsigned int numberOfLBnodesCoarse, 
-    unsigned int numberOfLBnodesFine, 
+    unsigned long long numberOfLBnodesCoarse, 
+    unsigned long long numberOfLBnodesFine, 
     bool isEvenTimestep,
     unsigned int* indicesCoarseMMM, 
     unsigned int* indicesFineMMM, 
     unsigned int numberOfInterfaceNodes, 
     real omegaCoarse, 
     real omegaFine, 
+    real* turbulentViscosityCoarse,
+    real* turbulentViscosityFine,
     OffCF offsetCF)
 {
     ////////////////////////////////////////////////////////////////////////////////
@@ -308,6 +310,8 @@ __global__ void scaleCF_compressible(
     unsigned int k_0MM = k_base_0MM;
     unsigned int k_MMM = k_base_MMM;
 
+    if(hasTurbulentViscosity) omegaC = omegaCoarse / (c1o1 + c3o1*omegaCoarse*turbulentViscosityCoarse[k_000]);
+
     calculateMomentsOnSourceNodes( distCoarse, omegaC,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_MMM, vx1_MMM, vx2_MMM, vx3_MMM,
         kxyFromfcNEQ_MMM, kyzFromfcNEQ_MMM, kxzFromfcNEQ_MMM, kxxMyyFromfcNEQ_MMM, kxxMzzFromfcNEQ_MMM);
@@ -325,6 +329,8 @@ __global__ void scaleCF_compressible(
     k_0MM = neighborZcoarse[k_0MM];
     k_MMM = neighborZcoarse[k_MMM];
 
+    if(hasTurbulentViscosity) omegaC = omegaCoarse / (c1o1 + c3o1*omegaCoarse*turbulentViscosityCoarse[k_000]);
+
     calculateMomentsOnSourceNodes( distCoarse, omegaC,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_MMP, vx1_MMP, vx2_MMP, vx3_MMP,
         kxyFromfcNEQ_MMP, kyzFromfcNEQ_MMP, kxzFromfcNEQ_MMP, kxxMyyFromfcNEQ_MMP, kxxMzzFromfcNEQ_MMP);
@@ -342,6 +348,8 @@ __global__ void scaleCF_compressible(
     k_0MM = k_MMM;
     k_MMM = neighborXcoarse[k_MMM];
 
+    if(hasTurbulentViscosity) omegaC = omegaCoarse / (c1o1 + c3o1*omegaCoarse*turbulentViscosityCoarse[k_000]);
+
     calculateMomentsOnSourceNodes( distCoarse, omegaC,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_PMP, vx1_PMP, vx2_PMP, vx3_PMP,
         kxyFromfcNEQ_PMP, kyzFromfcNEQ_PMP, kxzFromfcNEQ_PMP, kxxMyyFromfcNEQ_PMP, kxxMzzFromfcNEQ_PMP);
@@ -359,6 +367,8 @@ __global__ void scaleCF_compressible(
     k_0M0 = k_base_MM0;
     k_MM0 = neighborXcoarse[k_base_MM0];
 
+    if(hasTurbulentViscosity) omegaC = omegaCoarse / (c1o1 + c3o1*omegaCoarse*turbulentViscosityCoarse[k_000]);
+
     calculateMomentsOnSourceNodes( distCoarse, omegaC,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_PMM, vx1_PMM, vx2_PMM, vx3_PMM,
         kxyFromfcNEQ_PMM, kyzFromfcNEQ_PMM, kxzFromfcNEQ_PMM, kxxMyyFromfcNEQ_PMM, kxxMzzFromfcNEQ_PMM);
@@ -386,6 +396,8 @@ __global__ void scaleCF_compressible(
     k_0MM = k_base_0MM;
     k_MMM = k_base_MMM;
 
+    if(hasTurbulentViscosity) omegaC = omegaCoarse / (c1o1 + c3o1*omegaCoarse*turbulentViscosityCoarse[k_000]);
+
     calculateMomentsOnSourceNodes( distCoarse, omegaC,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_MPM, vx1_MPM, vx2_MPM, vx3_MPM,
         kxyFromfcNEQ_MPM, kyzFromfcNEQ_MPM, kxzFromfcNEQ_MPM, kxxMyyFromfcNEQ_MPM, kxxMzzFromfcNEQ_MPM);
@@ -402,6 +414,8 @@ __global__ void scaleCF_compressible(
     k_M0M = neighborZcoarse[k_M0M];
     k_0MM = neighborZcoarse[k_0MM];
     k_MMM = neighborZcoarse[k_MMM];
+
+    if(hasTurbulentViscosity) omegaC = omegaCoarse / (c1o1 + c3o1*omegaCoarse*turbulentViscosityCoarse[k_000]);
     
     calculateMomentsOnSourceNodes( distCoarse, omegaC,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_MPP, vx1_MPP, vx2_MPP, vx3_MPP,
@@ -421,11 +435,12 @@ __global__ void scaleCF_compressible(
     k_0MM = k_MMM;
     k_MMM = neighborXcoarse[k_MMM];
 
+    if(hasTurbulentViscosity) omegaC = omegaCoarse / (c1o1 + c3o1*omegaCoarse*turbulentViscosityCoarse[k_000]);
+
     calculateMomentsOnSourceNodes( distCoarse, omegaC,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_PPP, vx1_PPP, vx2_PPP, vx3_PPP,
         kxyFromfcNEQ_PPP, kyzFromfcNEQ_PPP, kxzFromfcNEQ_PPP, kxxMyyFromfcNEQ_PPP, kxxMzzFromfcNEQ_PPP);
 
-
     //////////////////////////////////////////////////////////////////////////
     // source node BNE = PPM
     //////////////////////////////////////////////////////////////////////////
@@ -438,6 +453,8 @@ __global__ void scaleCF_compressible(
     k_M00 = neighborXcoarse[k_base_M00];
     k_0M0 = k_base_MM0;
     k_MM0 = neighborXcoarse[k_base_MM0];
+
+    if(hasTurbulentViscosity) omegaC = omegaCoarse / (c1o1 + c3o1*omegaCoarse*turbulentViscosityCoarse[k_000]);
     
     calculateMomentsOnSourceNodes( distCoarse, omegaC,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_PPM, vx1_PPM, vx2_PPM, vx3_PPM,
@@ -452,119 +469,240 @@ __global__ void scaleCF_compressible(
     real c_000, c_100, c_010, c_001, c_200, c_020, c_002, c_110, c_101, c_011, c_111;
     real d_000, d_100, d_010, d_001, d_110, d_101, d_011, d_111;
 
-    a_000 = (-kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_PPP + kxxMyyFromfcNEQ_MPM + kxxMyyFromfcNEQ_MPP -
-            kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_PMP + kxxMyyFromfcNEQ_MMM + kxxMyyFromfcNEQ_MMP -
-            kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_PPP + kxxMzzFromfcNEQ_MPM + kxxMzzFromfcNEQ_MPP -
-            kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_PMP + kxxMzzFromfcNEQ_MMM + kxxMzzFromfcNEQ_MMP -
-            c2o1 * kxyFromfcNEQ_PPM - c2o1 * kxyFromfcNEQ_PPP - c2o1 * kxyFromfcNEQ_MPM - c2o1 * kxyFromfcNEQ_MPP +
-            c2o1 * kxyFromfcNEQ_PMM + c2o1 * kxyFromfcNEQ_PMP + c2o1 * kxyFromfcNEQ_MMM + c2o1 * kxyFromfcNEQ_MMP +
-            c2o1 * kxzFromfcNEQ_PPM - c2o1 * kxzFromfcNEQ_PPP + c2o1 * kxzFromfcNEQ_MPM - c2o1 * kxzFromfcNEQ_MPP +
-            c2o1 * kxzFromfcNEQ_PMM - c2o1 * kxzFromfcNEQ_PMP + c2o1 * kxzFromfcNEQ_MMM - c2o1 * kxzFromfcNEQ_MMP +
-            c8o1 * vx1_PPM + c8o1 * vx1_PPP + c8o1 * vx1_MPM + c8o1 * vx1_MPP + c8o1 * vx1_PMM + c8o1 * vx1_PMP +
-            c8o1 * vx1_MMM + c8o1 * vx1_MMP + c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM - c2o1 * vx2_MPP -
-            c2o1 * vx2_PMM - c2o1 * vx2_PMP + c2o1 * vx2_MMM + c2o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP +
-            c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM + c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
-            c64o1;
-    b_000 = (c2o1 * kxxMyyFromfcNEQ_PPM + c2o1 * kxxMyyFromfcNEQ_PPP + c2o1 * kxxMyyFromfcNEQ_MPM +
-            c2o1 * kxxMyyFromfcNEQ_MPP - c2o1 * kxxMyyFromfcNEQ_PMM - c2o1 * kxxMyyFromfcNEQ_PMP -
-            c2o1 * kxxMyyFromfcNEQ_MMM - c2o1 * kxxMyyFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_PPP -
-            kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_MPP + kxxMzzFromfcNEQ_PMM + kxxMzzFromfcNEQ_PMP +
-            kxxMzzFromfcNEQ_MMM + kxxMzzFromfcNEQ_MMP - c2o1 * kxyFromfcNEQ_PPM - c2o1 * kxyFromfcNEQ_PPP +
-            c2o1 * kxyFromfcNEQ_MPM + c2o1 * kxyFromfcNEQ_MPP - c2o1 * kxyFromfcNEQ_PMM - c2o1 * kxyFromfcNEQ_PMP +
-            c2o1 * kxyFromfcNEQ_MMM + c2o1 * kxyFromfcNEQ_MMP + c2o1 * kyzFromfcNEQ_PPM - c2o1 * kyzFromfcNEQ_PPP +
-            c2o1 * kyzFromfcNEQ_MPM - c2o1 * kyzFromfcNEQ_MPP + c2o1 * kyzFromfcNEQ_PMM - c2o1 * kyzFromfcNEQ_PMP +
-            c2o1 * kyzFromfcNEQ_MMM - c2o1 * kyzFromfcNEQ_MMP + c2o1 * vx1_PPM + c2o1 * vx1_PPP - c2o1 * vx1_MPM -
-            c2o1 * vx1_MPP - c2o1 * vx1_PMM - c2o1 * vx1_PMP + c2o1 * vx1_MMM + c2o1 * vx1_MMP + c8o1 * vx2_PPM +
-            c8o1 * vx2_PPP + c8o1 * vx2_MPM + c8o1 * vx2_MPP + c8o1 * vx2_PMM + c8o1 * vx2_PMP + c8o1 * vx2_MMM +
-            c8o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP - c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM -
-            c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
-            c64o1;
-    c_000 = (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_PPP + kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_MPP +
-            kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_PMP + kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_MMP -
-            c2o1 * kxxMzzFromfcNEQ_PPM + c2o1 * kxxMzzFromfcNEQ_PPP - c2o1 * kxxMzzFromfcNEQ_MPM +
-            c2o1 * kxxMzzFromfcNEQ_MPP - c2o1 * kxxMzzFromfcNEQ_PMM + c2o1 * kxxMzzFromfcNEQ_PMP -
-            c2o1 * kxxMzzFromfcNEQ_MMM + c2o1 * kxxMzzFromfcNEQ_MMP - c2o1 * kxzFromfcNEQ_PPM -
-            c2o1 * kxzFromfcNEQ_PPP + c2o1 * kxzFromfcNEQ_MPM + c2o1 * kxzFromfcNEQ_MPP - c2o1 * kxzFromfcNEQ_PMM -
-            c2o1 * kxzFromfcNEQ_PMP + c2o1 * kxzFromfcNEQ_MMM + c2o1 * kxzFromfcNEQ_MMP - c2o1 * kyzFromfcNEQ_PPM -
-            c2o1 * kyzFromfcNEQ_PPP - c2o1 * kyzFromfcNEQ_MPM - c2o1 * kyzFromfcNEQ_MPP + c2o1 * kyzFromfcNEQ_PMM +
-            c2o1 * kyzFromfcNEQ_PMP + c2o1 * kyzFromfcNEQ_MMM + c2o1 * kyzFromfcNEQ_MMP - c2o1 * vx1_PPM +
-            c2o1 * vx1_PPP + c2o1 * vx1_MPM - c2o1 * vx1_MPP - c2o1 * vx1_PMM + c2o1 * vx1_PMP + c2o1 * vx1_MMM -
-            c2o1 * vx1_MMP - c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM -
-            c2o1 * vx2_PMP + c2o1 * vx2_MMM - c2o1 * vx2_MMP + c8o1 * vx3_PPM + c8o1 * vx3_PPP + c8o1 * vx3_MPM +
-            c8o1 * vx3_MPP + c8o1 * vx3_PMM + c8o1 * vx3_PMP + c8o1 * vx3_MMM + c8o1 * vx3_MMP) /
-            c64o1;
-    a_100  = (vx1_PPM + vx1_PPP - vx1_MPM - vx1_MPP + vx1_PMM + vx1_PMP - vx1_MMM - vx1_MMP) / c4o1;
-    b_100  = (vx2_PPM + vx2_PPP - vx2_MPM - vx2_MPP + vx2_PMM + vx2_PMP - vx2_MMM - vx2_MMP) / c4o1;
-    c_100  = (vx3_PPM + vx3_PPP - vx3_MPM - vx3_MPP + vx3_PMM + vx3_PMP - vx3_MMM - vx3_MMP) / c4o1;
-    a_200 = (kxxMyyFromfcNEQ_PPM + kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_MPP +
-            kxxMyyFromfcNEQ_PMM + kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_MMP +
-            kxxMzzFromfcNEQ_PPM + kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_MPP +
-            kxxMzzFromfcNEQ_PMM + kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_MMP + c2o1 * vx2_PPM +
-            c2o1 * vx2_PPP - c2o1 * vx2_MPM - c2o1 * vx2_MPP - c2o1 * vx2_PMM - c2o1 * vx2_PMP + c2o1 * vx2_MMM +
-            c2o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP + c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM +
-            c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
-            c16o1;
-    b_200 = (kxyFromfcNEQ_PPM + kxyFromfcNEQ_PPP - kxyFromfcNEQ_MPM - kxyFromfcNEQ_MPP + kxyFromfcNEQ_PMM +
-            kxyFromfcNEQ_PMP - kxyFromfcNEQ_MMM - kxyFromfcNEQ_MMP - c2o1 * vx1_PPM - c2o1 * vx1_PPP +
-            c2o1 * vx1_MPM + c2o1 * vx1_MPP + c2o1 * vx1_PMM + c2o1 * vx1_PMP - c2o1 * vx1_MMM - c2o1 * vx1_MMP) /
-            c8o1;
-    c_200 = (kxzFromfcNEQ_PPM + kxzFromfcNEQ_PPP - kxzFromfcNEQ_MPM - kxzFromfcNEQ_MPP + kxzFromfcNEQ_PMM +
-            kxzFromfcNEQ_PMP - kxzFromfcNEQ_MMM - kxzFromfcNEQ_MMP + c2o1 * vx1_PPM - c2o1 * vx1_PPP -
-            c2o1 * vx1_MPM + c2o1 * vx1_MPP + c2o1 * vx1_PMM - c2o1 * vx1_PMP - c2o1 * vx1_MMM + c2o1 * vx1_MMP) /
-            c8o1;
-    a_010  = (vx1_PPM + vx1_PPP + vx1_MPM + vx1_MPP - vx1_PMM - vx1_PMP - vx1_MMM - vx1_MMP) / c4o1;
-    b_010  = (vx2_PPM + vx2_PPP + vx2_MPM + vx2_MPP - vx2_PMM - vx2_PMP - vx2_MMM - vx2_MMP) / c4o1;
-    c_010  = (vx3_PPM + vx3_PPP + vx3_MPM + vx3_MPP - vx3_PMM - vx3_PMP - vx3_MMM - vx3_MMP) / c4o1;
-    a_020 = (kxyFromfcNEQ_PPM + kxyFromfcNEQ_PPP + kxyFromfcNEQ_MPM + kxyFromfcNEQ_MPP - kxyFromfcNEQ_PMM -
-            kxyFromfcNEQ_PMP - kxyFromfcNEQ_MMM - kxyFromfcNEQ_MMP - c2o1 * vx2_PPM - c2o1 * vx2_PPP +
-            c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM + c2o1 * vx2_PMP - c2o1 * vx2_MMM - c2o1 * vx2_MMP) /
-            c8o1;
-    b_020 = (-c2o1 * kxxMyyFromfcNEQ_PPM - c2o1 * kxxMyyFromfcNEQ_PPP - c2o1 * kxxMyyFromfcNEQ_MPM -
-            c2o1 * kxxMyyFromfcNEQ_MPP + c2o1 * kxxMyyFromfcNEQ_PMM + c2o1 * kxxMyyFromfcNEQ_PMP +
-            c2o1 * kxxMyyFromfcNEQ_MMM + c2o1 * kxxMyyFromfcNEQ_MMP + kxxMzzFromfcNEQ_PPM + kxxMzzFromfcNEQ_PPP +
-            kxxMzzFromfcNEQ_MPM + kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_PMP -
-            kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_MMP + c2o1 * vx1_PPM + c2o1 * vx1_PPP - c2o1 * vx1_MPM -
-            c2o1 * vx1_MPP - c2o1 * vx1_PMM - c2o1 * vx1_PMP + c2o1 * vx1_MMM + c2o1 * vx1_MMP - c2o1 * vx3_PPM +
-            c2o1 * vx3_PPP - c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM - c2o1 * vx3_PMP + c2o1 * vx3_MMM -
-            c2o1 * vx3_MMP) /
-            c16o1;
-    c_020 = (kyzFromfcNEQ_PPM + kyzFromfcNEQ_PPP + kyzFromfcNEQ_MPM + kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM -
-            kyzFromfcNEQ_PMP - kyzFromfcNEQ_MMM - kyzFromfcNEQ_MMP + c2o1 * vx2_PPM - c2o1 * vx2_PPP +
-            c2o1 * vx2_MPM - c2o1 * vx2_MPP - c2o1 * vx2_PMM + c2o1 * vx2_PMP - c2o1 * vx2_MMM + c2o1 * vx2_MMP) /
-            c8o1;
-    a_001  = (-vx1_PPM + vx1_PPP - vx1_MPM + vx1_MPP - vx1_PMM + vx1_PMP - vx1_MMM + vx1_MMP) / c4o1;
-    b_001  = (-vx2_PPM + vx2_PPP - vx2_MPM + vx2_MPP - vx2_PMM + vx2_PMP - vx2_MMM + vx2_MMP) / c4o1;
-    c_001  = (-vx3_PPM + vx3_PPP - vx3_MPM + vx3_MPP - vx3_PMM + vx3_PMP - vx3_MMM + vx3_MMP) / c4o1;
-    a_002 = (-kxzFromfcNEQ_PPM + kxzFromfcNEQ_PPP - kxzFromfcNEQ_MPM + kxzFromfcNEQ_MPP - kxzFromfcNEQ_PMM +
-            kxzFromfcNEQ_PMP - kxzFromfcNEQ_MMM + kxzFromfcNEQ_MMP + c2o1 * vx3_PPM - c2o1 * vx3_PPP -
-            c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM - c2o1 * vx3_PMP - c2o1 * vx3_MMM + c2o1 * vx3_MMP) /
-            c8o1;
-    b_002 = (-kyzFromfcNEQ_PPM + kyzFromfcNEQ_PPP - kyzFromfcNEQ_MPM + kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM +
-            kyzFromfcNEQ_PMP - kyzFromfcNEQ_MMM + kyzFromfcNEQ_MMP + c2o1 * vx3_PPM - c2o1 * vx3_PPP +
-            c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM + c2o1 * vx3_PMP - c2o1 * vx3_MMM + c2o1 * vx3_MMP) /
-            c8o1;
-    c_002 = (-kxxMyyFromfcNEQ_PPM + kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MPM + kxxMyyFromfcNEQ_MPP -
-            kxxMyyFromfcNEQ_PMM + kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MMM + kxxMyyFromfcNEQ_MMP +
-            c2o1 * kxxMzzFromfcNEQ_PPM - c2o1 * kxxMzzFromfcNEQ_PPP + c2o1 * kxxMzzFromfcNEQ_MPM -
-            c2o1 * kxxMzzFromfcNEQ_MPP + c2o1 * kxxMzzFromfcNEQ_PMM - c2o1 * kxxMzzFromfcNEQ_PMP +
-            c2o1 * kxxMzzFromfcNEQ_MMM - c2o1 * kxxMzzFromfcNEQ_MMP - c2o1 * vx1_PPM + c2o1 * vx1_PPP +
-            c2o1 * vx1_MPM - c2o1 * vx1_MPP - c2o1 * vx1_PMM + c2o1 * vx1_PMP + c2o1 * vx1_MMM - c2o1 * vx1_MMP -
-            c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM - c2o1 * vx2_PMP +
-            c2o1 * vx2_MMM - c2o1 * vx2_MMP) /
-            c16o1;
-    a_110 = (vx1_PPM + vx1_PPP - vx1_MPM - vx1_MPP - vx1_PMM - vx1_PMP + vx1_MMM + vx1_MMP) / c2o1;
-    b_110 = (vx2_PPM + vx2_PPP - vx2_MPM - vx2_MPP - vx2_PMM - vx2_PMP + vx2_MMM + vx2_MMP) / c2o1;
-    c_110 = (vx3_PPM + vx3_PPP - vx3_MPM - vx3_MPP - vx3_PMM - vx3_PMP + vx3_MMM + vx3_MMP) / c2o1;
-    a_101 = (-vx1_PPM + vx1_PPP + vx1_MPM - vx1_MPP - vx1_PMM + vx1_PMP + vx1_MMM - vx1_MMP) / c2o1;
-    b_101 = (-vx2_PPM + vx2_PPP + vx2_MPM - vx2_MPP - vx2_PMM + vx2_PMP + vx2_MMM - vx2_MMP) / c2o1;
-    c_101 = (-vx3_PPM + vx3_PPP + vx3_MPM - vx3_MPP - vx3_PMM + vx3_PMP + vx3_MMM - vx3_MMP) / c2o1;
-    a_011 = (-vx1_PPM + vx1_PPP - vx1_MPM + vx1_MPP + vx1_PMM - vx1_PMP + vx1_MMM - vx1_MMP) / c2o1;
-    b_011 = (-vx2_PPM + vx2_PPP - vx2_MPM + vx2_MPP + vx2_PMM - vx2_PMP + vx2_MMM - vx2_MMP) / c2o1;
-    c_011 = (-vx3_PPM + vx3_PPP - vx3_MPM + vx3_MPP + vx3_PMM - vx3_PMP + vx3_MMM - vx3_MMP) / c2o1;
-
-    a_111 = -vx1_PPM + vx1_PPP + vx1_MPM - vx1_MPP + vx1_PMM - vx1_PMP - vx1_MMM + vx1_MMP;
-    b_111 = -vx2_PPM + vx2_PPP + vx2_MPM - vx2_MPP + vx2_PMM - vx2_PMP - vx2_MMM + vx2_MMP;
-    c_111 = -vx3_PPM + vx3_PPP + vx3_MPM - vx3_MPP + vx3_PMM - vx3_PMP - vx3_MMM + vx3_MMP;
+    // a_000 = (-kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_PPP + kxxMyyFromfcNEQ_MPM + kxxMyyFromfcNEQ_MPP -
+    //         kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_PMP + kxxMyyFromfcNEQ_MMM + kxxMyyFromfcNEQ_MMP -
+    //         kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_PPP + kxxMzzFromfcNEQ_MPM + kxxMzzFromfcNEQ_MPP -
+    //         kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_PMP + kxxMzzFromfcNEQ_MMM + kxxMzzFromfcNEQ_MMP -
+    //         c2o1 * kxyFromfcNEQ_PPM - c2o1 * kxyFromfcNEQ_PPP - c2o1 * kxyFromfcNEQ_MPM - c2o1 * kxyFromfcNEQ_MPP +
+    //         c2o1 * kxyFromfcNEQ_PMM + c2o1 * kxyFromfcNEQ_PMP + c2o1 * kxyFromfcNEQ_MMM + c2o1 * kxyFromfcNEQ_MMP +
+    //         c2o1 * kxzFromfcNEQ_PPM - c2o1 * kxzFromfcNEQ_PPP + c2o1 * kxzFromfcNEQ_MPM - c2o1 * kxzFromfcNEQ_MPP +
+    //         c2o1 * kxzFromfcNEQ_PMM - c2o1 * kxzFromfcNEQ_PMP + c2o1 * kxzFromfcNEQ_MMM - c2o1 * kxzFromfcNEQ_MMP +
+    //         c8o1 * vx1_PPM + c8o1 * vx1_PPP + c8o1 * vx1_MPM + c8o1 * vx1_MPP + c8o1 * vx1_PMM + c8o1 * vx1_PMP +
+    //         c8o1 * vx1_MMM + c8o1 * vx1_MMP + c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM - c2o1 * vx2_MPP -
+    //         c2o1 * vx2_PMM - c2o1 * vx2_PMP + c2o1 * vx2_MMM + c2o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP +
+    //         c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM + c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
+    //         c64o1;
+    a_000 =
+        c1o64 * (c2o1 * (((kxyFromfcNEQ_MMM - kxyFromfcNEQ_PPP) + (kxyFromfcNEQ_MMP - kxyFromfcNEQ_PPM)) +
+                         ((kxyFromfcNEQ_PMM - kxyFromfcNEQ_MPP) + (kxyFromfcNEQ_PMP - kxyFromfcNEQ_MPM)) +
+                         ((kxzFromfcNEQ_MMM - kxzFromfcNEQ_PPP) + (kxzFromfcNEQ_PPM - kxzFromfcNEQ_MMP)) +
+                         ((kxzFromfcNEQ_PMM - kxzFromfcNEQ_MPP) + (kxzFromfcNEQ_MPM - kxzFromfcNEQ_PMP)) +
+                         ((vx2_PPP + vx2_MMM) + (vx2_PPM + vx2_MMP)) - ((vx2_MPP + vx2_PMM) + (vx2_MPM + vx2_PMP)) +
+                         ((vx3_PPP + vx3_MMM) - (vx3_PPM + vx3_MMP)) + ((vx3_PMP + vx3_MPM) - (vx3_MPP + vx3_PMM))) +
+                 c8o1 * (((vx1_PPP + vx1_MMM) + (vx1_PPM + vx1_MMP)) + ((vx1_MPP + vx1_PMM) + (vx1_PMP + vx1_MPM))) +
+                 ((kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_PPP) + (kxxMyyFromfcNEQ_MMP - kxxMyyFromfcNEQ_PPM)) +
+                 ((kxxMyyFromfcNEQ_MPP - kxxMyyFromfcNEQ_PMM) + (kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_PMP)) +
+                 ((kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_PPP) + (kxxMzzFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM)) +
+                 ((kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM) + (kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_PMP)));
+
+    // b_000 = (c2o1 * kxxMyyFromfcNEQ_PPM + c2o1 * kxxMyyFromfcNEQ_PPP + c2o1 * kxxMyyFromfcNEQ_MPM +
+    //         c2o1 * kxxMyyFromfcNEQ_MPP - c2o1 * kxxMyyFromfcNEQ_PMM - c2o1 * kxxMyyFromfcNEQ_PMP -
+    //         c2o1 * kxxMyyFromfcNEQ_MMM - c2o1 * kxxMyyFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_PPP -
+    //         kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_MPP + kxxMzzFromfcNEQ_PMM + kxxMzzFromfcNEQ_PMP +
+    //         kxxMzzFromfcNEQ_MMM + kxxMzzFromfcNEQ_MMP - c2o1 * kxyFromfcNEQ_PPM - c2o1 * kxyFromfcNEQ_PPP +
+    //         c2o1 * kxyFromfcNEQ_MPM + c2o1 * kxyFromfcNEQ_MPP - c2o1 * kxyFromfcNEQ_PMM - c2o1 * kxyFromfcNEQ_PMP +
+    //         c2o1 * kxyFromfcNEQ_MMM + c2o1 * kxyFromfcNEQ_MMP + c2o1 * kyzFromfcNEQ_PPM - c2o1 * kyzFromfcNEQ_PPP +
+    //         c2o1 * kyzFromfcNEQ_MPM - c2o1 * kyzFromfcNEQ_MPP + c2o1 * kyzFromfcNEQ_PMM - c2o1 * kyzFromfcNEQ_PMP +
+    //         c2o1 * kyzFromfcNEQ_MMM - c2o1 * kyzFromfcNEQ_MMP + c2o1 * vx1_PPM + c2o1 * vx1_PPP - c2o1 * vx1_MPM -
+    //         c2o1 * vx1_MPP - c2o1 * vx1_PMM - c2o1 * vx1_PMP + c2o1 * vx1_MMM + c2o1 * vx1_MMP + c8o1 * vx2_PPM +
+    //         c8o1 * vx2_PPP + c8o1 * vx2_MPM + c8o1 * vx2_MPP + c8o1 * vx2_PMM + c8o1 * vx2_PMP + c8o1 * vx2_MMM +
+    //         c8o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP - c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM -
+    //         c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
+    //         c64o1;
+    b_000 =
+        c1o64 * (c2o1 * (((kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MMM) + (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_MMP)) +
+                         ((kxxMyyFromfcNEQ_MPP - kxxMyyFromfcNEQ_PMM) + (kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_PMP)) +
+                         ((kxyFromfcNEQ_MMM - kxyFromfcNEQ_PPP) + (kxyFromfcNEQ_MMP - kxyFromfcNEQ_PPM)) +
+                         ((kxyFromfcNEQ_MPP - kxyFromfcNEQ_PMM) + (kxyFromfcNEQ_MPM - kxyFromfcNEQ_PMP)) +
+                         ((kyzFromfcNEQ_MMM - kyzFromfcNEQ_PPP) + (kyzFromfcNEQ_PPM - kyzFromfcNEQ_MMP)) +
+                         ((kyzFromfcNEQ_PMM - kyzFromfcNEQ_MPP) + (kyzFromfcNEQ_MPM - kyzFromfcNEQ_PMP)) +
+                         ((vx1_PPP + vx1_MMM) + (vx1_PPM + vx1_MMP)) - ((vx1_MPM + vx1_MPP) + (vx1_PMM + vx1_PMP)) +
+                         ((vx3_PPP + vx3_MMM) - (vx3_PPM + vx3_MMP)) + ((vx3_MPP + vx3_PMM) - (vx3_MPM + vx3_PMP))) +
+                 c8o1 * (((vx2_PPP + vx2_MMM) + (vx2_PPM + vx2_MMP)) + ((vx2_MPP + vx2_PMM) + (vx2_MPM + vx2_PMP))) +
+                 ((kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_PPP) + (kxxMzzFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM)) +
+                 ((kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_MPP) + (kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MPM)));
+
+    // c_000 = (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_PPP + kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_MPP +
+    //         kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_PMP + kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_MMP -
+    //         c2o1 * kxxMzzFromfcNEQ_PPM + c2o1 * kxxMzzFromfcNEQ_PPP - c2o1 * kxxMzzFromfcNEQ_MPM +
+    //         c2o1 * kxxMzzFromfcNEQ_MPP - c2o1 * kxxMzzFromfcNEQ_PMM + c2o1 * kxxMzzFromfcNEQ_PMP -
+    //         c2o1 * kxxMzzFromfcNEQ_MMM + c2o1 * kxxMzzFromfcNEQ_MMP - c2o1 * kxzFromfcNEQ_PPM -
+    //         c2o1 * kxzFromfcNEQ_PPP + c2o1 * kxzFromfcNEQ_MPM + c2o1 * kxzFromfcNEQ_MPP - c2o1 * kxzFromfcNEQ_PMM -
+    //         c2o1 * kxzFromfcNEQ_PMP + c2o1 * kxzFromfcNEQ_MMM + c2o1 * kxzFromfcNEQ_MMP - c2o1 * kyzFromfcNEQ_PPM -
+    //         c2o1 * kyzFromfcNEQ_PPP - c2o1 * kyzFromfcNEQ_MPM - c2o1 * kyzFromfcNEQ_MPP + c2o1 * kyzFromfcNEQ_PMM +
+    //         c2o1 * kyzFromfcNEQ_PMP + c2o1 * kyzFromfcNEQ_MMM + c2o1 * kyzFromfcNEQ_MMP - c2o1 * vx1_PPM +
+    //         c2o1 * vx1_PPP + c2o1 * vx1_MPM - c2o1 * vx1_MPP - c2o1 * vx1_PMM + c2o1 * vx1_PMP + c2o1 * vx1_MMM -
+    //         c2o1 * vx1_MMP - c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM -
+    //         c2o1 * vx2_PMP + c2o1 * vx2_MMM - c2o1 * vx2_MMP + c8o1 * vx3_PPM + c8o1 * vx3_PPP + c8o1 * vx3_MPM +
+    //         c8o1 * vx3_MPP + c8o1 * vx3_PMM + c8o1 * vx3_PMP + c8o1 * vx3_MMM + c8o1 * vx3_MMP) /
+    //         c64o1;
+    c_000 =
+        c1o64 * (c2o1 * (((kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MMM) + (kxxMzzFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM)) +
+                         ((kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM) + (kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MPM)) +
+                         ((kxzFromfcNEQ_MMM - kxzFromfcNEQ_PPP) + (kxzFromfcNEQ_MMP - kxzFromfcNEQ_PPM)) +
+                         ((kxzFromfcNEQ_MPP - kxzFromfcNEQ_PMM) + (kxzFromfcNEQ_MPM - kxzFromfcNEQ_PMP)) +
+                         ((kyzFromfcNEQ_MMM - kyzFromfcNEQ_PPP) + (kyzFromfcNEQ_MMP - kyzFromfcNEQ_PPM)) +
+                         ((kyzFromfcNEQ_PMM - kyzFromfcNEQ_MPP) + (kyzFromfcNEQ_PMP - kyzFromfcNEQ_MPM)) +
+                         ((vx1_PPP + vx1_MMM) - (vx1_MMP + vx1_PPM)) + ((vx1_MPM + vx1_PMP) - (vx1_MPP + vx1_PMM)) +
+                         ((vx2_PPP + vx2_MMM) - (vx2_MMP + vx2_PPM)) + ((vx2_MPP + vx2_PMM) - (vx2_MPM + vx2_PMP))) +
+                 c8o1 * (((vx3_PPP + vx3_MMM) + (vx3_PPM + vx3_MMP)) + ((vx3_PMM + vx3_MPP) + (vx3_PMP + vx3_MPM))) +
+                 ((kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_PPP) + (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_MMP)) +
+                 ((kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_MPP) + (kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_PMP)));
+
+    // a_100  = (vx1_PPM + vx1_PPP - vx1_MPM - vx1_MPP + vx1_PMM + vx1_PMP - vx1_MMM - vx1_MMP) / c4o1;
+    a_100 = c1o4 * (((vx1_PPP - vx1_MMM) + (vx1_PPM - vx1_MMP)) + ((vx1_PMM - vx1_MPP) + (vx1_PMP - vx1_MPM)));
+
+    // b_100  = (vx2_PPM + vx2_PPP - vx2_MPM - vx2_MPP + vx2_PMM + vx2_PMP - vx2_MMM - vx2_MMP) / c4o1;
+    b_100 = c1o4 * (((vx2_PPP - vx2_MMM) + (vx2_PPM - vx2_MMP)) + ((vx2_PMM - vx2_MPP) + (vx2_PMP - vx2_MPM)));
+
+    // c_100  = (vx3_PPM + vx3_PPP - vx3_MPM - vx3_MPP + vx3_PMM + vx3_PMP - vx3_MMM - vx3_MMP) / c4o1;
+    c_100 = c1o4 * (((vx3_PPP - vx3_MMM) + (vx3_PPM - vx3_MMP)) + ((vx3_PMM - vx3_MPP) + (vx3_PMP - vx3_MPM)));
+
+    // a_200 = (kxxMyyFromfcNEQ_PPM + kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_MPP +
+    //         kxxMyyFromfcNEQ_PMM + kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_MMP +
+    //         kxxMzzFromfcNEQ_PPM + kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_MPP +
+    //         kxxMzzFromfcNEQ_PMM + kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_MMP + c2o1 * vx2_PPM +
+    //         c2o1 * vx2_PPP - c2o1 * vx2_MPM - c2o1 * vx2_MPP - c2o1 * vx2_PMM - c2o1 * vx2_PMP + c2o1 * vx2_MMM +
+    //         c2o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP + c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM +
+    //         c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
+    //         c16o1;
+    a_200 =
+        c1o16 * (c2o1 * (((vx2_PPP + vx2_MMM) + (vx2_PPM - vx2_MPP)) + ((vx2_MMP - vx2_PMM) - (vx2_MPM + vx2_PMP)) +
+                         ((vx3_PPP + vx3_MMM) - (vx3_PPM + vx3_MPP)) + ((vx3_MPM + vx3_PMP) - (vx3_MMP + vx3_PMM))) +
+                 ((kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MMM) + (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_MMP)) +
+                 ((kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_MPP) + (kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MPM)) +
+                 ((kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MMM) + (kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_MMP)) +
+                 ((kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_MPP) + (kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MPM)));
+
+    // b_200 = (kxyFromfcNEQ_PPM + kxyFromfcNEQ_PPP - kxyFromfcNEQ_MPM - kxyFromfcNEQ_MPP + kxyFromfcNEQ_PMM +
+    //         kxyFromfcNEQ_PMP - kxyFromfcNEQ_MMM - kxyFromfcNEQ_MMP - c2o1 * vx1_PPM - c2o1 * vx1_PPP +
+    //         c2o1 * vx1_MPM + c2o1 * vx1_MPP + c2o1 * vx1_PMM + c2o1 * vx1_PMP - c2o1 * vx1_MMM - c2o1 * vx1_MMP) /
+    //         c8o1;
+    b_200 =
+        c1o8 * (c2o1 * (-((vx1_PPP + vx1_MMM) + (vx1_PPM + vx1_MMP)) + ((vx1_MPP + vx1_PMM) + (vx1_MPM + vx1_PMP))) +
+                ((kxyFromfcNEQ_PPP - kxyFromfcNEQ_MMM) + (kxyFromfcNEQ_PPM - kxyFromfcNEQ_MMP)) +
+                ((kxyFromfcNEQ_PMM - kxyFromfcNEQ_MPP) + (kxyFromfcNEQ_PMP - kxyFromfcNEQ_MPM)));
+
+    // c_200 = (kxzFromfcNEQ_PPM + kxzFromfcNEQ_PPP - kxzFromfcNEQ_MPM - kxzFromfcNEQ_MPP + kxzFromfcNEQ_PMM +
+    //          kxzFromfcNEQ_PMP - kxzFromfcNEQ_MMM - kxzFromfcNEQ_MMP + c2o1 * vx1_PPM - c2o1 * vx1_PPP - c2o1 *
+    //          vx1_MPM + c2o1 * vx1_MPP + c2o1 * vx1_PMM - c2o1 * vx1_PMP - c2o1 * vx1_MMM + c2o1 * vx1_MMP) /
+    //         c8o1;
+    c_200 = c1o8 * (c2o1 * (((vx1_PPM + vx1_MMP) - (vx1_PPP + vx1_MMM)) + ((vx1_MPP + vx1_PMM) - (vx1_MPM + vx1_PMP))) +
+                    ((kxzFromfcNEQ_PPP - kxzFromfcNEQ_MMM) + (kxzFromfcNEQ_PPM - kxzFromfcNEQ_MMP)) +
+                    ((kxzFromfcNEQ_PMM - kxzFromfcNEQ_MPP) + (kxzFromfcNEQ_PMP - kxzFromfcNEQ_MPM)));
+
+    // a_010 = (vx1_PPM + vx1_PPP + vx1_MPM + vx1_MPP - vx1_PMM - vx1_PMP - vx1_MMM - vx1_MMP) / c4o1;
+    a_010 = c1o4 * (((vx1_PPP - vx1_MMM) + (vx1_PPM - vx1_MMP)) + ((vx1_MPP - vx1_PMM) + (vx1_MPM - vx1_PMP)));
+
+    // b_010 = (vx2_PPM + vx2_PPP + vx2_MPM + vx2_MPP - vx2_PMM - vx2_PMP - vx2_MMM - vx2_MMP) / c4o1;
+    b_010 = c1o4 * (((vx2_PPP - vx2_MMM) + (vx2_PPM - vx2_MMP)) + ((vx2_MPP - vx2_PMM) + (vx2_MPM - vx2_PMP)));
+
+    // c_010 = (vx3_PPM + vx3_PPP + vx3_MPM + vx3_MPP - vx3_PMM - vx3_PMP - vx3_MMM - vx3_MMP) / c4o1;
+    c_010 = c1o4 * (((vx3_PPP - vx3_MMM) + (vx3_PPM - vx3_MMP)) + ((vx3_MPP - vx3_PMM) + (vx3_MPM - vx3_PMP)));
+
+    // a_020 = (kxyFromfcNEQ_PPM + kxyFromfcNEQ_PPP + kxyFromfcNEQ_MPM + kxyFromfcNEQ_MPP - kxyFromfcNEQ_PMM -
+    //         kxyFromfcNEQ_PMP - kxyFromfcNEQ_MMM - kxyFromfcNEQ_MMP - c2o1 * vx2_PPM - c2o1 * vx2_PPP +
+    //         c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM + c2o1 * vx2_PMP - c2o1 * vx2_MMM - c2o1 * vx2_MMP) /
+    //         c8o1;
+    a_020 =
+        c1o8 * (c2o1 * (-((vx2_PPP + vx2_MMM) + (vx2_MMP + vx2_PPM)) + ((vx2_MPP + vx2_PMM) + (vx2_MPM + vx2_PMP))) +
+                ((kxyFromfcNEQ_PPP - kxyFromfcNEQ_MMM) + (kxyFromfcNEQ_PPM - kxyFromfcNEQ_MMP)) +
+                ((kxyFromfcNEQ_MPP - kxyFromfcNEQ_PMM) + (kxyFromfcNEQ_MPM - kxyFromfcNEQ_PMP)));
+
+    // b_020 = (-c2o1 * kxxMyyFromfcNEQ_PPM - c2o1 * kxxMyyFromfcNEQ_PPP - c2o1 * kxxMyyFromfcNEQ_MPM -
+    //         c2o1 * kxxMyyFromfcNEQ_MPP + c2o1 * kxxMyyFromfcNEQ_PMM + c2o1 * kxxMyyFromfcNEQ_PMP +
+    //         c2o1 * kxxMyyFromfcNEQ_MMM + c2o1 * kxxMyyFromfcNEQ_MMP + kxxMzzFromfcNEQ_PPM + kxxMzzFromfcNEQ_PPP +
+    //         kxxMzzFromfcNEQ_MPM + kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_PMP -
+    //         kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_MMP + c2o1 * vx1_PPM + c2o1 * vx1_PPP - c2o1 * vx1_MPM -
+    //         c2o1 * vx1_MPP - c2o1 * vx1_PMM - c2o1 * vx1_PMP + c2o1 * vx1_MMM + c2o1 * vx1_MMP - c2o1 * vx3_PPM +
+    //         c2o1 * vx3_PPP - c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM - c2o1 * vx3_PMP + c2o1 * vx3_MMM -
+    //         c2o1 * vx3_MMP) /
+    //         c16o1;
+    b_020 =
+        c1o16 * (c2o1 * (((kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_PPP) + (kxxMyyFromfcNEQ_MMP - kxxMyyFromfcNEQ_PPM)) +
+                         ((kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_MPP) + (kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MPM)) +
+                         ((vx1_PPP + vx1_MMM) + (vx1_PPM + vx1_MMP)) - ((vx1_MPP + vx1_PMM) + (vx1_PMP + vx1_MPM)) +
+                         ((vx3_PPP + vx3_MMM) - (vx3_PPM + vx3_MMP)) + ((vx3_MPP + vx3_PMM) - (vx3_MPM + vx3_PMP))) +
+                 ((kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MMM) + (kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_MMP)) +
+                 ((kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM) + (kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_PMP)));
+
+    // c_020 = (kyzFromfcNEQ_PPM + kyzFromfcNEQ_PPP + kyzFromfcNEQ_MPM + kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM -
+    //          kyzFromfcNEQ_PMP - kyzFromfcNEQ_MMM - kyzFromfcNEQ_MMP + c2o1 * vx2_PPM - c2o1 * vx2_PPP + c2o1 *
+    //          vx2_MPM - c2o1 * vx2_MPP - c2o1 * vx2_PMM + c2o1 * vx2_PMP - c2o1 * vx2_MMM + c2o1 * vx2_MMP) /
+    //         c8o1;
+    c_020 = c1o8 * (c2o1 * (((vx2_MMP + vx2_PPM) - (vx2_PPP + vx2_MMM)) + ((vx2_PMP + vx2_MPM) - (vx2_MPP + vx2_PMM))) +
+                    ((kyzFromfcNEQ_PPP - kyzFromfcNEQ_MMM) + (kyzFromfcNEQ_PPM - kyzFromfcNEQ_MMP)) +
+                    ((kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM) + (kyzFromfcNEQ_MPM - kyzFromfcNEQ_PMP)));
+
+    // a_001  = (-vx1_PPM + vx1_PPP - vx1_MPM + vx1_MPP - vx1_PMM + vx1_PMP - vx1_MMM + vx1_MMP) / c4o1;
+    a_001 = c1o4 * (((vx1_PPP - vx1_MMM) + (vx1_MMP - vx1_PPM)) + ((vx1_MPP - vx1_PMM) + (vx1_PMP - vx1_MPM)));
+
+    // b_001  = (-vx2_PPM + vx2_PPP - vx2_MPM + vx2_MPP - vx2_PMM + vx2_PMP - vx2_MMM + vx2_MMP) / c4o1;
+    b_001 = c1o4 * (((vx2_PPP - vx2_MMM) + (vx2_MMP - vx2_PPM)) + ((vx2_MPP - vx2_PMM) + (vx2_PMP - vx2_MPM)));
+
+    // c_001  = (-vx3_PPM + vx3_PPP - vx3_MPM + vx3_MPP - vx3_PMM + vx3_PMP - vx3_MMM + vx3_MMP) / c4o1;
+    c_001 = c1o4 * (((vx3_PPP - vx3_MMM) + (vx3_MMP - vx3_PPM)) + ((vx3_MPP - vx3_PMM) + (vx3_PMP - vx3_MPM)));
+
+    // a_002 = (-kxzFromfcNEQ_PPM + kxzFromfcNEQ_PPP - kxzFromfcNEQ_MPM + kxzFromfcNEQ_MPP - kxzFromfcNEQ_PMM +
+    //         kxzFromfcNEQ_PMP - kxzFromfcNEQ_MMM + kxzFromfcNEQ_MMP + c2o1 * vx3_PPM - c2o1 * vx3_PPP -
+    //         c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM - c2o1 * vx3_PMP - c2o1 * vx3_MMM + c2o1 * vx3_MMP) /
+    //         c8o1;
+    a_002 = c1o8 * (c2o1 * (((vx3_PPM + vx3_MMP) - (vx3_PPP + vx3_MMM)) + ((vx3_MPP + vx3_PMM) - (vx3_PMP + vx3_MPM))) +
+                    ((kxzFromfcNEQ_PPP - kxzFromfcNEQ_MMM) + (kxzFromfcNEQ_MMP - kxzFromfcNEQ_PPM)) +
+                    ((kxzFromfcNEQ_PMP - kxzFromfcNEQ_MPM) + (kxzFromfcNEQ_MPP - kxzFromfcNEQ_PMM)));
+
+    // b_002 = (-kyzFromfcNEQ_PPM + kyzFromfcNEQ_PPP - kyzFromfcNEQ_MPM + kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM +
+    //          kyzFromfcNEQ_PMP - kyzFromfcNEQ_MMM + kyzFromfcNEQ_MMP + c2o1 * vx3_PPM - c2o1 * vx3_PPP + c2o1 *
+    //          vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM + c2o1 * vx3_PMP - c2o1 * vx3_MMM + c2o1 * vx3_MMP) /
+    //         c8o1;
+    b_002 = c1o8 * (c2o1 * (((vx3_PPM + vx3_MMP) - (vx3_PPP + vx3_MMM)) + ((vx3_MPM + vx3_PMP) - (vx3_PMM + vx3_MPP))) +
+                    ((kyzFromfcNEQ_PPP - kyzFromfcNEQ_MMM) + (kyzFromfcNEQ_MMP - kyzFromfcNEQ_PPM)) +
+                    ((kyzFromfcNEQ_PMP - kyzFromfcNEQ_MPM) + (kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM)));
+
+    // c_002 = (-kxxMyyFromfcNEQ_PPM + kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MPM + kxxMyyFromfcNEQ_MPP -
+    //         kxxMyyFromfcNEQ_PMM + kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MMM + kxxMyyFromfcNEQ_MMP +
+    //         c2o1 * kxxMzzFromfcNEQ_PPM - c2o1 * kxxMzzFromfcNEQ_PPP + c2o1 * kxxMzzFromfcNEQ_MPM -
+    //         c2o1 * kxxMzzFromfcNEQ_MPP + c2o1 * kxxMzzFromfcNEQ_PMM - c2o1 * kxxMzzFromfcNEQ_PMP +
+    //         c2o1 * kxxMzzFromfcNEQ_MMM - c2o1 * kxxMzzFromfcNEQ_MMP - c2o1 * vx1_PPM + c2o1 * vx1_PPP +
+    //         c2o1 * vx1_MPM - c2o1 * vx1_MPP - c2o1 * vx1_PMM + c2o1 * vx1_PMP + c2o1 * vx1_MMM - c2o1 * vx1_MMP -
+    //         c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM - c2o1 * vx2_PMP +
+    //         c2o1 * vx2_MMM - c2o1 * vx2_MMP) /
+    //         c16o1;
+    c_002 =
+        c1o16 * (c2o1 * (((kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_PPP) + (kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_MMP)) +
+                         ((kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_PMP) + (kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_MPP)) +
+                         ((vx1_PPP + vx1_MMM) - (vx1_MMP + vx1_PPM)) + ((vx1_MPM + vx1_PMP) - (vx1_PMM + vx1_MPP)) +
+                         ((vx2_PPP + vx2_MMM) - (vx2_MMP + vx2_PPM)) + ((vx2_PMM + vx2_MPP) - (vx2_MPM + vx2_PMP))) +
+                 ((kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MMM) + (kxxMyyFromfcNEQ_MMP - kxxMyyFromfcNEQ_PPM)) +
+                 ((kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MPM) + (kxxMyyFromfcNEQ_MPP - kxxMyyFromfcNEQ_PMM)));
+
+    // a_110 = (vx1_PPM + vx1_PPP - vx1_MPM - vx1_MPP - vx1_PMM - vx1_PMP + vx1_MMM + vx1_MMP) / c2o1;
+    // b_110 = (vx2_PPM + vx2_PPP - vx2_MPM - vx2_MPP - vx2_PMM - vx2_PMP + vx2_MMM + vx2_MMP) / c2o1;
+    // c_110 = (vx3_PPM + vx3_PPP - vx3_MPM - vx3_MPP - vx3_PMM - vx3_PMP + vx3_MMM + vx3_MMP) / c2o1;
+    a_110 = c1o2 * (((vx1_PPP + vx1_MMM) + (vx1_MMP + vx1_PPM)) - ((vx1_MPM + vx1_PMP) + (vx1_PMM + vx1_MPP)));
+    b_110 = c1o2 * (((vx2_PPP + vx2_MMM) + (vx2_MMP + vx2_PPM)) - ((vx2_MPM + vx2_PMP) + (vx2_PMM + vx2_MPP)));
+    c_110 = c1o2 * (((vx3_PPP + vx3_MMM) + (vx3_MMP + vx3_PPM)) - ((vx3_MPM + vx3_PMP) + (vx3_PMM + vx3_MPP)));
+
+    // a_101 = (-vx1_PPM + vx1_PPP + vx1_MPM - vx1_MPP - vx1_PMM + vx1_PMP + vx1_MMM - vx1_MMP) / c2o1;
+    // b_101 = (-vx2_PPM + vx2_PPP + vx2_MPM - vx2_MPP - vx2_PMM + vx2_PMP + vx2_MMM - vx2_MMP) / c2o1;
+    // c_101 = (-vx3_PPM + vx3_PPP + vx3_MPM - vx3_MPP - vx3_PMM + vx3_PMP + vx3_MMM - vx3_MMP) / c2o1;
+    a_101 = c1o2 * (((vx1_PPP + vx1_MMM) - (vx1_MMP + vx1_PPM)) + ((vx1_MPM + vx1_PMP) - (vx1_PMM + vx1_MPP)));
+    b_101 = c1o2 * (((vx2_PPP + vx2_MMM) - (vx2_MMP + vx2_PPM)) + ((vx2_MPM + vx2_PMP) - (vx2_PMM + vx2_MPP)));
+    c_101 = c1o2 * (((vx3_PPP + vx3_MMM) - (vx3_MMP + vx3_PPM)) + ((vx3_MPM + vx3_PMP) - (vx3_PMM + vx3_MPP)));
+
+    // a_011 = (-vx1_PPM + vx1_PPP - vx1_MPM + vx1_MPP + vx1_PMM - vx1_PMP + vx1_MMM - vx1_MMP) / c2o1;
+    // b_011 = (-vx2_PPM + vx2_PPP - vx2_MPM + vx2_MPP + vx2_PMM - vx2_PMP + vx2_MMM - vx2_MMP) / c2o1;
+    // c_011 = (-vx3_PPM + vx3_PPP - vx3_MPM + vx3_MPP + vx3_PMM - vx3_PMP + vx3_MMM - vx3_MMP) / c2o1;
+    a_011 = c1o2 * (((vx1_PPP + vx1_MMM) - (vx1_MMP + vx1_PPM)) + ((vx1_PMM + vx1_MPP) - (vx1_MPM + vx1_PMP)));
+    b_011 = c1o2 * (((vx2_PPP + vx2_MMM) - (vx2_MMP + vx2_PPM)) + ((vx2_PMM + vx2_MPP) - (vx2_MPM + vx2_PMP)));
+    c_011 = c1o2 * (((vx3_PPP + vx3_MMM) - (vx3_MMP + vx3_PPM)) + ((vx3_PMM + vx3_MPP) - (vx3_MPM + vx3_PMP)));
+
+    // a_111 = -vx1_PPM + vx1_PPP + vx1_MPM - vx1_MPP + vx1_PMM - vx1_PMP - vx1_MMM + vx1_MMP;
+    // b_111 = -vx2_PPM + vx2_PPP + vx2_MPM - vx2_MPP + vx2_PMM - vx2_PMP - vx2_MMM + vx2_MMP;
+    // c_111 = -vx3_PPM + vx3_PPP + vx3_MPM - vx3_MPP + vx3_PMM - vx3_PMP - vx3_MMM + vx3_MMP;
+    a_111 = ((vx1_PPP - vx1_MMM) + (vx1_MMP - vx1_PPM)) + ((vx1_MPM - vx1_PMP) + (vx1_PMM - vx1_MPP));
+    b_111 = ((vx2_PPP - vx2_MMM) + (vx2_MMP - vx2_PPM)) + ((vx2_MPM - vx2_PMP) + (vx2_PMM - vx2_MPP));
+    c_111 = ((vx3_PPP - vx3_MMM) + (vx3_MMP - vx3_PPM)) + ((vx3_MPM - vx3_PMP) + (vx3_PMM - vx3_MPP));
 
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -632,14 +770,29 @@ __global__ void scaleCF_compressible(
         ((xoff != c0o1) || (yoff != c0o1) || (zoff != c0o1))
         ? c0o1
         : -c3o1 * (a_100 * a_100 + b_010 * b_010 + c_001 * c_001) - c6o1 * (b_100 * a_010 + c_100 * a_001 + c_010 * b_001);
-    d_000 = ( drho_PPM + drho_PPP + drho_MPM + drho_MPP + drho_PMM + drho_PMP + drho_MMM + drho_MMP) * c1o8;
-    d_100 = ( drho_PPM + drho_PPP - drho_MPM - drho_MPP + drho_PMM + drho_PMP - drho_MMM - drho_MMP) * c1o4;
-    d_010 = ( drho_PPM + drho_PPP + drho_MPM + drho_MPP - drho_PMM - drho_PMP - drho_MMM - drho_MMP) * c1o4;
-    d_001 = (-drho_PPM + drho_PPP - drho_MPM + drho_MPP - drho_PMM + drho_PMP - drho_MMM + drho_MMP) * c1o4;
-    d_110 = ( drho_PPM + drho_PPP - drho_MPM - drho_MPP - drho_PMM - drho_PMP + drho_MMM + drho_MMP) * c1o2;
-    d_101 = (-drho_PPM + drho_PPP + drho_MPM - drho_MPP - drho_PMM + drho_PMP + drho_MMM - drho_MMP) * c1o2;
-    d_011 = (-drho_PPM + drho_PPP - drho_MPM + drho_MPP + drho_PMM - drho_PMP + drho_MMM - drho_MMP) * c1o2;
-    d_111 =  -drho_PPM + drho_PPP + drho_MPM - drho_MPP + drho_PMM - drho_PMP - drho_MMM + drho_MMP;
+    // d_000 = ( drho_PPM + drho_PPP + drho_MPM + drho_MPP + drho_PMM + drho_PMP + drho_MMM + drho_MMP) * c1o8;
+    d_000 = c1o8 * (((drho_PPP + drho_MMM) + (drho_PPM + drho_MMP)) + ((drho_PMM + drho_MPP) + (drho_PMP + drho_MPM)));
+
+    // d_100 = ( drho_PPM + drho_PPP - drho_MPM - drho_MPP + drho_PMM + drho_PMP - drho_MMM - drho_MMP) * c1o4;
+    d_100 = c1o4 * (((drho_PPP - drho_MMM) + (drho_PPM - drho_MMP)) + ((drho_PMM - drho_MPP) + (drho_PMP - drho_MPM)));
+
+    // d_010 = ( drho_PPM + drho_PPP + drho_MPM + drho_MPP - drho_PMM - drho_PMP - drho_MMM - drho_MMP) * c1o4;
+    d_010 = c1o4 * (((drho_PPP - drho_MMM) + (drho_PPM - drho_MMP)) + ((drho_MPP - drho_PMM) + (drho_MPM - drho_PMP)));
+
+    // d_001 = (-drho_PPM + drho_PPP - drho_MPM + drho_MPP - drho_PMM + drho_PMP - drho_MMM + drho_MMP) * c1o4;
+    d_001 = c1o4 * (((drho_PPP - drho_MMM) + (drho_MMP - drho_PPM)) + ((drho_MPP - drho_PMM) + (drho_PMP - drho_MPM)));
+
+    // d_110 = ( drho_PPM + drho_PPP - drho_MPM - drho_MPP - drho_PMM - drho_PMP + drho_MMM + drho_MMP) * c1o2;
+    d_110 = c1o2 * (((drho_PPP + drho_MMM) + (drho_PPM + drho_MMP)) - ((drho_PMM + drho_MPP) + (drho_PMP + drho_MPM)));
+
+    // d_101 = (-drho_PPM + drho_PPP + drho_MPM - drho_MPP - drho_PMM + drho_PMP + drho_MMM - drho_MMP) * c1o2;
+    d_101 = c1o2 * (((drho_PPP + drho_MMM) - (drho_PPM + drho_MMP)) + ((drho_PMP + drho_MPM) - (drho_PMM + drho_MPP)));
+
+    // d_011 = (-drho_PPM + drho_PPP - drho_MPM + drho_MPP + drho_PMM - drho_PMP + drho_MMM - drho_MMP) * c1o2;
+    d_011 = c1o2 * (((drho_PPP + drho_MMM) - (drho_PPM + drho_MMP)) + ((drho_PMM + drho_MPP) - (drho_PMP + drho_MPM)));
+
+    // d_111 =  -drho_PPM + drho_PPP + drho_MPM - drho_MPP + drho_PMM - drho_PMP - drho_MMM + drho_MMP;
+    d_111 = (((drho_PPP - drho_MMM) + (drho_MMP - drho_PPM)) + ((drho_PMM - drho_MPP) + (drho_MPM - drho_PMP)));
 
     //////////////////////////////////////////////////////////////////////////
     //! - Extrapolation for refinement in to the wall (polynomial coefficients)
@@ -745,28 +898,6 @@ __global__ void scaleCF_compressible(
     real y = -c1o4;
     real z = -c1o4;
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    ////////////////////////////////////////////////////////////////////////////////
-    //! - Set moments (zeroth to sixth order) on destination node
-    //!
-    interpolateDistributions(
-        x, y, z,
-        m_000, 
-        m_100, m_010, m_001,
-        m_011, m_101, m_110, m_200, m_020, m_002,
-        m_111, m_210, m_012, m_201, m_021, m_120, m_102,
-        m_022, m_202, m_220, m_211, m_121, m_112,
-        m_122, m_212, m_221,
-        m_222,
-        a_000, a_100, a_010, a_001, a_200, a_020, a_002, a_110,  a_101, a_011, a_111,
-        b_000, b_100, b_010, b_001, b_200, b_020, b_002, b_110,  b_101, b_011, b_111,
-        c_000, c_100, c_010, c_001, c_200, c_020, c_002, c_110,  c_101, c_011, c_111,
-        d_000, d_100, d_010, d_001, d_110, d_101, d_011, d_111,
-        LaplaceRho, eps_new, omegaF, 
-        kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
-    );
-
-    //////////////////////////////////////////////////////////////////////////
     // index of the base node and its neighbors
     k_base_000 = indicesFineMMM[k_thread];
     k_base_M00 = neighborXfine [k_base_000];
@@ -786,6 +917,28 @@ __global__ void scaleCF_compressible(
     k_M0M = k_base_M0M;
     k_0MM = k_base_0MM;
     k_MMM = k_base_MMM;
+    ////////////////////////////////////////////////////////////////////////////////
+    //! - Set moments (zeroth to sixth order) on destination node
+    //!
+
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
+    interpolateDistributions(
+        x, y, z,
+        m_000, 
+        m_100, m_010, m_001,
+        m_011, m_101, m_110, m_200, m_020, m_002,
+        m_111, m_210, m_012, m_201, m_021, m_120, m_102,
+        m_022, m_202, m_220, m_211, m_121, m_112,
+        m_122, m_212, m_221,
+        m_222,
+        a_000, a_100, a_010, a_001, a_200, a_020, a_002, a_110,  a_101, a_011, a_111,
+        b_000, b_100, b_010, b_001, b_200, b_020, b_002, b_110,  b_101, b_011, b_111,
+        c_000, c_100, c_010, c_001, c_200, c_020, c_002, c_110,  c_101, c_011, c_111,
+        d_000, d_100, d_010, d_001, d_110, d_101, d_011, d_111,
+        LaplaceRho, eps_new, omegaF, 
+        kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
+    );
 
     //////////////////////////////////////////////////////////////////////////
     //! - Write distributions: style of reading and writing the distributions from/to
@@ -830,9 +983,22 @@ __global__ void scaleCF_compressible(
     x = -c1o4;
     y = -c1o4;
     z =  c1o4;
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Set neighbor indices
+    k_000 = k_00M;
+    k_M00 = k_M0M;
+    k_0M0 = k_0MM;
+    k_00M = neighborZfine[k_00M];
+    k_MM0 = k_MMM;
+    k_M0M = neighborZfine[k_M0M];
+    k_0MM = neighborZfine[k_0MM];
+    k_MMM = neighborZfine[k_MMM];
 
     ////////////////////////////////////////////////////////////////////////////////
     // Set moments (zeroth to sixth orders) on destination node
+
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     interpolateDistributions(
         x, y, z,
         m_000, 
@@ -850,17 +1016,6 @@ __global__ void scaleCF_compressible(
         kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
     );
 
-    ////////////////////////////////////////////////////////////////////////////////////
-    // Set neighbor indices
-    k_000 = k_00M;
-    k_M00 = k_M0M;
-    k_0M0 = k_0MM;
-    k_00M = neighborZfine[k_00M];
-    k_MM0 = k_MMM;
-    k_M0M = neighborZfine[k_M0M];
-    k_0MM = neighborZfine[k_0MM];
-    k_MMM = neighborZfine[k_MMM];
-
     //////////////////////////////////////////////////////////////////////////
     // Write distributions
     (distFine.f[DIR_000])[k_000] = f_000;
@@ -900,9 +1055,21 @@ __global__ void scaleCF_compressible(
     y = -c1o4;
     z =  c1o4;
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Set neighbor indices
+    k_000 = k_M00;
+    k_M00 = neighborXfine[k_M00];
+    k_0M0 = k_MM0;
+    k_00M = k_M0M;
+    k_MM0 = neighborXfine[k_MM0];
+    k_M0M = neighborXfine[k_M0M];
+    k_0MM = k_MMM;
+    k_MMM = neighborXfine[k_MMM];
 
     ////////////////////////////////////////////////////////////////////////////////
     // Set moments (zeroth to sixth orders) on destination node
+
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     interpolateDistributions(
         x, y, z,
         m_000, 
@@ -920,17 +1087,6 @@ __global__ void scaleCF_compressible(
         kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
     );
 
-    ////////////////////////////////////////////////////////////////////////////////////
-    // Set neighbor indices
-    k_000 = k_M00;
-    k_M00 = neighborXfine[k_M00];
-    k_0M0 = k_MM0;
-    k_00M = k_M0M;
-    k_MM0 = neighborXfine[k_MM0];
-    k_M0M = neighborXfine[k_M0M];
-    k_0MM = k_MMM;
-    k_MMM = neighborXfine[k_MMM];
-
     //////////////////////////////////////////////////////////////////////////
     // Write distributions
     (distFine.f[DIR_000])[k_000] = f_000;
@@ -969,9 +1125,22 @@ __global__ void scaleCF_compressible(
     x =  c1o4;
     y = -c1o4;
     z = -c1o4;
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Set neighbor indices
+    k_00M = k_000;
+    k_M0M = k_M00;
+    k_0MM = k_0M0;
+    k_MMM = k_MM0;
+    k_000 = k_base_M00;
+    k_M00 = neighborXfine[k_base_M00];
+    k_0M0 = k_base_MM0;
+    k_MM0 = neighborXfine[k_base_MM0];
 
     ////////////////////////////////////////////////////////////////////////////////
     // Set moments (zeroth to sixth orders) on destination node
+
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     interpolateDistributions(
         x, y, z,
         m_000, 
@@ -989,17 +1158,6 @@ __global__ void scaleCF_compressible(
         kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
     );
 
-    ////////////////////////////////////////////////////////////////////////////////////
-    // Set neighbor indices
-    k_00M = k_000;
-    k_M0M = k_M00;
-    k_0MM = k_0M0;
-    k_MMM = k_MM0;
-    k_000 = k_base_M00;
-    k_M00 = neighborXfine[k_base_M00];
-    k_0M0 = k_base_MM0;
-    k_MM0 = neighborXfine[k_base_MM0];
-
     //////////////////////////////////////////////////////////////////////////
     // Write distributions
     (distFine.f[DIR_000])[k_000] = f_000;
@@ -1039,25 +1197,6 @@ __global__ void scaleCF_compressible(
     y =  c1o4;
     z = -c1o4;
     
-    ////////////////////////////////////////////////////////////////////////////////
-    // Set moments (zeroth to sixth orders) on destination node
-    interpolateDistributions(
-        x, y, z,
-        m_000, 
-        m_100, m_010, m_001,
-        m_011, m_101, m_110, m_200, m_020, m_002,
-        m_111, m_210, m_012, m_201, m_021, m_120, m_102,
-        m_022, m_202, m_220, m_211, m_121, m_112,
-        m_122, m_212, m_221,
-        m_222,
-        a_000, a_100, a_010, a_001, a_200, a_020, a_002, a_110,  a_101, a_011, a_111,
-        b_000, b_100, b_010, b_001, b_200, b_020, b_002, b_110,  b_101, b_011, b_111,
-        c_000, c_100, c_010, c_001, c_200, c_020, c_002, c_110,  c_101, c_011, c_111,
-        d_000, d_100, d_010, d_001, d_110, d_101, d_011, d_111,
-        LaplaceRho, eps_new, omegaF, 
-        kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
-    );
-
     //////////////////////////////////////////////////////////////////////////
     // index of the base node and its neighbors
     k_base_000 = k_base_0M0;
@@ -1080,6 +1219,28 @@ __global__ void scaleCF_compressible(
     k_0MM = k_base_0MM;
     k_MMM = k_base_MMM;
 
+    ////////////////////////////////////////////////////////////////////////////////
+    // Set moments (zeroth to sixth orders) on destination node
+
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
+    interpolateDistributions(
+        x, y, z,
+        m_000, 
+        m_100, m_010, m_001,
+        m_011, m_101, m_110, m_200, m_020, m_002,
+        m_111, m_210, m_012, m_201, m_021, m_120, m_102,
+        m_022, m_202, m_220, m_211, m_121, m_112,
+        m_122, m_212, m_221,
+        m_222,
+        a_000, a_100, a_010, a_001, a_200, a_020, a_002, a_110,  a_101, a_011, a_111,
+        b_000, b_100, b_010, b_001, b_200, b_020, b_002, b_110,  b_101, b_011, b_111,
+        c_000, c_100, c_010, c_001, c_200, c_020, c_002, c_110,  c_101, c_011, c_111,
+        d_000, d_100, d_010, d_001, d_110, d_101, d_011, d_111,
+        LaplaceRho, eps_new, omegaF, 
+        kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
+    );
+
     //////////////////////////////////////////////////////////////////////////
     // Write distributions
     (distFine.f[DIR_000])[k_000] = f_000;
@@ -1118,9 +1279,22 @@ __global__ void scaleCF_compressible(
     x = -c1o4;
     y =  c1o4;
     z =  c1o4;
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Set neighbor indices
+    k_000 = k_00M;
+    k_M00 = k_M0M;
+    k_0M0 = k_0MM;
+    k_00M = neighborZfine[k_00M];
+    k_MM0 = k_MMM;
+    k_M0M = neighborZfine[k_M0M];
+    k_0MM = neighborZfine[k_0MM];
+    k_MMM = neighborZfine[k_MMM];
 
     ////////////////////////////////////////////////////////////////////////////////
     // Set moments (zeroth to sixth orders) on destination node
+
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     interpolateDistributions(
         x, y, z,
         m_000, 
@@ -1138,17 +1312,6 @@ __global__ void scaleCF_compressible(
         kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
     );
 
-    ////////////////////////////////////////////////////////////////////////////////////
-    // Set neighbor indices
-    k_000 = k_00M;
-    k_M00 = k_M0M;
-    k_0M0 = k_0MM;
-    k_00M = neighborZfine[k_00M];
-    k_MM0 = k_MMM;
-    k_M0M = neighborZfine[k_M0M];
-    k_0MM = neighborZfine[k_0MM];
-    k_MMM = neighborZfine[k_MMM];
-
     //////////////////////////////////////////////////////////////////////////
     // Write distributions
     (distFine.f[DIR_000])[k_000] = f_000;
@@ -1187,9 +1350,22 @@ __global__ void scaleCF_compressible(
     x = c1o4;
     y = c1o4;
     z = c1o4;
+    ////////////////////////////////////////////////////////////////////////////////////
+    // Set neighbor indices
+    k_000 = k_M00;
+    k_M00 = neighborXfine[k_M00];
+    k_0M0 = k_MM0;
+    k_00M = k_M0M;
+    k_MM0 = neighborXfine[k_MM0];
+    k_M0M = neighborXfine[k_M0M];
+    k_0MM = k_MMM;
+    k_MMM = neighborXfine[k_MMM];
 
     ////////////////////////////////////////////////////////////////////////////////
     // Set moments (zeroth to sixth orders) on destination node
+
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     interpolateDistributions(
         x, y, z,
         m_000, 
@@ -1207,17 +1383,6 @@ __global__ void scaleCF_compressible(
         kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
     );
 
-    ////////////////////////////////////////////////////////////////////////////////////
-    // Set neighbor indices
-    k_000 = k_M00;
-    k_M00 = neighborXfine[k_M00];
-    k_0M0 = k_MM0;
-    k_00M = k_M0M;
-    k_MM0 = neighborXfine[k_MM0];
-    k_M0M = neighborXfine[k_M0M];
-    k_0MM = k_MMM;
-    k_MMM = neighborXfine[k_MMM];
-
     //////////////////////////////////////////////////////////////////////////
     // Write distributions
     (distFine.f[DIR_000])[k_000] = f_000;
@@ -1256,9 +1421,22 @@ __global__ void scaleCF_compressible(
     x =  c1o4;
     y =  c1o4;
     z = -c1o4;
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Set neighbor indices
+    k_00M = k_000;
+    k_M0M = k_M00;
+    k_0MM = k_0M0;
+    k_MMM = k_MM0;
+    k_000 = k_base_M00;
+    k_M00 = neighborXfine[k_base_M00];
+    k_0M0 = k_base_MM0;
+    k_MM0 = neighborXfine[k_base_MM0];
 
     ////////////////////////////////////////////////////////////////////////////////
     // Set moments (zeroth to sixth orders) on destination node
+
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     interpolateDistributions(
         x, y, z,
         m_000, 
@@ -1276,17 +1454,6 @@ __global__ void scaleCF_compressible(
         kxxMyyAverage, kxxMzzAverage, kyzAverage, kxzAverage, kxyAverage
     );
 
-    ////////////////////////////////////////////////////////////////////////////////////
-    // Set neighbor indices
-    k_00M = k_000;
-    k_M0M = k_M00;
-    k_0MM = k_0M0;
-    k_MMM = k_MM0;
-    k_000 = k_base_M00;
-    k_M00 = neighborXfine[k_base_M00];
-    k_0M0 = k_base_MM0;
-    k_MM0 = neighborXfine[k_base_MM0];
-
     //////////////////////////////////////////////////////////////////////////
     // Write distributions
     (distFine.f[DIR_000])[k_000] = f_000;
@@ -1317,3 +1484,7 @@ __global__ void scaleCF_compressible(
     (distFine.f[DIR_PMM])[k_0MM] = f_PMM;
     (distFine.f[DIR_MMM])[k_MMM] = f_MMM;
 }
+
+template __global__ void scaleCF_compressible<true>( real* distributionsCoarse, real* distributionsFine, unsigned int* neighborXcoarse, unsigned int* neighborYcoarse, unsigned int* neighborZcoarse, unsigned int* neighborXfine, unsigned int* neighborYfine, unsigned int* neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int* indicesCoarseMMM, unsigned int* indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, OffCF offsetCF);
+
+template __global__ void scaleCF_compressible<false>( real* distributionsCoarse, real* distributionsFine, unsigned int* neighborXcoarse, unsigned int* neighborYcoarse, unsigned int* neighborZcoarse, unsigned int* neighborXfine, unsigned int* neighborYfine, unsigned int* neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int* indicesCoarseMMM, unsigned int* indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, OffCF offsetCF);
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleFC_compressible.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleFC_compressible.cu
index 3ab8b9d20279eff341ca42d20cee9fe7550a2039..69d5195f7700146b1fef112f062a5700078e3262 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleFC_compressible.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/scaleFC_compressible.cu
@@ -45,7 +45,7 @@ using namespace vf::lbm::dir;
 //!
 
 // based on scaleFC_RhoSq_comp_27
-__global__ void scaleFC_compressible(
+template<bool hasTurbulentViscosity> __global__ void scaleFC_compressible(
     real *distributionsCoarse,
     real *distributionsFine,
     unsigned int *neighborXcoarse,
@@ -54,14 +54,16 @@ __global__ void scaleFC_compressible(
     unsigned int *neighborXfine,
     unsigned int *neighborYfine,
     unsigned int *neighborZfine,
-    unsigned int numberOfLBnodesCoarse,
-    unsigned int numberOfLBnodesFine,
+    unsigned long long numberOfLBnodesCoarse,
+    unsigned long long numberOfLBnodesFine,
     bool isEvenTimestep,
     unsigned int *indicesCoarse000,
     unsigned int *indicesFineMMM,
     unsigned int numberOfInterfaceNodes,
     real omegaCoarse,
     real omegaFine,
+    real* turbulentViscosityCoarse,
+    real* turbulentViscosityFine,
     OffFC offsetFC)
 {
     ////////////////////////////////////////////////////////////////////////////////
@@ -136,6 +138,8 @@ __global__ void scaleFC_compressible(
     unsigned int k_0MM = k_base_0MM;
     unsigned int k_MMM = k_base_MMM;
 
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     calculateMomentsOnSourceNodes( distFine, omegaF,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_MMM, vx1_MMM, vx2_MMM, vx3_MMM,
         kxyFromfcNEQ_MMM, kyzFromfcNEQ_MMM, kxzFromfcNEQ_MMM, kxxMyyFromfcNEQ_MMM, kxxMzzFromfcNEQ_MMM);
@@ -153,6 +157,8 @@ __global__ void scaleFC_compressible(
     k_0MM = neighborZfine[k_0MM];
     k_MMM = neighborZfine[k_MMM];
 
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     calculateMomentsOnSourceNodes( distFine, omegaF,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_MMP, vx1_MMP, vx2_MMP, vx3_MMP,
         kxyFromfcNEQ_MMP, kyzFromfcNEQ_MMP, kxzFromfcNEQ_MMP, kxxMyyFromfcNEQ_MMP, kxxMzzFromfcNEQ_MMP);
@@ -170,6 +176,8 @@ __global__ void scaleFC_compressible(
     k_0MM = k_MMM;
     k_MMM = neighborXfine[k_MMM];
 
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     calculateMomentsOnSourceNodes( distFine, omegaF,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_PMP, vx1_PMP, vx2_PMP, vx3_PMP,
         kxyFromfcNEQ_PMP, kyzFromfcNEQ_PMP, kxzFromfcNEQ_PMP, kxxMyyFromfcNEQ_PMP, kxxMzzFromfcNEQ_PMP);
@@ -187,6 +195,8 @@ __global__ void scaleFC_compressible(
     k_0M0 = k_base_MM0;
     k_MM0 = neighborXfine[k_base_MM0];
 
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     calculateMomentsOnSourceNodes( distFine, omegaF,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_PMM, vx1_PMM, vx2_PMM, vx3_PMM,
         kxyFromfcNEQ_PMM, kyzFromfcNEQ_PMM, kxzFromfcNEQ_PMM, kxxMyyFromfcNEQ_PMM, kxxMzzFromfcNEQ_PMM);
@@ -214,6 +224,8 @@ __global__ void scaleFC_compressible(
     k_0MM = k_base_0MM;
     k_MMM = k_base_MMM;
 
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     calculateMomentsOnSourceNodes( distFine, omegaF,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_MPM, vx1_MPM, vx2_MPM, vx3_MPM,
         kxyFromfcNEQ_MPM, kyzFromfcNEQ_MPM, kxzFromfcNEQ_MPM, kxxMyyFromfcNEQ_MPM, kxxMzzFromfcNEQ_MPM);
@@ -230,6 +242,8 @@ __global__ void scaleFC_compressible(
     k_M0M = neighborZfine[k_M0M];
     k_0MM = neighborZfine[k_0MM];
     k_MMM = neighborZfine[k_MMM];
+
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
     
     calculateMomentsOnSourceNodes( distFine, omegaF,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_MPP, vx1_MPP, vx2_MPP, vx3_MPP,
@@ -248,6 +262,8 @@ __global__ void scaleFC_compressible(
     k_0MM = k_MMM;
     k_MMM = neighborXfine[k_MMM];
 
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     calculateMomentsOnSourceNodes( distFine, omegaF,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_PPP, vx1_PPP, vx2_PPP, vx3_PPP,
         kxyFromfcNEQ_PPP, kyzFromfcNEQ_PPP, kxzFromfcNEQ_PPP, kxxMyyFromfcNEQ_PPP, kxxMzzFromfcNEQ_PPP);
@@ -265,6 +281,8 @@ __global__ void scaleFC_compressible(
     k_0M0 = k_base_MM0;
     k_MM0 = neighborXfine[k_base_MM0];
     
+    if(hasTurbulentViscosity) omegaF = omegaFine/ (c1o1 + c3o1*omegaFine*turbulentViscosityFine[k_000]);
+
     calculateMomentsOnSourceNodes( distFine, omegaF,
         k_000, k_M00, k_0M0, k_00M, k_MM0, k_M0M, k_0MM, k_MMM, drho_PPM, vx1_PPM, vx2_PPM, vx3_PPM,
         kxyFromfcNEQ_PPM, kyzFromfcNEQ_PPM, kxzFromfcNEQ_PPM, kxxMyyFromfcNEQ_PPM, kxxMzzFromfcNEQ_PPM);
@@ -278,115 +296,243 @@ __global__ void scaleFC_compressible(
     real c_000, c_100, c_010, c_001, c_200, c_020, c_002, c_110, c_101, c_011;
     real d_000, d_100, d_010, d_001, d_110, d_101, d_011;
 
-    a_000 = (-kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_PPP + kxxMyyFromfcNEQ_MPM + kxxMyyFromfcNEQ_MPP -
-            kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_PMP + kxxMyyFromfcNEQ_MMM + kxxMyyFromfcNEQ_MMP -
-            kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_PPP + kxxMzzFromfcNEQ_MPM + kxxMzzFromfcNEQ_MPP -
-            kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_PMP + kxxMzzFromfcNEQ_MMM + kxxMzzFromfcNEQ_MMP -
-            c2o1 * kxyFromfcNEQ_PPM - c2o1 * kxyFromfcNEQ_PPP - c2o1 * kxyFromfcNEQ_MPM - c2o1 * kxyFromfcNEQ_MPP +
-            c2o1 * kxyFromfcNEQ_PMM + c2o1 * kxyFromfcNEQ_PMP + c2o1 * kxyFromfcNEQ_MMM + c2o1 * kxyFromfcNEQ_MMP +
-            c2o1 * kxzFromfcNEQ_PPM - c2o1 * kxzFromfcNEQ_PPP + c2o1 * kxzFromfcNEQ_MPM - c2o1 * kxzFromfcNEQ_MPP +
-            c2o1 * kxzFromfcNEQ_PMM - c2o1 * kxzFromfcNEQ_PMP + c2o1 * kxzFromfcNEQ_MMM - c2o1 * kxzFromfcNEQ_MMP +
-            c8o1 * vx1_PPM + c8o1 * vx1_PPP + c8o1 * vx1_MPM + c8o1 * vx1_MPP + c8o1 * vx1_PMM + c8o1 * vx1_PMP +
-            c8o1 * vx1_MMM + c8o1 * vx1_MMP + c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM - c2o1 * vx2_MPP -
-            c2o1 * vx2_PMM - c2o1 * vx2_PMP + c2o1 * vx2_MMM + c2o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP +
-            c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM + c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
-            c64o1;
-    b_000 = (c2o1 * kxxMyyFromfcNEQ_PPM + c2o1 * kxxMyyFromfcNEQ_PPP + c2o1 * kxxMyyFromfcNEQ_MPM +
-            c2o1 * kxxMyyFromfcNEQ_MPP - c2o1 * kxxMyyFromfcNEQ_PMM - c2o1 * kxxMyyFromfcNEQ_PMP -
-            c2o1 * kxxMyyFromfcNEQ_MMM - c2o1 * kxxMyyFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_PPP -
-            kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_MPP + kxxMzzFromfcNEQ_PMM + kxxMzzFromfcNEQ_PMP +
-            kxxMzzFromfcNEQ_MMM + kxxMzzFromfcNEQ_MMP - c2o1 * kxyFromfcNEQ_PPM - c2o1 * kxyFromfcNEQ_PPP +
-            c2o1 * kxyFromfcNEQ_MPM + c2o1 * kxyFromfcNEQ_MPP - c2o1 * kxyFromfcNEQ_PMM - c2o1 * kxyFromfcNEQ_PMP +
-            c2o1 * kxyFromfcNEQ_MMM + c2o1 * kxyFromfcNEQ_MMP + c2o1 * kyzFromfcNEQ_PPM - c2o1 * kyzFromfcNEQ_PPP +
-            c2o1 * kyzFromfcNEQ_MPM - c2o1 * kyzFromfcNEQ_MPP + c2o1 * kyzFromfcNEQ_PMM - c2o1 * kyzFromfcNEQ_PMP +
-            c2o1 * kyzFromfcNEQ_MMM - c2o1 * kyzFromfcNEQ_MMP + c2o1 * vx1_PPM + c2o1 * vx1_PPP - c2o1 * vx1_MPM -
-            c2o1 * vx1_MPP - c2o1 * vx1_PMM - c2o1 * vx1_PMP + c2o1 * vx1_MMM + c2o1 * vx1_MMP + c8o1 * vx2_PPM +
-            c8o1 * vx2_PPP + c8o1 * vx2_MPM + c8o1 * vx2_MPP + c8o1 * vx2_PMM + c8o1 * vx2_PMP + c8o1 * vx2_MMM +
-            c8o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP - c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM -
-            c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
-            c64o1;
-    c_000 = (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_PPP + kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_MPP +
-            kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_PMP + kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_MMP -
-            c2o1 * kxxMzzFromfcNEQ_PPM + c2o1 * kxxMzzFromfcNEQ_PPP - c2o1 * kxxMzzFromfcNEQ_MPM +
-            c2o1 * kxxMzzFromfcNEQ_MPP - c2o1 * kxxMzzFromfcNEQ_PMM + c2o1 * kxxMzzFromfcNEQ_PMP -
-            c2o1 * kxxMzzFromfcNEQ_MMM + c2o1 * kxxMzzFromfcNEQ_MMP - c2o1 * kxzFromfcNEQ_PPM -
-            c2o1 * kxzFromfcNEQ_PPP + c2o1 * kxzFromfcNEQ_MPM + c2o1 * kxzFromfcNEQ_MPP - c2o1 * kxzFromfcNEQ_PMM -
-            c2o1 * kxzFromfcNEQ_PMP + c2o1 * kxzFromfcNEQ_MMM + c2o1 * kxzFromfcNEQ_MMP - c2o1 * kyzFromfcNEQ_PPM -
-            c2o1 * kyzFromfcNEQ_PPP - c2o1 * kyzFromfcNEQ_MPM - c2o1 * kyzFromfcNEQ_MPP + c2o1 * kyzFromfcNEQ_PMM +
-            c2o1 * kyzFromfcNEQ_PMP + c2o1 * kyzFromfcNEQ_MMM + c2o1 * kyzFromfcNEQ_MMP - c2o1 * vx1_PPM +
-            c2o1 * vx1_PPP + c2o1 * vx1_MPM - c2o1 * vx1_MPP - c2o1 * vx1_PMM + c2o1 * vx1_PMP + c2o1 * vx1_MMM -
-            c2o1 * vx1_MMP - c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM -
-            c2o1 * vx2_PMP + c2o1 * vx2_MMM - c2o1 * vx2_MMP + c8o1 * vx3_PPM + c8o1 * vx3_PPP + c8o1 * vx3_MPM +
-            c8o1 * vx3_MPP + c8o1 * vx3_PMM + c8o1 * vx3_PMP + c8o1 * vx3_MMM + c8o1 * vx3_MMP) /
-            c64o1;
-    a_100  = (vx1_PPM + vx1_PPP - vx1_MPM - vx1_MPP + vx1_PMM + vx1_PMP - vx1_MMM - vx1_MMP) / c4o1;
-    b_100  = (vx2_PPM + vx2_PPP - vx2_MPM - vx2_MPP + vx2_PMM + vx2_PMP - vx2_MMM - vx2_MMP) / c4o1;
-    c_100  = (vx3_PPM + vx3_PPP - vx3_MPM - vx3_MPP + vx3_PMM + vx3_PMP - vx3_MMM - vx3_MMP) / c4o1;
-    a_200 = (kxxMyyFromfcNEQ_PPM + kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_MPP +
-            kxxMyyFromfcNEQ_PMM + kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_MMP +
-            kxxMzzFromfcNEQ_PPM + kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_MPP +
-            kxxMzzFromfcNEQ_PMM + kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_MMP + c2o1 * vx2_PPM +
-            c2o1 * vx2_PPP - c2o1 * vx2_MPM - c2o1 * vx2_MPP - c2o1 * vx2_PMM - c2o1 * vx2_PMP + c2o1 * vx2_MMM +
-            c2o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP + c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM +
-            c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
-            c16o1;
-    b_200 = (kxyFromfcNEQ_PPM + kxyFromfcNEQ_PPP - kxyFromfcNEQ_MPM - kxyFromfcNEQ_MPP + kxyFromfcNEQ_PMM +
-            kxyFromfcNEQ_PMP - kxyFromfcNEQ_MMM - kxyFromfcNEQ_MMP - c2o1 * vx1_PPM - c2o1 * vx1_PPP +
-            c2o1 * vx1_MPM + c2o1 * vx1_MPP + c2o1 * vx1_PMM + c2o1 * vx1_PMP - c2o1 * vx1_MMM - c2o1 * vx1_MMP) /
-            c8o1;
-    c_200 = (kxzFromfcNEQ_PPM + kxzFromfcNEQ_PPP - kxzFromfcNEQ_MPM - kxzFromfcNEQ_MPP + kxzFromfcNEQ_PMM +
-            kxzFromfcNEQ_PMP - kxzFromfcNEQ_MMM - kxzFromfcNEQ_MMP + c2o1 * vx1_PPM - c2o1 * vx1_PPP -
-            c2o1 * vx1_MPM + c2o1 * vx1_MPP + c2o1 * vx1_PMM - c2o1 * vx1_PMP - c2o1 * vx1_MMM + c2o1 * vx1_MMP) /
-            c8o1;
-    a_010  = (vx1_PPM + vx1_PPP + vx1_MPM + vx1_MPP - vx1_PMM - vx1_PMP - vx1_MMM - vx1_MMP) / c4o1;
-    b_010  = (vx2_PPM + vx2_PPP + vx2_MPM + vx2_MPP - vx2_PMM - vx2_PMP - vx2_MMM - vx2_MMP) / c4o1;
-    c_010  = (vx3_PPM + vx3_PPP + vx3_MPM + vx3_MPP - vx3_PMM - vx3_PMP - vx3_MMM - vx3_MMP) / c4o1;
-    a_020 = (kxyFromfcNEQ_PPM + kxyFromfcNEQ_PPP + kxyFromfcNEQ_MPM + kxyFromfcNEQ_MPP - kxyFromfcNEQ_PMM -
-            kxyFromfcNEQ_PMP - kxyFromfcNEQ_MMM - kxyFromfcNEQ_MMP - c2o1 * vx2_PPM - c2o1 * vx2_PPP +
-            c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM + c2o1 * vx2_PMP - c2o1 * vx2_MMM - c2o1 * vx2_MMP) /
-            c8o1;
-    b_020 = (-c2o1 * kxxMyyFromfcNEQ_PPM - c2o1 * kxxMyyFromfcNEQ_PPP - c2o1 * kxxMyyFromfcNEQ_MPM -
-            c2o1 * kxxMyyFromfcNEQ_MPP + c2o1 * kxxMyyFromfcNEQ_PMM + c2o1 * kxxMyyFromfcNEQ_PMP +
-            c2o1 * kxxMyyFromfcNEQ_MMM + c2o1 * kxxMyyFromfcNEQ_MMP + kxxMzzFromfcNEQ_PPM + kxxMzzFromfcNEQ_PPP +
-            kxxMzzFromfcNEQ_MPM + kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_PMP -
-            kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_MMP + c2o1 * vx1_PPM + c2o1 * vx1_PPP - c2o1 * vx1_MPM -
-            c2o1 * vx1_MPP - c2o1 * vx1_PMM - c2o1 * vx1_PMP + c2o1 * vx1_MMM + c2o1 * vx1_MMP - c2o1 * vx3_PPM +
-            c2o1 * vx3_PPP - c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM - c2o1 * vx3_PMP + c2o1 * vx3_MMM -
-            c2o1 * vx3_MMP) /
-            c16o1;
-    c_020 = (kyzFromfcNEQ_PPM + kyzFromfcNEQ_PPP + kyzFromfcNEQ_MPM + kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM -
-            kyzFromfcNEQ_PMP - kyzFromfcNEQ_MMM - kyzFromfcNEQ_MMP + c2o1 * vx2_PPM - c2o1 * vx2_PPP +
-            c2o1 * vx2_MPM - c2o1 * vx2_MPP - c2o1 * vx2_PMM + c2o1 * vx2_PMP - c2o1 * vx2_MMM + c2o1 * vx2_MMP) /
-            c8o1;
-    a_001  = (-vx1_PPM + vx1_PPP - vx1_MPM + vx1_MPP - vx1_PMM + vx1_PMP - vx1_MMM + vx1_MMP) / c4o1;
-    b_001  = (-vx2_PPM + vx2_PPP - vx2_MPM + vx2_MPP - vx2_PMM + vx2_PMP - vx2_MMM + vx2_MMP) / c4o1;
-    c_001  = (-vx3_PPM + vx3_PPP - vx3_MPM + vx3_MPP - vx3_PMM + vx3_PMP - vx3_MMM + vx3_MMP) / c4o1;
-    a_002 = (-kxzFromfcNEQ_PPM + kxzFromfcNEQ_PPP - kxzFromfcNEQ_MPM + kxzFromfcNEQ_MPP - kxzFromfcNEQ_PMM +
-            kxzFromfcNEQ_PMP - kxzFromfcNEQ_MMM + kxzFromfcNEQ_MMP + c2o1 * vx3_PPM - c2o1 * vx3_PPP -
-            c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM - c2o1 * vx3_PMP - c2o1 * vx3_MMM + c2o1 * vx3_MMP) /
-            c8o1;
-    b_002 = (-kyzFromfcNEQ_PPM + kyzFromfcNEQ_PPP - kyzFromfcNEQ_MPM + kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM +
-            kyzFromfcNEQ_PMP - kyzFromfcNEQ_MMM + kyzFromfcNEQ_MMP + c2o1 * vx3_PPM - c2o1 * vx3_PPP +
-            c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM + c2o1 * vx3_PMP - c2o1 * vx3_MMM + c2o1 * vx3_MMP) /
-            c8o1;
-    c_002 = (-kxxMyyFromfcNEQ_PPM + kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MPM + kxxMyyFromfcNEQ_MPP -
-            kxxMyyFromfcNEQ_PMM + kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MMM + kxxMyyFromfcNEQ_MMP +
-            c2o1 * kxxMzzFromfcNEQ_PPM - c2o1 * kxxMzzFromfcNEQ_PPP + c2o1 * kxxMzzFromfcNEQ_MPM -
-            c2o1 * kxxMzzFromfcNEQ_MPP + c2o1 * kxxMzzFromfcNEQ_PMM - c2o1 * kxxMzzFromfcNEQ_PMP +
-            c2o1 * kxxMzzFromfcNEQ_MMM - c2o1 * kxxMzzFromfcNEQ_MMP - c2o1 * vx1_PPM + c2o1 * vx1_PPP +
-            c2o1 * vx1_MPM - c2o1 * vx1_MPP - c2o1 * vx1_PMM + c2o1 * vx1_PMP + c2o1 * vx1_MMM - c2o1 * vx1_MMP -
-            c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM - c2o1 * vx2_PMP +
-            c2o1 * vx2_MMM - c2o1 * vx2_MMP) /
-            c16o1;
-    a_110 = (vx1_PPM + vx1_PPP - vx1_MPM - vx1_MPP - vx1_PMM - vx1_PMP + vx1_MMM + vx1_MMP) / c2o1;
-    b_110 = (vx2_PPM + vx2_PPP - vx2_MPM - vx2_MPP - vx2_PMM - vx2_PMP + vx2_MMM + vx2_MMP) / c2o1;
-    c_110 = (vx3_PPM + vx3_PPP - vx3_MPM - vx3_MPP - vx3_PMM - vx3_PMP + vx3_MMM + vx3_MMP) / c2o1;
-    a_101 = (-vx1_PPM + vx1_PPP + vx1_MPM - vx1_MPP - vx1_PMM + vx1_PMP + vx1_MMM - vx1_MMP) / c2o1;
-    b_101 = (-vx2_PPM + vx2_PPP + vx2_MPM - vx2_MPP - vx2_PMM + vx2_PMP + vx2_MMM - vx2_MMP) / c2o1;
-    c_101 = (-vx3_PPM + vx3_PPP + vx3_MPM - vx3_MPP - vx3_PMM + vx3_PMP + vx3_MMM - vx3_MMP) / c2o1;
-    a_011 = (-vx1_PPM + vx1_PPP - vx1_MPM + vx1_MPP + vx1_PMM - vx1_PMP + vx1_MMM - vx1_MMP) / c2o1;
-    b_011 = (-vx2_PPM + vx2_PPP - vx2_MPM + vx2_MPP + vx2_PMM - vx2_PMP + vx2_MMM - vx2_MMP) / c2o1;
-    c_011 = (-vx3_PPM + vx3_PPP - vx3_MPM + vx3_MPP + vx3_PMM - vx3_PMP + vx3_MMM - vx3_MMP) / c2o1;
+    //a_000 = (-kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_PPP + kxxMyyFromfcNEQ_MPM + kxxMyyFromfcNEQ_MPP -
+    //        kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_PMP + kxxMyyFromfcNEQ_MMM + kxxMyyFromfcNEQ_MMP -
+    //        kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_PPP + kxxMzzFromfcNEQ_MPM + kxxMzzFromfcNEQ_MPP -
+    //        kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_PMP + kxxMzzFromfcNEQ_MMM + kxxMzzFromfcNEQ_MMP -
+    //        c2o1 * kxyFromfcNEQ_PPM - c2o1 * kxyFromfcNEQ_PPP - c2o1 * kxyFromfcNEQ_MPM - c2o1 * kxyFromfcNEQ_MPP +
+    //        c2o1 * kxyFromfcNEQ_PMM + c2o1 * kxyFromfcNEQ_PMP + c2o1 * kxyFromfcNEQ_MMM + c2o1 * kxyFromfcNEQ_MMP +
+    //        c2o1 * kxzFromfcNEQ_PPM - c2o1 * kxzFromfcNEQ_PPP + c2o1 * kxzFromfcNEQ_MPM - c2o1 * kxzFromfcNEQ_MPP +
+    //        c2o1 * kxzFromfcNEQ_PMM - c2o1 * kxzFromfcNEQ_PMP + c2o1 * kxzFromfcNEQ_MMM - c2o1 * kxzFromfcNEQ_MMP +
+    //        c8o1 * vx1_PPM + c8o1 * vx1_PPP + c8o1 * vx1_MPM + c8o1 * vx1_MPP + c8o1 * vx1_PMM + c8o1 * vx1_PMP +
+    //        c8o1 * vx1_MMM + c8o1 * vx1_MMP + c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM - c2o1 * vx2_MPP -
+    //        c2o1 * vx2_PMM - c2o1 * vx2_PMP + c2o1 * vx2_MMM + c2o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP +
+    //        c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM + c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
+    //        c64o1;
+    a_000 = c1o64 * (
+            c2o1 * (
+            ((kxyFromfcNEQ_MMM - kxyFromfcNEQ_PPP) + (kxyFromfcNEQ_MMP - kxyFromfcNEQ_PPM)) + ((kxyFromfcNEQ_PMM - kxyFromfcNEQ_MPP) + (kxyFromfcNEQ_PMP - kxyFromfcNEQ_MPM)) + 
+            ((kxzFromfcNEQ_MMM - kxzFromfcNEQ_PPP) + (kxzFromfcNEQ_PPM - kxzFromfcNEQ_MMP)) + ((kxzFromfcNEQ_PMM - kxzFromfcNEQ_MPP) + (kxzFromfcNEQ_MPM - kxzFromfcNEQ_PMP)) + 
+            ((vx2_PPP + vx2_MMM) + (vx2_PPM + vx2_MMP)) - ((vx2_MPP + vx2_PMM) + (vx2_MPM + vx2_PMP)) + 
+            ((vx3_PPP + vx3_MMM) - (vx3_PPM + vx3_MMP)) + ((vx3_PMP + vx3_MPM) - (vx3_MPP + vx3_PMM))) + 
+            c8o1 * (((vx1_PPP + vx1_MMM) + (vx1_PPM + vx1_MMP)) + ((vx1_MPP + vx1_PMM) + (vx1_PMP + vx1_MPM))) +
+            ((kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_PPP) + (kxxMyyFromfcNEQ_MMP - kxxMyyFromfcNEQ_PPM)) + 
+            ((kxxMyyFromfcNEQ_MPP - kxxMyyFromfcNEQ_PMM) + (kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_PMP)) +
+            ((kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_PPP) + (kxxMzzFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM)) + 
+            ((kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM) + (kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_PMP)));
+
+    //b_000 = (c2o1 * kxxMyyFromfcNEQ_PPM + c2o1 * kxxMyyFromfcNEQ_PPP + c2o1 * kxxMyyFromfcNEQ_MPM +
+    //        c2o1 * kxxMyyFromfcNEQ_MPP - c2o1 * kxxMyyFromfcNEQ_PMM - c2o1 * kxxMyyFromfcNEQ_PMP -
+    //        c2o1 * kxxMyyFromfcNEQ_MMM - c2o1 * kxxMyyFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_PPP -
+    //        kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_MPP + kxxMzzFromfcNEQ_PMM + kxxMzzFromfcNEQ_PMP +
+    //        kxxMzzFromfcNEQ_MMM + kxxMzzFromfcNEQ_MMP - c2o1 * kxyFromfcNEQ_PPM - c2o1 * kxyFromfcNEQ_PPP +
+    //        c2o1 * kxyFromfcNEQ_MPM + c2o1 * kxyFromfcNEQ_MPP - c2o1 * kxyFromfcNEQ_PMM - c2o1 * kxyFromfcNEQ_PMP +
+    //        c2o1 * kxyFromfcNEQ_MMM + c2o1 * kxyFromfcNEQ_MMP + c2o1 * kyzFromfcNEQ_PPM - c2o1 * kyzFromfcNEQ_PPP +
+    //        c2o1 * kyzFromfcNEQ_MPM - c2o1 * kyzFromfcNEQ_MPP + c2o1 * kyzFromfcNEQ_PMM - c2o1 * kyzFromfcNEQ_PMP +
+    //        c2o1 * kyzFromfcNEQ_MMM - c2o1 * kyzFromfcNEQ_MMP + c2o1 * vx1_PPM + c2o1 * vx1_PPP - c2o1 * vx1_MPM -
+    //        c2o1 * vx1_MPP - c2o1 * vx1_PMM - c2o1 * vx1_PMP + c2o1 * vx1_MMM + c2o1 * vx1_MMP + c8o1 * vx2_PPM +
+    //        c8o1 * vx2_PPP + c8o1 * vx2_MPM + c8o1 * vx2_MPP + c8o1 * vx2_PMM + c8o1 * vx2_PMP + c8o1 * vx2_MMM +
+    //        c8o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP - c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM -
+    //        c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
+    //        c64o1;
+    b_000 = c1o64 * (
+            c2o1 * (
+            ((kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MMM) + (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_MMP)) + 
+            ((kxxMyyFromfcNEQ_MPP - kxxMyyFromfcNEQ_PMM) + (kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_PMP)) + 
+            ((kxyFromfcNEQ_MMM - kxyFromfcNEQ_PPP) + (kxyFromfcNEQ_MMP - kxyFromfcNEQ_PPM)) + 
+            ((kxyFromfcNEQ_MPP - kxyFromfcNEQ_PMM) + (kxyFromfcNEQ_MPM - kxyFromfcNEQ_PMP)) + 
+            ((kyzFromfcNEQ_MMM - kyzFromfcNEQ_PPP) + (kyzFromfcNEQ_PPM - kyzFromfcNEQ_MMP)) + 
+            ((kyzFromfcNEQ_PMM - kyzFromfcNEQ_MPP) + (kyzFromfcNEQ_MPM - kyzFromfcNEQ_PMP)) + 
+            ((vx1_PPP + vx1_MMM) + (vx1_PPM + vx1_MMP)) - ((vx1_MPM + vx1_MPP) + (vx1_PMM + vx1_PMP)) + 
+            ((vx3_PPP + vx3_MMM) - (vx3_PPM + vx3_MMP)) + ((vx3_MPP + vx3_PMM) - (vx3_MPM + vx3_PMP))) + 
+            c8o1 * (((vx2_PPP + vx2_MMM) + (vx2_PPM + vx2_MMP)) + ((vx2_MPP + vx2_PMM) + (vx2_MPM + vx2_PMP))) + 
+            ((kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_PPP) + (kxxMzzFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM)) +
+            ((kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_MPP) + (kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MPM)));
+
+    //c_000 = (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_PPP + kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_MPP +
+    //        kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_PMP + kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_MMP -
+    //        c2o1 * kxxMzzFromfcNEQ_PPM + c2o1 * kxxMzzFromfcNEQ_PPP - c2o1 * kxxMzzFromfcNEQ_MPM +
+    //        c2o1 * kxxMzzFromfcNEQ_MPP - c2o1 * kxxMzzFromfcNEQ_PMM + c2o1 * kxxMzzFromfcNEQ_PMP -
+    //        c2o1 * kxxMzzFromfcNEQ_MMM + c2o1 * kxxMzzFromfcNEQ_MMP - c2o1 * kxzFromfcNEQ_PPM -
+    //        c2o1 * kxzFromfcNEQ_PPP + c2o1 * kxzFromfcNEQ_MPM + c2o1 * kxzFromfcNEQ_MPP - c2o1 * kxzFromfcNEQ_PMM -
+    //        c2o1 * kxzFromfcNEQ_PMP + c2o1 * kxzFromfcNEQ_MMM + c2o1 * kxzFromfcNEQ_MMP - c2o1 * kyzFromfcNEQ_PPM -
+    //        c2o1 * kyzFromfcNEQ_PPP - c2o1 * kyzFromfcNEQ_MPM - c2o1 * kyzFromfcNEQ_MPP + c2o1 * kyzFromfcNEQ_PMM +
+    //        c2o1 * kyzFromfcNEQ_PMP + c2o1 * kyzFromfcNEQ_MMM + c2o1 * kyzFromfcNEQ_MMP - c2o1 * vx1_PPM +
+    //        c2o1 * vx1_PPP + c2o1 * vx1_MPM - c2o1 * vx1_MPP - c2o1 * vx1_PMM + c2o1 * vx1_PMP + c2o1 * vx1_MMM -
+    //        c2o1 * vx1_MMP - c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM -
+    //        c2o1 * vx2_PMP + c2o1 * vx2_MMM - c2o1 * vx2_MMP + c8o1 * vx3_PPM + c8o1 * vx3_PPP + c8o1 * vx3_MPM +
+    //        c8o1 * vx3_MPP + c8o1 * vx3_PMM + c8o1 * vx3_PMP + c8o1 * vx3_MMM + c8o1 * vx3_MMP) /
+    //        c64o1;
+    c_000 = c1o64 * ( 
+            c2o1 * (
+            ((kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MMM) + (kxxMzzFromfcNEQ_MMP - kxxMzzFromfcNEQ_PPM)) + 
+            ((kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM) + (kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MPM)) + 
+            ((kxzFromfcNEQ_MMM - kxzFromfcNEQ_PPP) + (kxzFromfcNEQ_MMP - kxzFromfcNEQ_PPM)) + 
+            ((kxzFromfcNEQ_MPP - kxzFromfcNEQ_PMM) + (kxzFromfcNEQ_MPM - kxzFromfcNEQ_PMP)) + 
+            ((kyzFromfcNEQ_MMM - kyzFromfcNEQ_PPP) + (kyzFromfcNEQ_MMP - kyzFromfcNEQ_PPM)) + 
+            ((kyzFromfcNEQ_PMM - kyzFromfcNEQ_MPP) + (kyzFromfcNEQ_PMP - kyzFromfcNEQ_MPM)) + 
+            ((vx1_PPP + vx1_MMM) - (vx1_MMP + vx1_PPM)) + ((vx1_MPM + vx1_PMP) - (vx1_MPP + vx1_PMM)) + 
+            ((vx2_PPP + vx2_MMM) - (vx2_MMP + vx2_PPM)) + ((vx2_MPP + vx2_PMM) - (vx2_MPM + vx2_PMP))) + 
+            c8o1 * (((vx3_PPP + vx3_MMM) + (vx3_PPM + vx3_MMP)) + ((vx3_PMM + vx3_MPP) + (vx3_PMP + vx3_MPM))) +
+            ((kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_PPP) + (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_MMP)) + 
+            ((kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_MPP) + (kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_PMP)));
+
+    //a_100  = (vx1_PPM + vx1_PPP - vx1_MPM - vx1_MPP + vx1_PMM + vx1_PMP - vx1_MMM - vx1_MMP) / c4o1;
+    a_100 = c1o4 * (((vx1_PPP - vx1_MMM) + (vx1_PPM - vx1_MMP)) + ((vx1_PMM - vx1_MPP) + (vx1_PMP - vx1_MPM)));
+
+    //b_100  = (vx2_PPM + vx2_PPP - vx2_MPM - vx2_MPP + vx2_PMM + vx2_PMP - vx2_MMM - vx2_MMP) / c4o1;
+    b_100 = c1o4 * (((vx2_PPP - vx2_MMM) + (vx2_PPM - vx2_MMP)) + ((vx2_PMM - vx2_MPP) + (vx2_PMP - vx2_MPM)));
+
+    //c_100  = (vx3_PPM + vx3_PPP - vx3_MPM - vx3_MPP + vx3_PMM + vx3_PMP - vx3_MMM - vx3_MMP) / c4o1;
+    c_100 = c1o4 * (((vx3_PPP - vx3_MMM) + (vx3_PPM - vx3_MMP)) + ((vx3_PMM - vx3_MPP) + (vx3_PMP - vx3_MPM)));
+
+    //a_200 = (kxxMyyFromfcNEQ_PPM + kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MPM - kxxMyyFromfcNEQ_MPP +
+    //        kxxMyyFromfcNEQ_PMM + kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_MMP +
+    //        kxxMzzFromfcNEQ_PPM + kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_MPP +
+    //        kxxMzzFromfcNEQ_PMM + kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_MMP + c2o1 * vx2_PPM +
+    //        c2o1 * vx2_PPP - c2o1 * vx2_MPM - c2o1 * vx2_MPP - c2o1 * vx2_PMM - c2o1 * vx2_PMP + c2o1 * vx2_MMM +
+    //        c2o1 * vx2_MMP - c2o1 * vx3_PPM + c2o1 * vx3_PPP + c2o1 * vx3_MPM - c2o1 * vx3_MPP - c2o1 * vx3_PMM +
+    //        c2o1 * vx3_PMP + c2o1 * vx3_MMM - c2o1 * vx3_MMP) /
+    //        c16o1;
+    a_200 = c1o16 * ( 
+            c2o1 * (
+            ((vx2_PPP + vx2_MMM) + (vx2_PPM - vx2_MPP)) + ((vx2_MMP - vx2_PMM) - (vx2_MPM + vx2_PMP)) + 
+            ((vx3_PPP + vx3_MMM) - (vx3_PPM + vx3_MPP)) + ((vx3_MPM + vx3_PMP) - (vx3_MMP + vx3_PMM))) + 
+            ((kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MMM) + (kxxMyyFromfcNEQ_PPM - kxxMyyFromfcNEQ_MMP)) + 
+            ((kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_MPP) + (kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MPM)) + 
+            ((kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MMM) + (kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_MMP)) + 
+            ((kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_MPP) + (kxxMzzFromfcNEQ_PMP - kxxMzzFromfcNEQ_MPM)));
+
+    //b_200 = (kxyFromfcNEQ_PPM + kxyFromfcNEQ_PPP - kxyFromfcNEQ_MPM - kxyFromfcNEQ_MPP + kxyFromfcNEQ_PMM +
+    //        kxyFromfcNEQ_PMP - kxyFromfcNEQ_MMM - kxyFromfcNEQ_MMP - c2o1 * vx1_PPM - c2o1 * vx1_PPP +
+    //        c2o1 * vx1_MPM + c2o1 * vx1_MPP + c2o1 * vx1_PMM + c2o1 * vx1_PMP - c2o1 * vx1_MMM - c2o1 * vx1_MMP) /
+    //        c8o1;
+    b_200 = c1o8 * (
+            c2o1 * (
+            -((vx1_PPP + vx1_MMM) + (vx1_PPM + vx1_MMP)) + ((vx1_MPP + vx1_PMM) + (vx1_MPM + vx1_PMP))) +
+            ((kxyFromfcNEQ_PPP - kxyFromfcNEQ_MMM) + (kxyFromfcNEQ_PPM - kxyFromfcNEQ_MMP)) + 
+            ((kxyFromfcNEQ_PMM - kxyFromfcNEQ_MPP) + (kxyFromfcNEQ_PMP - kxyFromfcNEQ_MPM)));
+
+    //c_200 = (kxzFromfcNEQ_PPM + kxzFromfcNEQ_PPP - kxzFromfcNEQ_MPM - kxzFromfcNEQ_MPP + kxzFromfcNEQ_PMM +
+    //         kxzFromfcNEQ_PMP - kxzFromfcNEQ_MMM - kxzFromfcNEQ_MMP + c2o1 * vx1_PPM - c2o1 * vx1_PPP - c2o1 * vx1_MPM +
+    //         c2o1 * vx1_MPP + c2o1 * vx1_PMM - c2o1 * vx1_PMP - c2o1 * vx1_MMM + c2o1 * vx1_MMP) /
+    //        c8o1;
+    c_200 = c1o8 * (
+            c2o1 * (
+            ((vx1_PPM + vx1_MMP) - (vx1_PPP + vx1_MMM)) + ((vx1_MPP + vx1_PMM) - (vx1_MPM + vx1_PMP))) +
+            ((kxzFromfcNEQ_PPP - kxzFromfcNEQ_MMM) + (kxzFromfcNEQ_PPM - kxzFromfcNEQ_MMP)) + 
+            ((kxzFromfcNEQ_PMM - kxzFromfcNEQ_MPP) + (kxzFromfcNEQ_PMP - kxzFromfcNEQ_MPM)));
+
+    //a_010 = (vx1_PPM + vx1_PPP + vx1_MPM + vx1_MPP - vx1_PMM - vx1_PMP - vx1_MMM - vx1_MMP) / c4o1;
+    a_010 = c1o4 * (((vx1_PPP - vx1_MMM) + (vx1_PPM - vx1_MMP)) + ((vx1_MPP - vx1_PMM) + (vx1_MPM - vx1_PMP)));
+
+    //b_010 = (vx2_PPM + vx2_PPP + vx2_MPM + vx2_MPP - vx2_PMM - vx2_PMP - vx2_MMM - vx2_MMP) / c4o1;
+    b_010 = c1o4 * (((vx2_PPP - vx2_MMM) + (vx2_PPM - vx2_MMP)) + ((vx2_MPP - vx2_PMM) + (vx2_MPM - vx2_PMP)));
+
+    //c_010 = (vx3_PPM + vx3_PPP + vx3_MPM + vx3_MPP - vx3_PMM - vx3_PMP - vx3_MMM - vx3_MMP) / c4o1;
+    c_010 = c1o4 * (((vx3_PPP - vx3_MMM) + (vx3_PPM - vx3_MMP)) + ((vx3_MPP - vx3_PMM) + (vx3_MPM - vx3_PMP)));
+
+    //a_020 = (kxyFromfcNEQ_PPM + kxyFromfcNEQ_PPP + kxyFromfcNEQ_MPM + kxyFromfcNEQ_MPP - kxyFromfcNEQ_PMM -
+    //        kxyFromfcNEQ_PMP - kxyFromfcNEQ_MMM - kxyFromfcNEQ_MMP - c2o1 * vx2_PPM - c2o1 * vx2_PPP +
+    //        c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM + c2o1 * vx2_PMP - c2o1 * vx2_MMM - c2o1 * vx2_MMP) /
+    //        c8o1;
+    a_020 = c1o8 * (
+            c2o1 * (-((vx2_PPP + vx2_MMM) + (vx2_MMP + vx2_PPM)) + ((vx2_MPP + vx2_PMM) + (vx2_MPM + vx2_PMP))) +
+            ((kxyFromfcNEQ_PPP - kxyFromfcNEQ_MMM) + (kxyFromfcNEQ_PPM - kxyFromfcNEQ_MMP)) + 
+            ((kxyFromfcNEQ_MPP - kxyFromfcNEQ_PMM) + (kxyFromfcNEQ_MPM - kxyFromfcNEQ_PMP)));
+
+    //b_020 = (-c2o1 * kxxMyyFromfcNEQ_PPM - c2o1 * kxxMyyFromfcNEQ_PPP - c2o1 * kxxMyyFromfcNEQ_MPM -
+    //        c2o1 * kxxMyyFromfcNEQ_MPP + c2o1 * kxxMyyFromfcNEQ_PMM + c2o1 * kxxMyyFromfcNEQ_PMP +
+    //        c2o1 * kxxMyyFromfcNEQ_MMM + c2o1 * kxxMyyFromfcNEQ_MMP + kxxMzzFromfcNEQ_PPM + kxxMzzFromfcNEQ_PPP +
+    //        kxxMzzFromfcNEQ_MPM + kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_PMP -
+    //        kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_MMP + c2o1 * vx1_PPM + c2o1 * vx1_PPP - c2o1 * vx1_MPM -
+    //        c2o1 * vx1_MPP - c2o1 * vx1_PMM - c2o1 * vx1_PMP + c2o1 * vx1_MMM + c2o1 * vx1_MMP - c2o1 * vx3_PPM +
+    //        c2o1 * vx3_PPP - c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM - c2o1 * vx3_PMP + c2o1 * vx3_MMM -
+    //        c2o1 * vx3_MMP) /
+    //        c16o1;
+    b_020 = c1o16 * (
+            c2o1 * (
+            ((kxxMyyFromfcNEQ_MMM - kxxMyyFromfcNEQ_PPP) + (kxxMyyFromfcNEQ_MMP - kxxMyyFromfcNEQ_PPM)) +
+            ((kxxMyyFromfcNEQ_PMM - kxxMyyFromfcNEQ_MPP) + (kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MPM)) +
+            ((vx1_PPP + vx1_MMM) + (vx1_PPM + vx1_MMP)) - ((vx1_MPP + vx1_PMM) + (vx1_PMP + vx1_MPM)) + 
+            ((vx3_PPP + vx3_MMM) - (vx3_PPM + vx3_MMP)) + ((vx3_MPP + vx3_PMM) - (vx3_MPM + vx3_PMP))) +
+            ((kxxMzzFromfcNEQ_PPP - kxxMzzFromfcNEQ_MMM) + (kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_MMP)) + 
+            ((kxxMzzFromfcNEQ_MPP - kxxMzzFromfcNEQ_PMM) + (kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_PMP)));
+
+    //c_020 = (kyzFromfcNEQ_PPM + kyzFromfcNEQ_PPP + kyzFromfcNEQ_MPM + kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM -
+    //         kyzFromfcNEQ_PMP - kyzFromfcNEQ_MMM - kyzFromfcNEQ_MMP + c2o1 * vx2_PPM - c2o1 * vx2_PPP + c2o1 * vx2_MPM -
+    //         c2o1 * vx2_MPP - c2o1 * vx2_PMM + c2o1 * vx2_PMP - c2o1 * vx2_MMM + c2o1 * vx2_MMP) /
+    //        c8o1;
+    c_020 = c1o8 * (
+            c2o1 * (((vx2_MMP + vx2_PPM) - (vx2_PPP + vx2_MMM)) + ((vx2_PMP + vx2_MPM) - (vx2_MPP + vx2_PMM))) +
+            ((kyzFromfcNEQ_PPP - kyzFromfcNEQ_MMM) + (kyzFromfcNEQ_PPM - kyzFromfcNEQ_MMP)) +
+            ((kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM) + (kyzFromfcNEQ_MPM - kyzFromfcNEQ_PMP)));
+
+    //a_001  = (-vx1_PPM + vx1_PPP - vx1_MPM + vx1_MPP - vx1_PMM + vx1_PMP - vx1_MMM + vx1_MMP) / c4o1;
+    a_001 = c1o4 * (((vx1_PPP - vx1_MMM) + (vx1_MMP - vx1_PPM)) + ((vx1_MPP - vx1_PMM) + (vx1_PMP - vx1_MPM)));
+
+    //b_001  = (-vx2_PPM + vx2_PPP - vx2_MPM + vx2_MPP - vx2_PMM + vx2_PMP - vx2_MMM + vx2_MMP) / c4o1;
+    b_001 = c1o4 * (((vx2_PPP - vx2_MMM) + (vx2_MMP - vx2_PPM)) + ((vx2_MPP - vx2_PMM) + (vx2_PMP - vx2_MPM)));
+
+    //c_001  = (-vx3_PPM + vx3_PPP - vx3_MPM + vx3_MPP - vx3_PMM + vx3_PMP - vx3_MMM + vx3_MMP) / c4o1;
+    c_001 = c1o4 * (((vx3_PPP - vx3_MMM) + (vx3_MMP - vx3_PPM)) + ((vx3_MPP - vx3_PMM) + (vx3_PMP - vx3_MPM)));
+
+    //a_002 = (-kxzFromfcNEQ_PPM + kxzFromfcNEQ_PPP - kxzFromfcNEQ_MPM + kxzFromfcNEQ_MPP - kxzFromfcNEQ_PMM +
+    //        kxzFromfcNEQ_PMP - kxzFromfcNEQ_MMM + kxzFromfcNEQ_MMP + c2o1 * vx3_PPM - c2o1 * vx3_PPP -
+    //        c2o1 * vx3_MPM + c2o1 * vx3_MPP + c2o1 * vx3_PMM - c2o1 * vx3_PMP - c2o1 * vx3_MMM + c2o1 * vx3_MMP) /
+    //        c8o1;
+    a_002 = c1o8 * (
+            c2o1 * (((vx3_PPM + vx3_MMP) - (vx3_PPP + vx3_MMM)) + ((vx3_MPP + vx3_PMM) - (vx3_PMP + vx3_MPM))) +
+                    ((kxzFromfcNEQ_PPP - kxzFromfcNEQ_MMM) + (kxzFromfcNEQ_MMP - kxzFromfcNEQ_PPM)) +
+                    ((kxzFromfcNEQ_PMP - kxzFromfcNEQ_MPM) + (kxzFromfcNEQ_MPP - kxzFromfcNEQ_PMM)));
+
+    //b_002 = (-kyzFromfcNEQ_PPM + kyzFromfcNEQ_PPP - kyzFromfcNEQ_MPM + kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM +
+    //         kyzFromfcNEQ_PMP - kyzFromfcNEQ_MMM + kyzFromfcNEQ_MMP + c2o1 * vx3_PPM - c2o1 * vx3_PPP + c2o1 * vx3_MPM -
+    //         c2o1 * vx3_MPP - c2o1 * vx3_PMM + c2o1 * vx3_PMP - c2o1 * vx3_MMM + c2o1 * vx3_MMP) /
+    //        c8o1;
+    b_002 = c1o8 * (
+            c2o1 * (((vx3_PPM + vx3_MMP) - (vx3_PPP + vx3_MMM)) + ((vx3_MPM + vx3_PMP) - (vx3_PMM + vx3_MPP))) + 
+                    ((kyzFromfcNEQ_PPP - kyzFromfcNEQ_MMM) + (kyzFromfcNEQ_MMP - kyzFromfcNEQ_PPM)) + 
+                    ((kyzFromfcNEQ_PMP - kyzFromfcNEQ_MPM) + (kyzFromfcNEQ_MPP - kyzFromfcNEQ_PMM)));
+
+    //c_002 = (-kxxMyyFromfcNEQ_PPM + kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MPM + kxxMyyFromfcNEQ_MPP -
+    //        kxxMyyFromfcNEQ_PMM + kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MMM + kxxMyyFromfcNEQ_MMP +
+    //        c2o1 * kxxMzzFromfcNEQ_PPM - c2o1 * kxxMzzFromfcNEQ_PPP + c2o1 * kxxMzzFromfcNEQ_MPM -
+    //        c2o1 * kxxMzzFromfcNEQ_MPP + c2o1 * kxxMzzFromfcNEQ_PMM - c2o1 * kxxMzzFromfcNEQ_PMP +
+    //        c2o1 * kxxMzzFromfcNEQ_MMM - c2o1 * kxxMzzFromfcNEQ_MMP - c2o1 * vx1_PPM + c2o1 * vx1_PPP +
+    //        c2o1 * vx1_MPM - c2o1 * vx1_MPP - c2o1 * vx1_PMM + c2o1 * vx1_PMP + c2o1 * vx1_MMM - c2o1 * vx1_MMP -
+    //        c2o1 * vx2_PPM + c2o1 * vx2_PPP - c2o1 * vx2_MPM + c2o1 * vx2_MPP + c2o1 * vx2_PMM - c2o1 * vx2_PMP +
+    //        c2o1 * vx2_MMM - c2o1 * vx2_MMP) /
+    //        c16o1;
+    c_002 = c1o16 * (
+            c2o1 * (
+            ((kxxMzzFromfcNEQ_MMM - kxxMzzFromfcNEQ_PPP) + (kxxMzzFromfcNEQ_PPM - kxxMzzFromfcNEQ_MMP)) + 
+            ((kxxMzzFromfcNEQ_MPM - kxxMzzFromfcNEQ_PMP) + (kxxMzzFromfcNEQ_PMM - kxxMzzFromfcNEQ_MPP)) + 
+            ((vx1_PPP + vx1_MMM) - (vx1_MMP + vx1_PPM)) + ((vx1_MPM + vx1_PMP) - (vx1_PMM + vx1_MPP)) + 
+            ((vx2_PPP + vx2_MMM) - (vx2_MMP + vx2_PPM)) + ((vx2_PMM + vx2_MPP) - (vx2_MPM + vx2_PMP))) + 
+            ((kxxMyyFromfcNEQ_PPP - kxxMyyFromfcNEQ_MMM) + (kxxMyyFromfcNEQ_MMP - kxxMyyFromfcNEQ_PPM)) +
+            ((kxxMyyFromfcNEQ_PMP - kxxMyyFromfcNEQ_MPM) + (kxxMyyFromfcNEQ_MPP - kxxMyyFromfcNEQ_PMM)));
+
+    //a_110 = (vx1_PPM + vx1_PPP - vx1_MPM - vx1_MPP - vx1_PMM - vx1_PMP + vx1_MMM + vx1_MMP) / c2o1;
+    //b_110 = (vx2_PPM + vx2_PPP - vx2_MPM - vx2_MPP - vx2_PMM - vx2_PMP + vx2_MMM + vx2_MMP) / c2o1;
+    //c_110 = (vx3_PPM + vx3_PPP - vx3_MPM - vx3_MPP - vx3_PMM - vx3_PMP + vx3_MMM + vx3_MMP) / c2o1;
+    a_110 = c1o2 * (((vx1_PPP + vx1_MMM) + (vx1_MMP + vx1_PPM)) - ((vx1_MPM + vx1_PMP) + (vx1_PMM + vx1_MPP)));
+    b_110 = c1o2 * (((vx2_PPP + vx2_MMM) + (vx2_MMP + vx2_PPM)) - ((vx2_MPM + vx2_PMP) + (vx2_PMM + vx2_MPP)));
+    c_110 = c1o2 * (((vx3_PPP + vx3_MMM) + (vx3_MMP + vx3_PPM)) - ((vx3_MPM + vx3_PMP) + (vx3_PMM + vx3_MPP)));
+
+    //a_101 = (-vx1_PPM + vx1_PPP + vx1_MPM - vx1_MPP - vx1_PMM + vx1_PMP + vx1_MMM - vx1_MMP) / c2o1;
+    //b_101 = (-vx2_PPM + vx2_PPP + vx2_MPM - vx2_MPP - vx2_PMM + vx2_PMP + vx2_MMM - vx2_MMP) / c2o1;
+    //c_101 = (-vx3_PPM + vx3_PPP + vx3_MPM - vx3_MPP - vx3_PMM + vx3_PMP + vx3_MMM - vx3_MMP) / c2o1;
+    a_101 = c1o2 * (((vx1_PPP + vx1_MMM) - (vx1_MMP + vx1_PPM)) + ((vx1_MPM + vx1_PMP) - (vx1_PMM + vx1_MPP)));
+    b_101 = c1o2 * (((vx2_PPP + vx2_MMM) - (vx2_MMP + vx2_PPM)) + ((vx2_MPM + vx2_PMP) - (vx2_PMM + vx2_MPP)));
+    c_101 = c1o2 * (((vx3_PPP + vx3_MMM) - (vx3_MMP + vx3_PPM)) + ((vx3_MPM + vx3_PMP) - (vx3_PMM + vx3_MPP)));
+    
+    //a_011 = (-vx1_PPM + vx1_PPP - vx1_MPM + vx1_MPP + vx1_PMM - vx1_PMP + vx1_MMM - vx1_MMP) / c2o1;
+    //b_011 = (-vx2_PPM + vx2_PPP - vx2_MPM + vx2_MPP + vx2_PMM - vx2_PMP + vx2_MMM - vx2_MMP) / c2o1;
+    //c_011 = (-vx3_PPM + vx3_PPP - vx3_MPM + vx3_MPP + vx3_PMM - vx3_PMP + vx3_MMM - vx3_MMP) / c2o1;
+    a_011 = c1o2 * (((vx1_PPP + vx1_MMM) - (vx1_MMP + vx1_PPM)) + ((vx1_PMM + vx1_MPP) - (vx1_MPM + vx1_PMP)));
+    b_011 = c1o2 * (((vx2_PPP + vx2_MMM) - (vx2_MMP + vx2_PPM)) + ((vx2_PMM + vx2_MPP) - (vx2_MPM + vx2_PMP)));
+    c_011 = c1o2 * (((vx3_PPP + vx3_MMM) - (vx3_MMP + vx3_PPM)) + ((vx3_PMM + vx3_MPP) - (vx3_MPM + vx3_PMP)));
 
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
@@ -412,15 +558,28 @@ __global__ void scaleFC_compressible(
     //! 
     real LaplaceRho = 
         ((xoff != c0o1) || (yoff != c0o1) || (zoff != c0o1))
-        ? c0o1
-        : -c3o1 * (a_100 * a_100 + b_010 * b_010 + c_001 * c_001) - c6o1 * (b_100 * a_010 + c_100 * a_001 + c_010 * b_001);
-    d_000 = ( drho_PPM + drho_PPP + drho_MPM + drho_MPP + drho_PMM + drho_PMP + drho_MMM + drho_MMP - c2o1 * LaplaceRho) * c1o8;
-    d_100 = ( drho_PPM + drho_PPP - drho_MPM - drho_MPP + drho_PMM + drho_PMP - drho_MMM - drho_MMP) * c1o4;
-    d_010 = ( drho_PPM + drho_PPP + drho_MPM + drho_MPP - drho_PMM - drho_PMP - drho_MMM - drho_MMP) * c1o4;
-    d_001 = (-drho_PPM + drho_PPP - drho_MPM + drho_MPP - drho_PMM + drho_PMP - drho_MMM + drho_MMP) * c1o4;
-    d_110 = ( drho_PPM + drho_PPP - drho_MPM - drho_MPP - drho_PMM - drho_PMP + drho_MMM + drho_MMP) * c1o2;
-    d_101 = (-drho_PPM + drho_PPP + drho_MPM - drho_MPP - drho_PMM + drho_PMP + drho_MMM - drho_MMP) * c1o2;
-    d_011 = (-drho_PPM + drho_PPP - drho_MPM + drho_MPP + drho_PMM - drho_PMP + drho_MMM - drho_MMP) * c1o2;
+        ? c0o1 : c0o1;
+//        : -c3o1 * (a_100 * a_100 + b_010 * b_010 + c_001 * c_001) - c6o1 * (b_100 * a_010 + c_100 * a_001 + c_010 * b_001);
+    // d_000 = ( drho_PPM + drho_PPP + drho_MPM + drho_MPP + drho_PMM + drho_PMP + drho_MMM + drho_MMP - c2o1 * LaplaceRho) * c1o8;
+    d_000 =  c1o8 * ((((drho_PPP + drho_MMM) + (drho_PPM + drho_MMP)) + ((drho_PMM + drho_MPP) + (drho_PMP + drho_MPM))) - c2o1 * LaplaceRho);
+
+    // d_100 = ( drho_PPM + drho_PPP - drho_MPM - drho_MPP + drho_PMM + drho_PMP - drho_MMM - drho_MMP) * c1o4;
+    d_100 = c1o4 * (((drho_PPP - drho_MMM) + (drho_PPM - drho_MMP)) + ((drho_PMM - drho_MPP) + (drho_PMP - drho_MPM)));
+
+    // d_010 = ( drho_PPM + drho_PPP + drho_MPM + drho_MPP - drho_PMM - drho_PMP - drho_MMM - drho_MMP) * c1o4;
+    d_010 = c1o4 * (((drho_PPP - drho_MMM) + (drho_PPM - drho_MMP)) + ((drho_MPP - drho_PMM) + (drho_MPM - drho_PMP)));
+
+    // d_001 = (-drho_PPM + drho_PPP - drho_MPM + drho_MPP - drho_PMM + drho_PMP - drho_MMM + drho_MMP) * c1o4;
+    d_001 = c1o4 * (((drho_PPP - drho_MMM) + (drho_MMP - drho_PPM)) + ((drho_MPP - drho_PMM) + (drho_PMP - drho_MPM)));
+
+    // d_110 = ( drho_PPM + drho_PPP - drho_MPM - drho_MPP - drho_PMM - drho_PMP + drho_MMM + drho_MMP) * c1o2;
+    d_110 = c1o2 * (((drho_PPP + drho_MMM) + (drho_PPM + drho_MMP)) - ((drho_PMM + drho_MPP) + (drho_PMP + drho_MPM)));
+
+    // d_101 = (-drho_PPM + drho_PPP + drho_MPM - drho_MPP - drho_PMM + drho_PMP + drho_MMM - drho_MMP) * c1o2;
+    d_101 = c1o2 * (((drho_PPP + drho_MMM) - (drho_PPM + drho_MMP)) + ((drho_PMP + drho_MPM) - (drho_PMM + drho_MPP)));
+
+    // d_011 = (-drho_PPM + drho_PPP - drho_MPM + drho_MPP + drho_PMM - drho_PMP + drho_MMM - drho_MMP) * c1o2;
+    d_011 = c1o2 * (((drho_PPP + drho_MMM) - (drho_PPM + drho_MMP)) + ((drho_PMM + drho_MPP) - (drho_PMP + drho_MPM)));
 
 
     //////////////////////////////////////////////////////////////////////////
@@ -534,6 +693,18 @@ __global__ void scaleFC_compressible(
     // y = 0.;
     // z = 0.;
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // index of the destination node and its neighbors
+    k_000 = indicesCoarse000[k_thread];
+    k_M00 = neighborXcoarse [k_000];
+    k_0M0 = neighborYcoarse [k_000];
+    k_00M = neighborZcoarse [k_000];
+    k_MM0 = neighborYcoarse [k_M00];
+    k_M0M = neighborZcoarse [k_M00];
+    k_0MM = neighborZcoarse [k_0M0];
+    k_MMM = neighborZcoarse [k_MM0];
+    ////////////////////////////////////////////////////////////////////////////////////
+
+    if(hasTurbulentViscosity) omegaC = omegaCoarse / (c1o1 + c3o1*omegaCoarse*turbulentViscosityCoarse[k_000]);
 
     ////////////////////////////////////////////////////////////////////////////////
     //! - Set macroscopic values on destination node (zeroth and first order moments)
@@ -636,19 +807,6 @@ __global__ void scaleFC_compressible(
     backwardInverseChimeraWithK(m_210, m_211, m_212, vvz, vz_sq, c9o1,  c1o9);
     backwardInverseChimeraWithK(m_220, m_221, m_222, vvz, vz_sq, c36o1, c1o36);
 
-
-    ////////////////////////////////////////////////////////////////////////////////////
-    // index of the destination node and its neighbors
-    k_000 = indicesCoarse000[k_thread];
-    k_M00 = neighborXcoarse [k_000];
-    k_0M0 = neighborYcoarse [k_000];
-    k_00M = neighborZcoarse [k_000];
-    k_MM0 = neighborYcoarse [k_M00];
-    k_M0M = neighborZcoarse [k_M00];
-    k_0MM = neighborZcoarse [k_0M0];
-    k_MMM = neighborZcoarse [k_MM0];
-    ////////////////////////////////////////////////////////////////////////////////////
-
     ////////////////////////////////////////////////////////////////////////////////////
     //! - Write distributions: style of reading and writing the distributions from/to
     //! stored arrays dependent on timestep is based on the esoteric twist algorithm
@@ -684,3 +842,7 @@ __global__ void scaleFC_compressible(
     (distCoarse.f[DIR_MMM])[k_MMM] = f_MMM;
     ////////////////////////////////////////////////////////////////////////////////////
 }
+
+template __global__ void scaleFC_compressible<true>( real *distributionsCoarse, real *distributionsFine, unsigned int *neighborXcoarse, unsigned int *neighborYcoarse, unsigned int *neighborZcoarse, unsigned int *neighborXfine, unsigned int *neighborYfine, unsigned int *neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int *indicesCoarse000, unsigned int *indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, OffFC offsetFC);
+
+template __global__ void scaleFC_compressible<false>( real *distributionsCoarse, real *distributionsFine, unsigned int *neighborXcoarse, unsigned int *neighborYcoarse, unsigned int *neighborZcoarse, unsigned int *neighborXfine, unsigned int *neighborYfine, unsigned int *neighborZfine, unsigned long long numberOfLBnodesCoarse, unsigned long long numberOfLBnodesFine, bool isEvenTimestep, unsigned int *indicesCoarse000, unsigned int *indicesFineMMM, unsigned int numberOfInterfaceNodes, real omegaCoarse, real omegaFine, real* turbulentViscosityCoarse, real* turbulentViscosityFine, OffFC offsetFC);
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/GPU/Init27.cu b/src/gpu/VirtualFluids_GPU/GPU/Init27.cu
index 6d497d2a1ab7ec305bec4f1ad1ed2e2d63c4dc27..23666fdcf6714d30b40b4750c52f129cc472761c 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/Init27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/Init27.cu
@@ -15,7 +15,7 @@ __global__ void LBInit27( int myid,
                                      unsigned int* neighborY,
                                      unsigned int* neighborZ,
                                      real* vParabel,
-                                     unsigned int size_Mat,
+                                     unsigned long long numberOfLBnodes,
                                      unsigned int grid_nx, 
                                      unsigned int grid_ny, 
                                      unsigned int grid_nz, 
@@ -24,33 +24,33 @@ __global__ void LBInit27( int myid,
                                      int maxlev)
 {
    Distributions27 D;
-   D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-   D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-   D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-   D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-   D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-   D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-   D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-   D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-   D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-   D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-   D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-   D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-   D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-   D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-   D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-   D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-   D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-   D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-   D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-   D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-   D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-   D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-   D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-   D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-   D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+   D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+   D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+   D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+   D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+   D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+   D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+   D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+   D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+   D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+   D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+   D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+   D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+   D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+   D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+   D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+   D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+   D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+   D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+   D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+   D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+   D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+   D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+   D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+   D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+   D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+   D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+   D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    ////////////////////////////////////////////////////////////////////////////////
    unsigned int  k;                   // Zugriff auf arrays im device
    //
@@ -142,32 +142,32 @@ __global__ void LBInit27( int myid,
    real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
    (D.f[DIR_000])[kzero] =   c8o27* (drho-cu_sq);
-   (D.f[DIR_P00   ])[ke   ] =   c2o27* (drho+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
-   (D.f[DIR_M00   ])[kw   ] =   c2o27* (drho+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
-   (D.f[DIR_0P0   ])[kn   ] =   c2o27* (drho+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
-   (D.f[DIR_0M0   ])[ks   ] =   c2o27* (drho+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
-   (D.f[DIR_00P   ])[kt   ] =   c2o27* (drho+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
-   (D.f[DIR_00M   ])[kb   ] =   c2o27* (drho+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
-   (D.f[DIR_PP0  ])[kne  ] =   c1o54* (drho+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
-   (D.f[DIR_MM0  ])[ksw  ] =   c1o54* (drho+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
-   (D.f[DIR_PM0  ])[kse  ] =   c1o54* (drho+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
-   (D.f[DIR_MP0  ])[knw  ] =   c1o54* (drho+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
-   (D.f[DIR_P0P  ])[kte  ] =   c1o54* (drho+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
-   (D.f[DIR_M0M  ])[kbw  ] =   c1o54* (drho+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
-   (D.f[DIR_P0M  ])[kbe  ] =   c1o54* (drho+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
-   (D.f[DIR_M0P  ])[ktw  ] =   c1o54* (drho+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
-   (D.f[DIR_0PP  ])[ktn  ] =   c1o54* (drho+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
-   (D.f[DIR_0MM  ])[kbs  ] =   c1o54* (drho+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
-   (D.f[DIR_0PM  ])[kbn  ] =   c1o54* (drho+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
-   (D.f[DIR_0MP  ])[kts  ] =   c1o54* (drho+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
-   (D.f[DIR_PPP ])[ktne ] =   c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
-   (D.f[DIR_MMM ])[kbsw ] =   c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
-   (D.f[DIR_PPM ])[kbne ] =   c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
-   (D.f[DIR_MMP ])[ktsw ] =   c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
-   (D.f[DIR_PMP ])[ktse ] =   c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
-   (D.f[DIR_MPM ])[kbnw ] =   c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
-   (D.f[DIR_PMM ])[kbse ] =   c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
-   (D.f[DIR_MPP ])[ktnw ] =   c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+   (D.f[DIR_P00])[ke   ] =   c2o27* (drho+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
+   (D.f[DIR_M00])[kw   ] =   c2o27* (drho+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
+   (D.f[DIR_0P0])[kn   ] =   c2o27* (drho+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
+   (D.f[DIR_0M0])[ks   ] =   c2o27* (drho+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
+   (D.f[DIR_00P])[kt   ] =   c2o27* (drho+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
+   (D.f[DIR_00M])[kb   ] =   c2o27* (drho+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
+   (D.f[DIR_PP0])[kne  ] =   c1o54* (drho+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
+   (D.f[DIR_MM0])[ksw  ] =   c1o54* (drho+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
+   (D.f[DIR_PM0])[kse  ] =   c1o54* (drho+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
+   (D.f[DIR_MP0])[knw  ] =   c1o54* (drho+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
+   (D.f[DIR_P0P])[kte  ] =   c1o54* (drho+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
+   (D.f[DIR_M0M])[kbw  ] =   c1o54* (drho+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
+   (D.f[DIR_P0M])[kbe  ] =   c1o54* (drho+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
+   (D.f[DIR_M0P])[ktw  ] =   c1o54* (drho+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
+   (D.f[DIR_0PP])[ktn  ] =   c1o54* (drho+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
+   (D.f[DIR_0MM])[kbs  ] =   c1o54* (drho+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
+   (D.f[DIR_0PM])[kbn  ] =   c1o54* (drho+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
+   (D.f[DIR_0MP])[kts  ] =   c1o54* (drho+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
+   (D.f[DIR_PPP])[ktne ] =   c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+   (D.f[DIR_MMM])[kbsw ] =   c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+   (D.f[DIR_PPM])[kbne ] =   c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+   (D.f[DIR_MMP])[ktsw ] =   c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+   (D.f[DIR_PMP])[ktse ] =   c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+   (D.f[DIR_MPM])[kbnw ] =   c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+   (D.f[DIR_PMM])[kbse ] =   c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+   (D.f[DIR_MPP])[ktnw ] =   c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
 
 }
 ////////////////////////////////////////////////////////////////////////////////
@@ -191,7 +191,7 @@ __global__ void LBInitNonEqPartSP27( unsigned int* neighborX,
                                                 real* ux,
                                                 real* uy,
                                                 real* uz,
-                                                unsigned int size_Mat,
+                                                unsigned long long numberOfLBnodes,
                                                 real* DD,
                                                 real omega,
                                                 bool EvenOrOdd)
@@ -207,7 +207,7 @@ __global__ void LBInitNonEqPartSP27( unsigned int* neighborX,
     const unsigned k = nx*(ny*z + y) + x;
     //////////////////////////////////////////////////////////////////////////
     
-    if(k<size_Mat)
+    if(k<numberOfLBnodes)
     {
         ////////////////////////////////////////////////////////////////////////////////
         unsigned int BC;
@@ -218,63 +218,63 @@ __global__ void LBInitNonEqPartSP27( unsigned int* neighborX,
             Distributions27 D;
             if (EvenOrOdd==true)
             {
-                D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-                D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-                D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-                D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-                D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-                D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-                D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-                D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-                D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-                D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-                D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-                D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-                D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-                D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-                D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-                D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-                D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-                D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-                D.f[DIR_000] = &DD[DIR_000*size_Mat];
-                D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-                D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-                D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-                D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-                D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-                D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-                D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-                D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+                D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+                D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+                D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+                D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+                D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+                D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+                D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+                D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+                D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+                D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+                D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+                D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+                D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+                D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+                D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+                D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+                D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+                D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+                D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+                D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+                D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+                D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+                D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+                D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+                D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+                D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+                D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
             }
             else
             {
-                D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-                D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-                D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-                D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-                D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-                D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-                D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-                D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-                D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-                D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-                D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-                D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-                D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-                D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-                D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-                D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-                D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-                D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-                D.f[DIR_000] = &DD[DIR_000*size_Mat];
-                D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-                D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-                D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
-                D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-                D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-                D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-                D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-                D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
+                D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+                D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+                D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+                D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+                D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+                D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+                D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+                D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+                D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+                D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+                D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+                D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+                D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+                D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+                D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+                D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+                D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+                D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+                D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+                D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+                D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+                D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
+                D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+                D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+                D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+                D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+                D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
             }
             //////////////////////////////////////////////////////////////////////////
             real drho = rho[k];//0.0f;//
@@ -397,62 +397,62 @@ __global__ void LBInitNonEqPartSP27( unsigned int* neighborX,
             real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
             
             (D.f[DIR_000])[kzero] =   c8o27* (drho-cu_sq);
-            (D.f[DIR_P00   ])[ke   ] =   c2o27* (drho+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
-            (D.f[DIR_M00   ])[kw   ] =   c2o27* (drho+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
-            (D.f[DIR_0P0   ])[kn   ] =   c2o27* (drho+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
-            (D.f[DIR_0M0   ])[ks   ] =   c2o27* (drho+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
-            (D.f[DIR_00P   ])[kt   ] =   c2o27* (drho+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
-            (D.f[DIR_00M   ])[kb   ] =   c2o27* (drho+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
-            (D.f[DIR_PP0  ])[kne  ] =   c1o54* (drho+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
-            (D.f[DIR_MM0  ])[ksw  ] =   c1o54* (drho+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
-            (D.f[DIR_PM0  ])[kse  ] =   c1o54* (drho+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
-            (D.f[DIR_MP0  ])[knw  ] =   c1o54* (drho+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
-            (D.f[DIR_P0P  ])[kte  ] =   c1o54* (drho+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
-            (D.f[DIR_M0M  ])[kbw  ] =   c1o54* (drho+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
-            (D.f[DIR_P0M  ])[kbe  ] =   c1o54* (drho+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
-            (D.f[DIR_M0P  ])[ktw  ] =   c1o54* (drho+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
-            (D.f[DIR_0PP  ])[ktn  ] =   c1o54* (drho+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
-            (D.f[DIR_0MM  ])[kbs  ] =   c1o54* (drho+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
-            (D.f[DIR_0PM  ])[kbn  ] =   c1o54* (drho+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
-            (D.f[DIR_0MP  ])[kts  ] =   c1o54* (drho+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
-            (D.f[DIR_PPP ])[ktne ] =   c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
-            (D.f[DIR_MMM ])[kbsw ] =   c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
-            (D.f[DIR_PPM ])[kbne ] =   c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
-            (D.f[DIR_MMP ])[ktsw ] =   c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
-            (D.f[DIR_PMP ])[ktse ] =   c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
-            (D.f[DIR_MPM ])[kbnw ] =   c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
-            (D.f[DIR_PMM ])[kbse ] =   c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
-            (D.f[DIR_MPP ])[ktnw ] =   c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+            (D.f[DIR_P00])[ke   ] =   c2o27* (drho+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
+            (D.f[DIR_M00])[kw   ] =   c2o27* (drho+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
+            (D.f[DIR_0P0])[kn   ] =   c2o27* (drho+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
+            (D.f[DIR_0M0])[ks   ] =   c2o27* (drho+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
+            (D.f[DIR_00P])[kt   ] =   c2o27* (drho+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
+            (D.f[DIR_00M])[kb   ] =   c2o27* (drho+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
+            (D.f[DIR_PP0])[kne  ] =   c1o54* (drho+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
+            (D.f[DIR_MM0])[ksw  ] =   c1o54* (drho+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
+            (D.f[DIR_PM0])[kse  ] =   c1o54* (drho+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
+            (D.f[DIR_MP0])[knw  ] =   c1o54* (drho+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
+            (D.f[DIR_P0P])[kte  ] =   c1o54* (drho+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
+            (D.f[DIR_M0M])[kbw  ] =   c1o54* (drho+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
+            (D.f[DIR_P0M])[kbe  ] =   c1o54* (drho+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
+            (D.f[DIR_M0P])[ktw  ] =   c1o54* (drho+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
+            (D.f[DIR_0PP])[ktn  ] =   c1o54* (drho+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
+            (D.f[DIR_0MM])[kbs  ] =   c1o54* (drho+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
+            (D.f[DIR_0PM])[kbn  ] =   c1o54* (drho+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
+            (D.f[DIR_0MP])[kts  ] =   c1o54* (drho+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
+            (D.f[DIR_PPP])[ktne ] =   c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+            (D.f[DIR_MMM])[kbsw ] =   c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+            (D.f[DIR_PPM])[kbne ] =   c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+            (D.f[DIR_MMP])[ktsw ] =   c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+            (D.f[DIR_PMP])[ktse ] =   c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+            (D.f[DIR_MPM])[kbnw ] =   c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+            (D.f[DIR_PMM])[kbse ] =   c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+            (D.f[DIR_MPP])[ktnw ] =   c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
 
             //////////////////////////////////////////////////////////////////////////
 
             (D.f[DIR_000])[kzero] += f_ZERO;
-            (D.f[DIR_P00   ])[ke   ] += f_E   ;
-            (D.f[DIR_M00   ])[kw   ] += f_E   ;
-            (D.f[DIR_0P0   ])[kn   ] += f_N   ;
-            (D.f[DIR_0M0   ])[ks   ] += f_N   ;
-            (D.f[DIR_00P   ])[kt   ] += f_T   ;
-            (D.f[DIR_00M   ])[kb   ] += f_T   ;
-            (D.f[DIR_PP0  ])[kne  ] += f_NE  ;
-            (D.f[DIR_MM0  ])[ksw  ] += f_NE  ;
-            (D.f[DIR_PM0  ])[kse  ] += f_SE  ;
-            (D.f[DIR_MP0  ])[knw  ] += f_SE  ;
-            (D.f[DIR_P0P  ])[kte  ] += f_TE  ;
-            (D.f[DIR_M0M  ])[kbw  ] += f_TE  ;
-            (D.f[DIR_P0M  ])[kbe  ] += f_BE  ;
-            (D.f[DIR_M0P  ])[ktw  ] += f_BE  ;
-            (D.f[DIR_0PP  ])[ktn  ] += f_TN  ;
-            (D.f[DIR_0MM  ])[kbs  ] += f_TN  ;
-            (D.f[DIR_0PM  ])[kbn  ] += f_BN  ;
-            (D.f[DIR_0MP  ])[kts  ] += f_BN  ;
-            (D.f[DIR_PPP ])[ktne ] += f_TNE ;
-            (D.f[DIR_MMM ])[kbsw ] += f_TNE ;
-            (D.f[DIR_PPM ])[kbne ] += f_TSW ;
-            (D.f[DIR_MMP ])[ktsw ] += f_TSW ;
-            (D.f[DIR_PMP ])[ktse ] += f_TSE ;
-            (D.f[DIR_MPM ])[kbnw ] += f_TSE ;
-            (D.f[DIR_PMM ])[kbse ] += f_TNW ;
-            (D.f[DIR_MPP ])[ktnw ] += f_TNW ;
+            (D.f[DIR_P00])[ke   ] += f_E   ;
+            (D.f[DIR_M00])[kw   ] += f_E   ;
+            (D.f[DIR_0P0])[kn   ] += f_N   ;
+            (D.f[DIR_0M0])[ks   ] += f_N   ;
+            (D.f[DIR_00P])[kt   ] += f_T   ;
+            (D.f[DIR_00M])[kb   ] += f_T   ;
+            (D.f[DIR_PP0])[kne  ] += f_NE  ;
+            (D.f[DIR_MM0])[ksw  ] += f_NE  ;
+            (D.f[DIR_PM0])[kse  ] += f_SE  ;
+            (D.f[DIR_MP0])[knw  ] += f_SE  ;
+            (D.f[DIR_P0P])[kte  ] += f_TE  ;
+            (D.f[DIR_M0M])[kbw  ] += f_TE  ;
+            (D.f[DIR_P0M])[kbe  ] += f_BE  ;
+            (D.f[DIR_M0P])[ktw  ] += f_BE  ;
+            (D.f[DIR_0PP])[ktn  ] += f_TN  ;
+            (D.f[DIR_0MM])[kbs  ] += f_TN  ;
+            (D.f[DIR_0PM])[kbn  ] += f_BN  ;
+            (D.f[DIR_0MP])[kts  ] += f_BN  ;
+            (D.f[DIR_PPP])[ktne ] += f_TNE ;
+            (D.f[DIR_MMM])[kbsw ] += f_TNE ;
+            (D.f[DIR_PPM])[kbne ] += f_TSW ;
+            (D.f[DIR_MMP])[ktsw ] += f_TSW ;
+            (D.f[DIR_PMP])[ktse ] += f_TSE ;
+            (D.f[DIR_MPM])[kbnw ] += f_TSE ;
+            (D.f[DIR_PMM])[kbse ] += f_TNW ;
+            (D.f[DIR_MPP])[ktnw ] += f_TNW ;
 
             //////////////////////////////////////////////////////////////////////////
         }
@@ -460,7 +460,7 @@ __global__ void LBInitNonEqPartSP27( unsigned int* neighborX,
 	    {
 		    //////////////////////////////////////////////////////////////////////////
 		    Distributions27 D;
-		    D.f[DIR_000] = &DD[DIR_000*size_Mat];
+		    D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
 		    //////////////////////////////////////////////////////////////////////////
 		    (D.f[DIR_000])[k] = c96o1;
 		    //////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/GPU/InitAdvectionDiffusion27.cu b/src/gpu/VirtualFluids_GPU/GPU/InitAdvectionDiffusion27.cu
index c091aa8b9a29017ddc0f6ea6584e805d7afc4859..7f67d1692f7e136a6537be6780fe8625adc33e22 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/InitAdvectionDiffusion27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/InitAdvectionDiffusion27.cu
@@ -47,7 +47,7 @@ __global__ void InitAD27(
 	real* velocityX,
 	real* velocityY,
 	real* velocityZ,
-	uint size_Mat,
+	unsigned long long numberOfLBnodes,
 	real* distributionsAD,
 	bool isEvenTimestep)
 {
@@ -68,7 +68,7 @@ __global__ void InitAD27(
 
 	//////////////////////////////////////////////////////////////////////////
 	// run for all indices in size_Mat and fluid nodes
-	if ((k < size_Mat) && (typeOfGridNode[k] == GEO_FLUID))
+	if ((k < numberOfLBnodes) && (typeOfGridNode[k] == GEO_FLUID))
 	{
 		//////////////////////////////////////////////////////////////////////////
 		//! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref
@@ -77,63 +77,63 @@ __global__ void InitAD27(
 		Distributions27 distAD;
 		if (isEvenTimestep)
 		{
-			distAD.f[DIR_P00   ] = &distributionsAD[DIR_P00   *size_Mat];
-			distAD.f[DIR_M00   ] = &distributionsAD[DIR_M00   *size_Mat];
-			distAD.f[DIR_0P0   ] = &distributionsAD[DIR_0P0   *size_Mat];
-			distAD.f[DIR_0M0   ] = &distributionsAD[DIR_0M0   *size_Mat];
-			distAD.f[DIR_00P   ] = &distributionsAD[DIR_00P   *size_Mat];
-			distAD.f[DIR_00M   ] = &distributionsAD[DIR_00M   *size_Mat];
-			distAD.f[DIR_PP0  ] = &distributionsAD[DIR_PP0  *size_Mat];
-			distAD.f[DIR_MM0  ] = &distributionsAD[DIR_MM0  *size_Mat];
-			distAD.f[DIR_PM0  ] = &distributionsAD[DIR_PM0  *size_Mat];
-			distAD.f[DIR_MP0  ] = &distributionsAD[DIR_MP0  *size_Mat];
-			distAD.f[DIR_P0P  ] = &distributionsAD[DIR_P0P  *size_Mat];
-			distAD.f[DIR_M0M  ] = &distributionsAD[DIR_M0M  *size_Mat];
-			distAD.f[DIR_P0M  ] = &distributionsAD[DIR_P0M  *size_Mat];
-			distAD.f[DIR_M0P  ] = &distributionsAD[DIR_M0P  *size_Mat];
-			distAD.f[DIR_0PP  ] = &distributionsAD[DIR_0PP  *size_Mat];
-			distAD.f[DIR_0MM  ] = &distributionsAD[DIR_0MM  *size_Mat];
-			distAD.f[DIR_0PM  ] = &distributionsAD[DIR_0PM  *size_Mat];
-			distAD.f[DIR_0MP  ] = &distributionsAD[DIR_0MP  *size_Mat];
-			distAD.f[DIR_000] = &distributionsAD[DIR_000*size_Mat];
-			distAD.f[DIR_PPP ] = &distributionsAD[DIR_PPP *size_Mat];
-			distAD.f[DIR_MMP ] = &distributionsAD[DIR_MMP *size_Mat];
-			distAD.f[DIR_PMP ] = &distributionsAD[DIR_PMP *size_Mat];
-			distAD.f[DIR_MPP ] = &distributionsAD[DIR_MPP *size_Mat];
-			distAD.f[DIR_PPM ] = &distributionsAD[DIR_PPM *size_Mat];
-			distAD.f[DIR_MMM ] = &distributionsAD[DIR_MMM *size_Mat];
-			distAD.f[DIR_PMM ] = &distributionsAD[DIR_PMM *size_Mat];
-			distAD.f[DIR_MPM ] = &distributionsAD[DIR_MPM *size_Mat];
+			distAD.f[DIR_P00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+			distAD.f[DIR_M00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+			distAD.f[DIR_0P0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+			distAD.f[DIR_0M0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+			distAD.f[DIR_00P] = &distributionsAD[DIR_00P * numberOfLBnodes];
+			distAD.f[DIR_00M] = &distributionsAD[DIR_00M * numberOfLBnodes];
+			distAD.f[DIR_PP0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+			distAD.f[DIR_MM0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+			distAD.f[DIR_PM0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+			distAD.f[DIR_MP0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+			distAD.f[DIR_P0P] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+			distAD.f[DIR_M0M] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+			distAD.f[DIR_P0M] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+			distAD.f[DIR_M0P] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+			distAD.f[DIR_0PP] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+			distAD.f[DIR_0MM] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+			distAD.f[DIR_0PM] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+			distAD.f[DIR_0MP] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+			distAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+			distAD.f[DIR_PPP] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+			distAD.f[DIR_MMP] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+			distAD.f[DIR_PMP] = &distributionsAD[DIR_PMP * numberOfLBnodes];
+			distAD.f[DIR_MPP] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+			distAD.f[DIR_PPM] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+			distAD.f[DIR_MMM] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+			distAD.f[DIR_PMM] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+			distAD.f[DIR_MPM] = &distributionsAD[DIR_MPM * numberOfLBnodes];
 		}
 		else
 		{
-			distAD.f[DIR_M00   ] = &distributionsAD[DIR_P00   *size_Mat];
-			distAD.f[DIR_P00   ] = &distributionsAD[DIR_M00   *size_Mat];
-			distAD.f[DIR_0M0   ] = &distributionsAD[DIR_0P0   *size_Mat];
-			distAD.f[DIR_0P0   ] = &distributionsAD[DIR_0M0   *size_Mat];
-			distAD.f[DIR_00M   ] = &distributionsAD[DIR_00P   *size_Mat];
-			distAD.f[DIR_00P   ] = &distributionsAD[DIR_00M   *size_Mat];
-			distAD.f[DIR_MM0  ] = &distributionsAD[DIR_PP0  *size_Mat];
-			distAD.f[DIR_PP0  ] = &distributionsAD[DIR_MM0  *size_Mat];
-			distAD.f[DIR_MP0  ] = &distributionsAD[DIR_PM0  *size_Mat];
-			distAD.f[DIR_PM0  ] = &distributionsAD[DIR_MP0  *size_Mat];
-			distAD.f[DIR_M0M  ] = &distributionsAD[DIR_P0P  *size_Mat];
-			distAD.f[DIR_P0P  ] = &distributionsAD[DIR_M0M  *size_Mat];
-			distAD.f[DIR_M0P  ] = &distributionsAD[DIR_P0M  *size_Mat];
-			distAD.f[DIR_P0M  ] = &distributionsAD[DIR_M0P  *size_Mat];
-			distAD.f[DIR_0MM  ] = &distributionsAD[DIR_0PP  *size_Mat];
-			distAD.f[DIR_0PP  ] = &distributionsAD[DIR_0MM  *size_Mat];
-			distAD.f[DIR_0MP  ] = &distributionsAD[DIR_0PM  *size_Mat];
-			distAD.f[DIR_0PM  ] = &distributionsAD[DIR_0MP  *size_Mat];
-			distAD.f[DIR_000] = &distributionsAD[DIR_000*size_Mat];
-			distAD.f[DIR_MMM ] = &distributionsAD[DIR_PPP *size_Mat];
-			distAD.f[DIR_PPM ] = &distributionsAD[DIR_MMP *size_Mat];
-			distAD.f[DIR_MPM ] = &distributionsAD[DIR_PMP *size_Mat];
-			distAD.f[DIR_PMM ] = &distributionsAD[DIR_MPP *size_Mat];
-			distAD.f[DIR_MMP ] = &distributionsAD[DIR_PPM *size_Mat];
-			distAD.f[DIR_PPP ] = &distributionsAD[DIR_MMM *size_Mat];
-			distAD.f[DIR_MPP ] = &distributionsAD[DIR_PMM *size_Mat];
-			distAD.f[DIR_PMP ] = &distributionsAD[DIR_MPM *size_Mat];
+			distAD.f[DIR_M00] = &distributionsAD[DIR_P00 * numberOfLBnodes];
+			distAD.f[DIR_P00] = &distributionsAD[DIR_M00 * numberOfLBnodes];
+			distAD.f[DIR_0M0] = &distributionsAD[DIR_0P0 * numberOfLBnodes];
+			distAD.f[DIR_0P0] = &distributionsAD[DIR_0M0 * numberOfLBnodes];
+			distAD.f[DIR_00M] = &distributionsAD[DIR_00P * numberOfLBnodes];
+			distAD.f[DIR_00P] = &distributionsAD[DIR_00M * numberOfLBnodes];
+			distAD.f[DIR_MM0] = &distributionsAD[DIR_PP0 * numberOfLBnodes];
+			distAD.f[DIR_PP0] = &distributionsAD[DIR_MM0 * numberOfLBnodes];
+			distAD.f[DIR_MP0] = &distributionsAD[DIR_PM0 * numberOfLBnodes];
+			distAD.f[DIR_PM0] = &distributionsAD[DIR_MP0 * numberOfLBnodes];
+			distAD.f[DIR_M0M] = &distributionsAD[DIR_P0P * numberOfLBnodes];
+			distAD.f[DIR_P0P] = &distributionsAD[DIR_M0M * numberOfLBnodes];
+			distAD.f[DIR_M0P] = &distributionsAD[DIR_P0M * numberOfLBnodes];
+			distAD.f[DIR_P0M] = &distributionsAD[DIR_M0P * numberOfLBnodes];
+			distAD.f[DIR_0MM] = &distributionsAD[DIR_0PP * numberOfLBnodes];
+			distAD.f[DIR_0PP] = &distributionsAD[DIR_0MM * numberOfLBnodes];
+			distAD.f[DIR_0MP] = &distributionsAD[DIR_0PM * numberOfLBnodes];
+			distAD.f[DIR_0PM] = &distributionsAD[DIR_0MP * numberOfLBnodes];
+			distAD.f[DIR_000] = &distributionsAD[DIR_000 * numberOfLBnodes];
+			distAD.f[DIR_MMM] = &distributionsAD[DIR_PPP * numberOfLBnodes];
+			distAD.f[DIR_PPM] = &distributionsAD[DIR_MMP * numberOfLBnodes];
+			distAD.f[DIR_MPM] = &distributionsAD[DIR_PMP * numberOfLBnodes];
+			distAD.f[DIR_PMM] = &distributionsAD[DIR_MPP * numberOfLBnodes];
+			distAD.f[DIR_MMP] = &distributionsAD[DIR_PPM * numberOfLBnodes];
+			distAD.f[DIR_PPP] = &distributionsAD[DIR_MMM * numberOfLBnodes];
+			distAD.f[DIR_MPP] = &distributionsAD[DIR_PMM * numberOfLBnodes];
+			distAD.f[DIR_PMP] = &distributionsAD[DIR_MPM * numberOfLBnodes];
 		}
 		//////////////////////////////////////////////////////////////////////////
 		//! - Set local velocities and concetration
@@ -178,32 +178,32 @@ __global__ void InitAD27(
 		real cu_sq = c3o2*(vx1*vx1 + vx2*vx2 + vx3*vx3);
 
 		(distAD.f[DIR_000])[kzero] = c8o27  * conc * (c1o1 - cu_sq);
-		(distAD.f[DIR_P00   ])[ke   ] = c2o27  * conc * (c1o1 + c3o1 * ( vx1            ) + c9o2 * ( vx1            ) * ( vx1            ) - cu_sq);
-		(distAD.f[DIR_M00   ])[kw   ] = c2o27  * conc * (c1o1 + c3o1 * (-vx1            ) + c9o2 * (-vx1            ) * (-vx1            ) - cu_sq);
-		(distAD.f[DIR_0P0   ])[kn   ] = c2o27  * conc * (c1o1 + c3o1 * (       vx2      ) + c9o2 * (       vx2      ) * (       vx2      ) - cu_sq);
-		(distAD.f[DIR_0M0   ])[ks   ] = c2o27  * conc * (c1o1 + c3o1 * (     - vx2      ) + c9o2 * (     - vx2      ) * (     - vx2      ) - cu_sq);
-		(distAD.f[DIR_00P   ])[kt   ] = c2o27  * conc * (c1o1 + c3o1 * (             vx3) + c9o2 * (             vx3) * (             vx3) - cu_sq);
-		(distAD.f[DIR_00M   ])[kb   ] = c2o27  * conc * (c1o1 + c3o1 * (           - vx3) + c9o2 * (           - vx3) * (           - vx3) - cu_sq);
-		(distAD.f[DIR_PP0  ])[kne  ] = c1o54  * conc * (c1o1 + c3o1 * ( vx1 + vx2      ) + c9o2 * ( vx1 + vx2      ) * ( vx1 + vx2      ) - cu_sq);
-		(distAD.f[DIR_MM0  ])[ksw  ] = c1o54  * conc * (c1o1 + c3o1 * (-vx1 - vx2      ) + c9o2 * (-vx1 - vx2      ) * (-vx1 - vx2      ) - cu_sq);
-		(distAD.f[DIR_PM0  ])[kse  ] = c1o54  * conc * (c1o1 + c3o1 * ( vx1 - vx2      ) + c9o2 * ( vx1 - vx2      ) * ( vx1 - vx2      ) - cu_sq);
-		(distAD.f[DIR_MP0  ])[knw  ] = c1o54  * conc * (c1o1 + c3o1 * (-vx1 + vx2      ) + c9o2 * (-vx1 + vx2      ) * (-vx1 + vx2      ) - cu_sq);
-		(distAD.f[DIR_P0P  ])[kte  ] = c1o54  * conc * (c1o1 + c3o1 * ( vx1       + vx3) + c9o2 * ( vx1       + vx3) * ( vx1       + vx3) - cu_sq);
-		(distAD.f[DIR_M0M  ])[kbw  ] = c1o54  * conc * (c1o1 + c3o1 * (-vx1       - vx3) + c9o2 * (-vx1       - vx3) * (-vx1       - vx3) - cu_sq);
-		(distAD.f[DIR_P0M  ])[kbe  ] = c1o54  * conc * (c1o1 + c3o1 * ( vx1       - vx3) + c9o2 * ( vx1       - vx3) * ( vx1       - vx3) - cu_sq);
-		(distAD.f[DIR_M0P  ])[ktw  ] = c1o54  * conc * (c1o1 + c3o1 * (-vx1       + vx3) + c9o2 * (-vx1       + vx3) * (-vx1       + vx3) - cu_sq);
-		(distAD.f[DIR_0PP  ])[ktn  ] = c1o54  * conc * (c1o1 + c3o1 * (       vx2 + vx3) + c9o2 * (       vx2 + vx3) * (       vx2 + vx3) - cu_sq);
-		(distAD.f[DIR_0MM  ])[kbs  ] = c1o54  * conc * (c1o1 + c3o1 * (     - vx2 - vx3) + c9o2 * (     - vx2 - vx3) * (     - vx2 - vx3) - cu_sq);
-		(distAD.f[DIR_0PM  ])[kbn  ] = c1o54  * conc * (c1o1 + c3o1 * (       vx2 - vx3) + c9o2 * (       vx2 - vx3) * (       vx2 - vx3) - cu_sq);
-		(distAD.f[DIR_0MP  ])[kts  ] = c1o54  * conc * (c1o1 + c3o1 * (     - vx2 + vx3) + c9o2 * (     - vx2 + vx3) * (     - vx2 + vx3) - cu_sq);
-		(distAD.f[DIR_PPP ])[ktne ] = c1o216 * conc * (c1o1 + c3o1 * ( vx1 + vx2 + vx3) + c9o2 * ( vx1 + vx2 + vx3) * ( vx1 + vx2 + vx3) - cu_sq);
-		(distAD.f[DIR_MMM ])[kbsw ] = c1o216 * conc * (c1o1 + c3o1 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq);
-		(distAD.f[DIR_PPM ])[kbne ] = c1o216 * conc * (c1o1 + c3o1 * ( vx1 + vx2 - vx3) + c9o2 * ( vx1 + vx2 - vx3) * ( vx1 + vx2 - vx3) - cu_sq);
-		(distAD.f[DIR_MMP ])[ktsw ] = c1o216 * conc * (c1o1 + c3o1 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq);
-		(distAD.f[DIR_PMP ])[ktse ] = c1o216 * conc * (c1o1 + c3o1 * ( vx1 - vx2 + vx3) + c9o2 * ( vx1 - vx2 + vx3) * ( vx1 - vx2 + vx3) - cu_sq);
-		(distAD.f[DIR_MPM ])[kbnw ] = c1o216 * conc * (c1o1 + c3o1 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq);
-		(distAD.f[DIR_PMM ])[kbse ] = c1o216 * conc * (c1o1 + c3o1 * ( vx1 - vx2 - vx3) + c9o2 * ( vx1 - vx2 - vx3) * ( vx1 - vx2 - vx3) - cu_sq);
-		(distAD.f[DIR_MPP ])[ktnw ] = c1o216 * conc * (c1o1 + c3o1 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq);
+		(distAD.f[DIR_P00])[ke   ] = c2o27  * conc * (c1o1 + c3o1 * ( vx1            ) + c9o2 * ( vx1            ) * ( vx1            ) - cu_sq);
+		(distAD.f[DIR_M00])[kw   ] = c2o27  * conc * (c1o1 + c3o1 * (-vx1            ) + c9o2 * (-vx1            ) * (-vx1            ) - cu_sq);
+		(distAD.f[DIR_0P0])[kn   ] = c2o27  * conc * (c1o1 + c3o1 * (       vx2      ) + c9o2 * (       vx2      ) * (       vx2      ) - cu_sq);
+		(distAD.f[DIR_0M0])[ks   ] = c2o27  * conc * (c1o1 + c3o1 * (     - vx2      ) + c9o2 * (     - vx2      ) * (     - vx2      ) - cu_sq);
+		(distAD.f[DIR_00P])[kt   ] = c2o27  * conc * (c1o1 + c3o1 * (             vx3) + c9o2 * (             vx3) * (             vx3) - cu_sq);
+		(distAD.f[DIR_00M])[kb   ] = c2o27  * conc * (c1o1 + c3o1 * (           - vx3) + c9o2 * (           - vx3) * (           - vx3) - cu_sq);
+		(distAD.f[DIR_PP0])[kne  ] = c1o54  * conc * (c1o1 + c3o1 * ( vx1 + vx2      ) + c9o2 * ( vx1 + vx2      ) * ( vx1 + vx2      ) - cu_sq);
+		(distAD.f[DIR_MM0])[ksw  ] = c1o54  * conc * (c1o1 + c3o1 * (-vx1 - vx2      ) + c9o2 * (-vx1 - vx2      ) * (-vx1 - vx2      ) - cu_sq);
+		(distAD.f[DIR_PM0])[kse  ] = c1o54  * conc * (c1o1 + c3o1 * ( vx1 - vx2      ) + c9o2 * ( vx1 - vx2      ) * ( vx1 - vx2      ) - cu_sq);
+		(distAD.f[DIR_MP0])[knw  ] = c1o54  * conc * (c1o1 + c3o1 * (-vx1 + vx2      ) + c9o2 * (-vx1 + vx2      ) * (-vx1 + vx2      ) - cu_sq);
+		(distAD.f[DIR_P0P])[kte  ] = c1o54  * conc * (c1o1 + c3o1 * ( vx1       + vx3) + c9o2 * ( vx1       + vx3) * ( vx1       + vx3) - cu_sq);
+		(distAD.f[DIR_M0M])[kbw  ] = c1o54  * conc * (c1o1 + c3o1 * (-vx1       - vx3) + c9o2 * (-vx1       - vx3) * (-vx1       - vx3) - cu_sq);
+		(distAD.f[DIR_P0M])[kbe  ] = c1o54  * conc * (c1o1 + c3o1 * ( vx1       - vx3) + c9o2 * ( vx1       - vx3) * ( vx1       - vx3) - cu_sq);
+		(distAD.f[DIR_M0P])[ktw  ] = c1o54  * conc * (c1o1 + c3o1 * (-vx1       + vx3) + c9o2 * (-vx1       + vx3) * (-vx1       + vx3) - cu_sq);
+		(distAD.f[DIR_0PP])[ktn  ] = c1o54  * conc * (c1o1 + c3o1 * (       vx2 + vx3) + c9o2 * (       vx2 + vx3) * (       vx2 + vx3) - cu_sq);
+		(distAD.f[DIR_0MM])[kbs  ] = c1o54  * conc * (c1o1 + c3o1 * (     - vx2 - vx3) + c9o2 * (     - vx2 - vx3) * (     - vx2 - vx3) - cu_sq);
+		(distAD.f[DIR_0PM])[kbn  ] = c1o54  * conc * (c1o1 + c3o1 * (       vx2 - vx3) + c9o2 * (       vx2 - vx3) * (       vx2 - vx3) - cu_sq);
+		(distAD.f[DIR_0MP])[kts  ] = c1o54  * conc * (c1o1 + c3o1 * (     - vx2 + vx3) + c9o2 * (     - vx2 + vx3) * (     - vx2 + vx3) - cu_sq);
+		(distAD.f[DIR_PPP])[ktne ] = c1o216 * conc * (c1o1 + c3o1 * ( vx1 + vx2 + vx3) + c9o2 * ( vx1 + vx2 + vx3) * ( vx1 + vx2 + vx3) - cu_sq);
+		(distAD.f[DIR_MMM])[kbsw ] = c1o216 * conc * (c1o1 + c3o1 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq);
+		(distAD.f[DIR_PPM])[kbne ] = c1o216 * conc * (c1o1 + c3o1 * ( vx1 + vx2 - vx3) + c9o2 * ( vx1 + vx2 - vx3) * ( vx1 + vx2 - vx3) - cu_sq);
+		(distAD.f[DIR_MMP])[ktsw ] = c1o216 * conc * (c1o1 + c3o1 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq);
+		(distAD.f[DIR_PMP])[ktse ] = c1o216 * conc * (c1o1 + c3o1 * ( vx1 - vx2 + vx3) + c9o2 * ( vx1 - vx2 + vx3) * ( vx1 - vx2 + vx3) - cu_sq);
+		(distAD.f[DIR_MPM])[kbnw ] = c1o216 * conc * (c1o1 + c3o1 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq);
+		(distAD.f[DIR_PMM])[kbse ] = c1o216 * conc * (c1o1 + c3o1 * ( vx1 - vx2 - vx3) + c9o2 * ( vx1 - vx2 - vx3) * ( vx1 - vx2 - vx3) - cu_sq);
+		(distAD.f[DIR_MPP])[ktnw ] = c1o216 * conc * (c1o1 + c3o1 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq);
 	}
 }
 
@@ -263,63 +263,63 @@ __global__ void InitAD27(
 //          Distributions27 D27;
 //          if (EvenOrOdd==true)
 //          {
-//             D27.f[DIR_P00   ] = &DD27[DIR_P00   *size_Mat];
-//             D27.f[DIR_M00   ] = &DD27[DIR_M00   *size_Mat];
-//             D27.f[DIR_0P0   ] = &DD27[DIR_0P0   *size_Mat];
-//             D27.f[DIR_0M0   ] = &DD27[DIR_0M0   *size_Mat];
-//             D27.f[DIR_00P   ] = &DD27[DIR_00P   *size_Mat];
-//             D27.f[DIR_00M   ] = &DD27[DIR_00M   *size_Mat];
-//             D27.f[DIR_PP0  ] = &DD27[DIR_PP0  *size_Mat];
-//             D27.f[DIR_MM0  ] = &DD27[DIR_MM0  *size_Mat];
-//             D27.f[DIR_PM0  ] = &DD27[DIR_PM0  *size_Mat];
-//             D27.f[DIR_MP0  ] = &DD27[DIR_MP0  *size_Mat];
-//             D27.f[DIR_P0P  ] = &DD27[DIR_P0P  *size_Mat];
-//             D27.f[DIR_M0M  ] = &DD27[DIR_M0M  *size_Mat];
-//             D27.f[DIR_P0M  ] = &DD27[DIR_P0M  *size_Mat];
-//             D27.f[DIR_M0P  ] = &DD27[DIR_M0P  *size_Mat];
-//             D27.f[DIR_0PP  ] = &DD27[DIR_0PP  *size_Mat];
-//             D27.f[DIR_0MM  ] = &DD27[DIR_0MM  *size_Mat];
-//             D27.f[DIR_0PM  ] = &DD27[DIR_0PM  *size_Mat];
-//             D27.f[DIR_0MP  ] = &DD27[DIR_0MP  *size_Mat];
-//             D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-//             D27.f[DIR_PPP ] = &DD27[DIR_PPP *size_Mat];
-//             D27.f[DIR_MMP ] = &DD27[DIR_MMP *size_Mat];
-//             D27.f[DIR_PMP ] = &DD27[DIR_PMP *size_Mat];
-//             D27.f[DIR_MPP ] = &DD27[DIR_MPP *size_Mat];
-//             D27.f[DIR_PPM ] = &DD27[DIR_PPM *size_Mat];
-//             D27.f[DIR_MMM ] = &DD27[DIR_MMM *size_Mat];
-//             D27.f[DIR_PMM ] = &DD27[DIR_PMM *size_Mat];
-//             D27.f[DIR_MPM ] = &DD27[DIR_MPM *size_Mat];
+//             D27.f[DIR_P00] = &DD27[DIR_P00 * size_Mat];
+//             D27.f[DIR_M00] = &DD27[DIR_M00 * size_Mat];
+//             D27.f[DIR_0P0] = &DD27[DIR_0P0 * size_Mat];
+//             D27.f[DIR_0M0] = &DD27[DIR_0M0 * size_Mat];
+//             D27.f[DIR_00P] = &DD27[DIR_00P * size_Mat];
+//             D27.f[DIR_00M] = &DD27[DIR_00M * size_Mat];
+//             D27.f[DIR_PP0] = &DD27[DIR_PP0 * size_Mat];
+//             D27.f[DIR_MM0] = &DD27[DIR_MM0 * size_Mat];
+//             D27.f[DIR_PM0] = &DD27[DIR_PM0 * size_Mat];
+//             D27.f[DIR_MP0] = &DD27[DIR_MP0 * size_Mat];
+//             D27.f[DIR_P0P] = &DD27[DIR_P0P * size_Mat];
+//             D27.f[DIR_M0M] = &DD27[DIR_M0M * size_Mat];
+//             D27.f[DIR_P0M] = &DD27[DIR_P0M * size_Mat];
+//             D27.f[DIR_M0P] = &DD27[DIR_M0P * size_Mat];
+//             D27.f[DIR_0PP] = &DD27[DIR_0PP * size_Mat];
+//             D27.f[DIR_0MM] = &DD27[DIR_0MM * size_Mat];
+//             D27.f[DIR_0PM] = &DD27[DIR_0PM * size_Mat];
+//             D27.f[DIR_0MP] = &DD27[DIR_0MP * size_Mat];
+//             D27.f[DIR_000] = &DD27[DIR_000 * size_Mat];
+//             D27.f[DIR_PPP] = &DD27[DIR_PPP * size_Mat];
+//             D27.f[DIR_MMP] = &DD27[DIR_MMP * size_Mat];
+//             D27.f[DIR_PMP] = &DD27[DIR_PMP * size_Mat];
+//             D27.f[DIR_MPP] = &DD27[DIR_MPP * size_Mat];
+//             D27.f[DIR_PPM] = &DD27[DIR_PPM * size_Mat];
+//             D27.f[DIR_MMM] = &DD27[DIR_MMM * size_Mat];
+//             D27.f[DIR_PMM] = &DD27[DIR_PMM * size_Mat];
+//             D27.f[DIR_MPM] = &DD27[DIR_MPM * size_Mat];
 //          }
 //          else
 //          {
-//             D27.f[DIR_M00   ] = &DD27[DIR_P00   *size_Mat];
-//             D27.f[DIR_P00   ] = &DD27[DIR_M00   *size_Mat];
-//             D27.f[DIR_0M0   ] = &DD27[DIR_0P0   *size_Mat];
-//             D27.f[DIR_0P0   ] = &DD27[DIR_0M0   *size_Mat];
-//             D27.f[DIR_00M   ] = &DD27[DIR_00P   *size_Mat];
-//             D27.f[DIR_00P   ] = &DD27[DIR_00M   *size_Mat];
-//             D27.f[DIR_MM0  ] = &DD27[DIR_PP0  *size_Mat];
-//             D27.f[DIR_PP0  ] = &DD27[DIR_MM0  *size_Mat];
-//             D27.f[DIR_MP0  ] = &DD27[DIR_PM0  *size_Mat];
-//             D27.f[DIR_PM0  ] = &DD27[DIR_MP0  *size_Mat];
-//             D27.f[DIR_M0M  ] = &DD27[DIR_P0P  *size_Mat];
-//             D27.f[DIR_P0P  ] = &DD27[DIR_M0M  *size_Mat];
-//             D27.f[DIR_M0P  ] = &DD27[DIR_P0M  *size_Mat];
-//             D27.f[DIR_P0M  ] = &DD27[DIR_M0P  *size_Mat];
-//             D27.f[DIR_0MM  ] = &DD27[DIR_0PP  *size_Mat];
-//             D27.f[DIR_0PP  ] = &DD27[DIR_0MM  *size_Mat];
-//             D27.f[DIR_0MP  ] = &DD27[DIR_0PM  *size_Mat];
-//             D27.f[DIR_0PM  ] = &DD27[DIR_0MP  *size_Mat];
-//             D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-//             D27.f[DIR_MMM ] = &DD27[DIR_PPP *size_Mat];
-//             D27.f[DIR_PPM ] = &DD27[DIR_MMP *size_Mat];
-//             D27.f[DIR_MPM ] = &DD27[DIR_PMP *size_Mat];
-//             D27.f[DIR_PMM ] = &DD27[DIR_MPP *size_Mat];
-//             D27.f[DIR_MMP ] = &DD27[DIR_PPM *size_Mat];
-//             D27.f[DIR_PPP ] = &DD27[DIR_MMM *size_Mat];
-//             D27.f[DIR_MPP ] = &DD27[DIR_PMM *size_Mat];
-//             D27.f[DIR_PMP ] = &DD27[DIR_MPM *size_Mat];
+//             D27.f[DIR_M00] = &DD27[DIR_P00 * size_Mat];
+//             D27.f[DIR_P00] = &DD27[DIR_M00 * size_Mat];
+//             D27.f[DIR_0M0] = &DD27[DIR_0P0 * size_Mat];
+//             D27.f[DIR_0P0] = &DD27[DIR_0M0 * size_Mat];
+//             D27.f[DIR_00M] = &DD27[DIR_00P * size_Mat];
+//             D27.f[DIR_00P] = &DD27[DIR_00M * size_Mat];
+//             D27.f[DIR_MM0] = &DD27[DIR_PP0 * size_Mat];
+//             D27.f[DIR_PP0] = &DD27[DIR_MM0 * size_Mat];
+//             D27.f[DIR_MP0] = &DD27[DIR_PM0 * size_Mat];
+//             D27.f[DIR_PM0] = &DD27[DIR_MP0 * size_Mat];
+//             D27.f[DIR_M0M] = &DD27[DIR_P0P * size_Mat];
+//             D27.f[DIR_P0P] = &DD27[DIR_M0M * size_Mat];
+//             D27.f[DIR_M0P] = &DD27[DIR_P0M * size_Mat];
+//             D27.f[DIR_P0M] = &DD27[DIR_M0P * size_Mat];
+//             D27.f[DIR_0MM] = &DD27[DIR_0PP * size_Mat];
+//             D27.f[DIR_0PP] = &DD27[DIR_0MM * size_Mat];
+//             D27.f[DIR_0MP] = &DD27[DIR_0PM * size_Mat];
+//             D27.f[DIR_0PM] = &DD27[DIR_0MP * size_Mat];
+//             D27.f[DIR_000] = &DD27[DIR_000 * size_Mat];
+//             D27.f[DIR_MMM] = &DD27[DIR_PPP * size_Mat];
+//             D27.f[DIR_PPM] = &DD27[DIR_MMP * size_Mat];
+//             D27.f[DIR_MPM] = &DD27[DIR_PMP * size_Mat];
+//             D27.f[DIR_PMM] = &DD27[DIR_MPP * size_Mat];
+//             D27.f[DIR_MMP] = &DD27[DIR_PPM * size_Mat];
+//             D27.f[DIR_PPP] = &DD27[DIR_MMM * size_Mat];
+//             D27.f[DIR_MPP] = &DD27[DIR_PMM * size_Mat];
+//             D27.f[DIR_PMP] = &DD27[DIR_MPM * size_Mat];
 //          }
 //          //////////////////////////////////////////////////////////////////////////
 //          real ConcD = Conc[k];
@@ -391,32 +391,32 @@ __global__ void InitAD27(
 //          real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
 //          (D27.f[DIR_000])[kzero] =   c8o27* ConcD*(c1o1-cu_sq);
-//          (D27.f[DIR_P00   ])[ke   ] =   c2o27* ConcD*(c1o1+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
-//          (D27.f[DIR_M00   ])[kw   ] =   c2o27* ConcD*(c1o1+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
-//          (D27.f[DIR_0P0   ])[kn   ] =   c2o27* ConcD*(c1o1+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
-//          (D27.f[DIR_0M0   ])[ks   ] =   c2o27* ConcD*(c1o1+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
-//          (D27.f[DIR_00P   ])[kt   ] =   c2o27* ConcD*(c1o1+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
-//          (D27.f[DIR_00M   ])[kb   ] =   c2o27* ConcD*(c1o1+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
-//          (D27.f[DIR_PP0  ])[kne  ] =   c1o54* ConcD*(c1o1+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
-//          (D27.f[DIR_MM0  ])[ksw  ] =   c1o54* ConcD*(c1o1+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
-//          (D27.f[DIR_PM0  ])[kse  ] =   c1o54* ConcD*(c1o1+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
-//          (D27.f[DIR_MP0  ])[knw  ] =   c1o54* ConcD*(c1o1+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
-//          (D27.f[DIR_P0P  ])[kte  ] =   c1o54* ConcD*(c1o1+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
-//          (D27.f[DIR_M0M  ])[kbw  ] =   c1o54* ConcD*(c1o1+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
-//          (D27.f[DIR_P0M  ])[kbe  ] =   c1o54* ConcD*(c1o1+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
-//          (D27.f[DIR_M0P  ])[ktw  ] =   c1o54* ConcD*(c1o1+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
-//          (D27.f[DIR_0PP  ])[ktn  ] =   c1o54* ConcD*(c1o1+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
-//          (D27.f[DIR_0MM  ])[kbs  ] =   c1o54* ConcD*(c1o1+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
-//          (D27.f[DIR_0PM  ])[kbn  ] =   c1o54* ConcD*(c1o1+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
-//          (D27.f[DIR_0MP  ])[kts  ] =   c1o54* ConcD*(c1o1+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
-//          (D27.f[DIR_PPP ])[ktne ] =   c1o216*ConcD*(c1o1+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
-//          (D27.f[DIR_MMM ])[kbsw ] =   c1o216*ConcD*(c1o1+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
-//          (D27.f[DIR_PPM ])[kbne ] =   c1o216*ConcD*(c1o1+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
-//          (D27.f[DIR_MMP ])[ktsw ] =   c1o216*ConcD*(c1o1+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
-//          (D27.f[DIR_PMP ])[ktse ] =   c1o216*ConcD*(c1o1+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
-//          (D27.f[DIR_MPM ])[kbnw ] =   c1o216*ConcD*(c1o1+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
-//          (D27.f[DIR_PMM ])[kbse ] =   c1o216*ConcD*(c1o1+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
-//          (D27.f[DIR_MPP ])[ktnw ] =   c1o216*ConcD*(c1o1+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+//          (D27.f[DIR_P00])[ke   ] =   c2o27* ConcD*(c1o1+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
+//          (D27.f[DIR_M00])[kw   ] =   c2o27* ConcD*(c1o1+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
+//          (D27.f[DIR_0P0])[kn   ] =   c2o27* ConcD*(c1o1+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
+//          (D27.f[DIR_0M0])[ks   ] =   c2o27* ConcD*(c1o1+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
+//          (D27.f[DIR_00P])[kt   ] =   c2o27* ConcD*(c1o1+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
+//          (D27.f[DIR_00M])[kb   ] =   c2o27* ConcD*(c1o1+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
+//          (D27.f[DIR_PP0])[kne  ] =   c1o54* ConcD*(c1o1+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
+//          (D27.f[DIR_MM0])[ksw  ] =   c1o54* ConcD*(c1o1+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
+//          (D27.f[DIR_PM0])[kse  ] =   c1o54* ConcD*(c1o1+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
+//          (D27.f[DIR_MP0])[knw  ] =   c1o54* ConcD*(c1o1+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
+//          (D27.f[DIR_P0P])[kte  ] =   c1o54* ConcD*(c1o1+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
+//          (D27.f[DIR_M0M])[kbw  ] =   c1o54* ConcD*(c1o1+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
+//          (D27.f[DIR_P0M])[kbe  ] =   c1o54* ConcD*(c1o1+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
+//          (D27.f[DIR_M0P])[ktw  ] =   c1o54* ConcD*(c1o1+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
+//          (D27.f[DIR_0PP])[ktn  ] =   c1o54* ConcD*(c1o1+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
+//          (D27.f[DIR_0MM])[kbs  ] =   c1o54* ConcD*(c1o1+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
+//          (D27.f[DIR_0PM])[kbn  ] =   c1o54* ConcD*(c1o1+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
+//          (D27.f[DIR_0MP])[kts  ] =   c1o54* ConcD*(c1o1+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
+//          (D27.f[DIR_PPP])[ktne ] =   c1o216*ConcD*(c1o1+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+//          (D27.f[DIR_MMM])[kbsw ] =   c1o216*ConcD*(c1o1+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+//          (D27.f[DIR_PPM])[kbne ] =   c1o216*ConcD*(c1o1+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+//          (D27.f[DIR_MMP])[ktsw ] =   c1o216*ConcD*(c1o1+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+//          (D27.f[DIR_PMP])[ktse ] =   c1o216*ConcD*(c1o1+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+//          (D27.f[DIR_MPM])[kbnw ] =   c1o216*ConcD*(c1o1+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+//          (D27.f[DIR_PMM])[kbse ] =   c1o216*ConcD*(c1o1+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+//          (D27.f[DIR_MPP])[ktnw ] =   c1o216*ConcD*(c1o1+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
 //          ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //       }
 //    }
@@ -448,7 +448,7 @@ __global__ void InitAD7( unsigned int* neighborX,
                                     real* ux,
                                     real* uy,
                                     real* uz,
-                                    unsigned int size_Mat,
+                                    unsigned long long numberOfLBnodes,
                                     real* DD7,
                                     bool EvenOrOdd)
 {
@@ -463,7 +463,7 @@ __global__ void InitAD7( unsigned int* neighborX,
    const unsigned k = nx*(ny*z + y) + x;
    //////////////////////////////////////////////////////////////////////////
 
-   if(k<size_Mat)
+   if(k<numberOfLBnodes)
    {
       ////////////////////////////////////////////////////////////////////////////////
       unsigned int BC;
@@ -474,23 +474,23 @@ __global__ void InitAD7( unsigned int* neighborX,
          Distributions7 D7;
          if (EvenOrOdd==true)
          {
-            D7.f[0] = &DD7[0*size_Mat];
-            D7.f[1] = &DD7[1*size_Mat];
-            D7.f[2] = &DD7[2*size_Mat];
-            D7.f[3] = &DD7[3*size_Mat];
-            D7.f[4] = &DD7[4*size_Mat];
-            D7.f[5] = &DD7[5*size_Mat];
-            D7.f[6] = &DD7[6*size_Mat];
+            D7.f[0] = &DD7[0*numberOfLBnodes];
+            D7.f[1] = &DD7[1*numberOfLBnodes];
+            D7.f[2] = &DD7[2*numberOfLBnodes];
+            D7.f[3] = &DD7[3*numberOfLBnodes];
+            D7.f[4] = &DD7[4*numberOfLBnodes];
+            D7.f[5] = &DD7[5*numberOfLBnodes];
+            D7.f[6] = &DD7[6*numberOfLBnodes];
          }
          else
          {
-            D7.f[0] = &DD7[0*size_Mat];
-            D7.f[2] = &DD7[1*size_Mat];
-            D7.f[1] = &DD7[2*size_Mat];
-            D7.f[4] = &DD7[3*size_Mat];
-            D7.f[3] = &DD7[4*size_Mat];
-            D7.f[6] = &DD7[5*size_Mat];
-            D7.f[5] = &DD7[6*size_Mat];
+            D7.f[0] = &DD7[0*numberOfLBnodes];
+            D7.f[2] = &DD7[1*numberOfLBnodes];
+            D7.f[1] = &DD7[2*numberOfLBnodes];
+            D7.f[4] = &DD7[3*numberOfLBnodes];
+            D7.f[3] = &DD7[4*numberOfLBnodes];
+            D7.f[6] = &DD7[5*numberOfLBnodes];
+            D7.f[5] = &DD7[6*numberOfLBnodes];
          }
          //////////////////////////////////////////////////////////////////////////
          real ConcD = Conc[k];
diff --git a/src/gpu/VirtualFluids_GPU/GPU/KernelUtilities.h b/src/gpu/VirtualFluids_GPU/GPU/KernelUtilities.h
index 2f6a11aa17398b65858508c3f94b241c16551b37..8ca148bf0d0800d04926ee7884a8b58fc3c2825a 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/KernelUtilities.h
+++ b/src/gpu/VirtualFluids_GPU/GPU/KernelUtilities.h
@@ -40,99 +40,99 @@
 using namespace vf::lbm::constant;
 using namespace vf::lbm::dir;
 
-__inline__ __device__ void getPointersToDistributions(Distributions27 &dist, real *distributionArray, const uint numberOfLBnodes, const bool isEvenTimestep)
+__inline__ __device__ void getPointersToDistributions(Distributions27 &dist, real *distributionArray, const unsigned long long numberOfLBnodes, const bool isEvenTimestep)
 {
     if (isEvenTimestep)
     {
-        dist.f[DIR_P00   ] = &distributionArray[DIR_P00   *numberOfLBnodes];
-        dist.f[DIR_M00   ] = &distributionArray[DIR_M00   *numberOfLBnodes];
-        dist.f[DIR_0P0   ] = &distributionArray[DIR_0P0   *numberOfLBnodes];
-        dist.f[DIR_0M0   ] = &distributionArray[DIR_0M0   *numberOfLBnodes];
-        dist.f[DIR_00P   ] = &distributionArray[DIR_00P   *numberOfLBnodes];
-        dist.f[DIR_00M   ] = &distributionArray[DIR_00M   *numberOfLBnodes];
-        dist.f[DIR_PP0  ] = &distributionArray[DIR_PP0  *numberOfLBnodes];
-        dist.f[DIR_MM0  ] = &distributionArray[DIR_MM0  *numberOfLBnodes];
-        dist.f[DIR_PM0  ] = &distributionArray[DIR_PM0  *numberOfLBnodes];
-        dist.f[DIR_MP0  ] = &distributionArray[DIR_MP0  *numberOfLBnodes];
-        dist.f[DIR_P0P  ] = &distributionArray[DIR_P0P  *numberOfLBnodes];
-        dist.f[DIR_M0M  ] = &distributionArray[DIR_M0M  *numberOfLBnodes];
-        dist.f[DIR_P0M  ] = &distributionArray[DIR_P0M  *numberOfLBnodes];
-        dist.f[DIR_M0P  ] = &distributionArray[DIR_M0P  *numberOfLBnodes];
-        dist.f[DIR_0PP  ] = &distributionArray[DIR_0PP  *numberOfLBnodes];
-        dist.f[DIR_0MM  ] = &distributionArray[DIR_0MM  *numberOfLBnodes];
-        dist.f[DIR_0PM  ] = &distributionArray[DIR_0PM  *numberOfLBnodes];
-        dist.f[DIR_0MP  ] = &distributionArray[DIR_0MP  *numberOfLBnodes];
-        dist.f[DIR_000] = &distributionArray[DIR_000*numberOfLBnodes];
-        dist.f[DIR_PPP ] = &distributionArray[DIR_PPP *numberOfLBnodes];
-        dist.f[DIR_MMP ] = &distributionArray[DIR_MMP *numberOfLBnodes];
-        dist.f[DIR_PMP ] = &distributionArray[DIR_PMP *numberOfLBnodes];
-        dist.f[DIR_MPP ] = &distributionArray[DIR_MPP *numberOfLBnodes];
-        dist.f[DIR_PPM ] = &distributionArray[DIR_PPM *numberOfLBnodes];
-        dist.f[DIR_MMM ] = &distributionArray[DIR_MMM *numberOfLBnodes];
-        dist.f[DIR_PMM ] = &distributionArray[DIR_PMM *numberOfLBnodes];
-        dist.f[DIR_MPM ] = &distributionArray[DIR_MPM *numberOfLBnodes];
+        dist.f[DIR_P00] = &distributionArray[DIR_P00 * numberOfLBnodes];
+        dist.f[DIR_M00] = &distributionArray[DIR_M00 * numberOfLBnodes];
+        dist.f[DIR_0P0] = &distributionArray[DIR_0P0 * numberOfLBnodes];
+        dist.f[DIR_0M0] = &distributionArray[DIR_0M0 * numberOfLBnodes];
+        dist.f[DIR_00P] = &distributionArray[DIR_00P * numberOfLBnodes];
+        dist.f[DIR_00M] = &distributionArray[DIR_00M * numberOfLBnodes];
+        dist.f[DIR_PP0] = &distributionArray[DIR_PP0 * numberOfLBnodes];
+        dist.f[DIR_MM0] = &distributionArray[DIR_MM0 * numberOfLBnodes];
+        dist.f[DIR_PM0] = &distributionArray[DIR_PM0 * numberOfLBnodes];
+        dist.f[DIR_MP0] = &distributionArray[DIR_MP0 * numberOfLBnodes];
+        dist.f[DIR_P0P] = &distributionArray[DIR_P0P * numberOfLBnodes];
+        dist.f[DIR_M0M] = &distributionArray[DIR_M0M * numberOfLBnodes];
+        dist.f[DIR_P0M] = &distributionArray[DIR_P0M * numberOfLBnodes];
+        dist.f[DIR_M0P] = &distributionArray[DIR_M0P * numberOfLBnodes];
+        dist.f[DIR_0PP] = &distributionArray[DIR_0PP * numberOfLBnodes];
+        dist.f[DIR_0MM] = &distributionArray[DIR_0MM * numberOfLBnodes];
+        dist.f[DIR_0PM] = &distributionArray[DIR_0PM * numberOfLBnodes];
+        dist.f[DIR_0MP] = &distributionArray[DIR_0MP * numberOfLBnodes];
+        dist.f[DIR_000] = &distributionArray[DIR_000 * numberOfLBnodes];
+        dist.f[DIR_PPP] = &distributionArray[DIR_PPP * numberOfLBnodes];
+        dist.f[DIR_MMP] = &distributionArray[DIR_MMP * numberOfLBnodes];
+        dist.f[DIR_PMP] = &distributionArray[DIR_PMP * numberOfLBnodes];
+        dist.f[DIR_MPP] = &distributionArray[DIR_MPP * numberOfLBnodes];
+        dist.f[DIR_PPM] = &distributionArray[DIR_PPM * numberOfLBnodes];
+        dist.f[DIR_MMM] = &distributionArray[DIR_MMM * numberOfLBnodes];
+        dist.f[DIR_PMM] = &distributionArray[DIR_PMM * numberOfLBnodes];
+        dist.f[DIR_MPM] = &distributionArray[DIR_MPM * numberOfLBnodes];
     }
     else
     {
-         dist.f[DIR_M00   ] = &distributionArray[DIR_P00   *numberOfLBnodes];
-         dist.f[DIR_P00   ] = &distributionArray[DIR_M00   *numberOfLBnodes];
-         dist.f[DIR_0M0   ] = &distributionArray[DIR_0P0   *numberOfLBnodes];
-         dist.f[DIR_0P0   ] = &distributionArray[DIR_0M0   *numberOfLBnodes];
-         dist.f[DIR_00M   ] = &distributionArray[DIR_00P   *numberOfLBnodes];
-         dist.f[DIR_00P   ] = &distributionArray[DIR_00M   *numberOfLBnodes];
-         dist.f[DIR_MM0  ] = &distributionArray[DIR_PP0  *numberOfLBnodes];
-         dist.f[DIR_PP0  ] = &distributionArray[DIR_MM0  *numberOfLBnodes];
-         dist.f[DIR_MP0  ] = &distributionArray[DIR_PM0  *numberOfLBnodes];
-         dist.f[DIR_PM0  ] = &distributionArray[DIR_MP0  *numberOfLBnodes];
-         dist.f[DIR_M0M  ] = &distributionArray[DIR_P0P  *numberOfLBnodes];
-         dist.f[DIR_P0P  ] = &distributionArray[DIR_M0M  *numberOfLBnodes];
-         dist.f[DIR_M0P  ] = &distributionArray[DIR_P0M  *numberOfLBnodes];
-         dist.f[DIR_P0M  ] = &distributionArray[DIR_M0P  *numberOfLBnodes];
-         dist.f[DIR_0MM  ] = &distributionArray[DIR_0PP  *numberOfLBnodes];
-         dist.f[DIR_0PP  ] = &distributionArray[DIR_0MM  *numberOfLBnodes];
-         dist.f[DIR_0MP  ] = &distributionArray[DIR_0PM  *numberOfLBnodes];
-         dist.f[DIR_0PM  ] = &distributionArray[DIR_0MP  *numberOfLBnodes];
-         dist.f[DIR_000] = &distributionArray[DIR_000*numberOfLBnodes];
-         dist.f[DIR_PPP ] = &distributionArray[DIR_MMM *numberOfLBnodes];
-         dist.f[DIR_MMP ] = &distributionArray[DIR_PPM *numberOfLBnodes];
-         dist.f[DIR_PMP ] = &distributionArray[DIR_MPM *numberOfLBnodes];
-         dist.f[DIR_MPP ] = &distributionArray[DIR_PMM *numberOfLBnodes];
-         dist.f[DIR_PPM ] = &distributionArray[DIR_MMP *numberOfLBnodes];
-         dist.f[DIR_MMM ] = &distributionArray[DIR_PPP *numberOfLBnodes];
-         dist.f[DIR_PMM ] = &distributionArray[DIR_MPP *numberOfLBnodes];
-         dist.f[DIR_MPM ] = &distributionArray[DIR_PMP *numberOfLBnodes];
+         dist.f[DIR_M00] = &distributionArray[DIR_P00 * numberOfLBnodes];
+         dist.f[DIR_P00] = &distributionArray[DIR_M00 * numberOfLBnodes];
+         dist.f[DIR_0M0] = &distributionArray[DIR_0P0 * numberOfLBnodes];
+         dist.f[DIR_0P0] = &distributionArray[DIR_0M0 * numberOfLBnodes];
+         dist.f[DIR_00M] = &distributionArray[DIR_00P * numberOfLBnodes];
+         dist.f[DIR_00P] = &distributionArray[DIR_00M * numberOfLBnodes];
+         dist.f[DIR_MM0] = &distributionArray[DIR_PP0 * numberOfLBnodes];
+         dist.f[DIR_PP0] = &distributionArray[DIR_MM0 * numberOfLBnodes];
+         dist.f[DIR_MP0] = &distributionArray[DIR_PM0 * numberOfLBnodes];
+         dist.f[DIR_PM0] = &distributionArray[DIR_MP0 * numberOfLBnodes];
+         dist.f[DIR_M0M] = &distributionArray[DIR_P0P * numberOfLBnodes];
+         dist.f[DIR_P0P] = &distributionArray[DIR_M0M * numberOfLBnodes];
+         dist.f[DIR_M0P] = &distributionArray[DIR_P0M * numberOfLBnodes];
+         dist.f[DIR_P0M] = &distributionArray[DIR_M0P * numberOfLBnodes];
+         dist.f[DIR_0MM] = &distributionArray[DIR_0PP * numberOfLBnodes];
+         dist.f[DIR_0PP] = &distributionArray[DIR_0MM * numberOfLBnodes];
+         dist.f[DIR_0MP] = &distributionArray[DIR_0PM * numberOfLBnodes];
+         dist.f[DIR_0PM] = &distributionArray[DIR_0MP * numberOfLBnodes];
+         dist.f[DIR_000] = &distributionArray[DIR_000 * numberOfLBnodes];
+         dist.f[DIR_PPP] = &distributionArray[DIR_MMM * numberOfLBnodes];
+         dist.f[DIR_MMP] = &distributionArray[DIR_PPM * numberOfLBnodes];
+         dist.f[DIR_PMP] = &distributionArray[DIR_MPM * numberOfLBnodes];
+         dist.f[DIR_MPP] = &distributionArray[DIR_PMM * numberOfLBnodes];
+         dist.f[DIR_PPM] = &distributionArray[DIR_MMP * numberOfLBnodes];
+         dist.f[DIR_MMM] = &distributionArray[DIR_PPP * numberOfLBnodes];
+         dist.f[DIR_PMM] = &distributionArray[DIR_MPP * numberOfLBnodes];
+         dist.f[DIR_MPM] = &distributionArray[DIR_PMP * numberOfLBnodes];
     }
 }
 
 __inline__ __device__ void getPointersToSubgridDistances(SubgridDistances27& subgridD, real* subgridDistances, const unsigned int numberOfSubgridIndices)
 {
-    subgridD.q[DIR_P00   ] = &subgridDistances[DIR_P00    *numberOfSubgridIndices];
-    subgridD.q[DIR_M00   ] = &subgridDistances[DIR_M00    *numberOfSubgridIndices];
-    subgridD.q[DIR_0P0   ] = &subgridDistances[DIR_0P0    *numberOfSubgridIndices];
-    subgridD.q[DIR_0M0   ] = &subgridDistances[DIR_0M0    *numberOfSubgridIndices];
-    subgridD.q[DIR_00P   ] = &subgridDistances[DIR_00P    *numberOfSubgridIndices];
-    subgridD.q[DIR_00M   ] = &subgridDistances[DIR_00M    *numberOfSubgridIndices];
-    subgridD.q[DIR_PP0  ] = &subgridDistances[DIR_PP0   *numberOfSubgridIndices];
-    subgridD.q[DIR_MM0  ] = &subgridDistances[DIR_MM0   *numberOfSubgridIndices];
-    subgridD.q[DIR_PM0  ] = &subgridDistances[DIR_PM0   *numberOfSubgridIndices];
-    subgridD.q[DIR_MP0  ] = &subgridDistances[DIR_MP0   *numberOfSubgridIndices];
-    subgridD.q[DIR_P0P  ] = &subgridDistances[DIR_P0P   *numberOfSubgridIndices];
-    subgridD.q[DIR_M0M  ] = &subgridDistances[DIR_M0M   *numberOfSubgridIndices];
-    subgridD.q[DIR_P0M  ] = &subgridDistances[DIR_P0M   *numberOfSubgridIndices];
-    subgridD.q[DIR_M0P  ] = &subgridDistances[DIR_M0P   *numberOfSubgridIndices];
-    subgridD.q[DIR_0PP  ] = &subgridDistances[DIR_0PP   *numberOfSubgridIndices];
-    subgridD.q[DIR_0MM  ] = &subgridDistances[DIR_0MM   *numberOfSubgridIndices];
-    subgridD.q[DIR_0PM  ] = &subgridDistances[DIR_0PM   *numberOfSubgridIndices];
-    subgridD.q[DIR_0MP  ] = &subgridDistances[DIR_0MP   *numberOfSubgridIndices];
-    subgridD.q[DIR_000] = &subgridDistances[DIR_000 *numberOfSubgridIndices];
-    subgridD.q[DIR_PPP ] = &subgridDistances[DIR_PPP  *numberOfSubgridIndices];
-    subgridD.q[DIR_MMP ] = &subgridDistances[DIR_MMP  *numberOfSubgridIndices];
-    subgridD.q[DIR_PMP ] = &subgridDistances[DIR_PMP  *numberOfSubgridIndices];
-    subgridD.q[DIR_MPP ] = &subgridDistances[DIR_MPP  *numberOfSubgridIndices];
-    subgridD.q[DIR_PPM ] = &subgridDistances[DIR_PPM  *numberOfSubgridIndices];
-    subgridD.q[DIR_MMM ] = &subgridDistances[DIR_MMM  *numberOfSubgridIndices];
-    subgridD.q[DIR_PMM ] = &subgridDistances[DIR_PMM  *numberOfSubgridIndices];
-    subgridD.q[DIR_MPM ] = &subgridDistances[DIR_MPM  *numberOfSubgridIndices];
+    subgridD.q[DIR_P00] = &subgridDistances[DIR_P00 * numberOfSubgridIndices];
+    subgridD.q[DIR_M00] = &subgridDistances[DIR_M00 * numberOfSubgridIndices];
+    subgridD.q[DIR_0P0] = &subgridDistances[DIR_0P0 * numberOfSubgridIndices];
+    subgridD.q[DIR_0M0] = &subgridDistances[DIR_0M0 * numberOfSubgridIndices];
+    subgridD.q[DIR_00P] = &subgridDistances[DIR_00P * numberOfSubgridIndices];
+    subgridD.q[DIR_00M] = &subgridDistances[DIR_00M * numberOfSubgridIndices];
+    subgridD.q[DIR_PP0] = &subgridDistances[DIR_PP0 * numberOfSubgridIndices];
+    subgridD.q[DIR_MM0] = &subgridDistances[DIR_MM0 * numberOfSubgridIndices];
+    subgridD.q[DIR_PM0] = &subgridDistances[DIR_PM0 * numberOfSubgridIndices];
+    subgridD.q[DIR_MP0] = &subgridDistances[DIR_MP0 * numberOfSubgridIndices];
+    subgridD.q[DIR_P0P] = &subgridDistances[DIR_P0P * numberOfSubgridIndices];
+    subgridD.q[DIR_M0M] = &subgridDistances[DIR_M0M * numberOfSubgridIndices];
+    subgridD.q[DIR_P0M] = &subgridDistances[DIR_P0M * numberOfSubgridIndices];
+    subgridD.q[DIR_M0P] = &subgridDistances[DIR_M0P * numberOfSubgridIndices];
+    subgridD.q[DIR_0PP] = &subgridDistances[DIR_0PP * numberOfSubgridIndices];
+    subgridD.q[DIR_0MM] = &subgridDistances[DIR_0MM * numberOfSubgridIndices];
+    subgridD.q[DIR_0PM] = &subgridDistances[DIR_0PM * numberOfSubgridIndices];
+    subgridD.q[DIR_0MP] = &subgridDistances[DIR_0MP * numberOfSubgridIndices];
+    subgridD.q[DIR_000] = &subgridDistances[DIR_000 * numberOfSubgridIndices];
+    subgridD.q[DIR_PPP] = &subgridDistances[DIR_PPP * numberOfSubgridIndices];
+    subgridD.q[DIR_MMP] = &subgridDistances[DIR_MMP * numberOfSubgridIndices];
+    subgridD.q[DIR_PMP] = &subgridDistances[DIR_PMP * numberOfSubgridIndices];
+    subgridD.q[DIR_MPP] = &subgridDistances[DIR_MPP * numberOfSubgridIndices];
+    subgridD.q[DIR_PPM] = &subgridDistances[DIR_PPM * numberOfSubgridIndices];
+    subgridD.q[DIR_MMM] = &subgridDistances[DIR_MMM * numberOfSubgridIndices];
+    subgridD.q[DIR_PMM] = &subgridDistances[DIR_PMM * numberOfSubgridIndices];
+    subgridD.q[DIR_MPM] = &subgridDistances[DIR_MPM * numberOfSubgridIndices];
 }
 
 __inline__ __device__ real getEquilibriumForBC(const real& drho, const real& velocity, const real& cu_sq, const real weight)
@@ -163,6 +163,14 @@ __inline__ __device__ real getInterpolatedDistributionForNoSlipBC(const real& q,
            + (q * (f + fInverse)) / (c1o1 + q);
 }
 
+__inline__ __device__ real getInterpolatedDistributionForNoSlipWithPressureBC(const real& q, const real& f, const real& fInverse, const real& feq, 
+                                                                  const real& omega, const real& drho, const real weight)
+{
+
+    return (c1o1-q) / (c1o1+q) * (f - fInverse + (f + fInverse - c2o1 * feq * omega) / (c1o1 - omega)) * c1o2 
+           + (q * (f + fInverse)) / (c1o1 + q) - weight * drho;
+}
+
 
 __inline__ __device__ real getInterpolatedDistributionForVeloWithPressureBC(const real& q, const real& f, const real& fInverse, const real& feq, 
                                                                             const real& omega, const real& drho, const real& velocity, const real weight)
diff --git a/src/gpu/VirtualFluids_GPU/GPU/KineticEnergyAnalyzer.cu b/src/gpu/VirtualFluids_GPU/GPU/KineticEnergyAnalyzer.cu
index 51368bbe09e6fc43a7a1ff6b8b15387417774964..b05cb9201ce30038bd6edf52e2e95a13c6f6d7d4 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/KineticEnergyAnalyzer.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/KineticEnergyAnalyzer.cu
@@ -14,7 +14,7 @@
 
 #include <iomanip>
 
-//#include "Core/Logger/Logger.h"
+#include "cuda/CudaGrid.h"
 
 #include "Parameter/Parameter.h"
 // includes, kernels
@@ -24,7 +24,7 @@
 using namespace vf::lbm::constant;
 using namespace vf::lbm::dir;
 
-__global__                 void kineticEnergyKernel  (real* vx, real* vy, real* vz, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* kineticEnergy, uint* isFluid, uint size_Mat);
+__global__                 void kineticEnergyKernel  (real* vx, real* vy, real* vz, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* kineticEnergy, uint* isFluid, unsigned long long numberOfLBnodes);
 
 __host__ __device__ inline void kineticEnergyFunction(real* vx, real* vy, real* vz, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* kineticEnergy, uint* isFluid, uint index);
 
@@ -35,56 +35,42 @@ bool KineticEnergyAnalyzer::run(uint iter)
     if( iter % this->analyzeIter != 0 ) return false;
 
 	int lev = 0;
-	int size_Mat = this->para->getParD(lev)->numberOfNodes;
-
-    thrust::device_vector<real> kineticEnergy(size_Mat, c0o1);
-    thrust::device_vector<uint> isFluid      (size_Mat, 0);
-
-	unsigned int numberOfThreads = 128;
-    int Grid = (size_Mat / numberOfThreads)+1;
-    int Grid1, Grid2;
-    if (Grid>512)
-    {
-       Grid1 = 512;
-       Grid2 = (Grid/Grid1)+1;
-    } 
-    else
-    {
-       Grid1 = 1;
-       Grid2 = Grid;
-    }
-    dim3 grid(Grid1, Grid2);
-    dim3 threads(numberOfThreads, 1, 1 );
-
-    LBCalcMacCompSP27<<< grid, threads >>> (para->getParD(lev)->velocityX,
-											para->getParD(lev)->velocityY,
-											para->getParD(lev)->velocityZ,
-											para->getParD(lev)->rho,
-											para->getParD(lev)->pressure,
-											para->getParD(lev)->typeOfGridNode,
-											para->getParD(lev)->neighborX,
-											para->getParD(lev)->neighborY,
-											para->getParD(lev)->neighborZ,
-											para->getParD(lev)->numberOfNodes,
-											para->getParD(lev)->distributions.f[0],
-											para->getParD(lev)->isEvenTimestep); 
-    getLastCudaError("LBCalcMacSP27 execution failed"); 
-
-	kineticEnergyKernel <<< grid, threads >>> ( para->getParD(lev)->velocityX, 
-											    para->getParD(lev)->velocityY, 
-												para->getParD(lev)->velocityZ, 
-												para->getParD(lev)->rho, 
-											    para->getParD(lev)->neighborX,
-											    para->getParD(lev)->neighborY,
-											    para->getParD(lev)->neighborZ,
-											    para->getParD(lev)->neighborInverse,
-											    para->getParD(lev)->typeOfGridNode,
-												kineticEnergy.data().get(), 
-                                                isFluid.data().get(),
-												size_Mat);
-	cudaDeviceSynchronize();
-
-	 getLastCudaError("kineticEnergyKernel execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(lev)->numberofthreads, para->getParD(lev)->numberOfNodes);
+
+    thrust::device_vector<real> kineticEnergy( this->para->getParD(lev)->numberOfNodes, c0o1);
+    thrust::device_vector<uint> isFluid      ( this->para->getParD(lev)->numberOfNodes, 0);
+
+    LBCalcMacCompSP27<<< grid.grid, grid.threads >>>(
+        para->getParD(lev)->velocityX,
+        para->getParD(lev)->velocityY,
+        para->getParD(lev)->velocityZ,
+        para->getParD(lev)->rho,
+        para->getParD(lev)->pressure,
+        para->getParD(lev)->typeOfGridNode,
+        para->getParD(lev)->neighborX,
+        para->getParD(lev)->neighborY,
+        para->getParD(lev)->neighborZ,
+        para->getParD(lev)->numberOfNodes,
+        para->getParD(lev)->distributions.f[0],
+        para->getParD(lev)->isEvenTimestep); 
+    getLastCudaError("LBCalcMacCompSP27 execution failed"); 
+
+    kineticEnergyKernel<<< grid.grid, grid.threads >>>(
+        para->getParD(lev)->velocityX, 
+        para->getParD(lev)->velocityY, 
+        para->getParD(lev)->velocityZ, 
+        para->getParD(lev)->rho, 
+        para->getParD(lev)->neighborX,
+        para->getParD(lev)->neighborY,
+        para->getParD(lev)->neighborZ,
+        para->getParD(lev)->neighborInverse,
+        para->getParD(lev)->typeOfGridNode,
+        kineticEnergy.data().get(), 
+        isFluid.data().get(),
+        para->getParD(lev)->numberOfNodes);
+    cudaDeviceSynchronize();
+
+    getLastCudaError("kineticEnergyKernel execution failed");
 
 	 real EKin               = thrust::reduce(kineticEnergy.begin(), kineticEnergy.end(), c0o1, thrust::plus<real>());
      uint numberOfFluidNodes = thrust::reduce(isFluid.begin(),       isFluid.end(),       0,    thrust::plus<uint>());
@@ -99,7 +85,7 @@ bool KineticEnergyAnalyzer::run(uint iter)
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-__global__ void kineticEnergyKernel(real* vx, real* vy, real* vz, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* kineticEnergy, uint* isFluid, uint size_Mat)
+__global__ void kineticEnergyKernel(real* vx, real* vy, real* vz, real* rho, uint* neighborX, uint* neighborY, uint* neighborZ, uint* neighborWSB, uint* geo, real* kineticEnergy, uint* isFluid, unsigned long long numberOfLBnodes)
 {
     //////////////////////////////////////////////////////////////////////////
     const uint x = threadIdx.x;  // Globaler x-Index 
@@ -115,7 +101,7 @@ __global__ void kineticEnergyKernel(real* vx, real* vy, real* vz, real* rho, uin
 
     //if( index % 34 == 0 || index % 34 == 33 ) return;
 
-    if( index >= size_Mat) return;
+    if( index >= (uint)numberOfLBnodes) return;
 
 	unsigned int BC;
 	BC = geo[index];
diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
index 363fb76626b256205346a290a42a1da40e1c7445..b253a4529f76e3f907148be52a0f8d4920fc2398 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
@@ -18,1587 +18,1644 @@
 
 #include "Parameter/Parameter.h"
 //////////////////////////////////////////////////////////////////////////
-void KernelCas27( unsigned int grid_nx,
-                             unsigned int grid_ny,
-                             unsigned int grid_nz,
-                             real s9,
-                             unsigned int* bcMatD,
-                             unsigned int* neighborX,
-                             unsigned int* neighborY,
-                             unsigned int* neighborZ,
-                             real* DD,
-                             int size_Mat,
-                             bool EvenOrOdd)
-{
-   dim3 threads       ( grid_nx, 1, 1 );
-   dim3 grid          ( grid_ny, grid_nz );   // Gitter fuer Kollision und Propagation
-
-      LB_Kernel_Casc27<<< grid, threads >>>( s9,
-                                             bcMatD,
-                                             neighborX,
-                                             neighborY,
-                                             neighborZ,
-                                             DD,
-                                             size_Mat,
-                                             EvenOrOdd);
-     getLastCudaError("LB_Kernel_Casc27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelCasSP27( unsigned int numberOfThreads,
-                               real s9,
-                               unsigned int* bcMatD,
-                               unsigned int* neighborX,
-                               unsigned int* neighborY,
-                               unsigned int* neighborZ,
-                               real* DD,
-                               int size_Mat,
-                               bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-      LB_Kernel_Casc_SP_27<<< grid.grid, grid.threads >>>(s9,
-                                                bcMatD,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                DD,
-                                                size_Mat,
-                                                EvenOrOdd);
-      getLastCudaError("LB_Kernel_Casc_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelCasSPMS27( unsigned int numberOfThreads,
-                                 real s9,
-                                 unsigned int* bcMatD,
-                                 unsigned int* neighborX,
-                                 unsigned int* neighborY,
-                                 unsigned int* neighborZ,
-                                 real* DD,
-                                 int size_Mat,
-                                 bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-      LB_Kernel_Casc_SP_MS_27<<< grid.grid, grid.threads >>>(s9,
-                                                   bcMatD,
-                                                   neighborX,
-                                                   neighborY,
-                                                   neighborZ,
-                                                   DD,
-                                                   size_Mat,
-                                                   EvenOrOdd);
-      getLastCudaError("LB_Kernel_Casc_SP_MS_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelCasSPMSOHM27( unsigned int numberOfThreads,
-                                    real s9,
-                                    unsigned int* bcMatD,
-                                    unsigned int* neighborX,
-                                    unsigned int* neighborY,
-                                    unsigned int* neighborZ,
-                                    real* DD,
-                                    int size_Mat,
-                                    bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-      LB_Kernel_Casc_SP_MS_OHM_27<<< grid.grid, grid.threads >>>(  s9,
-                                                         bcMatD,
-                                                         neighborX,
-                                                         neighborY,
-                                                         neighborZ,
-                                                         DD,
-                                                         size_Mat,
-                                                         EvenOrOdd);
-      getLastCudaError("LB_Kernel_Casc_SP_MS_OHM_27 execution failed");
+void KernelCas27(
+    unsigned int grid_nx,
+    unsigned int grid_ny,
+    unsigned int grid_nz,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    dim3 threads       ( grid_nx, 1, 1 );
+    dim3 grid          ( grid_ny, grid_nz );   // Gitter fuer Kollision und Propagation
+
+    LB_Kernel_Casc27<<< grid, threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_Casc27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelCasSP27( 
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_Casc_SP_27<<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_Casc_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelCasSPMS27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_Casc_SP_MS_27<<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_Casc_SP_MS_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelCasSPMSOHM27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_Casc_SP_MS_OHM_27<<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_Casc_SP_MS_OHM_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void KernelKumCompSRTSP27(
-	unsigned int numberOfThreads,
-	real omega,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* DDStart,
-	int size_Mat,
-	int level,
-	real* forces,
-	bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-   LB_Kernel_Kum_New_Comp_SRT_SP_27 <<< grid.grid, grid.threads >>>(
-	   omega,
-	   bcMatD,
-	   neighborX,
-	   neighborY,
-	   neighborZ,
-	   DDStart,
-	   size_Mat,
-	   level,
-	   forces,
-	   EvenOrOdd);
-      getLastCudaError("LB_Kernel_Kum_New_Comp_SRT_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelKum1hSP27(    unsigned int numberOfThreads,
-									real omega,
-									real deltaPhi,
-									real angularVelocity,
-									unsigned int* bcMatD,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									real* coordX,
-									real* coordY,
-									real* coordZ,
-									real* DDStart,
-									int size_Mat,
-									bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-		LB_Kernel_Kum_1h_SP_27<<< grid.grid, grid.threads >>>(omega,
-													deltaPhi,
-													angularVelocity,
-													bcMatD,
-													neighborX,
-													neighborY,
-													neighborZ,
-													coordX,
-													coordY,
-													coordZ,
-													DDStart,
-													size_Mat,
-													EvenOrOdd);
-		getLastCudaError("LB_Kernel_Kum_New_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelCascadeSP27(  unsigned int numberOfThreads,
-									real s9,
-									unsigned int* bcMatD,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									real* DD,
-									int size_Mat,
-									bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-		LB_Kernel_Cascade_SP_27<<< grid.grid, grid.threads >>>(s9,
-													bcMatD,
-													neighborX,
-													neighborY,
-													neighborZ,
-													DD,
-													size_Mat,
-													EvenOrOdd);
-		getLastCudaError("LB_Kernel_Cascade_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelKumNewSP27(   unsigned int numberOfThreads,
-									real s9,
-									unsigned int* bcMatD,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									real* DD,
-									int size_Mat,
-									bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-
-		LB_Kernel_Kum_New_SP_27<<< grid.grid, grid.threads >>>(s9,
-													bcMatD,
-													neighborX,
-													neighborY,
-													neighborZ,
-													DD,
-													size_Mat,
-													EvenOrOdd);
-		getLastCudaError("LB_Kernel_Kum_New_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelKumNewCompSP27(unsigned int numberOfThreads,
-									real s9,
-									unsigned int* bcMatD,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									real* DD,
-									int size_Mat,
-									int size_Array,
-									int level,
-									real* forces,
-									bool EvenOrOdd)
-{
-	//int Grid = size_Array / numberOfThreads;
-	//dim3 grid(Grid, 1, 1);
-	//dim3 threads(numberOfThreads, 1, 1 );
-
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-		//LB_Kernel_Kum_New_Comp_SP_27<<< grid.grid, grid.threads >>>(	s9,
-		//													bcMatD,
-		//													neighborX,
-		//													neighborY,
-		//													neighborZ,
-		//													DD,
-		//													size_Mat,
-		//													level,
-		//													forces,
-		//													EvenOrOdd);
-		//getLastCudaError("LB_Kernel_Kum_New_Comp_SP_27 execution failed");
-}
-
-//////////////////////////////////////////////////////////////////////////
-void CumulantOnePreconditionedErrorDiffusionChimCompSP27(unsigned int numberOfThreads,
-																	real s9,
-																	unsigned int* bcMatD,
-																	unsigned int* neighborX,
-																	unsigned int* neighborY,
-																	unsigned int* neighborZ,
-																	real* DD,
-																	int size_Mat,
-																	int size_Array,
-																	int level,
-																	real* forces,
-																	bool EvenOrOdd)
-{
-	//int Grid = size_Array / numberOfThreads;
-	//dim3 grid(Grid, 1, 1);
-	//dim3 threads(numberOfThreads, 1, 1 );
-
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-
-	Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>(	s9,
-																						bcMatD,
-																						neighborX,
-																						neighborY,
-																						neighborZ,
-																						DD,
-																						size_Mat,
-																						level,
-																						forces,
-																						EvenOrOdd);
-		getLastCudaError("Cumulant_One_preconditioned_chim_Comp_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CumulantOnePreconditionedChimCompSP27(  unsigned int numberOfThreads,
-														real s9,
-														unsigned int* bcMatD,
-														unsigned int* neighborX,
-														unsigned int* neighborY,
-														unsigned int* neighborZ,
-														real* DD,
-														int size_Mat,
-														int size_Array,
-														int level,
-														real* forces,
-														bool EvenOrOdd)
-{
-	//int Grid = size_Array / numberOfThreads;
-	//dim3 grid(Grid, 1, 1);
-	//dim3 threads(numberOfThreads, 1, 1 );
-
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-
-	Cumulant_One_preconditioned_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>(	s9,
-																		bcMatD,
-																		neighborX,
-																		neighborY,
-																		neighborZ,
-																		DD,
-																		size_Mat,
-																		level,
-																		forces,
-																		EvenOrOdd);
-		getLastCudaError("Cumulant_One_preconditioned_chim_Comp_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CumulantOneChimCompSP27(unsigned int numberOfThreads,
-										real s9,
-										unsigned int* bcMatD,
-										unsigned int* neighborX,
-										unsigned int* neighborY,
-										unsigned int* neighborZ,
-										real* DD,
-										int size_Mat,
-										int size_Array,
-										int level,
-										real* forces,
-										bool EvenOrOdd)
-{
-	//int Grid = size_Array / numberOfThreads;
-	//dim3 grid(Grid, 1, 1);
-	//dim3 threads(numberOfThreads, 1, 1 );
-
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-
-	Cumulant_One_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>(	s9,
-														bcMatD,
-														neighborX,
-														neighborY,
-														neighborZ,
-														DD,
-														size_Mat,
-														level,
-														forces,
-														EvenOrOdd);
-		getLastCudaError("Cumulant_One_chim_Comp_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelKumIsoTestSP27(unsigned int numberOfThreads,
-									 real s9,
-									 unsigned int* bcMatD,
-									 unsigned int* neighborX,
-									 unsigned int* neighborY,
-									 unsigned int* neighborZ,
-									 real* DD,
-									 real* dxxUx,
-									 real* dyyUy,
-									 real* dzzUz,
-									 int size_Mat,
-									 bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-
-	LB_Kernel_Kum_IsoTest_SP_27<<< grid.grid, grid.threads >>>(s9,
-													bcMatD,
-													neighborX,
-													neighborY,
-													neighborZ,
-													DD,
-													dxxUx,
-													dyyUy,
-													dzzUz,
-													size_Mat,
-													EvenOrOdd);
-	getLastCudaError("LB_Kernel_Kum_IsoTest_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelKumCompSP27(  unsigned int numberOfThreads,
-									real s9,
-									unsigned int* bcMatD,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									real* DD,
-									int size_Mat,
-									bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-
-		LB_Kernel_Kum_Comp_SP_27<<< grid.grid, grid.threads >>>(s9,
-													bcMatD,
-													neighborX,
-													neighborY,
-													neighborZ,
-													DD,
-													size_Mat,
-													EvenOrOdd);
-		getLastCudaError("LB_Kernel_Kum_Comp_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelPMCumOneCompSP27(unsigned int numberOfThreads,
-									   real omega,
-									   unsigned int* neighborX,
-									   unsigned int* neighborY,
-									   unsigned int* neighborZ,
-									   real* DD,
-									   int size_Mat,
-									   int level,
-									   real* forces,
-									   real porosity,
-									   real darcy,
-									   real forchheimer,
-									   unsigned int sizeOfPorousMedia,
-									   unsigned int* nodeIdsPorousMedia,
-									   bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-
-	LB_Kernel_PM_Cum_One_Comp_SP_27 <<< grid.grid, grid.threads >>>(omega,
-														  neighborX,
-														  neighborY,
-														  neighborZ,
-														  DD,
-														  size_Mat,
-														  level,
-														  forces,
-														  porosity,
-														  darcy,
-														  forchheimer,
-														  sizeOfPorousMedia,
-														  nodeIdsPorousMedia,
-														  EvenOrOdd);
-	getLastCudaError("LB_Kernel_PM_Cum_One_Comp_SP_27 execution failed");
+    unsigned int numberOfThreads,
+    real omega,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DDStart,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_Kum_New_Comp_SRT_SP_27 <<< grid.grid, grid.threads >>>(
+        omega,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DDStart,
+        numberOfLBnodes,
+        level,
+        forces,
+        EvenOrOdd);
+        getLastCudaError("LB_Kernel_Kum_New_Comp_SRT_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelKum1hSP27(
+    unsigned int numberOfThreads,
+    real omega,
+    real deltaPhi,
+    real angularVelocity,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* coordX,
+    real* coordY,
+    real* coordZ,
+    real* DDStart,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_Kum_1h_SP_27<<< grid.grid, grid.threads >>>(
+        omega,
+        deltaPhi,
+        angularVelocity,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        coordX,
+        coordY,
+        coordZ,
+        DDStart,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_Kum_1h_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelCascadeSP27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_Cascade_SP_27<<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_Cascade_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelKumNewSP27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+
+    LB_Kernel_Kum_New_SP_27<<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_Kum_New_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelKumNewCompSP27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    int size_Array,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    //LB_Kernel_Kum_New_Comp_SP_27<<< grid.grid, grid.threads >>>(	s9,
+    //													bcMatD,
+    //													neighborX,
+    //													neighborY,
+    //													neighborZ,
+    //													DD,
+    //													numberOfLBnodes,
+    //													level,
+    //													forces,
+    //													EvenOrOdd);
+    //getLastCudaError("LB_Kernel_Kum_New_Comp_SP_27 execution failed");
+}
+
+//////////////////////////////////////////////////////////////////////////
+void CumulantOnePreconditionedErrorDiffusionChimCompSP27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    int size_Array,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        level,
+        forces,
+        EvenOrOdd);
+    getLastCudaError("Cumulant_One_preconditioned_chim_Comp_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CumulantOnePreconditionedChimCompSP27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    int size_Array,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    Cumulant_One_preconditioned_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        level,
+        forces,
+        EvenOrOdd);
+    getLastCudaError("Cumulant_One_preconditioned_chim_Comp_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CumulantOneChimCompSP27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    int size_Array,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    Cumulant_One_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        level,
+        forces,
+        EvenOrOdd);
+    getLastCudaError("Cumulant_One_chim_Comp_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelKumIsoTestSP27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    real* dxxUx,
+    real* dyyUy,
+    real* dzzUz,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_Kum_IsoTest_SP_27<<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        dxxUx,
+        dyyUy,
+        dzzUz,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_Kum_IsoTest_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelKumCompSP27(
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+
+    LB_Kernel_Kum_Comp_SP_27<<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_Kum_Comp_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelPMCumOneCompSP27(
+    unsigned int numberOfThreads,
+    real omega,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    real porosity,
+    real darcy,
+    real forchheimer,
+    unsigned int sizeOfPorousMedia,
+    unsigned int* nodeIdsPorousMedia,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_PM_Cum_One_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+        omega,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        level,
+        forces,
+        porosity,
+        darcy,
+        forchheimer,
+        sizeOfPorousMedia,
+        nodeIdsPorousMedia,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_PM_Cum_One_Comp_SP_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void KernelWaleBySoniMalavCumAA2016CompSP27(
-	unsigned int numberOfThreads,
-	real s9,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	unsigned int* neighborWSB,
-	real* veloX,
-	real* veloY,
-	real* veloZ,
-	real* DD,
-	real* turbulentViscosity,
-	int size_Mat,
-	int size_Array,
-	int level,
-	real* forces,
-	bool EvenOrOdd)
-{
-	//int Grid = size_Array / numberOfThreads;
-	//dim3 grid(Grid, 1, 1);
-	//dim3 threads(numberOfThreads, 1, 1 );
-
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-
-	LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27 << < grid.grid, grid.threads >> >(
-		s9,
-		bcMatD,
-		neighborX,
-		neighborY,
-		neighborZ,
-		neighborWSB,
-		veloX,
-		veloY,
-		veloZ,
-		DD,
-		turbulentViscosity,
-		size_Mat,
-		level,
-		forces,
-		EvenOrOdd);
-	getLastCudaError("LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelADincomp7(   unsigned int numberOfThreads,
-								   real diffusivity,
-								   unsigned int* bcMatD,
-								   unsigned int* neighborX,
-								   unsigned int* neighborY,
-								   unsigned int* neighborZ,
-								   real* DD,
-								   real* DD7,
-								   int size_Mat,
-								   bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-      LB_Kernel_AD_Incomp_7<<< grid.grid, grid.threads >>>( diffusivity,
-												  bcMatD,
-												  neighborX,
-												  neighborY,
-												  neighborZ,
-												  DD,
-												  DD7,
-												  size_Mat,
-												  EvenOrOdd);
-      getLastCudaError("LB_Kernel_AD_Incomp_7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void KernelADincomp27( unsigned int numberOfThreads,
-								  real diffusivity,
-								  unsigned int* bcMatD,
-								  unsigned int* neighborX,
-								  unsigned int* neighborY,
-								  unsigned int* neighborZ,
-								  real* DD,
-								  real* DD27,
-								  int size_Mat,
-								  bool EvenOrOdd)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LB_Kernel_AD_Incomp_27<<< grid.grid, grid.threads >>>( diffusivity,
-													bcMatD,
-													neighborX,
-													neighborY,
-													neighborZ,
-													DD,
-													DD27,
-													size_Mat,
-													EvenOrOdd);
-	getLastCudaError("LB_Kernel_AD_Incomp_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void Init27( int myid,
-                        int numprocs,
-                        real u0,
-                        unsigned int* geoD,
-                        unsigned int* neighborX,
-                        unsigned int* neighborY,
-                        unsigned int* neighborZ,
-                        real* vParab,
-                        unsigned int size_Mat,
-                        unsigned int grid_nx,
-                        unsigned int grid_ny,
-                        unsigned int grid_nz,
-                        real* DD,
-                        int level,
-                        int maxlevel)
-{
-   dim3 threads       ( grid_nx, 1, 1 );
-   dim3 grid          ( grid_ny, grid_nz );   // Gitter fuer Kollision und Propagation
-
-	LBInit27<<< grid, threads >>> (  myid,
-                                       numprocs,
-                                       u0,
-                                       geoD,
-                                       neighborX,
-                                       neighborY,
-                                       neighborZ,
-                                       vParab,
-                                       size_Mat,
-                                       grid_nx,
-                                       grid_ny,
-                                       grid_nz,
-                                       DD,
-                                       level,
-                                       maxlevel);
-	getLastCudaError("LBInit27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void InitNonEqPartSP27( unsigned int numberOfThreads,
-                                   unsigned int* neighborX,
-                                   unsigned int* neighborY,
-                                   unsigned int* neighborZ,
-                                   unsigned int* neighborWSB,
-                                   unsigned int* geoD,
-                                   real* rho,
-                                   real* ux,
-                                   real* uy,
-                                   real* uz,
-                                   unsigned int size_Mat,
-                                   real* DD,
-                                   real omega,
-                                   bool EvenOrOdd)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBInitNonEqPartSP27<<< grid.grid, grid.threads >>>( neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                neighborWSB,
-                                                geoD,
-                                                rho,
-                                                ux,
-                                                uy,
-                                                uz,
-                                                size_Mat,
-                                                DD,
-                                                omega,
-                                                EvenOrOdd);
-	getLastCudaError("LBInitNonEqPartSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void InitThS7(     unsigned int numberOfThreads,
-                              unsigned int* neighborX,
-                              unsigned int* neighborY,
-                              unsigned int* neighborZ,
-                              unsigned int* geoD,
-                              real* Conc,
-                              real* ux,
-                              real* uy,
-                              real* uz,
-                              unsigned int size_Mat,
-                              real* DD7,
-                              bool EvenOrOdd)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	InitAD7<<< grid.grid, grid.threads >>>( neighborX,
-                                       neighborY,
-                                       neighborZ,
-                                       geoD,
-                                       Conc,
-                                       ux,
-                                       uy,
-                                       uz,
-                                       size_Mat,
-                                       DD7,
-                                       EvenOrOdd);
-	getLastCudaError("InitAD7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void InitADDev27( unsigned int numberOfThreads,
-                           unsigned int* neighborX,
-                           unsigned int* neighborY,
-                           unsigned int* neighborZ,
-                           unsigned int* geoD,
-                           real* Conc,
-                           real* ux,
-                           real* uy,
-                           real* uz,
-                           unsigned int size_Mat,
-                           real* DD27,
-                           bool EvenOrOdd)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	InitAD27<<< grid.grid, grid.threads >>>(neighborX,
-                                       neighborY,
-                                       neighborZ,
-                                       geoD,
-                                       Conc,
-                                       ux,
-                                       uy,
-                                       uz,
-                                       size_Mat,
-                                       DD27,
-                                       EvenOrOdd);
-	getLastCudaError("InitAD27 execution failed");
+    unsigned int numberOfThreads,
+    real s9,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int* neighborWSB,
+    real* veloX,
+    real* veloY,
+    real* veloZ,
+    real* DD,
+    real* turbulentViscosity,
+    unsigned long long numberOfLBnodes,
+    int size_Array,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+        s9,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        neighborWSB,
+        veloX,
+        veloY,
+        veloZ,
+        DD,
+        turbulentViscosity,
+        numberOfLBnodes,
+        level,
+        forces,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelADincomp7(
+    unsigned int numberOfThreads,
+    real diffusivity,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    real* DD7,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_AD_Incomp_7<<< grid.grid, grid.threads >>>(
+        diffusivity,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        DD7,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_AD_Incomp_7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void KernelADincomp27(
+    unsigned int numberOfThreads,
+    real diffusivity,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* DD,
+    real* DD27,
+    unsigned long long numberOfLBnodes,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_Kernel_AD_Incomp_27<<< grid.grid, grid.threads >>>(
+        diffusivity,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        DD27,
+        numberOfLBnodes,
+        EvenOrOdd);
+    getLastCudaError("LB_Kernel_AD_Incomp_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void Init27(
+    int myid,
+    int numprocs,
+    real u0,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* vParab,
+    unsigned long long numberOfLBnodes,
+    unsigned int grid_nx,
+    unsigned int grid_ny,
+    unsigned int grid_nz,
+    real* DD,
+    int level,
+    int maxlevel)
+{
+    dim3 threads       ( grid_nx, 1, 1 );
+    dim3 grid          ( grid_ny, grid_nz );
+
+    LBInit27<<< grid, threads >>> (
+        myid,
+        numprocs,
+        u0,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        vParab,
+        numberOfLBnodes,
+        grid_nx,
+        grid_ny,
+        grid_nz,
+        DD,
+        level,
+        maxlevel);
+    getLastCudaError("LBInit27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void InitNonEqPartSP27(
+    unsigned int numberOfThreads,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int* neighborWSB,
+    unsigned int* geoD,
+    real* rho,
+    real* ux,
+    real* uy,
+    real* uz,
+    unsigned long long numberOfLBnodes,
+    real* DD,
+    real omega,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBInitNonEqPartSP27<<< grid.grid, grid.threads >>>(
+        neighborX,
+        neighborY,
+        neighborZ,
+        neighborWSB,
+        geoD,
+        rho,
+        ux,
+        uy,
+        uz,
+        numberOfLBnodes,
+        DD,
+        omega,
+        EvenOrOdd);
+    getLastCudaError("LBInitNonEqPartSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void InitThS7(
+    unsigned int numberOfThreads,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int* geoD,
+    real* Conc,
+    real* ux,
+    real* uy,
+    real* uz,
+    unsigned long long numberOfLBnodes,
+    real* DD7,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    InitAD7<<< grid.grid, grid.threads >>>(
+        neighborX,
+        neighborY,
+        neighborZ,
+        geoD,
+        Conc,
+        ux,
+        uy,
+        uz,
+        numberOfLBnodes,
+        DD7,
+        EvenOrOdd);
+    getLastCudaError("InitAD7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void InitADDev27(
+    unsigned int numberOfThreads,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int* geoD,
+    real* Conc,
+    real* ux,
+    real* uy,
+    real* uz,
+    unsigned long long numberOfLBnodes,
+    real* DD27,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    InitAD27<<< grid.grid, grid.threads >>>(
+        neighborX,
+        neighborY,
+        neighborZ,
+        geoD,
+        Conc,
+        ux,
+        uy,
+        uz,
+        numberOfLBnodes,
+        DD27,
+        EvenOrOdd);
+    getLastCudaError("InitAD27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void PostProcessorF3_2018Fehlberg(
-	unsigned int numberOfThreads,
-	real omega,
-	unsigned int* bcMatD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	real* rhoOut,
-	real* vxOut,
-	real* vyOut,
-	real* vzOut,
-	real* DDStart,
-	real* G6,
-	int size_Mat,
-	int level,
-	real* forces,
-	bool EvenOrOdd)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LB_PostProcessor_F3_2018_Fehlberg <<< grid.grid, grid.threads >>> (   omega,
-																  bcMatD,
-																  neighborX,
-																  neighborY,
-																  neighborZ,
-																  rhoOut,
-																  vxOut,
-																  vyOut,
-																  vzOut,
-																  DDStart,
-																  G6,
-																  size_Mat,
-																  level,
-																  forces,
-																  EvenOrOdd);
-	getLastCudaError("LB_PostProcessor_F3_2018_Fehlberg execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcMac27( real* vxD,
-                           real* vyD,
-                           real* vzD,
-                           real* rhoD,
-                           unsigned int* geoD,
-                           unsigned int* neighborX,
-                           unsigned int* neighborY,
-                           unsigned int* neighborZ,
-                           unsigned int size_Mat,
-                           unsigned int grid_nx,
-                           unsigned int grid_ny,
-                           unsigned int grid_nz,
-                           real* DD,
-                           bool isEvenTimestep)
+    unsigned int numberOfThreads,
+    real omega,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* rhoOut,
+    real* vxOut,
+    real* vyOut,
+    real* vzOut,
+    real* DDStart,
+    real* G6,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LB_PostProcessor_F3_2018_Fehlberg <<< grid.grid, grid.threads >>> (
+        omega,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        rhoOut,
+        vxOut,
+        vyOut,
+        vzOut,
+        DDStart,
+        G6,
+        numberOfLBnodes,
+        level,
+        forces,
+        EvenOrOdd);
+    getLastCudaError("LB_PostProcessor_F3_2018_Fehlberg execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcMac27(
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int grid_nx,
+    unsigned int grid_ny,
+    unsigned int grid_nz,
+    real* DD,
+    bool isEvenTimestep)
 {
    dim3 threads       ( grid_nx, 1, 1 );
    dim3 grid          ( grid_ny, grid_nz );
 
-	LBCalcMac27<<< grid, threads >>> (  vxD,
-                                          vyD,
-                                          vzD,
-                                          rhoD,
-                                          geoD,
-                                          neighborX,
-                                          neighborY,
-                                          neighborZ,
-                                          size_Mat,
-                                          DD,
-                                          isEvenTimestep);
-	getLastCudaError("LBCalcMac27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcMacSP27( real* vxD,
-                             real* vyD,
-                             real* vzD,
-                             real* rhoD,
-                             real* pressD,
-                             unsigned int* geoD,
-                             unsigned int* neighborX,
-                             unsigned int* neighborY,
-                             unsigned int* neighborZ,
-                             unsigned int size_Mat,
-                             unsigned int numberOfThreads,
-                             real* DD,
-                             bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalcMacSP27<<< grid.grid, grid.threads >>> (   vxD,
-                                             vyD,
-                                             vzD,
-                                             rhoD,
-                                             pressD,
-                                             geoD,
-                                             neighborX,
-                                             neighborY,
-                                             neighborZ,
-                                             size_Mat,
-                                             DD,
-                                             isEvenTimestep);
-	getLastCudaError("LBCalcMacSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcMacCompSP27( real* vxD,
-								 real* vyD,
-								 real* vzD,
-								 real* rhoD,
-								 real* pressD,
-								 unsigned int* geoD,
-								 unsigned int* neighborX,
-								 unsigned int* neighborY,
-								 unsigned int* neighborZ,
-								 unsigned int size_Mat,
-								 unsigned int numberOfThreads,
-								 real* DD,
-								 bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalcMacCompSP27<<< grid.grid, grid.threads >>> (   vxD,
-												 vyD,
-												 vzD,
-												 rhoD,
-												 pressD,
-												 geoD,
-												 neighborX,
-												 neighborY,
-												 neighborZ,
-												 size_Mat,
-												 DD,
-												 isEvenTimestep);
-	getLastCudaError("LBCalcMacSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcMacThS7(  real* Conc,
-                              unsigned int* geoD,
-                              unsigned int* neighborX,
-                              unsigned int* neighborY,
-                              unsigned int* neighborZ,
-                              unsigned int size_Mat,
-                              unsigned int numberOfThreads,
-                              real* DD7,
-                              bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	CalcConc7<<< grid.grid, grid.threads >>> (Conc,
-                                          geoD,
-                                          neighborX,
-                                          neighborY,
-                                          neighborZ,
-                                          size_Mat,
-                                          DD7,
-                                          isEvenTimestep);
-	getLastCudaError("CalcConc7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void PlaneConcThS7(real* Conc,
-							  int* kPC,
-							  unsigned int numberOfPointskPC,
-							  unsigned int* geoD,
-							  unsigned int* neighborX,
-							  unsigned int* neighborY,
-							  unsigned int* neighborZ,
-							  unsigned int size_Mat,
-                              unsigned int numberOfThreads,
-							  real* DD7,
-							  bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskPC);
-
-	GetPlaneConc7<<< grid.grid, grid.threads >>> (	Conc,
-												kPC,
-												numberOfPointskPC,
-												geoD,
-												neighborX,
-												neighborY,
-												neighborZ,
-												size_Mat,
-												DD7,
-												isEvenTimestep);
-	getLastCudaError("GetPlaneConc7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void PlaneConcThS27(real* Conc,
-							   int* kPC,
-							   unsigned int numberOfPointskPC,
-							   unsigned int* geoD,
-							   unsigned int* neighborX,
-							   unsigned int* neighborY,
-							   unsigned int* neighborZ,
-							   unsigned int size_Mat,
-                               unsigned int numberOfThreads,
-							   real* DD27,
-							   bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskPC);
-
-	GetPlaneConc27<<< grid.grid, grid.threads >>> (	Conc,
-												kPC,
-												numberOfPointskPC,
-												geoD,
-												neighborX,
-												neighborY,
-												neighborZ,
-												size_Mat,
-												DD27,
-												isEvenTimestep);
-	getLastCudaError("GetPlaneConc27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcConcentration27( unsigned int numberOfThreads,
-                                     real* Conc,
-                                     unsigned int* geoD,
-                                     unsigned int* neighborX,
-                                     unsigned int* neighborY,
-                                     unsigned int* neighborZ,
-                                     unsigned int size_Mat,
-                                     real* DD27,
-                                     bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	CalcConc27<<< grid.grid, grid.threads >>> (  Conc,
-                                             geoD,
-                                             neighborX,
-                                             neighborY,
-                                             neighborZ,
-                                             size_Mat,
-                                             DD27,
-                                             isEvenTimestep);
-	getLastCudaError("CalcConc27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcMedSP27(  real* vxD,
-                              real* vyD,
-                              real* vzD,
-                              real* rhoD,
-                              real* pressD,
-                              unsigned int* geoD,
-                              unsigned int* neighborX,
-                              unsigned int* neighborY,
-                              unsigned int* neighborZ,
-                              unsigned int size_Mat,
-                              unsigned int numberOfThreads,
-                              real* DD,
-                              bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalcMedSP27<<< grid.grid, grid.threads >>> (   vxD,
-                                             vyD,
-                                             vzD,
-                                             rhoD,
-                                             pressD,
-                                             geoD,
-                                             neighborX,
-                                             neighborY,
-                                             neighborZ,
-                                             size_Mat,
-                                             DD,
-                                             isEvenTimestep);
-	getLastCudaError("LBCalcMedSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcMedCompSP27(  real* vxD,
-								  real* vyD,
-								  real* vzD,
-								  real* rhoD,
-								  real* pressD,
-								  unsigned int* geoD,
-								  unsigned int* neighborX,
-								  unsigned int* neighborY,
-								  unsigned int* neighborZ,
-								  unsigned int size_Mat,
-								  unsigned int numberOfThreads,
-								  real* DD,
-								  bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalcMedCompSP27<<< grid.grid, grid.threads >>> (   vxD,
-												 vyD,
-												 vzD,
-												 rhoD,
-												 pressD,
-												 geoD,
-												 neighborX,
-												 neighborY,
-												 neighborZ,
-												 size_Mat,
-												 DD,
-												 isEvenTimestep);
-	getLastCudaError("LBCalcMedSP27 execution failed");
+    LBCalcMac27<<< grid, threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        rhoD,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        isEvenTimestep);
+    getLastCudaError("LBCalcMac27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcMacSP27(
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalcMacSP27<<< grid.grid, grid.threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        rhoD,
+        pressD,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        isEvenTimestep);
+    getLastCudaError("LBCalcMacSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcMacCompSP27(
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalcMacCompSP27<<< grid.grid, grid.threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        rhoD,
+        pressD,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        isEvenTimestep);
+    getLastCudaError("LBCalcMacCompSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcMacThS7(
+    real* Conc,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD7,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    CalcConc7<<< grid.grid, grid.threads >>> (
+        Conc,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD7,
+        isEvenTimestep);
+    getLastCudaError("CalcConc7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void PlaneConcThS7(
+    real* Conc,
+    int* kPC,
+    unsigned int numberOfPointskPC,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD7,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskPC);
+
+    GetPlaneConc7<<< grid.grid, grid.threads >>> (
+        Conc,
+        kPC,
+        numberOfPointskPC,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD7,
+        isEvenTimestep);
+    getLastCudaError("GetPlaneConc7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void PlaneConcThS27(
+    real* Conc,
+    int* kPC,
+    unsigned int numberOfPointskPC,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD27,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskPC);
+
+    GetPlaneConc27<<< grid.grid, grid.threads >>> (
+        Conc,
+        kPC,
+        numberOfPointskPC,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD27,
+        isEvenTimestep);
+    getLastCudaError("GetPlaneConc27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcConcentration27(
+    unsigned int numberOfThreads,
+    real* Conc,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    real* DD27,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    CalcConc27<<< grid.grid, grid.threads >>> (
+        Conc,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD27,
+        isEvenTimestep);
+    getLastCudaError("CalcConc27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcMedSP27(
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalcMedSP27<<< grid.grid, grid.threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        rhoD,
+        pressD,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        isEvenTimestep);
+    getLastCudaError("LBCalcMedSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcMedCompSP27(
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalcMedCompSP27<<< grid.grid, grid.threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        rhoD,
+        pressD,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        isEvenTimestep);
+    getLastCudaError("LBCalcMedCompSP27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void CalcMedCompAD27(
-	real* vxD,
-	real* vyD,
-	real* vzD,
-	real* rhoD,
-	real* pressD,
-	real* concD,
-	unsigned int* geoD,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	unsigned int size_Mat,
-	unsigned int numberOfThreads,
-	real* DD,
-	real* DD_AD,
-	bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalcMedCompAD27 <<< grid.grid, grid.threads >>> (
-		vxD,
-		vyD,
-		vzD,
-		rhoD,
-		pressD,
-		concD,
-		geoD,
-		neighborX,
-		neighborY,
-		neighborZ,
-		size_Mat,
-		DD,
-		DD_AD,
-		isEvenTimestep);
-	getLastCudaError("LBCalcMedAD27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcMacMedSP27(  real* vxD,
-                                 real* vyD,
-                                 real* vzD,
-                                 real* rhoD,
-                                 real* pressD,
-                                 unsigned int* geoD,
-                                 unsigned int* neighborX,
-                                 unsigned int* neighborY,
-                                 unsigned int* neighborZ,
-                                 unsigned int tdiff,
-                                 unsigned int size_Mat,
-                                 unsigned int numberOfThreads,
-                                 bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalcMacMedSP27<<< grid.grid, grid.threads >>> (   vxD,
-                                                vyD,
-                                                vzD,
-                                                rhoD,
-                                                pressD,
-                                                geoD,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                tdiff,
-                                                size_Mat,
-                                                isEvenTimestep);
-	getLastCudaError("LBCalcMacMedSP27 execution failed");
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    real* concD,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD_AD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalcMedCompAD27 <<< grid.grid, grid.threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        rhoD,
+        pressD,
+        concD,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        DD_AD,
+        isEvenTimestep);
+    getLastCudaError("LBCalcMedCompAD27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcMacMedSP27(
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int tdiff,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalcMacMedSP27<<< grid.grid, grid.threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        rhoD,
+        pressD,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        tdiff,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("LBCalcMacMedSP27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void ResetMedianValuesSP27(
-	real* vxD,
-	real* vyD,
-	real* vzD,
-	real* rhoD,
-	real* pressD,
-	unsigned int size_Mat,
-	unsigned int numberOfThreads,
-	bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-
-	LBResetMedianValuesSP27 << < grid.grid, grid.threads >> > (
-		vxD,
-		vyD,
-		vzD,
-		rhoD,
-		pressD,
-		size_Mat,
-		isEvenTimestep);
-	getLastCudaError("LBResetMedianValuesSP27 execution failed");
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBResetMedianValuesSP27 <<< grid.grid, grid.threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        rhoD,
+        pressD,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("LBResetMedianValuesSP27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void ResetMedianValuesAD27(
-	real* vxD,
-	real* vyD,
-	real* vzD,
-	real* rhoD,
-	real* pressD,
-	real* concD,
-	unsigned int size_Mat,
-	unsigned int numberOfThreads,
-	bool isEvenTimestep)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBResetMedianValuesAD27 << < grid.grid, grid.threads >> > (
-		vxD,
-		vyD,
-		vzD,
-		rhoD,
-		pressD,
-		concD,
-		size_Mat,
-		isEvenTimestep);
-	getLastCudaError("LBResetMedianValuesAD27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void Calc2ndMomentsIncompSP27(real* kxyFromfcNEQ,
-										 real* kyzFromfcNEQ,
-										 real* kxzFromfcNEQ,
-										 real* kxxMyyFromfcNEQ,
-										 real* kxxMzzFromfcNEQ,
-										 unsigned int* geoD,
-										 unsigned int* neighborX,
-										 unsigned int* neighborY,
-										 unsigned int* neighborZ,
-										 unsigned int size_Mat,
-										 unsigned int numberOfThreads,
-										 real* DD,
-										 bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalc2ndMomentsIncompSP27<<< grid.grid, grid.threads >>> (  kxyFromfcNEQ,
-														 kyzFromfcNEQ,
-														 kxzFromfcNEQ,
-														 kxxMyyFromfcNEQ,
-														 kxxMzzFromfcNEQ,
-														 geoD,
-														 neighborX,
-														 neighborY,
-														 neighborZ,
-														 size_Mat,
-														 DD,
-														 isEvenTimestep);
-	getLastCudaError("LBCalc2ndMomentsIncompSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void Calc2ndMomentsCompSP27( real* kxyFromfcNEQ,
-										real* kyzFromfcNEQ,
-										real* kxzFromfcNEQ,
-										real* kxxMyyFromfcNEQ,
-										real* kxxMzzFromfcNEQ,
-										unsigned int* geoD,
-										unsigned int* neighborX,
-										unsigned int* neighborY,
-										unsigned int* neighborZ,
-										unsigned int size_Mat,
-										unsigned int numberOfThreads,
-										real* DD,
-										bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalc2ndMomentsCompSP27<<< grid.grid, grid.threads >>> (kxyFromfcNEQ,
-													 kyzFromfcNEQ,
-													 kxzFromfcNEQ,
-													 kxxMyyFromfcNEQ,
-													 kxxMzzFromfcNEQ,
-													 geoD,
-													 neighborX,
-													 neighborY,
-													 neighborZ,
-													 size_Mat,
-													 DD,
-													 isEvenTimestep);
-	getLastCudaError("LBCalc2ndMomentsCompSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void Calc3rdMomentsIncompSP27(real* CUMbbb,
-										 real* CUMabc,
-										 real* CUMbac,
-										 real* CUMbca,
-										 real* CUMcba,
-										 real* CUMacb,
-										 real* CUMcab,
-										 unsigned int* geoD,
-										 unsigned int* neighborX,
-										 unsigned int* neighborY,
-										 unsigned int* neighborZ,
-										 unsigned int size_Mat,
-										 unsigned int numberOfThreads,
-										 real* DD,
-										 bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalc3rdMomentsIncompSP27<<< grid.grid, grid.threads >>> (  CUMbbb,
-														 CUMabc,
-														 CUMbac,
-														 CUMbca,
-														 CUMcba,
-														 CUMacb,
-														 CUMcab,
-														 geoD,
-														 neighborX,
-														 neighborY,
-														 neighborZ,
-														 DD,
-														 size_Mat,
-														 isEvenTimestep);
-	getLastCudaError("LBCalc3rdMomentsIncompSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void Calc3rdMomentsCompSP27( real* CUMbbb,
-										real* CUMabc,
-										real* CUMbac,
-										real* CUMbca,
-										real* CUMcba,
-										real* CUMacb,
-										real* CUMcab,
-										unsigned int* geoD,
-										unsigned int* neighborX,
-										unsigned int* neighborY,
-										unsigned int* neighborZ,
-										unsigned int size_Mat,
-										unsigned int numberOfThreads,
-										real* DD,
-										bool isEvenTimestep)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalc3rdMomentsCompSP27<<< grid.grid, grid.threads >>> (CUMbbb,
-													 CUMabc,
-													 CUMbac,
-													 CUMbca,
-													 CUMcba,
-													 CUMacb,
-													 CUMcab,
-													 geoD,
-													 neighborX,
-													 neighborY,
-													 neighborZ,
-													 DD,
-													 size_Mat,
-													 isEvenTimestep);
-	getLastCudaError("LBCalc3rdMomentsCompSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcHigherMomentsIncompSP27(real* CUMcbb,
-											real* CUMbcb,
-											real* CUMbbc,
-											real* CUMcca,
-											real* CUMcac,
-											real* CUMacc,
-											real* CUMbcc,
-											real* CUMcbc,
-											real* CUMccb,
-											real* CUMccc,
-											unsigned int* geoD,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											unsigned int numberOfThreads,
-											real* DD,
-											bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalcHigherMomentsIncompSP27<<< grid.grid, grid.threads >>> (CUMcbb,
-														  CUMbcb,
-														  CUMbbc,
-														  CUMcca,
-														  CUMcac,
-														  CUMacc,
-														  CUMbcc,
-														  CUMcbc,
-														  CUMccb,
-														  CUMccc,
-														  geoD,
-														  neighborX,
-														  neighborY,
-														  neighborZ,
-														  DD,
-														  size_Mat,
-														  isEvenTimestep);
-	getLastCudaError("LBCalcHigherMomentsIncompSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcHigherMomentsCompSP27(  real* CUMcbb,
-											real* CUMbcb,
-											real* CUMbbc,
-											real* CUMcca,
-											real* CUMcac,
-											real* CUMacc,
-											real* CUMbcc,
-											real* CUMcbc,
-											real* CUMccb,
-											real* CUMccc,
-											unsigned int* geoD,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											unsigned int numberOfThreads,
-											real* DD,
-											bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-
-	LBCalcHigherMomentsCompSP27<<< grid.grid, grid.threads >>> (  CUMcbb,
-														  CUMbcb,
-														  CUMbbc,
-														  CUMcca,
-														  CUMcac,
-														  CUMacc,
-														  CUMbcc,
-														  CUMcbc,
-														  CUMccb,
-														  CUMccc,
-														  geoD,
-														  neighborX,
-														  neighborY,
-														  neighborZ,
-														  DD,
-														  size_Mat,
-														  isEvenTimestep);
-	getLastCudaError("LBCalcHigherMomentsCompSP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void LBCalcMeasurePoints27(real* vxMP,
-                                      real* vyMP,
-                                      real* vzMP,
-                                      real* rhoMP,
-                                      unsigned int* kMP,
-                                      unsigned int numberOfPointskMP,
-                                      unsigned int MPClockCycle,
-                                      unsigned int t,
-                                      unsigned int* geoD,
-                                      unsigned int* neighborX,
-                                      unsigned int* neighborY,
-                                      unsigned int* neighborZ,
-                                      unsigned int size_Mat,
-                                      real* DD,
-                                      unsigned int numberOfThreads,
-                                      bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskMP);
-
-	LBCalcMeasurePoints<<< grid.grid, grid.threads >>> (vxMP,
-                                                vyMP,
-                                                vzMP,
-                                                rhoMP,
-                                                kMP,
-                                                numberOfPointskMP,
-                                                MPClockCycle,
-                                                t,
-                                                geoD,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                size_Mat,
-                                                DD,
-                                                isEvenTimestep);
-	getLastCudaError("LBCalcMeasurePoints execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-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 int size_Mat,
-                           bool isEvenTimestep)
-{
-	dim3 threads       ( grid_nx, 1, 1 );
-	dim3 grid          ( grid_ny, 1 );
-
-	LB_BC_Press_East27<<< grid, threads >>> ( nx,
-                                                ny,
-                                                tz,
-                                                bcMatD,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                DD,
-                                                size_Mat,
-                                                isEvenTimestep);
-	getLastCudaError("LB_BC_Press_East27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void BcVel27(int nx,
-                        int ny,
-                        int nz,
-                        int itz,
-                        unsigned int grid_nx,
-                        unsigned int grid_ny,
-                        unsigned int* bcMatD,
-                        unsigned int* neighborX,
-                        unsigned int* neighborY,
-                        unsigned int* neighborZ,
-                        real* DD,
-                        unsigned int size_Mat,
-                        bool isEvenTimestep,
-                        real u0x,
-                        real om)
-{
-	dim3 threads       ( grid_nx, 1, 1 );
-	dim3 grid          ( grid_ny, 1 );
-
-	LB_BC_Vel_West_27<<< grid, threads >>> (  nx,
-                                                ny,
-                                                nz,
-                                                itz,
-                                                bcMatD,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                DD,
-                                                size_Mat,
-                                                isEvenTimestep,
-                                                u0x,
-                                                grid_nx,
-                                                grid_ny,
-                                                om);
-	getLastCudaError("LB_BC_Vel_West_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADPressDev7( unsigned int numberOfThreads,
-                              real* DD,
-                              real* DD7,
-                              real* temp,
-                              real* velo,
-                              real diffusivity,
-                              int* k_Q,
-                              real* QQ,
-                              unsigned int numberOfBCnodes,
-                              real om1,
-                              unsigned int* neighborX,
-                              unsigned int* neighborY,
-                              unsigned int* neighborZ,
-                              unsigned int size_Mat,
-                              bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADPress7<<< grid.grid, grid.threads >>>( DD,
-                                       DD7,
-                                       temp,
-                                       velo,
-                                       diffusivity,
-                                       k_Q,
-                                       QQ,
-                                       numberOfBCnodes,
-                                       om1,
-                                       neighborX,
-                                       neighborY,
-                                       neighborZ,
-                                       size_Mat,
-                                       isEvenTimestep);
-	getLastCudaError("QADPress7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADPressDev27(unsigned int numberOfThreads,
-                              real* DD,
-                              real* DD27,
-                              real* temp,
-                              real* velo,
-                              real diffusivity,
-                              int* k_Q,
-                              real* QQ,
-                              unsigned int numberOfBCnodes,
-                              real om1,
-                              unsigned int* neighborX,
-                              unsigned int* neighborY,
-                              unsigned int* neighborZ,
-                              unsigned int size_Mat,
-                              bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADPress27<<< grid.grid, grid.threads >>>(   DD,
-                                          DD27,
-                                          temp,
-                                          velo,
-                                          diffusivity,
-                                          k_Q,
-                                          QQ,
-                                          numberOfBCnodes,
-                                          om1,
-                                          neighborX,
-                                          neighborY,
-                                          neighborZ,
-                                          size_Mat,
-                                          isEvenTimestep);
-	getLastCudaError("QADPress27 execution failed");
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* rhoD,
+    real* pressD,
+    real* concD,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBResetMedianValuesAD27 <<< grid.grid, grid.threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        rhoD,
+        pressD,
+        concD,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("LBResetMedianValuesAD27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void Calc2ndMomentsIncompSP27(
+    real* kxyFromfcNEQ,
+    real* kyzFromfcNEQ,
+    real* kxzFromfcNEQ,
+    real* kxxMyyFromfcNEQ,
+    real* kxxMzzFromfcNEQ,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalc2ndMomentsIncompSP27<<< grid.grid, grid.threads >>> (
+        kxyFromfcNEQ,
+        kyzFromfcNEQ,
+        kxzFromfcNEQ,
+        kxxMyyFromfcNEQ,
+        kxxMzzFromfcNEQ,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        isEvenTimestep);
+    getLastCudaError("LBCalc2ndMomentsIncompSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void Calc2ndMomentsCompSP27(
+    real* kxyFromfcNEQ,
+    real* kyzFromfcNEQ,
+    real* kxzFromfcNEQ,
+    real* kxxMyyFromfcNEQ,
+    real* kxxMzzFromfcNEQ,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalc2ndMomentsCompSP27<<< grid.grid, grid.threads >>> (
+        kxyFromfcNEQ,
+        kyzFromfcNEQ,
+        kxzFromfcNEQ,
+        kxxMyyFromfcNEQ,
+        kxxMzzFromfcNEQ,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        isEvenTimestep);
+    getLastCudaError("LBCalc2ndMomentsCompSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void Calc3rdMomentsIncompSP27(
+    real* CUMbbb,
+    real* CUMabc,
+    real* CUMbac,
+    real* CUMbca,
+    real* CUMcba,
+    real* CUMacb,
+    real* CUMcab,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalc3rdMomentsIncompSP27<<< grid.grid, grid.threads >>> (
+        CUMbbb,
+        CUMabc,
+        CUMbac,
+        CUMbca,
+        CUMcba,
+        CUMacb,
+        CUMcab,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("LBCalc3rdMomentsIncompSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void Calc3rdMomentsCompSP27(
+    real* CUMbbb,
+    real* CUMabc,
+    real* CUMbac,
+    real* CUMbca,
+    real* CUMcba,
+    real* CUMacb,
+    real* CUMcab,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalc3rdMomentsCompSP27<<< grid.grid, grid.threads >>> (
+        CUMbbb,
+        CUMabc,
+        CUMbac,
+        CUMbca,
+        CUMcba,
+        CUMacb,
+        CUMcab,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("LBCalc3rdMomentsCompSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcHigherMomentsIncompSP27(
+    real* CUMcbb,
+    real* CUMbcb,
+    real* CUMbbc,
+    real* CUMcca,
+    real* CUMcac,
+    real* CUMacc,
+    real* CUMbcc,
+    real* CUMcbc,
+    real* CUMccb,
+    real* CUMccc,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalcHigherMomentsIncompSP27<<< grid.grid, grid.threads >>> (
+        CUMcbb,
+        CUMbcb,
+        CUMbbc,
+        CUMcca,
+        CUMcac,
+        CUMacc,
+        CUMbcc,
+        CUMcbc,
+        CUMccb,
+        CUMccc,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("LBCalcHigherMomentsIncompSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcHigherMomentsCompSP27(
+    real* CUMcbb,
+    real* CUMbcb,
+    real* CUMbbc,
+    real* CUMcca,
+    real* CUMcac,
+    real* CUMacc,
+    real* CUMbcc,
+    real* CUMcbc,
+    real* CUMccb,
+    real* CUMccc,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+
+    LBCalcHigherMomentsCompSP27<<< grid.grid, grid.threads >>> (
+        CUMcbb,
+        CUMbcb,
+        CUMbbc,
+        CUMcca,
+        CUMcac,
+        CUMacc,
+        CUMbcc,
+        CUMcbc,
+        CUMccb,
+        CUMccc,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("LBCalcHigherMomentsCompSP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void LBCalcMeasurePoints27(
+    real* vxMP,
+    real* vyMP,
+    real* vzMP,
+    real* rhoMP,
+    unsigned int* kMP,
+    unsigned int numberOfPointskMP,
+    unsigned int MPClockCycle,
+    unsigned int t,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    real* DD,
+    unsigned int numberOfThreads,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskMP);
+
+    LBCalcMeasurePoints<<< grid.grid, grid.threads >>> (
+        vxMP,
+        vyMP,
+        vzMP,
+        rhoMP,
+        kMP,
+        numberOfPointskMP,
+        MPClockCycle,
+        t,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        isEvenTimestep);
+    getLastCudaError("LBCalcMeasurePoints execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+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)
+{
+    dim3 threads       ( grid_nx, 1, 1 );
+    dim3 grid          ( grid_ny, 1 );
+
+    LB_BC_Press_East27<<< grid, threads >>> (
+        nx,
+        ny,
+        tz,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("LB_BC_Press_East27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void BcVel27(
+    int nx,
+    int ny,
+    int nz,
+    int itz,
+    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,
+    real u0x,
+    real om)
+{
+    dim3 threads       ( grid_nx, 1, 1 );
+    dim3 grid          ( grid_ny, 1 );
+
+    LB_BC_Vel_West_27<<< grid, threads >>> (
+        nx,
+        ny,
+        nz,
+        itz,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        DD,
+        numberOfLBnodes,
+        isEvenTimestep,
+        u0x,
+        grid_nx,
+        grid_ny,
+        om);
+    getLastCudaError("LB_BC_Vel_West_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADPressDev7(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD7,
+    real* temp,
+    real* velo,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADPress7<<< grid.grid, grid.threads >>>(
+        DD,
+        DD7,
+        temp,
+        velo,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADPress7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADPressDev27(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD27,
+    real* temp,
+    real* velo,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADPress27<<< grid.grid, grid.threads >>>(
+        DD,
+        DD27,
+        temp,
+        velo,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADPress27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QADPressNEQNeighborDev27(
-											unsigned int numberOfThreads,
-											real* DD,
-											real* DD27,
-											int* k_Q,
-											int* k_N,
-											int numberOfBCnodes,
-											unsigned int* neighborX,
-											unsigned int* neighborY,
-											unsigned int* neighborZ,
-											unsigned int size_Mat,
-											bool isEvenTimestep
-										)
-{
-
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-	QADPressNEQNeighbor27<<< grid.grid, grid.threads >>>(
-												DD,
-												DD27,
-												k_Q,
-												k_N,
-												numberOfBCnodes,
-												neighborX,
-												neighborY,
-												neighborZ,
-												size_Mat,
-												isEvenTimestep
-											  );
-   	getLastCudaError("QADPressNEQNeighbor27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADVelDev7(unsigned int numberOfThreads,
-                           real* DD,
-                           real* DD7,
-                           real* temp,
-                           real* velo,
-                           real diffusivity,
-                           int* k_Q,
-                           real* QQ,
-                           unsigned int numberOfBCnodes,
-                           real om1,
-                           unsigned int* neighborX,
-                           unsigned int* neighborY,
-                           unsigned int* neighborZ,
-                           unsigned int size_Mat,
-                           bool isEvenTimestep)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADVel7<<< grid.grid, grid.threads >>> (  
-                                       DD,
-                                       DD7,
-                                       temp,
-                                       velo,
-                                       diffusivity,
-                                       k_Q,
-                                       QQ,
-                                       numberOfBCnodes,
-                                       om1,
-                                       neighborX,
-                                       neighborY,
-                                       neighborZ,
-                                       size_Mat,
-                                       isEvenTimestep);
-	getLastCudaError("QADVel7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADVelDev27(  unsigned int numberOfThreads,
-                              real* DD,
-                              real* DD27,
-                              real* temp,
-                              real* velo,
-                              real diffusivity,
-                              int* k_Q,
-                              real* QQ,
-                              unsigned int numberOfBCnodes,
-                              real om1,
-                              unsigned int* neighborX,
-                              unsigned int* neighborY,
-                              unsigned int* neighborZ,
-                              unsigned int size_Mat,
-                              bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADVel27<<< grid.grid, grid.threads >>> ( DD,
-                                      DD27,
-                                      temp,
-                                      velo,
-                                      diffusivity,
-                                      k_Q,
-                                      QQ,
-                                      numberOfBCnodes,
-                                      om1,
-                                      neighborX,
-                                      neighborY,
-                                      neighborZ,
-                                      size_Mat,
-                                      isEvenTimestep);
-      getLastCudaError("QADVel27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADDev7(unsigned int numberOfThreads,
-                        real* DD,
-                        real* DD7,
-                        real* temp,
-                        real diffusivity,
-                        int* k_Q,
-                        real* QQ,
-                        unsigned int numberOfBCnodes,
-                        real om1,
-                        unsigned int* neighborX,
-                        unsigned int* neighborY,
-                        unsigned int* neighborZ,
-                        unsigned int size_Mat,
-                        bool isEvenTimestep)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QAD7<<< grid.grid, grid.threads >>> (     DD,
-                                       DD7,
-                                       temp,
-                                       diffusivity,
-                                       k_Q,
-                                       QQ,
-                                       numberOfBCnodes,
-                                       om1,
-                                       neighborX,
-                                       neighborY,
-                                       neighborZ,
-                                       size_Mat,
-                                       isEvenTimestep);
-      getLastCudaError("QAD7 execution failed");
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD27,
+    int* k_Q,
+    int* k_N,
+    int numberOfBCnodes,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADPressNEQNeighbor27<<< grid.grid, grid.threads >>>(
+        DD,
+        DD27,
+        k_Q,
+        k_N,
+        numberOfBCnodes,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+       getLastCudaError("QADPressNEQNeighbor27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADVelDev7(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD7,
+    real* temp,
+    real* velo,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADVel7<<< grid.grid, grid.threads >>> (
+        DD,
+        DD7,
+        temp,
+        velo,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADVel7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADVelDev27(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD27,
+    real* temp,
+    real* velo,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADVel27<<< grid.grid, grid.threads >>> (
+        DD,
+        DD27,
+        temp,
+        velo,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADVel27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADDev7(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD7,
+    real* temp,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QAD7<<< grid.grid, grid.threads >>> (
+        DD,
+        DD7,
+        temp,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QAD7 execution failed");
 }
 
 
@@ -1613,1394 +1670,1431 @@ void FactorizedCentralMomentsAdvectionDiffusionDeviceKernel(
    uint* neighborZ,
    real* distributions,
    real* distributionsAD,
-   int size_Mat,
+   unsigned long long numberOfLBnodes,
    real* forces,
    bool isEvenTimestep)
 {
-   int Grid = (size_Mat / numberOfThreads) + 1;
-   dim3 grid(Grid, 1, 1);
-   dim3 threads(numberOfThreads, 1, 1);
+    int Grid = (numberOfLBnodes / numberOfThreads) + 1;
+    dim3 grid(Grid, 1, 1);
+    dim3 threads(numberOfThreads, 1, 1);
 
-   Factorized_Central_Moments_Advection_Diffusion_Device_Kernel <<< grid, threads >>> (
-      omegaDiffusivity,
-      typeOfGridNode,
-      neighborX,
-      neighborY,
-      neighborZ,
-      distributions,
-      distributionsAD,
-      size_Mat,
-      forces,
-      isEvenTimestep);
-   getLastCudaError("Factorized_Central_Moments_Advection_Diffusion_Device_Kernel execution failed");
+    Factorized_Central_Moments_Advection_Diffusion_Device_Kernel <<< grid, threads >>> (
+        omegaDiffusivity,
+        typeOfGridNode,
+        neighborX,
+        neighborY,
+        neighborZ,
+        distributions,
+        distributionsAD,
+        numberOfLBnodes,
+        forces,
+        isEvenTimestep);
+    getLastCudaError("Factorized_Central_Moments_Advection_Diffusion_Device_Kernel execution failed");
 }
 
 //////////////////////////////////////////////////////////////////////////
 void ADSlipVelDevComp(
-	uint numberOfThreads,
-	real * normalX,
-	real * normalY,
-	real * normalZ,
-	real * distributions,
-	real * distributionsAD,
-	int* QindexArray,
-	real * Qarrays,
-	uint numberOfBCnodes,
-	real omegaDiffusivity,
-	uint * neighborX,
-	uint * neighborY,
-	uint * neighborZ,
-	uint size_Mat,
-	bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-	AD_SlipVelDeviceComp << < grid.grid, grid.threads >> > (
-		normalX,
-		normalY,
-		normalZ,
-		distributions,
-		distributionsAD,
-		QindexArray,
-		Qarrays,
-		numberOfBCnodes,
-		omegaDiffusivity,
-		neighborX,
-		neighborY,
-		neighborZ,
-		size_Mat,
-		isEvenTimestep);
-	getLastCudaError("AD_SlipVelDeviceComp execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-
-void QADDirichletDev27( unsigned int numberOfThreads,
-								   real* DD,
-								   real* DD27,
-								   real* temp,
-								   real diffusivity,
-								   int* k_Q,
-								   real* QQ,
-								   unsigned int numberOfBCnodes,
-								   real om1,
-								   unsigned int* neighborX,
-								   unsigned int* neighborY,
-								   unsigned int* neighborZ,
-								   unsigned int size_Mat,
-								   bool isEvenTimestep)
-{
-   	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADDirichlet27<<< grid.grid, grid.threads >>> (
-											   DD,
-											   DD27,
-											   temp,
-											   diffusivity,
-											   k_Q,
-											   QQ,
-											   numberOfBCnodes,
-											   om1,
-											   neighborX,
-											   neighborY,
-											   neighborZ,
-											   size_Mat,
-											   isEvenTimestep);
-      getLastCudaError("QADDirichletDev27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADBBDev27(unsigned int numberOfThreads,
-                           real* DD,
-                           real* DD27,
-                           real* temp,
-                           real diffusivity,
-                           int* k_Q,
-                           real* QQ,
-                           unsigned int numberOfBCnodes,
-                           real om1,
-                           unsigned int* neighborX,
-                           unsigned int* neighborY,
-                           unsigned int* neighborZ,
-                           unsigned int size_Mat,
-                           bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADBB27<<< grid.grid, grid.threads >>> (  DD,
-                                       DD27,
-                                       temp,
-                                       diffusivity,
-                                       k_Q,
-                                       QQ,
-                                       numberOfBCnodes,
-                                       om1,
-                                       neighborX,
-                                       neighborY,
-                                       neighborZ,
-                                       size_Mat,
-                                       isEvenTimestep);
-      getLastCudaError("QADBB27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QNoSlipADincompDev7(unsigned int numberOfThreads,
-									real* DD,
-									real* DD7,
-									real* temp,
-									real diffusivity,
-									int* k_Q,
-									real* QQ,
-									unsigned int numberOfBCnodes,
-									real om1,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int size_Mat,
-									bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QNoSlipADincomp7<<< grid.grid, grid.threads >>> (
-											   DD,
-											   DD7,
-											   temp,
-											   diffusivity,
-											   k_Q,
-											   QQ,
-											   numberOfBCnodes,
-											   om1,
-											   neighborX,
-											   neighborY,
-											   neighborZ,
-											   size_Mat,
-											   isEvenTimestep);
-      getLastCudaError("QNoSlipADincomp7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QNoSlipADincompDev27(  unsigned int numberOfThreads,
-									   real* DD,
-									   real* DD27,
-									   real* temp,
-									   real diffusivity,
-									   int* k_Q,
-									   real* QQ,
-									   unsigned int numberOfBCnodes,
-									   real om1,
-									   unsigned int* neighborX,
-									   unsigned int* neighborY,
-									   unsigned int* neighborZ,
-									   unsigned int size_Mat,
-									   bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QNoSlipADincomp27<<< grid.grid, grid.threads >>> (
-											   DD,
-											   DD27,
-											   temp,
-											   diffusivity,
-											   k_Q,
-											   QQ,
-											   numberOfBCnodes,
-											   om1,
-											   neighborX,
-											   neighborY,
-											   neighborZ,
-											   size_Mat,
-											   isEvenTimestep);
-      getLastCudaError("QNoSlipADincomp27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADVeloIncompDev7( unsigned int numberOfThreads,
-								   real* DD,
-								   real* DD7,
-								   real* temp,
-								   real* velo,
-								   real diffusivity,
-								   int* k_Q,
-								   real* QQ,
-								   unsigned int numberOfBCnodes,
-								   real om1,
-								   unsigned int* neighborX,
-								   unsigned int* neighborY,
-								   unsigned int* neighborZ,
-								   unsigned int size_Mat,
-								   bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADVeloIncomp7<<< grid.grid, grid.threads >>> ( DD,
-	  										   DD7,
-											   temp,
-											   velo,
-											   diffusivity,
-											   k_Q,
-											   QQ,
-											   numberOfBCnodes,
-											   om1,
-											   neighborX,
-											   neighborY,
-											   neighborZ,
-											   size_Mat,
-											   isEvenTimestep);
-      getLastCudaError("QADVeloIncomp7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADVeloIncompDev27(   unsigned int numberOfThreads,
-									  real* DD,
-									  real* DD27,
-									  real* temp,
-									  real* velo,
-									  real diffusivity,
-									  int* k_Q,
-									  real* QQ,
-									  unsigned int numberOfBCnodes,
-									  real om1,
-									  unsigned int* neighborX,
-									  unsigned int* neighborY,
-									  unsigned int* neighborZ,
-									  unsigned int size_Mat,
-									  bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADVeloIncomp27<<< grid.grid, grid.threads >>> (
-											  DD,
-											  DD27,
-											  temp,
-											  velo,
-											  diffusivity,
-											  k_Q,
-											  QQ,
-											  numberOfBCnodes,
-											  om1,
-											  neighborX,
-											  neighborY,
-											  neighborZ,
-											  size_Mat,
-											  isEvenTimestep);
-      getLastCudaError("QADVeloIncomp27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADPressIncompDev7( unsigned int numberOfThreads,
-									  real* DD,
-									  real* DD7,
-									  real* temp,
-									  real* velo,
-									  real diffusivity,
-									  int* k_Q,
-									  real* QQ,
-									  unsigned int numberOfBCnodes,
-									  real om1,
-									  unsigned int* neighborX,
-									  unsigned int* neighborY,
-									  unsigned int* neighborZ,
-									  unsigned int size_Mat,
-									  bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADPressIncomp7<<< grid.grid, grid.threads >>>(
-											   DD,
-											   DD7,
-											   temp,
-											   velo,
-											   diffusivity,
-											   k_Q,
-											   QQ,
-											   numberOfBCnodes,
-											   om1,
-											   neighborX,
-											   neighborY,
-											   neighborZ,
-											   size_Mat,
-											   isEvenTimestep);
-      getLastCudaError("QADPressIncomp7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QADPressIncompDev27(  unsigned int numberOfThreads,
-									  real* DD,
-									  real* DD27,
-									  real* temp,
-									  real* velo,
-									  real diffusivity,
-									  int* k_Q,
-									  real* QQ,
-									  unsigned int numberOfBCnodes,
-									  real om1,
-									  unsigned int* neighborX,
-									  unsigned int* neighborY,
-									  unsigned int* neighborZ,
-									  unsigned int size_Mat,
-									  bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QADPressIncomp27<<< grid.grid, grid.threads >>>(DD, 
-	  										  DD27, 
-											  temp,
-											  velo,
-											  diffusivity,
-											  k_Q,
-											  QQ,
-											  numberOfBCnodes,
-											  om1,
-											  neighborX,
-											  neighborY,
-											  neighborZ,
-											  size_Mat,
-											  isEvenTimestep);
-      getLastCudaError("QADPressIncomp27 execution failed");
+    uint numberOfThreads,
+    real * normalX,
+    real * normalY,
+    real * normalZ,
+    real * distributions,
+    real * distributionsAD,
+    int* QindexArray,
+    real * Qarrays,
+    uint numberOfBCnodes,
+    real omegaDiffusivity,
+    uint * neighborX,
+    uint * neighborY,
+    uint * neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    AD_SlipVelDeviceComp <<< grid.grid, grid.threads >>> (
+        normalX,
+        normalY,
+        normalZ,
+        distributions,
+        distributionsAD,
+        QindexArray,
+        Qarrays,
+        numberOfBCnodes,
+        omegaDiffusivity,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("AD_SlipVelDeviceComp execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+
+void QADDirichletDev27(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD27,
+    real* temp,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADDirichlet27<<< grid.grid, grid.threads >>> (
+        DD,
+        DD27,
+        temp,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADDirichletDev27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADBBDev27(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD27,
+    real* temp,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADBB27<<< grid.grid, grid.threads >>> (
+        DD,
+        DD27,
+        temp,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADBB27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QNoSlipADincompDev7(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD7,
+    real* temp,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QNoSlipADincomp7<<< grid.grid, grid.threads >>> (
+        DD,
+        DD7,
+        temp,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QNoSlipADincomp7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QNoSlipADincompDev27(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD27,
+    real* temp,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QNoSlipADincomp27<<< grid.grid, grid.threads >>> (
+        DD,
+        DD27,
+        temp,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QNoSlipADincomp27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADVeloIncompDev7(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD7,
+    real* temp,
+    real* velo,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADVeloIncomp7<<< grid.grid, grid.threads >>> (
+        DD,
+        DD7,
+        temp,
+        velo,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADVeloIncomp7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADVeloIncompDev27(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD27,
+    real* temp,
+    real* velo,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADVeloIncomp27<<< grid.grid, grid.threads >>> (
+        DD,
+        DD27,
+        temp,
+        velo,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADVeloIncomp27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADPressIncompDev7(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD7,
+    real* temp,
+    real* velo,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADPressIncomp7<<< grid.grid, grid.threads >>>(
+        DD,
+        DD7,
+        temp,
+        velo,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADPressIncomp7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QADPressIncompDev27(
+    unsigned int numberOfThreads,
+    real* DD,
+    real* DD27,
+    real* temp,
+    real* velo,
+    real diffusivity,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QADPressIncomp27<<< grid.grid, grid.threads >>>(
+        DD,
+        DD27,
+        temp,
+        velo,
+        diffusivity,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QADPressIncomp27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
-
-      QDevice27<<< 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);
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
+    QDevice27<<< 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("QDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
-
-      QDeviceComp27<<< 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("QDeviceComp27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QDevCompThinWalls27(unsigned int numberOfThreads,
-									real* DD,
-									int* k_Q,
-									real* QQ,
-									unsigned int numberOfBCnodes,
-									real om1,
-									unsigned int* geom,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int* neighborWSB,
-									unsigned int size_Mat,
-									bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   QDeviceCompThinWallsPartOne27 <<< grid.grid, grid.threads >>> (DD,
-														 k_Q,
-														 QQ,
-														 numberOfBCnodes,
-														 om1,
-														 neighborX,
-														 neighborY,
-														 neighborZ,
-														 size_Mat,
-														 isEvenTimestep);
-   getLastCudaError("QDeviceCompThinWallsPartOne27 execution failed");
-
-   QThinWallsPartTwo27 <<< grid.grid, grid.threads >>> ( DD,
-												k_Q,
-												QQ,
-												numberOfBCnodes,
-												geom,
-												neighborX,
-												neighborY,
-												neighborZ,
-												neighborWSB,
-												size_Mat,
-												isEvenTimestep);
-   getLastCudaError("QThinWallsPartTwo27 execution failed");
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
+    QDeviceComp27<<< 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("QDeviceComp27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QDevCompThinWalls27(
+    unsigned int numberOfThreads,
+    real* DD,
+    int* k_Q,
+    real* QQ,
+    unsigned int numberOfBCnodes,
+    real om1,
+    unsigned int* geom,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int* neighborWSB,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QDeviceCompThinWallsPartOne27 <<< grid.grid, grid.threads >>> (
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QDeviceCompThinWallsPartOne27 execution failed");
+
+    QThinWallsPartTwo27 <<< grid.grid, grid.threads >>> (
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        geom,
+        neighborX,
+        neighborY,
+        neighborZ,
+        neighborWSB,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QThinWallsPartTwo27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QDev3rdMomentsComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1);
-
-   QDevice3rdMomentsComp27<<< 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);
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1);
+
+    QDevice3rdMomentsComp27<<< 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("QDevice3rdMomentsComp27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-void QDevIncompHighNu27( unsigned int numberOfThreads,
-									real* DD,
-									int* k_Q,
-									real* QQ,
-									unsigned int numberOfBCnodes,
-									real om1,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int size_Mat,
-									bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QDeviceIncompHighNu27<<< grid.grid, grid.threads >>> (
-												   DD,
-												   k_Q,
-												   QQ,
-												   numberOfBCnodes,
-												   om1,
-												   neighborX,
-												   neighborY,
-												   neighborZ,
-												   size_Mat,
-												   isEvenTimestep);
-      getLastCudaError("QDeviceIncompHighNu27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QDevCompHighNu27(   unsigned int numberOfThreads,
-									real* DD,
-									int* k_Q,
-									real* QQ,
-									unsigned int numberOfBCnodes,
-									real om1,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int size_Mat,
-									bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QDeviceCompHighNu27<<< grid.grid, grid.threads >>> (
-												   DD,
-												   k_Q,
-												   QQ,
-												   numberOfBCnodes,
-												   om1,
-												   neighborX,
-												   neighborY,
-												   neighborZ,
-												   size_Mat,
-												   isEvenTimestep);
-      getLastCudaError("QDevice27 execution failed");
+void QDevIncompHighNu27(
+    unsigned int numberOfThreads,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QDeviceIncompHighNu27<<< grid.grid, grid.threads >>> (
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QDeviceIncompHighNu27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QDevCompHighNu27(
+    unsigned int numberOfThreads,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QDeviceCompHighNu27<<< grid.grid, grid.threads >>> (
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QDeviceCompHighNu27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QVelDevicePlainBB27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QVelDevPlainBB27<<< grid, threads >>> (
-         boundaryCondition->Vx,
-         boundaryCondition->Vy,
-         boundaryCondition->Vz,
-         parameterDevice->distributions.f[0],
-         boundaryCondition->k,
-         boundaryCondition->q27[0],
-         boundaryCondition->numberOfBCnodes,
-         parameterDevice->neighborX,
-         parameterDevice->neighborY,
-         parameterDevice->neighborZ,
-         parameterDevice->numberOfNodes,
-         parameterDevice->isEvenTimestep);
-   getLastCudaError("QVelDevicePlainBB27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QVelDeviceCouette27(unsigned int numberOfThreads,
-									real* vx,
-									real* vy,
-									real* vz,
-									real* DD,
-									int* k_Q,
-									real* QQ,
-									unsigned int numberOfBCnodes,
-									real om1,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int size_Mat,
-									bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QVelDevCouette27<<< grid.grid, grid.threads >>> ( vx,
-												vy,
-												vz,
-												DD,
-												k_Q,
-												QQ,
-												numberOfBCnodes,
-												om1,
-												neighborX,
-												neighborY,
-												neighborZ,
-												size_Mat,
-												isEvenTimestep);
-      getLastCudaError("QVelDevicePlainBB27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QVelDevice1h27(   unsigned int numberOfThreads,
-								  int nx,
-								  int ny,
-								  real* vx,
-								  real* vy,
-								  real* vz,
-								  real* DD,
-								  int* k_Q,
-								  real* QQ,
-								  unsigned int numberOfBCnodes,
-								  real om1,
-								  real Phi,
-								  real angularVelocity,
-								  unsigned int* neighborX,
-								  unsigned int* neighborY,
-								  unsigned int* neighborZ,
-								  real* coordX,
-								  real* coordY,
-								  real* coordZ,
-								  unsigned int size_Mat,
-								  bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   QVelDev1h27<<< grid.grid, grid.threads >>> (nx,
-                                          ny,
-                                          vx,
-                                          vy,
-                                          vz,
-                                          DD,
-                                          k_Q,
-                                          QQ,
-                                          numberOfBCnodes,
-                                          om1,
-										  Phi,
-										  angularVelocity,
-                                          neighborX,
-                                          neighborY,
-                                          neighborZ,
-										  coordX,
-										  coordY,
-										  coordZ,
-                                          size_Mat,
-                                          isEvenTimestep);
-      getLastCudaError("QVelDevice27 execution failed");
+    QVelDevPlainBB27<<< grid, threads >>> (
+        boundaryCondition->Vx,
+        boundaryCondition->Vy,
+        boundaryCondition->Vz,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QVelDevicePlainBB27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QVelDeviceCouette27(
+    unsigned int numberOfThreads,
+    real* vx,
+    real* vy,
+    real* vz,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QVelDevCouette27<<< grid.grid, grid.threads >>> (
+        vx,
+        vy,
+        vz,
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QVelDevCouette27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QVelDevice1h27(
+    unsigned int numberOfThreads,
+    int nx,
+    int ny,
+    real* vx,
+    real* vy,
+    real* vz,
+    real* DD,
+    int* k_Q,
+    real* QQ,
+    unsigned int numberOfBCnodes,
+    real om1,
+    real Phi,
+    real angularVelocity,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* coordX,
+    real* coordY,
+    real* coordZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QVelDev1h27<<< grid.grid, grid.threads >>> (
+        nx,
+        ny,
+        vx,
+        vy,
+        vz,
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        Phi,
+        angularVelocity,
+        neighborX,
+        neighborY,
+        neighborZ,
+        coordX,
+        coordY,
+        coordZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QVelDev1h27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QVelDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      QVelDevice27<<< grid, threads >>> (
-            parameterDevice->nx,
-            parameterDevice->ny,
-            boundaryCondition->Vx,
-            boundaryCondition->Vy,
-            boundaryCondition->Vz,
-            parameterDevice->distributions.f[0],
-            boundaryCondition->k,
-            boundaryCondition->q27[0],
-            boundaryCondition->numberOfBCnodes,
-            parameterDevice->omega,
-            parameterDevice->neighborX,
-            parameterDevice->neighborY,
-            parameterDevice->neighborZ,
-            parameterDevice->numberOfNodes,
-            parameterDevice->isEvenTimestep);
-      getLastCudaError("QVelDevice27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QVelDevCompPlusSlip27(unsigned int numberOfThreads,
-									  real* vx,
-									  real* vy,
-									  real* vz,
-									  real* DD,
-									  int* k_Q,
-									  real* QQ,
-									  unsigned int numberOfBCnodes,
-									  real om1,
-									  unsigned int* neighborX,
-									  unsigned int* neighborY,
-									  unsigned int* neighborZ,
-									  unsigned int size_Mat,
-									  bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QVelDeviceCompPlusSlip27<<< grid.grid, grid.threads >>> (
-													  vx,
-													  vy,
-													  vz,
-													  DD,
-													  k_Q,
-													  QQ,
-													  numberOfBCnodes,
-													  om1,
-													  neighborX,
-													  neighborY,
-													  neighborZ,
-													  size_Mat,
-													  isEvenTimestep);
-      getLastCudaError("QVelDeviceCompPlusSlip27 execution failed");
+    QVelDevice27<<< grid, threads >>> (
+        parameterDevice->nx,
+        parameterDevice->ny,
+        boundaryCondition->Vx,
+        boundaryCondition->Vy,
+        boundaryCondition->Vz,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QVelDevice27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QVelDevCompPlusSlip27(
+    unsigned int numberOfThreads,
+    real* vx,
+    real* vy,
+    real* vz,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QVelDeviceCompPlusSlip27<<< grid.grid, grid.threads >>> (
+        vx,
+        vy,
+        vz,
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QVelDeviceCompPlusSlip27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QVelDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid(parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid(parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QVelDeviceComp27<<< grid, threads >>> (
-            boundaryCondition->Vx,
-            boundaryCondition->Vy,
-            boundaryCondition->Vz,
-            parameterDevice->distributions.f[0],
-            boundaryCondition->k,        
-            boundaryCondition->q27[0],
-            boundaryCondition->numberOfBCnodes,
-            parameterDevice->omega,
-            parameterDevice->neighborX,
-            parameterDevice->neighborY,
-            parameterDevice->neighborZ,
-            parameterDevice->numberOfNodes,
-            parameterDevice->isEvenTimestep);
+    QVelDeviceComp27<<< grid, threads >>> (
+        boundaryCondition->Vx,
+        boundaryCondition->Vy,
+        boundaryCondition->Vz,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
    getLastCudaError("QVelDeviceComp27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-void QVelDevCompThinWalls27(unsigned int numberOfThreads,
-							           real* vx,
-							           real* vy,
-							           real* vz,
-							           real* DD,
-							           int* k_Q,
-							           real* QQ,
-							           unsigned int numberOfBCnodes,
-							           real om1,
-									     unsigned int* geom,
-							           unsigned int* neighborX,
-							           unsigned int* neighborY,
-							           unsigned int* neighborZ,
-									     unsigned int* neighborWSB,
-							           unsigned int size_Mat,
-							           bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   QVelDeviceCompThinWallsPartOne27<<< grid.grid, grid.threads >>> (vx,
-											                  vy,
-											                  vz,
-											                  DD,
-											                  k_Q,
-											                  QQ,
-											                  numberOfBCnodes,
-											                  om1,
-											                  neighborX,
-											                  neighborY,
-											                  neighborZ,
-											                  size_Mat,
-											                  isEvenTimestep);
-   getLastCudaError("QVelDeviceCompThinWallsPartOne27 execution failed");
-
-	QThinWallsPartTwo27 <<< grid.grid, grid.threads >>> (
-       DD,
-       k_Q,
-       QQ,
-       numberOfBCnodes,
-       geom,
-       neighborX,
-       neighborY,
-       neighborZ,
-       neighborWSB,
-       size_Mat,
-       isEvenTimestep);
-   getLastCudaError("QThinWallsPartTwo27 execution failed");
-}
-
-void QVelDevCompZeroPress27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
+void QVelDevCompThinWalls27(
+    unsigned int numberOfThreads,
+    real* vx,
+    real* vy,
+    real* vz,
+    real* DD,
+    int* k_Q,
+    real* QQ,
+    unsigned int numberOfBCnodes,
+    real om1,
+    unsigned int* geom,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int* neighborWSB,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QVelDeviceCompThinWallsPartOne27<<< grid.grid, grid.threads >>> (
+        vx,
+        vy,
+        vz,
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QVelDeviceCompThinWallsPartOne27 execution failed");
+
+    QThinWallsPartTwo27 <<< grid.grid, grid.threads >>> (
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        geom,
+        neighborX,
+        neighborY,
+        neighborZ,
+        neighborWSB,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QThinWallsPartTwo27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QVelDevCompZeroPress27(LBMSimulationParameter *parameterDevice, QforBoundaryConditions *boundaryCondition)
 {
    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QVelDeviceCompZeroPress27<<< grid, threads >>> (
-            boundaryCondition->Vx,
-            boundaryCondition->Vy,
-            boundaryCondition->Vz,
-            parameterDevice->distributions.f[0],
-            boundaryCondition->k,
-            boundaryCondition->q27[0],
-            boundaryCondition->numberOfBCnodes,
-            parameterDevice->omega,
-            parameterDevice->neighborX,
-            parameterDevice->neighborY,
-            parameterDevice->neighborZ,
-            parameterDevice->numberOfNodes,
-            parameterDevice->isEvenTimestep);
-   getLastCudaError("QVelDeviceCompZeroPress27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QVelDevIncompHighNu27(unsigned int numberOfThreads,
-									  real* vx,
-									  real* vy,
-									  real* vz,
-									  real* DD,
-									  int* k_Q,
-									  real* QQ,
-									  unsigned int numberOfBCnodes,
-									  real om1,
-									  unsigned int* neighborX,
-									  unsigned int* neighborY,
-									  unsigned int* neighborZ,
-									  unsigned int size_Mat,
-									  bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QVelDeviceIncompHighNu27<<< grid.grid, grid.threads >>> (
-													  vx,
-													  vy,
-													  vz,
-													  DD,
-													  k_Q,
-													  QQ,
-													  numberOfBCnodes,
-													  om1,
-													  neighborX,
-													  neighborY,
-													  neighborZ,
-													  size_Mat,
-													  isEvenTimestep);
-      getLastCudaError("QVelDeviceIncompHighNu27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QVelDevCompHighNu27(  unsigned int numberOfThreads,
-									  real* vx,
-									  real* vy,
-									  real* vz,
-									  real* DD,
-									  int* k_Q,
-									  real* QQ,
-									  unsigned int numberOfBCnodes,
-									  real om1,
-									  unsigned int* neighborX,
-									  unsigned int* neighborY,
-									  unsigned int* neighborZ,
-									  unsigned int size_Mat,
-									  bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      QVelDeviceCompHighNu27<<< grid.grid, grid.threads >>> (
-													  vx,
-													  vy,
-													  vz,
-													  DD,
-													  k_Q,
-													  QQ,
-													  numberOfBCnodes,
-													  om1,
-													  neighborX,
-													  neighborY,
-													  neighborZ,
-													  size_Mat,
-													  isEvenTimestep);
-      getLastCudaError("QVelDeviceComp27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QVeloDevEQ27(unsigned int numberOfThreads,
-							 real* VeloX,
-							 real* VeloY,
-							 real* VeloZ,
-							 real* DD,
-							 int* k_Q,
-							 int numberOfBCnodes,
-							 real om1,
-							 unsigned int* neighborX,
-							 unsigned int* neighborY,
-							 unsigned int* neighborZ,
-							 unsigned int size_Mat,
-							 bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   QVeloDeviceEQ27<<< grid.grid, grid.threads >>> (VeloX,
-											 VeloY,
-											 VeloZ,
-											 DD,
-											 k_Q,
-											 numberOfBCnodes,
-											 om1,
-											 neighborX,
-											 neighborY,
-											 neighborZ,
-											 size_Mat,
-											 isEvenTimestep);
-      getLastCudaError("QVeloDeviceEQ27 execution failed");
+    QVelDeviceCompZeroPress27<<< grid, threads >>> (
+        boundaryCondition->Vx,
+        boundaryCondition->Vy,
+        boundaryCondition->Vz,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QVelDeviceCompZeroPress27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QVelDevIncompHighNu27(
+    unsigned int numberOfThreads,
+    real* vx,
+    real* vy,
+    real* vz,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QVelDeviceIncompHighNu27<<< grid.grid, grid.threads >>> (
+        vx,
+        vy,
+        vz,
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QVelDeviceIncompHighNu27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QVelDevCompHighNu27(
+    unsigned int numberOfThreads,
+    real* vx,
+    real* vy,
+    real* vz,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QVelDeviceCompHighNu27<<< grid.grid, grid.threads >>> (
+        vx,
+        vy,
+        vz,
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QVelDeviceComp27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QVeloDevEQ27(
+    unsigned int numberOfThreads,
+    real* VeloX,
+    real* VeloY,
+    real* VeloZ,
+    real* DD,
+    int* k_Q,
+    int numberOfBCnodes,
+    real om1,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QVeloDeviceEQ27<<< grid.grid, grid.threads >>> (
+        VeloX,
+        VeloY,
+        VeloZ,
+        DD,
+        k_Q,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QVeloDeviceEQ27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QVeloStreetDevEQ27(
-	uint  numberOfThreads,
-	real* veloXfraction,
-	real* veloYfraction,
-	int*  naschVelo,
-	real* DD,
-	int*  naschIndex,
-	int   numberOfStreetNodes,
-	real  velocityRatio,
-	uint* neighborX,
-	uint* neighborY,
-	uint* neighborZ,
-	uint  size_Mat,
-	bool  isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfStreetNodes);
-
-	QVeloStreetDeviceEQ27 << < grid.grid, grid.threads >> > (
-		veloXfraction,
-		veloYfraction,
-		naschVelo,
-		DD,
-		naschIndex,
-		numberOfStreetNodes,
-		velocityRatio,
-		neighborX,
-		neighborY,
-		neighborZ,
-		size_Mat,
-		isEvenTimestep);
-	getLastCudaError("QVeloStreetDeviceEQ27 execution failed");
+    uint  numberOfThreads,
+    real* veloXfraction,
+    real* veloYfraction,
+    int*  naschVelo,
+    real* DD,
+    int*  naschIndex,
+    int   numberOfStreetNodes,
+    real  velocityRatio,
+    uint* neighborX,
+    uint* neighborY,
+    uint* neighborZ,
+    uint  numberOfLBnodes,
+    bool  isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfStreetNodes);
+
+    QVeloStreetDeviceEQ27 << < grid.grid, grid.threads >> > (
+        veloXfraction,
+        veloYfraction,
+        naschVelo,
+        DD,
+        naschIndex,
+        numberOfStreetNodes,
+        velocityRatio,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QVeloStreetDeviceEQ27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QSlipDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    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");
+    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");
+    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 );
+    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");
+    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");
+    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 );
+    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("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 int size_Mat,
-								   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,
-												   size_Mat,
-												   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 int size_Mat,
-								   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,
-												   size_Mat,
-												   isEvenTimestep);
-      getLastCudaError("QSlipGeomDeviceComp27 execution failed");
+    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("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);
-   dim3 threads(para->getParD(level)->numberofthreads, 1, 1 );
-
-      QStressDeviceComp27<<< grid, threads >>> (
-         para->getParD(level)->distributions.f[0],
-         boundaryCondition->k,
-         boundaryCondition->kN,
-         boundaryCondition->q27[0],
-         boundaryCondition->numberOfBCnodes,
-         para->getParD(level)->omega,
-         para->getParD(level)->turbViscosity,
-         para->getParD(level)->velocityX,
-         para->getParD(level)->velocityY,
-         para->getParD(level)->velocityY,
-         boundaryCondition->normalX,
-         boundaryCondition->normalY,
-         boundaryCondition->normalZ,
-         boundaryCondition->Vx,
-         boundaryCondition->Vy,
-         boundaryCondition->Vz,
-         boundaryCondition->Vx1,
-         boundaryCondition->Vy1,
-         boundaryCondition->Vz1,
-         para->getParD(level)->wallModel.samplingOffset,
-         para->getParD(level)->wallModel.z0,
-         para->getHasWallModelMonitor(),
-         para->getParD(level)->wallModel.u_star,
-         para->getParD(level)->wallModel.Fx,
-         para->getParD(level)->wallModel.Fy,
-         para->getParD(level)->wallModel.Fz,
-         para->getParD(level)->neighborX,
-         para->getParD(level)->neighborY,
-         para->getParD(level)->neighborZ,
-         para->getParD(level)->numberOfNodes,
-         para->getParD(level)->isEvenTimestep);
-      getLastCudaError("QSlipDeviceComp27 execution failed");
+    dim3 grid = vf::cuda::getCudaGrid(  para->getParD(level)->numberofthreads, boundaryCondition->numberOfBCnodes);
+    dim3 threads(para->getParD(level)->numberofthreads, 1, 1 );
+
+    QStressDeviceComp27<<< grid, threads >>> (
+        para->getParD(level)->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->kN,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        para->getParD(level)->omega,
+        para->getParD(level)->turbViscosity,
+        para->getParD(level)->velocityX,
+        para->getParD(level)->velocityY,
+        para->getParD(level)->velocityY,
+        boundaryCondition->normalX,
+        boundaryCondition->normalY,
+        boundaryCondition->normalZ,
+        boundaryCondition->Vx,
+        boundaryCondition->Vy,
+        boundaryCondition->Vz,
+        boundaryCondition->Vx1,
+        boundaryCondition->Vy1,
+        boundaryCondition->Vz1,
+        para->getParD(level)->wallModel.samplingOffset,
+        para->getParD(level)->wallModel.z0,
+        para->getHasWallModelMonitor(),
+        para->getParD(level)->wallModel.u_star,
+        para->getParD(level)->wallModel.Fx,
+        para->getParD(level)->wallModel.Fy,
+        para->getParD(level)->wallModel.Fz,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("QStressDeviceComp27 execution failed");
 }
 
 //////////////////////////////////////////////////////////////////////////
 void BBStressDev27(Parameter *para,  QforBoundaryConditions* boundaryCondition, const int level)
 {
-   dim3 grid = vf::cuda::getCudaGrid( para->getParD(level)->numberofthreads, boundaryCondition->numberOfBCnodes);
-   dim3 threads(para->getParD(level)->numberofthreads, 1, 1 );
-
-   BBStressDevice27<<< grid, threads >>> (
-      para->getParD(level)->distributions.f[0],
-      boundaryCondition->k,
-      boundaryCondition->kN,
-      boundaryCondition->q27[0],
-      boundaryCondition->numberOfBCnodes,
-      para->getParD(level)->velocityX,
-      para->getParD(level)->velocityY,
-      para->getParD(level)->velocityY,
-      boundaryCondition->normalX,
-      boundaryCondition->normalY,
-      boundaryCondition->normalZ,
-      boundaryCondition->Vx,
-      boundaryCondition->Vy,
-      boundaryCondition->Vz,
-      boundaryCondition->Vx1,
-      boundaryCondition->Vy1,
-      boundaryCondition->Vz1,
-      para->getParD(level)->wallModel.samplingOffset,
-      para->getParD(level)->wallModel.z0,
-      para->getHasWallModelMonitor(),
-      para->getParD(level)->wallModel.u_star,
-      para->getParD(level)->wallModel.Fx,
-      para->getParD(level)->wallModel.Fy,
-      para->getParD(level)->wallModel.Fz,
-      para->getParD(level)->neighborX,
-      para->getParD(level)->neighborY,
-      para->getParD(level)->neighborZ,
-      para->getParD(level)->numberOfNodes,
-      para->getParD(level)->isEvenTimestep);
-      getLastCudaError("BBStressDevice27 execution failed");
+    dim3 grid = vf::cuda::getCudaGrid( para->getParD(level)->numberofthreads, boundaryCondition->numberOfBCnodes);
+    dim3 threads(para->getParD(level)->numberofthreads, 1, 1 );
+
+    BBStressDevice27<<< grid, threads >>> (
+        para->getParD(level)->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->kN,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        para->getParD(level)->velocityX,
+        para->getParD(level)->velocityY,
+        para->getParD(level)->velocityY,
+        boundaryCondition->normalX,
+        boundaryCondition->normalY,
+        boundaryCondition->normalZ,
+        boundaryCondition->Vx,
+        boundaryCondition->Vy,
+        boundaryCondition->Vz,
+        boundaryCondition->Vx1,
+        boundaryCondition->Vy1,
+        boundaryCondition->Vz1,
+        para->getParD(level)->wallModel.samplingOffset,
+        para->getParD(level)->wallModel.z0,
+        para->getHasWallModelMonitor(),
+        para->getParD(level)->wallModel.u_star,
+        para->getParD(level)->wallModel.Fx,
+        para->getParD(level)->wallModel.Fy,
+        para->getParD(level)->wallModel.Fz,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("BBStressDevice27 execution failed");
 }
 
 //////////////////////////////////////////////////////////////////////////
 void BBStressPressureDev27(Parameter *para,  QforBoundaryConditions* boundaryCondition, const int level)
 {
-   dim3 grid = vf::cuda::getCudaGrid( para->getParD(level)->numberofthreads, boundaryCondition->numberOfBCnodes);
-   dim3 threads(para->getParD(level)->numberofthreads, 1, 1 );
-
-   BBStressPressureDevice27<<< grid, threads >>> (
-      para->getParD(level)->distributions.f[0],
-      boundaryCondition->k,
-      boundaryCondition->kN,
-      boundaryCondition->q27[0],
-      boundaryCondition->numberOfBCnodes,
-      para->getParD(level)->velocityX,
-      para->getParD(level)->velocityY,
-      para->getParD(level)->velocityY,
-      boundaryCondition->normalX,
-      boundaryCondition->normalY,
-      boundaryCondition->normalZ,
-      boundaryCondition->Vx,
-      boundaryCondition->Vy,
-      boundaryCondition->Vz,
-      boundaryCondition->Vx1,
-      boundaryCondition->Vy1,
-      boundaryCondition->Vz1,
-      para->getParD(level)->wallModel.samplingOffset,
-      para->getParD(level)->wallModel.z0,
-      para->getHasWallModelMonitor(),
-      para->getParD(level)->wallModel.u_star,
-      para->getParD(level)->wallModel.Fx,
-      para->getParD(level)->wallModel.Fy,
-      para->getParD(level)->wallModel.Fz,
-      para->getParD(level)->neighborX,
-      para->getParD(level)->neighborY,
-      para->getParD(level)->neighborZ,
-      para->getParD(level)->numberOfNodes,
-      para->getParD(level)->isEvenTimestep);
-      getLastCudaError("BBStressDevice27 execution failed");
+    dim3 grid = vf::cuda::getCudaGrid( para->getParD(level)->numberofthreads, boundaryCondition->numberOfBCnodes);
+    dim3 threads(para->getParD(level)->numberofthreads, 1, 1 );
+
+    BBStressPressureDevice27<<< grid, threads >>> (
+        para->getParD(level)->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->kN,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        para->getParD(level)->velocityX,
+        para->getParD(level)->velocityY,
+        para->getParD(level)->velocityY,
+        boundaryCondition->normalX,
+        boundaryCondition->normalY,
+        boundaryCondition->normalZ,
+        boundaryCondition->Vx,
+        boundaryCondition->Vy,
+        boundaryCondition->Vz,
+        boundaryCondition->Vx1,
+        boundaryCondition->Vy1,
+        boundaryCondition->Vz1,
+        para->getParD(level)->wallModel.samplingOffset,
+        para->getParD(level)->wallModel.z0,
+        para->getHasWallModelMonitor(),
+        para->getParD(level)->wallModel.u_star,
+        para->getParD(level)->wallModel.Fx,
+        para->getParD(level)->wallModel.Fy,
+        para->getParD(level)->wallModel.Fz,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("BBStressPressureDevice27 execution failed");
 }
 
 //////////////////////////////////////////////////////////////////////////
 void QPressDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QPressDevice27<<< grid, threads >>> (
-      boundaryCondition->RhoBC,
-      parameterDevice->distributions.f[0],
-      boundaryCondition->k,
-      boundaryCondition->q27[0],
-      boundaryCondition->numberOfBCnodes,
-      parameterDevice->omega,
-      parameterDevice->neighborX,
-      parameterDevice->neighborY,
-      parameterDevice->neighborZ,
-      parameterDevice->numberOfNodes,
-      parameterDevice->isEvenTimestep);
-   getLastCudaError("QPressDevice27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QPressDevAntiBB27(  unsigned int numberOfThreads,
-                                    real* rhoBC,
-									real* vx,
-									real* vy,
-									real* vz,
-									real* DD,
-									int* k_Q,
-									real* QQ,
-									int numberOfBCnodes,
-									real om1,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int size_Mat,
-									bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   QPressDeviceAntiBB27<<< grid.grid, grid.threads >>>( rhoBC,
-												vx,
-												vy,
-												vz,
-												DD,
-												k_Q,
-												QQ,
-												numberOfBCnodes,
-												om1,
-												neighborX,
-												neighborY,
-												neighborZ,
-												size_Mat,
-												isEvenTimestep);
-   getLastCudaError("QPressDeviceAntiBB27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QPressDevFixBackflow27( unsigned int numberOfThreads,
-                                        real* rhoBC,
-                                        real* DD,
-                                        int* k_Q,
-                                        unsigned int numberOfBCnodes,
-                                        real om1,
-                                        unsigned int* neighborX,
-                                        unsigned int* neighborY,
-                                        unsigned int* neighborZ,
-                                        unsigned int size_Mat,
-                                        bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   QPressDeviceFixBackflow27<<< grid.grid, grid.threads >>> (  rhoBC,
-                                                         DD,
-                                                         k_Q,
-                                                         numberOfBCnodes,
-                                                         om1,
-                                                         neighborX,
-                                                         neighborY,
-                                                         neighborZ,
-                                                         size_Mat,
-                                                         isEvenTimestep);
-   getLastCudaError("QPressDeviceFixBackflow27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QPressDevDirDepBot27(  unsigned int numberOfThreads,
-                                       real* rhoBC,
-                                       real* DD,
-                                       int* k_Q,
-                                       unsigned int numberOfBCnodes,
-                                       real om1,
-                                       unsigned int* neighborX,
-                                       unsigned int* neighborY,
-                                       unsigned int* neighborZ,
-                                       unsigned int size_Mat,
-                                       bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   QPressDeviceDirDepBot27<<< grid.grid, grid.threads >>> ( rhoBC,
-                                                      DD,
-                                                      k_Q,
-                                                      numberOfBCnodes,
-                                                      om1,
-                                                      neighborX,
-                                                      neighborY,
-                                                      neighborZ,
-                                                      size_Mat,
-                                                      isEvenTimestep);
-   getLastCudaError("QPressDeviceDirDepBot27 execution failed");
+    QPressDevice27<<< grid, threads >>> (
+        boundaryCondition->RhoBC,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QPressDevice27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QPressDevAntiBB27(
+    unsigned int numberOfThreads,
+    real* rhoBC,
+    real* vx,
+    real* vy,
+    real* vz,
+    real* DD,
+    int* k_Q,
+    real* QQ,
+    int numberOfBCnodes,
+    real om1,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QPressDeviceAntiBB27<<< grid.grid, grid.threads >>>(
+        rhoBC,
+        vx,
+        vy,
+        vz,
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QPressDeviceAntiBB27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QPressDevFixBackflow27(
+    unsigned int numberOfThreads,
+    real* rhoBC,
+    real* DD,
+    int* k_Q,
+    unsigned int numberOfBCnodes,
+    real om1,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QPressDeviceFixBackflow27<<< grid.grid, grid.threads >>> (
+        rhoBC,
+        DD,
+        k_Q,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QPressDeviceFixBackflow27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QPressDevDirDepBot27(
+    unsigned int numberOfThreads,
+    real* rhoBC,
+    real* DD,
+    int* k_Q,
+    unsigned int numberOfBCnodes,
+    real om1,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QPressDeviceDirDepBot27<<< grid.grid, grid.threads >>> (
+        rhoBC,
+        DD,
+        k_Q,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QPressDeviceDirDepBot27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QPressNoRhoDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QPressNoRhoDevice27<<< grid, threads >>> (
-         boundaryCondition->RhoBC,
-         parameterDevice->distributions.f[0],
-         boundaryCondition->k,
-         boundaryCondition->kN,
-         boundaryCondition->numberOfBCnodes,
-         parameterDevice->omega,
-         parameterDevice->neighborX,
-         parameterDevice->neighborY,
-         parameterDevice->neighborZ,
-         parameterDevice->numberOfNodes,
-         parameterDevice->isEvenTimestep,
-         vf::lbm::dir::DIR_P00);
-   getLastCudaError("QPressNoRhoDevice27 execution failed");
+    QPressNoRhoDevice27<<< grid, threads >>> (
+        boundaryCondition->RhoBC,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->kN,
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep,
+        vf::lbm::dir::DIR_P00);
+    getLastCudaError("QPressNoRhoDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QPressZeroRhoOutflowDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QPressZeroRhoOutflowDevice27<<< grid, threads >>> (
-         boundaryCondition->RhoBC,
-         parameterDevice->distributions.f[0],
-         boundaryCondition->k,
-         boundaryCondition->kN,
-         boundaryCondition->numberOfBCnodes,
-         parameterDevice->omega,
-         parameterDevice->neighborX,
-         parameterDevice->neighborY,
-         parameterDevice->neighborZ,
-         parameterDevice->numberOfNodes,
-         parameterDevice->isEvenTimestep,
-         vf::lbm::dir::DIR_P00,
-         parameterDevice->outflowPressureCorrectionFactor);
-   getLastCudaError("QPressZeroRhoOutflowDev27 execution failed");
+    QPressZeroRhoOutflowDevice27<<< grid, threads >>> (
+        boundaryCondition->RhoBC,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->kN,
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep,
+        vf::lbm::dir::DIR_P00,
+        parameterDevice->outflowPressureCorrectionFactor);
+    getLastCudaError("QPressZeroRhoOutflowDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QInflowScaleByPressDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QInflowScaleByPressDevice27<<< grid, threads >>> (
-           boundaryCondition->RhoBC,
-           parameterDevice->distributions.f[0],
-           boundaryCondition->k,
-           boundaryCondition->kN,
-           boundaryCondition->numberOfBCnodes,
-           parameterDevice->omega,
-           parameterDevice->neighborX,
-           parameterDevice->neighborY,
-           parameterDevice->neighborZ,
-           parameterDevice->numberOfNodes,
-           parameterDevice->isEvenTimestep);
-   getLastCudaError("QInflowScaleByPressDevice27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QPressDevOld27(  unsigned int numberOfThreads,
-                                     real* rhoBC,
-                                     real* DD,
-                                     int* k_Q,
-                                     int* k_N,
-                                     unsigned int numberOfBCnodes,
-                                     real om1,
-                                     unsigned int* neighborX,
-                                     unsigned int* neighborY,
-                                     unsigned int* neighborZ,
-                                     unsigned int size_Mat,
-                                     bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   QPressDeviceOld27<<< grid.grid, grid.threads >>> ( rhoBC,
-                                                DD,
-                                                k_Q,
-                                                k_N,
-                                                numberOfBCnodes,
-                                                om1,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                size_Mat,
-                                                isEvenTimestep);
-   getLastCudaError("QPressDeviceOld27 execution failed");
+    QInflowScaleByPressDevice27<<< grid, threads >>> (
+        boundaryCondition->RhoBC,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->kN,
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QInflowScaleByPressDevice27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QPressDevOld27(
+    unsigned int numberOfThreads,
+    real* rhoBC,
+    real* DD,
+    int* k_Q,
+    int* k_N,
+    unsigned int numberOfBCnodes,
+    real om1,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QPressDeviceOld27<<< grid.grid, grid.threads >>> (
+        rhoBC,
+        DD,
+        k_Q,
+        k_N,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QPressDeviceOld27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QPressDevIncompNEQ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QPressDeviceIncompNEQ27<<< grid, threads >>> (
-         boundaryCondition->RhoBC,
-         parameterDevice->distributions.f[0],
-         boundaryCondition->k,
-         boundaryCondition->kN,
-         boundaryCondition->numberOfBCnodes,
-         parameterDevice->omega,
-         parameterDevice->neighborX,
-         parameterDevice->neighborY,
-         parameterDevice->neighborZ,
-         parameterDevice->numberOfNodes,
-         parameterDevice->isEvenTimestep);
-   getLastCudaError("QPressDeviceIncompNEQ27 execution failed");
+    QPressDeviceIncompNEQ27<<< grid, threads >>> (
+        boundaryCondition->RhoBC,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->kN,
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QPressDeviceIncompNEQ27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QPressDevNEQ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QPressDeviceNEQ27<<< grid, threads >>> (
+    QPressDeviceNEQ27<<< grid, threads >>> (
         boundaryCondition->RhoBC,
         parameterDevice->distributions.f[0],
         boundaryCondition->k,
@@ -3012,2656 +3106,2805 @@ void QPressDevNEQ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditi
         parameterDevice->neighborZ,
         parameterDevice->numberOfNodes,
         parameterDevice->isEvenTimestep);
-   getLastCudaError("QPressDevNEQ27 execution failed");
+    getLastCudaError("QPressDevNEQ27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void QPressDevEQZ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      QPressDeviceEQZ27<<< grid, threads >>> (
-            boundaryCondition->RhoBC,
-            parameterDevice->distributions.f[0],
-            boundaryCondition->k,
-            boundaryCondition->kN,
-            parameterDevice->kDistTestRE.f[0],
-            boundaryCondition->numberOfBCnodes,
-            parameterDevice->omega,
-            parameterDevice->neighborX,
-            parameterDevice->neighborY,
-            parameterDevice->neighborZ,
-            parameterDevice->numberOfNodes,
-            parameterDevice->isEvenTimestep);
-      getLastCudaError("QPressDeviceEQZ27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QPressDevZero27(unsigned int numberOfThreads,
-                                real* DD,
-                                int* k_Q,
-                                unsigned int numberOfBCnodes,
-                                unsigned int* neighborX,
-                                unsigned int* neighborY,
-                                unsigned int* neighborZ,
-                                unsigned int size_Mat,
-                                bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   QPressDeviceZero27<<< grid.grid, grid.threads >>> (DD,
-                                                k_Q,
-                                                numberOfBCnodes,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                size_Mat,
-                                                isEvenTimestep);
-   getLastCudaError("QPressDeviceOld27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QPressDevFake27(     unsigned int numberOfThreads,
-                                     real* rhoBC,
-                                     real* DD,
-                                     int* k_Q,
-                                     int* k_N,
-                                     unsigned int numberOfBCnodes,
-                                     real om1,
-                                     unsigned int* neighborX,
-                                     unsigned int* neighborY,
-                                     unsigned int* neighborZ,
-                                     unsigned int size_Mat,
-                                     bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-
-      QPressDeviceFake27<<< grid.grid, grid.threads >>> (rhoBC,
-                                                DD,
-                                                k_Q,
-                                                k_N,
-                                                numberOfBCnodes,
-                                                om1,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                size_Mat,
-                                                isEvenTimestep);
-      getLastCudaError("QPressDeviceFake27 execution failed");
+    QPressDeviceEQZ27<<< grid, threads >>> (
+        boundaryCondition->RhoBC,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->kN,
+        parameterDevice->kDistTestRE.f[0],
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QPressDeviceEQZ27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QPressDevZero27(
+    unsigned int numberOfThreads,
+    real* DD,
+    int* k_Q,
+    unsigned int numberOfBCnodes,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QPressDeviceZero27<<< grid.grid, grid.threads >>> (
+        DD,
+        k_Q,
+        numberOfBCnodes,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QPressDeviceOld27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QPressDevFake27(
+    unsigned int numberOfThreads,
+    real* rhoBC,
+    real* DD,
+    int* k_Q,
+    int* k_N,
+    unsigned int numberOfBCnodes,
+    real om1,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+
+    QPressDeviceFake27<<< grid.grid, grid.threads >>> (
+        rhoBC,
+        DD,
+        k_Q,
+        k_N,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QPressDeviceFake27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void BBDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
-   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   BBDevice27<<< grid, threads >>> (
-         parameterDevice->distributions.f[0],
-         boundaryCondition->k,
-         boundaryCondition->q27[0],
-         boundaryCondition->numberOfBCnodes,
-         parameterDevice->neighborX,
-         parameterDevice->neighborY,
-         parameterDevice->neighborZ,
-         parameterDevice->numberOfNodes,
-         parameterDevice->isEvenTimestep);
-   getLastCudaError("BBDevice27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QPressDev27_IntBB(  unsigned int numberOfThreads,
-									real* rho,
-									real* DD,
-									int* k_Q,
-									real* QQ,
-									unsigned int numberOfBCnodes,
-									real om1,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int size_Mat,
-									bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-	QPressDevice27_IntBB<<< grid.grid, grid.threads >>> (rho,
-													DD,
-													k_Q,
-													QQ,
-													numberOfBCnodes,
-													om1,
-													neighborX,
-													neighborY,
-													neighborZ,
-													size_Mat,
-													isEvenTimestep);
-	getLastCudaError("QPressDevice27_IntBB execution failed");
+    BBDevice27<<< grid, threads >>> (
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("BBDevice27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QPressDev27_IntBB(
+    unsigned int numberOfThreads,
+    real* rho,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    QPressDevice27_IntBB<<< grid.grid, grid.threads >>> (
+        rho,
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("QPressDevice27_IntBB execution failed");
 }
 // TODO: https://git.rz.tu-bs.de/irmb/VirtualFluids_dev/-/issues/29
 //////////////////////////////////////////////////////////////////////////
-void PressSchlaffer27(unsigned int numberOfThreads,
-                                 real* rhoBC,
-                                 real* DD,
-                                 real* vx0,
-                                 real* vy0,
-                                 real* vz0,
-                                 real* deltaVz0,
-                                 int* k_Q,
-                                 int* k_N,
-                                 int numberOfBCnodes,
-                                 real om1,
-                                 unsigned int* neighborX,
-                                 unsigned int* neighborY,
-                                 unsigned int* neighborZ,
-                                 unsigned int size_Mat,
-                                 bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   PressSchlaff27<<< grid.grid, grid.threads >>>(  rhoBC,
-                                             DD,
-                                             vx0,
-                                             vy0,
-                                             vz0,
-                                             deltaVz0,
-                                             k_Q,
-                                             k_N,
-                                             numberOfBCnodes,
-                                             om1,
-                                             neighborX,
-                                             neighborY,
-                                             neighborZ,
-                                             size_Mat,
-                                             isEvenTimestep);
-   getLastCudaError("PressSchlaff27 execution failed");
+void PressSchlaffer27(
+    unsigned int numberOfThreads,
+    real* rhoBC,
+    real* DD,
+    real* vx0,
+    real* vy0,
+    real* vz0,
+    real* deltaVz0,
+    int* k_Q,
+    int* k_N,
+    int numberOfBCnodes,
+    real om1,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    PressSchlaff27<<< grid.grid, grid.threads >>>(
+        rhoBC,
+        DD,
+        vx0,
+        vy0,
+        vz0,
+        deltaVz0,
+        k_Q,
+        k_N,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("PressSchlaff27 execution failed");
 }
 // TODO: https://git.rz.tu-bs.de/irmb/VirtualFluids_dev/-/issues/29
 //////////////////////////////////////////////////////////////////////////
-void VelSchlaffer27(  unsigned int numberOfThreads,
-                                 int t,
-                                 real* DD,
-                                 real* vz0,
-                                 real* deltaVz0,
-                                 int* k_Q,
-                                 int* k_N,
-                                 int numberOfBCnodes,
-                                 real om1,
-                                 unsigned int* neighborX,
-                                 unsigned int* neighborY,
-                                 unsigned int* neighborZ,
-                                 unsigned int size_Mat,
-                                 bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-   VelSchlaff27<<< grid.grid, grid.threads >>>( t,
-                                          DD,
-                                          vz0,
-                                          deltaVz0,
-                                          k_Q,
-                                          k_N,
-                                          numberOfBCnodes,
-                                          om1,
-                                          neighborX,
-                                          neighborY,
-                                          neighborZ,
-                                          size_Mat,
-                                          isEvenTimestep);
-      getLastCudaError("VelSchlaff27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QPrecursorDevCompZeroPress(LBMSimulationParameter* parameterDevice, 
-								QforPrecursorBoundaryConditions* boundaryCondition, 
-								real timeRatio, 
-								real velocityRatio)
-{
-
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-
-	QPrecursorDeviceCompZeroPress<<< grid.grid, grid.threads >>>(boundaryCondition->k,
-																boundaryCondition->numberOfBCnodes,
-																boundaryCondition->numberOfPrecursorNodes,
-																boundaryCondition->sizeQ,
-																parameterDevice->omega,
-																parameterDevice->distributions.f[0],
-																boundaryCondition->q27[0],
-																parameterDevice->neighborX,
-																parameterDevice->neighborY,
-																parameterDevice->neighborZ,
-																boundaryCondition->planeNeighbor0PP,
-																boundaryCondition->planeNeighbor0PM,
-																boundaryCondition->planeNeighbor0MP,
-																boundaryCondition->planeNeighbor0MM,
-																boundaryCondition->weights0PP,
-																boundaryCondition->weights0PM,
-																boundaryCondition->weights0MP,
-																boundaryCondition->weights0MM,
-																boundaryCondition->last,
-																boundaryCondition->current,
-																boundaryCondition->velocityX,
-																boundaryCondition->velocityY,
-																boundaryCondition->velocityZ,
-																timeRatio,
-																velocityRatio,
-																parameterDevice->numberOfNodes,
-																parameterDevice->isEvenTimestep);
-	getLastCudaError("QPrecursorDeviceCompZeroPress execution failed"); 
-
+void VelSchlaffer27(
+    unsigned int numberOfThreads,
+    int t,
+    real* DD,
+    real* vz0,
+    real* deltaVz0,
+    int* k_Q,
+    int* k_N,
+    int numberOfBCnodes,
+    real om1,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    VelSchlaff27<<< grid.grid, grid.threads >>>(
+        t,
+        DD,
+        vz0,
+        deltaVz0,
+        k_Q,
+        k_N,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("VelSchlaff27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void QPrecursorDevCompZeroPress(LBMSimulationParameter* parameterDevice,
+                                QforPrecursorBoundaryConditions* boundaryCondition,
+                                real timeRatio,
+                                real velocityRatio)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
+
+    QPrecursorDeviceCompZeroPress<<< grid.grid, grid.threads >>>(
+        boundaryCondition->k,
+        boundaryCondition->numberOfBCnodes,
+        boundaryCondition->numberOfPrecursorNodes,
+        boundaryCondition->sizeQ,
+        parameterDevice->omega,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->q27[0],
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        boundaryCondition->planeNeighbor0PP,
+        boundaryCondition->planeNeighbor0PM,
+        boundaryCondition->planeNeighbor0MP,
+        boundaryCondition->planeNeighbor0MM,
+        boundaryCondition->weights0PP,
+        boundaryCondition->weights0PM,
+        boundaryCondition->weights0MP,
+        boundaryCondition->weights0MM,
+        boundaryCondition->last,
+        boundaryCondition->current,
+        boundaryCondition->velocityX,
+        boundaryCondition->velocityY,
+        boundaryCondition->velocityZ,
+        timeRatio,
+        velocityRatio,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QPrecursorDeviceCompZeroPress execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void PrecursorDevEQ27( LBMSimulationParameter* parameterDevice,
-						QforPrecursorBoundaryConditions* boundaryCondition,
-						real timeRatio,
-						real velocityRatio)
-{
-
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-
-	PrecursorDeviceEQ27<<< grid.grid, grid.threads >>>(boundaryCondition->k,
-													boundaryCondition->numberOfBCnodes,
-													boundaryCondition->numberOfPrecursorNodes,
-													parameterDevice->omega,
-													parameterDevice->distributions.f[0],
-													parameterDevice->neighborX,
-													parameterDevice->neighborX,
-													parameterDevice->neighborX,
-													boundaryCondition->planeNeighbor0PP,
-													boundaryCondition->planeNeighbor0PM,
-													boundaryCondition->planeNeighbor0MP,
-													boundaryCondition->planeNeighbor0MM,
-													boundaryCondition->weights0PP,
-													boundaryCondition->weights0PM,
-													boundaryCondition->weights0MP,
-													boundaryCondition->weights0MM,
-													boundaryCondition->last,
-													boundaryCondition->current,
-													boundaryCondition->velocityX,
-													boundaryCondition->velocityY,
-													boundaryCondition->velocityZ,
-													timeRatio,
-													velocityRatio,
-													parameterDevice->numberOfNodes,
-													parameterDevice->isEvenTimestep);
-	getLastCudaError("PrecursorDeviceEQ27 execution failed"); 
+                        QforPrecursorBoundaryConditions* boundaryCondition,
+                        real timeRatio,
+                        real velocityRatio)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
+
+    PrecursorDeviceEQ27<<< grid.grid, grid.threads >>>(
+        boundaryCondition->k,
+        boundaryCondition->numberOfBCnodes,
+        boundaryCondition->numberOfPrecursorNodes,
+        parameterDevice->omega,
+        parameterDevice->distributions.f[0],
+        parameterDevice->neighborX,
+        parameterDevice->neighborX,
+        parameterDevice->neighborX,
+        boundaryCondition->planeNeighbor0PP,
+        boundaryCondition->planeNeighbor0PM,
+        boundaryCondition->planeNeighbor0MP,
+        boundaryCondition->planeNeighbor0MM,
+        boundaryCondition->weights0PP,
+        boundaryCondition->weights0PM,
+        boundaryCondition->weights0MP,
+        boundaryCondition->weights0MM,
+        boundaryCondition->last,
+        boundaryCondition->current,
+        boundaryCondition->velocityX,
+        boundaryCondition->velocityY,
+        boundaryCondition->velocityZ,
+        timeRatio,
+        velocityRatio,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("PrecursorDeviceEQ27 execution failed");
 
 }
 //////////////////////////////////////////////////////////////////////////
 void PrecursorDevDistributions( LBMSimulationParameter* parameterDevice,
-								QforPrecursorBoundaryConditions* boundaryCondition,
-								real timeRatio,
-								real velocityRatio)
-{
-
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-
-	PrecursorDeviceDistributions<<< grid.grid, grid.threads >>>(boundaryCondition->k,
-															boundaryCondition->numberOfBCnodes,
-															boundaryCondition->numberOfPrecursorNodes,
-															parameterDevice->distributions.f[0],
-															parameterDevice->neighborX,
-															parameterDevice->neighborY,
-															parameterDevice->neighborZ,
-															boundaryCondition->planeNeighbor0PP,
-															boundaryCondition->planeNeighbor0PM,
-															boundaryCondition->planeNeighbor0MP,
-															boundaryCondition->planeNeighbor0MM,
-															boundaryCondition->weights0PP,
-															boundaryCondition->weights0PM,
-															boundaryCondition->weights0MP,
-															boundaryCondition->weights0MM,
-															boundaryCondition->last,
-															boundaryCondition->current,
-															timeRatio,
-															parameterDevice->numberOfNodes,
-															parameterDevice->isEvenTimestep);
-	getLastCudaError("QPrecursorDeviceCompZeroPress execution failed"); 
+                                QforPrecursorBoundaryConditions* boundaryCondition,
+                                real timeRatio,
+                                real velocityRatio)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
+
+    PrecursorDeviceDistributions<<< grid.grid, grid.threads >>>(
+        boundaryCondition->k,
+        boundaryCondition->numberOfBCnodes,
+        boundaryCondition->numberOfPrecursorNodes,
+        parameterDevice->distributions.f[0],
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        boundaryCondition->planeNeighbor0PP,
+        boundaryCondition->planeNeighbor0PM,
+        boundaryCondition->planeNeighbor0MP,
+        boundaryCondition->planeNeighbor0MM,
+        boundaryCondition->weights0PP,
+        boundaryCondition->weights0PM,
+        boundaryCondition->weights0MP,
+        boundaryCondition->weights0MM,
+        boundaryCondition->last,
+        boundaryCondition->current,
+        timeRatio,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("PrecursorDeviceDistributions execution failed");
 
 }
 
 //////////////////////////////////////////////////////////////////////////
 void QPrecursorDevDistributions( LBMSimulationParameter* parameterDevice,
-								QforPrecursorBoundaryConditions* boundaryCondition,
-								real timeRatio,
-								real velocityRatio)
-{
-
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-
-	QPrecursorDeviceDistributions<<< grid.grid, grid.threads >>>(boundaryCondition->k,
-																boundaryCondition->q27[0],
-																boundaryCondition->sizeQ,
-																boundaryCondition->numberOfBCnodes,
-																boundaryCondition->numberOfPrecursorNodes,
-																parameterDevice->distributions.f[0],
-																parameterDevice->neighborX,
-																parameterDevice->neighborY,
-																parameterDevice->neighborZ,
-																boundaryCondition->planeNeighbor0PP,
-																boundaryCondition->planeNeighbor0PM,
-																boundaryCondition->planeNeighbor0MP,
-																boundaryCondition->planeNeighbor0MM,
-																boundaryCondition->weights0PP,
-																boundaryCondition->weights0PM,
-																boundaryCondition->weights0MP,
-																boundaryCondition->weights0MM,
-																boundaryCondition->last,
-																boundaryCondition->current,
-																timeRatio,
-																parameterDevice->numberOfNodes,
-																parameterDevice->isEvenTimestep);
-	getLastCudaError("QPrecursorDeviceCompZeroPress execution failed"); 
-
-}
-//////////////////////////////////////////////////////////////////////////
-extern "C" void PropVelo(   unsigned int numberOfThreads,
-                            unsigned int* neighborX,
-                            unsigned int* neighborY,
-                            unsigned int* neighborZ,
-                            real* rho,
-                            real* ux,
-                            real* uy,
-                            real* uz,
-                            int* k_Q,
-							unsigned int size_Prop,
-                            unsigned int size_Mat,
-                            unsigned int* bcMatD,
-                            real* DD,
-                            bool EvenOrOdd)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Prop);
-
-      PropellerBC<<< grid.grid, grid.threads >>>(neighborX,
-                                       neighborY,
-                                       neighborZ,
-                                       rho,
-                                       ux,
-                                       uy,
-                                       uz,
-									   k_Q,
-									   size_Prop,
-                                       size_Mat,
-									   bcMatD,
-                                       DD,
-                                       EvenOrOdd);
-      getLastCudaError("PropellerBC execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF27( real* DC,
-                        real* DF,
-                        unsigned int* neighborCX,
-                        unsigned int* neighborCY,
-                        unsigned int* neighborCZ,
-                        unsigned int* neighborFX,
-                        unsigned int* neighborFY,
-                        unsigned int* neighborFZ,
-                        unsigned int size_MatC,
-                        unsigned int size_MatF,
-                        bool isEvenTimestep,
-                        unsigned int* posCSWB,
-                        unsigned int* posFSWB,
-                        unsigned int kCF,
-                        real omCoarse,
-                        real omFine,
-                        real nu,
-                        unsigned int nxC,
-                        unsigned int nyC,
-                        unsigned int nxF,
-                        unsigned int nyF,
-                        unsigned int numberOfThreads)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-   
-      scaleCF27<<< grid.grid, grid.threads >>> ( DC,
-                                             DF,
-                                             neighborCX,
-                                             neighborCY,
-                                             neighborCZ,
-                                             neighborFX,
-                                             neighborFY,
-                                             neighborFZ,
-                                             size_MatC,
-                                             size_MatF,
-                                             isEvenTimestep,
-                                             posCSWB,
-                                             posFSWB,
-                                             kCF,
-                                             omCoarse,
-                                             omFine,
-                                             nu,
-                                             nxC,
-                                             nyC,
-                                             nxF,
-                                             nyF);
-      getLastCudaError("scaleCF27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCFEff27(real* DC,
-                             real* DF,
-                             unsigned int* neighborCX,
-                             unsigned int* neighborCY,
-                             unsigned int* neighborCZ,
-                             unsigned int* neighborFX,
-                             unsigned int* neighborFY,
-                             unsigned int* neighborFZ,
-                             unsigned int size_MatC,
-                             unsigned int size_MatF,
-                             bool isEvenTimestep,
-                             unsigned int* posCSWB,
-                             unsigned int* posFSWB,
-                             unsigned int kCF,
-                             real omCoarse,
-                             real omFine,
-                             real nu,
-                             unsigned int nxC,
-                             unsigned int nyC,
-                             unsigned int nxF,
-                             unsigned int nyF,
-                             unsigned int numberOfThreads,
-                             OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCFEff27<<< grid.grid, grid.threads >>> ( DC,
-                                                DF,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posCSWB,
-                                                posFSWB,
-                                                kCF,
-                                                omCoarse,
-                                                omFine,
-                                                nu,
-                                                nxC,
-                                                nyC,
-                                                nxF,
-                                                nyF,
-                                                offCF);
-      getLastCudaError("scaleCFEff27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCFLast27(real* DC,
-                              real* DF,
-                              unsigned int* neighborCX,
-                              unsigned int* neighborCY,
-                              unsigned int* neighborCZ,
-                              unsigned int* neighborFX,
-                              unsigned int* neighborFY,
-                              unsigned int* neighborFZ,
-                              unsigned int size_MatC,
-                              unsigned int size_MatF,
-                              bool isEvenTimestep,
-                              unsigned int* posCSWB,
-                              unsigned int* posFSWB,
-                              unsigned int kCF,
-                              real omCoarse,
-                              real omFine,
-                              real nu,
-                              unsigned int nxC,
-                              unsigned int nyC,
-                              unsigned int nxF,
-                              unsigned int nyF,
-                              unsigned int numberOfThreads,
-                              OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCFLast27<<< grid.grid, grid.threads >>> (DC,
-                                                DF,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posCSWB,
-                                                posFSWB,
-                                                kCF,
-                                                omCoarse,
-                                                omFine,
-                                                nu,
-                                                nxC,
-                                                nyC,
-                                                nxF,
-                                                nyF,
-                                                offCF);
-      getLastCudaError("scaleCFLast27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCFpress27(  real* DC,
-                                 real* DF,
-                                 unsigned int* neighborCX,
-                                 unsigned int* neighborCY,
-                                 unsigned int* neighborCZ,
-                                 unsigned int* neighborFX,
-                                 unsigned int* neighborFY,
-                                 unsigned int* neighborFZ,
-                                 unsigned int size_MatC,
-                                 unsigned int size_MatF,
-                                 bool isEvenTimestep,
-                                 unsigned int* posCSWB,
-                                 unsigned int* posFSWB,
-                                 unsigned int kCF,
-                                 real omCoarse,
-                                 real omFine,
-                                 real nu,
-                                 unsigned int nxC,
-                                 unsigned int nyC,
-                                 unsigned int nxF,
-                                 unsigned int nyF,
-                                 unsigned int numberOfThreads,
-                                 OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCFpress27<<< grid.grid, grid.threads >>>(DC,
-                                                DF,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posCSWB,
-                                                posFSWB,
-                                                kCF,
-                                                omCoarse,
-                                                omFine,
-                                                nu,
-                                                nxC,
-                                                nyC,
-                                                nxF,
-                                                nyF,
-                                                offCF);
-      getLastCudaError("scaleCFpress27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF_Fix_27(  real* DC,
-                                 real* DF,
-                                 unsigned int* neighborCX,
-                                 unsigned int* neighborCY,
-                                 unsigned int* neighborCZ,
-                                 unsigned int* neighborFX,
-                                 unsigned int* neighborFY,
-                                 unsigned int* neighborFZ,
-                                 unsigned int size_MatC,
-                                 unsigned int size_MatF,
-                                 bool isEvenTimestep,
-                                 unsigned int* posCSWB,
-                                 unsigned int* posFSWB,
-                                 unsigned int kCF,
-                                 real omCoarse,
-                                 real omFine,
-                                 real nu,
-                                 unsigned int nxC,
-                                 unsigned int nyC,
-                                 unsigned int nxF,
-                                 unsigned int nyF,
-                                 unsigned int numberOfThreads,
-                                 OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCF_Fix_27<<< grid.grid, grid.threads >>>(DC,
-                                                DF,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posCSWB,
-                                                posFSWB,
-                                                kCF,
-                                                omCoarse,
-                                                omFine,
-                                                nu,
-                                                nxC,
-                                                nyC,
-                                                nxF,
-                                                nyF,
-                                                offCF);
-      getLastCudaError("scaleCF_Fix_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF_Fix_comp_27( real* DC,
-									 real* DF,
-									 unsigned int* neighborCX,
-									 unsigned int* neighborCY,
-									 unsigned int* neighborCZ,
-									 unsigned int* neighborFX,
-									 unsigned int* neighborFY,
-									 unsigned int* neighborFZ,
-									 unsigned int size_MatC,
-									 unsigned int size_MatF,
-									 bool isEvenTimestep,
-									 unsigned int* posCSWB,
-									 unsigned int* posFSWB,
-									 unsigned int kCF,
-									 real omCoarse,
-									 real omFine,
-									 real nu,
-									 unsigned int nxC,
-									 unsigned int nyC,
-									 unsigned int nxF,
-									 unsigned int nyF,
-									 unsigned int numberOfThreads,
-									 OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCF_Fix_comp_27<<< grid.grid, grid.threads >>>(   DC,
-														DF,
-														neighborCX,
-														neighborCY,
-														neighborCZ,
-														neighborFX,
-														neighborFY,
-														neighborFZ,
-														size_MatC,
-														size_MatF,
-														isEvenTimestep,
-														posCSWB,
-														posFSWB,
-														kCF,
-														omCoarse,
-														omFine,
-														nu,
-														nxC,
-														nyC,
-														nxF,
-														nyF,
-														offCF);
-      getLastCudaError("scaleCF_Fix_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF_0817_comp_27(real* DC,
-									 real* DF,
-									 unsigned int* neighborCX,
-									 unsigned int* neighborCY,
-									 unsigned int* neighborCZ,
-									 unsigned int* neighborFX,
-									 unsigned int* neighborFY,
-									 unsigned int* neighborFZ,
-									 unsigned int size_MatC,
-									 unsigned int size_MatF,
-									 bool isEvenTimestep,
-									 unsigned int* posCSWB,
-									 unsigned int* posFSWB,
-									 unsigned int kCF,
-									 real omCoarse,
-									 real omFine,
-									 real nu,
-									 unsigned int nxC,
-									 unsigned int nyC,
-									 unsigned int nxF,
-									 unsigned int nyF,
-									 unsigned int numberOfThreads,
-									 OffCF offCF,
-                            CUstream_st *stream)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCF_0817_comp_27<<< grid.grid, grid.threads, 0, stream >>>(  DC,
-														DF,
-														neighborCX,
-														neighborCY,
-														neighborCZ,
-														neighborFX,
-														neighborFY,
-														neighborFZ,
-														size_MatC,
-														size_MatF,
-														isEvenTimestep,
-														posCSWB,
-														posFSWB,
-														kCF,
-														omCoarse,
-														omFine,
-														nu,
-														nxC,
-														nyC,
-														nxF,
-														nyF,
-														offCF);
-      getLastCudaError("scaleCF_0817_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF_comp_D3Q27F3_2018(real* DC,
-										  real* DF,
-										  real* G6,
-										  unsigned int* neighborCX,
-										  unsigned int* neighborCY,
-										  unsigned int* neighborCZ,
-										  unsigned int* neighborFX,
-										  unsigned int* neighborFY,
-										  unsigned int* neighborFZ,
-										  unsigned int size_MatC,
-										  unsigned int size_MatF,
-										  bool isEvenTimestep,
-										  unsigned int* posCSWB,
-										  unsigned int* posFSWB,
-										  unsigned int kCF,
-										  real omCoarse,
-										  real omFine,
-										  real nu,
-										  unsigned int nxC,
-										  unsigned int nyC,
-										  unsigned int nxF,
-										  unsigned int nyF,
-										  unsigned int numberOfThreads,
-										  OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCF_comp_D3Q27F3_2018 <<< grid.grid, grid.threads >>>(DC,
-															DF,
-															G6,
-															neighborCX,
-															neighborCY,
-															neighborCZ,
-															neighborFX,
-															neighborFY,
-															neighborFZ,
-															size_MatC,
-															size_MatF,
-															isEvenTimestep,
-															posCSWB,
-															posFSWB,
-															kCF,
-															omCoarse,
-															omFine,
-															nu,
-															nxC,
-															nyC,
-															nxF,
-															nyF,
-															offCF);
-      getLastCudaError("scaleCF_comp_D3Q27F3_2018 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF_comp_D3Q27F3(real* DC,
-									 real* DF,
-									 real* G6,
-									 unsigned int* neighborCX,
-									 unsigned int* neighborCY,
-									 unsigned int* neighborCZ,
-									 unsigned int* neighborFX,
-									 unsigned int* neighborFY,
-									 unsigned int* neighborFZ,
-									 unsigned int size_MatC,
-									 unsigned int size_MatF,
-									 bool isEvenTimestep,
-									 unsigned int* posCSWB,
-									 unsigned int* posFSWB,
-									 unsigned int kCF,
-									 real omCoarse,
-									 real omFine,
-									 real nu,
-									 unsigned int nxC,
-									 unsigned int nyC,
-									 unsigned int nxF,
-									 unsigned int nyF,
-									 unsigned int numberOfThreads,
-									 OffCF offCF,
-                            CUstream_st *stream)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCF_comp_D3Q27F3 <<< grid.grid, grid.threads, 0, stream >>>( DC,
-														DF,
-														G6,
-														neighborCX,
-														neighborCY,
-														neighborCZ,
-														neighborFX,
-														neighborFY,
-														neighborFZ,
-														size_MatC,
-														size_MatF,
-														isEvenTimestep,
-														posCSWB,
-														posFSWB,
-														kCF,
-														omCoarse,
-														omFine,
-														nu,
-														nxC,
-														nyC,
-														nxF,
-														nyF,
-														offCF);
-      getLastCudaError("scaleCF_comp_D3Q27F3 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF_staggered_time_comp_27(  real* DC,
-												 real* DF,
-												 unsigned int* neighborCX,
-												 unsigned int* neighborCY,
-												 unsigned int* neighborCZ,
-												 unsigned int* neighborFX,
-												 unsigned int* neighborFY,
-												 unsigned int* neighborFZ,
-												 unsigned int size_MatC,
-												 unsigned int size_MatF,
-												 bool isEvenTimestep,
-												 unsigned int* posCSWB,
-												 unsigned int* posFSWB,
-												 unsigned int kCF,
-												 real omCoarse,
-												 real omFine,
-												 real nu,
-												 unsigned int nxC,
-												 unsigned int nyC,
-												 unsigned int nxF,
-												 unsigned int nyF,
-												 unsigned int numberOfThreads,
-												 OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCF_staggered_time_comp_27<<< grid.grid, grid.threads >>>(    DC,
-																	DF,
-																	neighborCX,
-																	neighborCY,
-																	neighborCZ,
-																	neighborFX,
-																	neighborFY,
-																	neighborFZ,
-																	size_MatC,
-																	size_MatF,
-																	isEvenTimestep,
-																	posCSWB,
-																	posFSWB,
-																	kCF,
-																	omCoarse,
-																	omFine,
-																	nu,
-																	nxC,
-																	nyC,
-																	nxF,
-																	nyF,
-																	offCF);
-      getLastCudaError("scaleCF_Fix_27 execution failed");
+                                QforPrecursorBoundaryConditions* boundaryCondition,
+                                real timeRatio,
+                                real velocityRatio)
+{
+
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
+
+    QPrecursorDeviceDistributions<<< grid.grid, grid.threads >>>(
+        boundaryCondition->k,
+        boundaryCondition->q27[0],
+        boundaryCondition->sizeQ,
+        boundaryCondition->numberOfBCnodes,
+        boundaryCondition->numberOfPrecursorNodes,
+        parameterDevice->distributions.f[0],
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        boundaryCondition->planeNeighbor0PP,
+        boundaryCondition->planeNeighbor0PM,
+        boundaryCondition->planeNeighbor0MP,
+        boundaryCondition->planeNeighbor0MM,
+        boundaryCondition->weights0PP,
+        boundaryCondition->weights0PM,
+        boundaryCondition->weights0MP,
+        boundaryCondition->weights0MM,
+        boundaryCondition->last,
+        boundaryCondition->current,
+        timeRatio,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QPrecursorDeviceCompZeroPress execution failed");
+
+}
+//////////////////////////////////////////////////////////////////////////
+extern "C" void PropVelo(
+    unsigned int numberOfThreads,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* rho,
+    real* ux,
+    real* uy,
+    real* uz,
+    int* k_Q,
+    unsigned int size_Prop,
+    unsigned long long numberOfLBnodes,
+    unsigned int* bcMatD,
+    real* DD,
+    bool EvenOrOdd)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Prop);
+
+    PropellerBC<<< grid.grid, grid.threads >>>(
+        neighborX,
+        neighborY,
+        neighborZ,
+        rho,
+        ux,
+        uy,
+        uz,
+        k_Q,
+        size_Prop,
+        numberOfLBnodes,
+        bcMatD,
+        DD,
+        EvenOrOdd);
+    getLastCudaError("PropellerBC execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF);
+    getLastCudaError("scaleCF27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCFEff27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCFEff27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCFEff27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCFLast27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCFLast27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCFLast27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCFpress27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCFpress27<<< grid.grid, grid.threads >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCFpress27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF_Fix_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF_Fix_27<<< grid.grid, grid.threads >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCF_Fix_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF_Fix_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF_Fix_comp_27<<< grid.grid, grid.threads >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCF_Fix_comp_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF_0817_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF,
+    CUstream_st *stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF_0817_comp_27<<< grid.grid, grid.threads, 0, stream >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCF_0817_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF_comp_D3Q27F3_2018(
+    real* DC,
+    real* DF,
+    real* G6,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF_comp_D3Q27F3_2018 <<< grid.grid, grid.threads >>>(
+        DC,
+        DF,
+        G6,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCF_comp_D3Q27F3_2018 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF_comp_D3Q27F3(
+    real* DC,
+    real* DF,
+    real* G6,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF,
+    CUstream_st *stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF_comp_D3Q27F3 <<< grid.grid, grid.threads, 0, stream >>>(
+        DC,
+        DF,
+        G6,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCF_comp_D3Q27F3 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF_staggered_time_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF_staggered_time_comp_27<<< grid.grid, grid.threads >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCF_staggered_time_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void ScaleCF_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF& offsetCF, CUstream_st *stream)
 {
-   dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellCF->kCF);
-   dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
-
-   scaleCF_RhoSq_comp_27<<<grid, threads, 0, stream>>>(
-      parameterDeviceC->distributions.f[0],
-      parameterDeviceF->distributions.f[0],
-      parameterDeviceC->neighborX,
-      parameterDeviceC->neighborY,
-      parameterDeviceC->neighborZ,
-      parameterDeviceF->neighborX,
-      parameterDeviceF->neighborY,
-      parameterDeviceF->neighborZ,
-      parameterDeviceC->numberOfNodes,
-      parameterDeviceF->numberOfNodes,
-      parameterDeviceC->isEvenTimestep,
-      icellCF->ICellCFC,
-      icellCF->ICellCFF,
-      icellCF->kCF,
-      parameterDeviceC->omega,
-      parameterDeviceF->omega,
-      parameterDeviceC->vis,
-      parameterDeviceC->nx,
-      parameterDeviceC->ny,
-      parameterDeviceF->nx,
-      parameterDeviceF->ny,
-      offsetCF);
-   getLastCudaError("scaleCF_RhoSq_27 execution failed");
-}
-
-void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF& offsetCF, CUstream_st *stream)
-{
-   dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellCF->kCF);
-   dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
-
-   scaleCF_compressible<<<grid, threads, 0, stream>>>(
-      parameterDeviceC->distributions.f[0],
-      parameterDeviceF->distributions.f[0],
-      parameterDeviceC->neighborX,
-      parameterDeviceC->neighborY,
-      parameterDeviceC->neighborZ,
-      parameterDeviceF->neighborX,
-      parameterDeviceF->neighborY,
-      parameterDeviceF->neighborZ,
-      parameterDeviceC->numberOfNodes,
-      parameterDeviceF->numberOfNodes,
-      parameterDeviceC->isEvenTimestep,
-      icellCF->ICellCFC,
-      icellCF->ICellCFF,
-      icellCF->kCF,
-      parameterDeviceC->omega,
-      parameterDeviceF->omega,
-      offsetCF);
-
-   getLastCudaError("scaleCF_compressible execution failed");
-}
-
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF_RhoSq_3rdMom_comp_27(real* DC,
-											 real* DF,
-											 unsigned int* neighborCX,
-											 unsigned int* neighborCY,
-											 unsigned int* neighborCZ,
-											 unsigned int* neighborFX,
-											 unsigned int* neighborFY,
-											 unsigned int* neighborFZ,
-											 unsigned int size_MatC,
-											 unsigned int size_MatF,
-											 bool isEvenTimestep,
-											 unsigned int* posCSWB,
-											 unsigned int* posFSWB,
-											 unsigned int kCF,
-											 real omCoarse,
-											 real omFine,
-											 real nu,
-											 unsigned int nxC,
-											 unsigned int nyC,
-											 unsigned int nxF,
-											 unsigned int nyF,
-											 unsigned int numberOfThreads,
-											 OffCF offCF,
-                                  CUstream_st *stream)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCF_RhoSq_3rdMom_comp_27<<< grid.grid, grid.threads, 0, stream >>>(  DC,
-																DF,
-																neighborCX,
-																neighborCY,
-																neighborCZ,
-																neighborFX,
-																neighborFY,
-																neighborFZ,
-																size_MatC,
-																size_MatF,
-																isEvenTimestep,
-																posCSWB,
-																posFSWB,
-																kCF,
-																omCoarse,
-																omFine,
-																nu,
-																nxC,
-																nyC,
-																nxF,
-																nyF,
-																offCF);
-      getLastCudaError("scaleCF_RhoSq_3rdMom_comp_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF_AA2016_comp_27(real* DC,
-									   real* DF,
-									   unsigned int* neighborCX,
-									   unsigned int* neighborCY,
-									   unsigned int* neighborCZ,
-									   unsigned int* neighborFX,
-									   unsigned int* neighborFY,
-									   unsigned int* neighborFZ,
-									   unsigned int size_MatC,
-									   unsigned int size_MatF,
-									   bool isEvenTimestep,
-									   unsigned int* posCSWB,
-									   unsigned int* posFSWB,
-									   unsigned int kCF,
-									   real omCoarse,
-									   real omFine,
-									   real nu,
-									   unsigned int nxC,
-									   unsigned int nyC,
-									   unsigned int nxF,
-									   unsigned int nyF,
-									   unsigned int numberOfThreads,
-									   OffCF offCF,
-                              CUstream_st *stream)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCF_AA2016_comp_27<<< grid.grid, grid.threads, 0, stream >>>(DC,
-														DF,
-														neighborCX,
-														neighborCY,
-														neighborCZ,
-														neighborFX,
-														neighborFY,
-														neighborFZ,
-														size_MatC,
-														size_MatF,
-														isEvenTimestep,
-														posCSWB,
-														posFSWB,
-														kCF,
-														omCoarse,
-														omFine,
-														nu,
-														nxC,
-														nyC,
-														nxF,
-														nyF,
-														offCF);
-      getLastCudaError("scaleCF_AA2016_comp_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCF_NSPress_27(  real* DC,
-									 real* DF,
-									 unsigned int* neighborCX,
-									 unsigned int* neighborCY,
-									 unsigned int* neighborCZ,
-									 unsigned int* neighborFX,
-									 unsigned int* neighborFY,
-									 unsigned int* neighborFZ,
-									 unsigned int size_MatC,
-									 unsigned int size_MatF,
-									 bool isEvenTimestep,
-									 unsigned int* posCSWB,
-									 unsigned int* posFSWB,
-									 unsigned int kCF,
-									 real omCoarse,
-									 real omFine,
-									 real nu,
-									 unsigned int nxC,
-									 unsigned int nyC,
-									 unsigned int nxF,
-									 unsigned int nyF,
-									 unsigned int numberOfThreads,
-									 OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCF_NSPress_27<<< grid.grid, grid.threads >>>(DC,
-													DF,
-													neighborCX,
-													neighborCY,
-													neighborCZ,
-													neighborFX,
-													neighborFY,
-													neighborFZ,
-													size_MatC,
-													size_MatF,
-													isEvenTimestep,
-													posCSWB,
-													posFSWB,
-													kCF,
-													omCoarse,
-													omFine,
-													nu,
-													nxC,
-													nyC,
-													nxF,
-													nyF,
-													offCF);
-      getLastCudaError("scaleCF_Fix_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCFThSMG7(   real* DC,
-                                 real* DF,
-                                 real* DD7C,
-                                 real* DD7F,
-                                 unsigned int* neighborCX,
-                                 unsigned int* neighborCY,
-                                 unsigned int* neighborCZ,
-                                 unsigned int* neighborFX,
-                                 unsigned int* neighborFY,
-                                 unsigned int* neighborFZ,
-                                 unsigned int size_MatC,
-                                 unsigned int size_MatF,
-                                 bool isEvenTimestep,
-                                 unsigned int* posCSWB,
-                                 unsigned int* posFSWB,
-                                 unsigned int kCF,
-                                 real nu,
-                                 real diffusivity_fine,
-                                 unsigned int numberOfThreads,
-                                 OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCFThSMG7<<< grid.grid, grid.threads >>> (DC,
-                                                DF,
-                                                DD7C,
-                                                DD7F,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posCSWB,
-                                                posFSWB,
-                                                kCF,
-                                                nu,
-                                                diffusivity_fine,
-                                                offCF);
-      getLastCudaError("scaleCFThSMG7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCFThS7(  real* DC,
-                              real* DF,
-                              real* DD7C,
-                              real* DD7F,
-                              unsigned int* neighborCX,
-                              unsigned int* neighborCY,
-                              unsigned int* neighborCZ,
-                              unsigned int* neighborFX,
-                              unsigned int* neighborFY,
-                              unsigned int* neighborFZ,
-                              unsigned int size_MatC,
-                              unsigned int size_MatF,
-                              bool isEvenTimestep,
-                              unsigned int* posCSWB,
-                              unsigned int* posFSWB,
-                              unsigned int kCF,
-                              real nu,
-                              real diffusivity_fine,
-                              unsigned int numberOfThreads)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCFThS7<<< grid.grid, grid.threads >>> (  DC,
-                                                DF,
-                                                DD7C,
-                                                DD7F,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posCSWB,
-                                                posFSWB,
-                                                kCF,
-                                                nu,
-                                                diffusivity_fine);
-      getLastCudaError("scaleCFThS7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleCFThS27( real* DC,
-                              real* DF,
-                              real* DD27C,
-                              real* DD27F,
-                              unsigned int* neighborCX,
-                              unsigned int* neighborCY,
-                              unsigned int* neighborCZ,
-                              unsigned int* neighborFX,
-                              unsigned int* neighborFY,
-                              unsigned int* neighborFZ,
-                              unsigned int size_MatC,
-                              unsigned int size_MatF,
-                              bool isEvenTimestep,
-                              unsigned int* posCSWB,
-                              unsigned int* posFSWB,
-                              unsigned int kCF,
-                              real nu,
-                              real diffusivity_fine,
-                              unsigned int numberOfThreads,
-							  OffCF offCF)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
-
-      scaleCFThS27<<< grid.grid, grid.threads >>> ( DC,
-                                                DF,
-                                                DD27C,
-                                                DD27F,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posCSWB,
-                                                posFSWB,
-                                                kCF,
-                                                nu,
-                                                diffusivity_fine,
-										        offCF);
-      getLastCudaError("scaleCFThS27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC27( real* DC,
-                           real* DF,
-                           unsigned int* neighborCX,
-                           unsigned int* neighborCY,
-                           unsigned int* neighborCZ,
-                           unsigned int* neighborFX,
-                           unsigned int* neighborFY,
-                           unsigned int* neighborFZ,
-                           unsigned int size_MatC,
-                           unsigned int size_MatF,
-                           bool isEvenTimestep,
-                           unsigned int* posC,
-                           unsigned int* posFSWB,
-                           unsigned int kFC,
-                           real omCoarse,
-                           real omFine,
-                           real nu,
-                           unsigned int nxC,
-                           unsigned int nyC,
-                           unsigned int nxF,
-                           unsigned int nyF,
-                           unsigned int numberOfThreads)
-{
-   
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFC27<<< grid.grid, grid.threads >>> ( DC,
-                                             DF,
-                                             neighborCX,
-                                             neighborCY,
-                                             neighborCZ,
-                                             neighborFX,
-                                             neighborFY,
-                                             neighborFZ,
-                                             size_MatC,
-                                             size_MatF,
-                                             isEvenTimestep,
-                                             posC,
-                                             posFSWB,
-                                             kFC,
-                                             omCoarse,
-                                             omFine,
-                                             nu,
-                                             nxC,
-                                             nyC,
-                                             nxF,
-                                             nyF);
-      getLastCudaError("scaleFC27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFCEff27(real* DC,
-                             real* DF,
-                             unsigned int* neighborCX,
-                             unsigned int* neighborCY,
-                             unsigned int* neighborCZ,
-                             unsigned int* neighborFX,
-                             unsigned int* neighborFY,
-                             unsigned int* neighborFZ,
-                             unsigned int size_MatC,
-                             unsigned int size_MatF,
-                             bool isEvenTimestep,
-                             unsigned int* posC,
-                             unsigned int* posFSWB,
-                             unsigned int kFC,
-                             real omCoarse,
-                             real omFine,
-                             real nu,
-                             unsigned int nxC,
-                             unsigned int nyC,
-                             unsigned int nxF,
-                             unsigned int nyF,
-                             unsigned int numberOfThreads,
-                             OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFCEff27<<< grid.grid, grid.threads >>> ( DC,
-                                                DF,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posC,
-                                                posFSWB,
-                                                kFC,
-                                                omCoarse,
-                                                omFine,
-                                                nu,
-                                                nxC,
-                                                nyC,
-                                                nxF,
-                                                nyF,
-                                                offFC);
-      getLastCudaError("scaleFCEff27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFCLast27(real* DC,
-                              real* DF,
-                              unsigned int* neighborCX,
-                              unsigned int* neighborCY,
-                              unsigned int* neighborCZ,
-                              unsigned int* neighborFX,
-                              unsigned int* neighborFY,
-                              unsigned int* neighborFZ,
-                              unsigned int size_MatC,
-                              unsigned int size_MatF,
-                              bool isEvenTimestep,
-                              unsigned int* posC,
-                              unsigned int* posFSWB,
-                              unsigned int kFC,
-                              real omCoarse,
-                              real omFine,
-                              real nu,
-                              unsigned int nxC,
-                              unsigned int nyC,
-                              unsigned int nxF,
-                              unsigned int nyF,
-                              unsigned int numberOfThreads,
-                              OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFCLast27<<< grid.grid, grid.threads >>> (DC,
-                                                DF,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posC,
-                                                posFSWB,
-                                                kFC,
-                                                omCoarse,
-                                                omFine,
-                                                nu,
-                                                nxC,
-                                                nyC,
-                                                nxF,
-                                                nyF,
-                                                offFC);
-      getLastCudaError("Kernel execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFCpress27(real* DC,
-                              real* DF,
-                              unsigned int* neighborCX,
-                              unsigned int* neighborCY,
-                              unsigned int* neighborCZ,
-                              unsigned int* neighborFX,
-                              unsigned int* neighborFY,
-                              unsigned int* neighborFZ,
-                              unsigned int size_MatC,
-                              unsigned int size_MatF,
-                              bool isEvenTimestep,
-                              unsigned int* posC,
-                              unsigned int* posFSWB,
-                              unsigned int kFC,
-                              real omCoarse,
-                              real omFine,
-                              real nu,
-                              unsigned int nxC,
-                              unsigned int nyC,
-                              unsigned int nxF,
-                              unsigned int nyF,
-                              unsigned int numberOfThreads,
-                              OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFCpress27<<< grid.grid, grid.threads >>> (  DC,
-                                                   DF,
-                                                   neighborCX,
-                                                   neighborCY,
-                                                   neighborCZ,
-                                                   neighborFX,
-                                                   neighborFY,
-                                                   neighborFZ,
-                                                   size_MatC,
-                                                   size_MatF,
-                                                   isEvenTimestep,
-                                                   posC,
-                                                   posFSWB,
-                                                   kFC,
-                                                   omCoarse,
-                                                   omFine,
-                                                   nu,
-                                                   nxC,
-                                                   nyC,
-                                                   nxF,
-                                                   nyF,
-                                                   offFC);
-      getLastCudaError("scaleFCpress27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_Fix_27(real* DC,
-                              real* DF,
-                              unsigned int* neighborCX,
-                              unsigned int* neighborCY,
-                              unsigned int* neighborCZ,
-                              unsigned int* neighborFX,
-                              unsigned int* neighborFY,
-                              unsigned int* neighborFZ,
-                              unsigned int size_MatC,
-                              unsigned int size_MatF,
-                              bool isEvenTimestep,
-                              unsigned int* posC,
-                              unsigned int* posFSWB,
-                              unsigned int kFC,
-                              real omCoarse,
-                              real omFine,
-                              real nu,
-                              unsigned int nxC,
-                              unsigned int nyC,
-                              unsigned int nxF,
-                              unsigned int nyF,
-                              unsigned int numberOfThreads,
-                              OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFC_Fix_27<<< grid.grid, grid.threads >>> (  DC,
-                                                   DF,
-                                                   neighborCX,
-                                                   neighborCY,
-                                                   neighborCZ,
-                                                   neighborFX,
-                                                   neighborFY,
-                                                   neighborFZ,
-                                                   size_MatC,
-                                                   size_MatF,
-                                                   isEvenTimestep,
-                                                   posC,
-                                                   posFSWB,
-                                                   kFC,
-                                                   omCoarse,
-                                                   omFine,
-                                                   nu,
-                                                   nxC,
-                                                   nyC,
-                                                   nxF,
-                                                   nyF,
-                                                   offFC);
-      getLastCudaError("scaleFC_Fix_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_Fix_comp_27(  real* DC,
-									  real* DF,
-									  unsigned int* neighborCX,
-									  unsigned int* neighborCY,
-									  unsigned int* neighborCZ,
-									  unsigned int* neighborFX,
-									  unsigned int* neighborFY,
-									  unsigned int* neighborFZ,
-									  unsigned int size_MatC,
-									  unsigned int size_MatF,
-									  bool isEvenTimestep,
-									  unsigned int* posC,
-									  unsigned int* posFSWB,
-									  unsigned int kFC,
-									  real omCoarse,
-									  real omFine,
-									  real nu,
-									  unsigned int nxC,
-									  unsigned int nyC,
-									  unsigned int nxF,
-									  unsigned int nyF,
-									  unsigned int numberOfThreads,
-									  OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFC_Fix_comp_27<<< grid.grid, grid.threads >>> ( DC,
-													   DF,
-													   neighborCX,
-													   neighborCY,
-													   neighborCZ,
-													   neighborFX,
-													   neighborFY,
-													   neighborFZ,
-													   size_MatC,
-													   size_MatF,
-													   isEvenTimestep,
-													   posC,
-													   posFSWB,
-													   kFC,
-													   omCoarse,
-													   omFine,
-													   nu,
-													   nxC,
-													   nyC,
-													   nxF,
-													   nyF,
-													   offFC);
-      getLastCudaError("scaleFC_Fix_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_0817_comp_27( real* DC,
-									  real* DF,
-									  unsigned int* neighborCX,
-									  unsigned int* neighborCY,
-									  unsigned int* neighborCZ,
-									  unsigned int* neighborFX,
-									  unsigned int* neighborFY,
-									  unsigned int* neighborFZ,
-									  unsigned int size_MatC,
-									  unsigned int size_MatF,
-									  bool isEvenTimestep,
-									  unsigned int* posC,
-									  unsigned int* posFSWB,
-									  unsigned int kFC,
-									  real omCoarse,
-									  real omFine,
-									  real nu,
-									  unsigned int nxC,
-									  unsigned int nyC,
-									  unsigned int nxF,
-									  unsigned int nyF,
-									  unsigned int numberOfThreads,
-									  OffFC offFC,
-                             CUstream_st *stream)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFC_0817_comp_27<<< grid.grid, grid.threads, 0, stream >>> (DC,
-													   DF,
-													   neighborCX,
-													   neighborCY,
-													   neighborCZ,
-													   neighborFX,
-													   neighborFY,
-													   neighborFZ,
-													   size_MatC,
-													   size_MatF,
-													   isEvenTimestep,
-													   posC,
-													   posFSWB,
-													   kFC,
-													   omCoarse,
-													   omFine,
-													   nu,
-													   nxC,
-													   nyC,
-													   nxF,
-													   nyF,
-													   offFC);
-      getLastCudaError("scaleFC_0817_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_comp_D3Q27F3_2018( real* DC,
-										   real* DF,
-										   real* G6,
-										   unsigned int* neighborCX,
-										   unsigned int* neighborCY,
-										   unsigned int* neighborCZ,
-										   unsigned int* neighborFX,
-										   unsigned int* neighborFY,
-										   unsigned int* neighborFZ,
-										   unsigned int size_MatC,
-										   unsigned int size_MatF,
-										   bool isEvenTimestep,
-										   unsigned int* posC,
-										   unsigned int* posFSWB,
-										   unsigned int kFC,
-										   real omCoarse,
-										   real omFine,
-										   real nu,
-										   unsigned int nxC,
-										   unsigned int nyC,
-										   unsigned int nxF,
-										   unsigned int nyF,
-										   unsigned int numberOfThreads,
-										   OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-     scaleFC_comp_D3Q27F3_2018 <<< grid.grid, grid.threads >>> (DC,
-															DF,
-															G6,
-															neighborCX,
-															neighborCY,
-															neighborCZ,
-															neighborFX,
-															neighborFY,
-															neighborFZ,
-															size_MatC,
-															size_MatF,
-															isEvenTimestep,
-															posC,
-															posFSWB,
-															kFC,
-															omCoarse,
-															omFine,
-															nu,
-															nxC,
-															nyC,
-															nxF,
-															nyF,
-															offFC);
-      getLastCudaError("scaleFC_comp_D3Q27F3_2018 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_comp_D3Q27F3( real* DC,
-									  real* DF,
-									  real* G6,
-									  unsigned int* neighborCX,
-									  unsigned int* neighborCY,
-									  unsigned int* neighborCZ,
-									  unsigned int* neighborFX,
-									  unsigned int* neighborFY,
-									  unsigned int* neighborFZ,
-									  unsigned int size_MatC,
-									  unsigned int size_MatF,
-									  bool isEvenTimestep,
-									  unsigned int* posC,
-									  unsigned int* posFSWB,
-									  unsigned int kFC,
-									  real omCoarse,
-									  real omFine,
-									  real nu,
-									  unsigned int nxC,
-									  unsigned int nyC,
-									  unsigned int nxF,
-									  unsigned int nyF,
-									  unsigned int numberOfThreads,
-									  OffFC offFC,
-                             CUstream_st *stream)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-     scaleFC_comp_D3Q27F3 <<< grid.grid, grid.threads, 0, stream >>> (DC,
-													   DF,
-													   G6,
-													   neighborCX,
-													   neighborCY,
-													   neighborCZ,
-													   neighborFX,
-													   neighborFY,
-													   neighborFZ,
-													   size_MatC,
-													   size_MatF,
-													   isEvenTimestep,
-													   posC,
-													   posFSWB,
-													   kFC,
-													   omCoarse,
-													   omFine,
-													   nu,
-													   nxC,
-													   nyC,
-													   nxF,
-													   nyF,
-													   offFC);
-      getLastCudaError("scaleFC_0817_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_staggered_time_comp_27(   real* DC,
-												  real* DF,
-												  unsigned int* neighborCX,
-												  unsigned int* neighborCY,
-												  unsigned int* neighborCZ,
-												  unsigned int* neighborFX,
-												  unsigned int* neighborFY,
-												  unsigned int* neighborFZ,
-												  unsigned int size_MatC,
-												  unsigned int size_MatF,
-												  bool isEvenTimestep,
-												  unsigned int* posC,
-												  unsigned int* posFSWB,
-												  unsigned int kFC,
-												  real omCoarse,
-												  real omFine,
-												  real nu,
-												  unsigned int nxC,
-												  unsigned int nyC,
-												  unsigned int nxF,
-												  unsigned int nyF,
-												  unsigned int numberOfThreads,
-												  OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFC_staggered_time_comp_27<<< grid.grid, grid.threads >>> (  DC,
-																   DF,
-																   neighborCX,
-																   neighborCY,
-																   neighborCZ,
-																   neighborFX,
-																   neighborFY,
-																   neighborFZ,
-																   size_MatC,
-																   size_MatF,
-																   isEvenTimestep,
-																   posC,
-																   posFSWB,
-																   kFC,
-																   omCoarse,
-																   omFine,
-																   nu,
-																   nxC,
-																   nyC,
-																   nxF,
-																   nyF,
-																   offFC);
-      getLastCudaError("scaleFC_Fix_27 execution failed");
+    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellCF->kCF);
+    dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
+
+    scaleCF_RhoSq_comp_27<<<grid, threads, 0, stream>>>(
+        parameterDeviceC->distributions.f[0],
+        parameterDeviceF->distributions.f[0],
+        parameterDeviceC->neighborX,
+        parameterDeviceC->neighborY,
+        parameterDeviceC->neighborZ,
+        parameterDeviceF->neighborX,
+        parameterDeviceF->neighborY,
+        parameterDeviceF->neighborZ,
+        parameterDeviceC->numberOfNodes,
+        parameterDeviceF->numberOfNodes,
+        parameterDeviceC->isEvenTimestep,
+        icellCF->ICellCFC,
+        icellCF->ICellCFF,
+        icellCF->kCF,
+        parameterDeviceC->omega,
+        parameterDeviceF->omega,
+        parameterDeviceC->vis,
+        parameterDeviceC->nx,
+        parameterDeviceC->ny,
+        parameterDeviceF->nx,
+        parameterDeviceF->ny,
+        offsetCF);
+    getLastCudaError("scaleCF_RhoSq_27 execution failed");
+}
+
+template<bool hasTurbulentViscosity> void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF& offsetCF, CUstream_st *stream)
+{
+    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellCF->kCF);
+    dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
+
+    if(hasTurbulentViscosity)
+    {
+        scaleCF_compressible<true><<<grid, threads, 0, stream>>>(
+            parameterDeviceC->distributions.f[0],
+            parameterDeviceF->distributions.f[0],
+            parameterDeviceC->neighborX,
+            parameterDeviceC->neighborY,
+            parameterDeviceC->neighborZ,
+            parameterDeviceF->neighborX,
+            parameterDeviceF->neighborY,
+            parameterDeviceF->neighborZ,
+            parameterDeviceC->numberOfNodes,
+            parameterDeviceF->numberOfNodes,
+            parameterDeviceC->isEvenTimestep,
+            icellCF->ICellCFC,
+            icellCF->ICellCFF,
+            icellCF->kCF,
+            parameterDeviceC->omega,
+            parameterDeviceF->omega,
+            parameterDeviceC->turbViscosity,
+            parameterDeviceF->turbViscosity,
+            offsetCF);
+    }
+    else
+    {
+        scaleCF_compressible<false><<<grid, threads, 0, stream>>>(
+            parameterDeviceC->distributions.f[0],
+            parameterDeviceF->distributions.f[0],
+            parameterDeviceC->neighborX,
+            parameterDeviceC->neighborY,
+            parameterDeviceC->neighborZ,
+            parameterDeviceF->neighborX,
+            parameterDeviceF->neighborY,
+            parameterDeviceF->neighborZ,
+            parameterDeviceC->numberOfNodes,
+            parameterDeviceF->numberOfNodes,
+            parameterDeviceC->isEvenTimestep,
+            icellCF->ICellCFC,
+            icellCF->ICellCFF,
+            icellCF->kCF,
+            parameterDeviceC->omega,
+            parameterDeviceF->omega,
+            parameterDeviceC->turbViscosity,
+            parameterDeviceF->turbViscosity,
+            offsetCF);
+    }
+
+    getLastCudaError("scaleCF_compressible execution failed");
+}
+template void ScaleCF_compressible<true>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF& offsetCF, CUstream_st *stream);
+template void ScaleCF_compressible<false>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellCF * icellCF, OffCF& offsetCF, CUstream_st *stream);
+
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF_RhoSq_3rdMom_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF,
+    CUstream_st *stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF_RhoSq_3rdMom_comp_27<<< grid.grid, grid.threads, 0, stream >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCF_RhoSq_3rdMom_comp_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF_AA2016_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF,
+    CUstream_st *stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF_AA2016_comp_27<<< grid.grid, grid.threads, 0, stream >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCF_AA2016_comp_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCF_NSPress_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCF_NSPress_27<<< grid.grid, grid.threads >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offCF);
+    getLastCudaError("scaleCF_NSPress_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCFThSMG7(
+    real* DC,
+    real* DF,
+    real* DD7C,
+    real* DD7F,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real nu,
+    real diffusivity_fine,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCFThSMG7<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        DD7C,
+        DD7F,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        nu,
+        diffusivity_fine,
+        offCF);
+    getLastCudaError("scaleCFThSMG7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCFThS7(
+    real* DC,
+    real* DF,
+    real* DD7C,
+    real* DD7F,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real nu,
+    real diffusivity_fine,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCFThS7<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        DD7C,
+        DD7F,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        nu,
+        diffusivity_fine);
+    getLastCudaError("scaleCFThS7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleCFThS27(
+    real* DC,
+    real* DF,
+    real* DD27C,
+    real* DD27F,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posCSWB,
+    unsigned int* posFSWB,
+    unsigned int kCF,
+    real nu,
+    real diffusivity_fine,
+    unsigned int numberOfThreads,
+    OffCF offCF)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF);
+
+    scaleCFThS27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        DD27C,
+        DD27F,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posCSWB,
+        posFSWB,
+        kCF,
+        nu,
+        diffusivity_fine,
+        offCF);
+    getLastCudaError("scaleCFThS27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF);
+    getLastCudaError("scaleFC27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFCEff27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFCEff27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFCEff27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFCLast27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFCLast27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("Kernel execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFCpress27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFCpress27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFCpress27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC_Fix_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC_Fix_27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFC_Fix_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC_Fix_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC_Fix_comp_27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFC_Fix_comp_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC_0817_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC,
+    CUstream_st *stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC_0817_comp_27<<< grid.grid, grid.threads, 0, stream >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFC_0817_comp_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC_comp_D3Q27F3_2018(
+    real* DC,
+    real* DF,
+    real* G6,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC_comp_D3Q27F3_2018 <<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        G6,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFC_comp_D3Q27F3_2018 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC_comp_D3Q27F3(
+    real* DC,
+    real* DF,
+    real* G6,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC,
+    CUstream_st *stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC_comp_D3Q27F3 <<< grid.grid, grid.threads, 0, stream >>> (
+        DC,
+        DF,
+        G6,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFC_comp_D3Q27F3 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC_staggered_time_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC_staggered_time_comp_27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFC_staggered_time_comp_27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void ScaleFC_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC &offsetFC, CUstream_st *stream)
 {
-   dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellFC->kFC);
-   dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
-
-   scaleFC_RhoSq_comp_27<<<grid, threads, 0, stream>>>(
-      parameterDeviceC->distributions.f[0],
-      parameterDeviceF->distributions.f[0],
-      parameterDeviceC->neighborX,
-      parameterDeviceC->neighborY,
-      parameterDeviceC->neighborZ,
-      parameterDeviceF->neighborX,
-      parameterDeviceF->neighborY,
-      parameterDeviceF->neighborZ,
-      parameterDeviceC->numberOfNodes,
-      parameterDeviceF->numberOfNodes,
-      parameterDeviceC->isEvenTimestep,
-      icellFC->ICellFCC,
-      icellFC->ICellFCF,
-      icellFC->kFC,
-      parameterDeviceC->omega,
-      parameterDeviceF->omega,
-      parameterDeviceC->vis,
-      parameterDeviceC->nx,
-      parameterDeviceC->ny,
-      parameterDeviceF->nx,
-      parameterDeviceF->ny,
-      offsetFC);
-   getLastCudaError("scaleFC_RhoSq_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC &offsetFC, CUstream_st *stream)
-{
-   dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellFC->kFC);
-   dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
-
-   scaleFC_compressible<<<grid, threads, 0, stream>>>(
-      parameterDeviceC->distributions.f[0],
-      parameterDeviceF->distributions.f[0],
-      parameterDeviceC->neighborX,
-      parameterDeviceC->neighborY,
-      parameterDeviceC->neighborZ,
-      parameterDeviceF->neighborX,
-      parameterDeviceF->neighborY,
-      parameterDeviceF->neighborZ,
-      parameterDeviceC->numberOfNodes,
-      parameterDeviceF->numberOfNodes,
-      parameterDeviceC->isEvenTimestep,
-      icellFC->ICellFCC,
-      icellFC->ICellFCF,
-      icellFC->kFC,
-      parameterDeviceC->omega,
-      parameterDeviceF->omega,
-      offsetFC);
-   getLastCudaError("scaleFC_compressible execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_RhoSq_3rdMom_comp_27( real* DC,
-											  real* DF,
-											  unsigned int* neighborCX,
-											  unsigned int* neighborCY,
-											  unsigned int* neighborCZ,
-											  unsigned int* neighborFX,
-											  unsigned int* neighborFY,
-											  unsigned int* neighborFZ,
-											  unsigned int size_MatC,
-											  unsigned int size_MatF,
-											  bool isEvenTimestep,
-											  unsigned int* posC,
-											  unsigned int* posFSWB,
-											  unsigned int kFC,
-											  real omCoarse,
-											  real omFine,
-											  real nu,
-											  unsigned int nxC,
-											  unsigned int nyC,
-											  unsigned int nxF,
-											  unsigned int nyF,
-											  unsigned int numberOfThreads,
-											  OffFC offFC,
-                                   CUstream_st *stream)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFC_RhoSq_3rdMom_comp_27<<< grid.grid, grid.threads, 0, stream >>>(DC,
-															  DF,
-															  neighborCX,
-															  neighborCY,
-															  neighborCZ,
-															  neighborFX,
-															  neighborFY,
-															  neighborFZ,
-															  size_MatC,
-															  size_MatF,
-															  isEvenTimestep,
-															  posC,
-															  posFSWB,
-															  kFC,
-															  omCoarse,
-															  omFine,
-															  nu,
-															  nxC,
-															  nyC,
-															  nxF,
-															  nyF,
-															  offFC);
-      getLastCudaError("scaleFC_RhoSq_3rdMom_comp_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_AA2016_comp_27( real* DC,
-										real* DF,
-										unsigned int* neighborCX,
-										unsigned int* neighborCY,
-										unsigned int* neighborCZ,
-										unsigned int* neighborFX,
-										unsigned int* neighborFY,
-										unsigned int* neighborFZ,
-										unsigned int size_MatC,
-										unsigned int size_MatF,
-										bool isEvenTimestep,
-										unsigned int* posC,
-										unsigned int* posFSWB,
-										unsigned int kFC,
-										real omCoarse,
-										real omFine,
-										real nu,
-										unsigned int nxC,
-										unsigned int nyC,
-										unsigned int nxF,
-										unsigned int nyF,
-										unsigned int numberOfThreads,
-										OffFC offFC,
-                              CUstream_st *stream)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFC_AA2016_comp_27<<< grid.grid, grid.threads, 0, stream >>>(DC,
-														DF,
-														neighborCX,
-														neighborCY,
-														neighborCZ,
-														neighborFX,
-														neighborFY,
-														neighborFZ,
-														size_MatC,
-														size_MatF,
-														isEvenTimestep,
-														posC,
-														posFSWB,
-														kFC,
-														omCoarse,
-														omFine,
-														nu,
-														nxC,
-														nyC,
-														nxF,
-														nyF,
-														offFC);
-      getLastCudaError("scaleFC_AA2016_comp_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFC_NSPress_27(real* DC,
-								  real* DF,
-								  unsigned int* neighborCX,
-								  unsigned int* neighborCY,
-								  unsigned int* neighborCZ,
-								  unsigned int* neighborFX,
-								  unsigned int* neighborFY,
-								  unsigned int* neighborFZ,
-								  unsigned int size_MatC,
-								  unsigned int size_MatF,
-								  bool isEvenTimestep,
-								  unsigned int* posC,
-								  unsigned int* posFSWB,
-								  unsigned int kFC,
-								  real omCoarse,
-								  real omFine,
-								  real nu,
-								  unsigned int nxC,
-								  unsigned int nyC,
-								  unsigned int nxF,
-								  unsigned int nyF,
-								  unsigned int numberOfThreads,
-								  OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFC_NSPress_27<<< grid.grid, grid.threads >>> (  DC,
-													   DF,
-													   neighborCX,
-													   neighborCY,
-													   neighborCZ,
-													   neighborFX,
-													   neighborFY,
-													   neighborFZ,
-													   size_MatC,
-													   size_MatF,
-													   isEvenTimestep,
-													   posC,
-													   posFSWB,
-													   kFC,
-													   omCoarse,
-													   omFine,
-													   nu,
-													   nxC,
-													   nyC,
-													   nxF,
-													   nyF,
-													   offFC);
-      getLastCudaError("scaleFC_Fix_27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFCThSMG7(real* DC,
-                              real* DF,
-                              real* DD7C,
-                              real* DD7F,
-                              unsigned int* neighborCX,
-                              unsigned int* neighborCY,
-                              unsigned int* neighborCZ,
-                              unsigned int* neighborFX,
-                              unsigned int* neighborFY,
-                              unsigned int* neighborFZ,
-                              unsigned int size_MatC,
-                              unsigned int size_MatF,
-                              bool isEvenTimestep,
-                              unsigned int* posC,
-                              unsigned int* posFSWB,
-                              unsigned int kFC,
-                              real nu,
-                              real diffusivity_coarse,
-                              unsigned int numberOfThreads,
-                              OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFCThSMG7<<< grid.grid, grid.threads >>>( DC,
-                                                DF,
-                                                DD7C,
-                                                DD7F,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posC,
-                                                posFSWB,
-                                                kFC,
-                                                nu,
-                                                diffusivity_coarse,
-                                                offFC);
-      getLastCudaError("scaleFCThSMG7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFCThS7(  real* DC,
-                              real* DF,
-                              real* DD7C,
-                              real* DD7F,
-                              unsigned int* neighborCX,
-                              unsigned int* neighborCY,
-                              unsigned int* neighborCZ,
-                              unsigned int* neighborFX,
-                              unsigned int* neighborFY,
-                              unsigned int* neighborFZ,
-                              unsigned int size_MatC,
-                              unsigned int size_MatF,
-                              bool isEvenTimestep,
-                              unsigned int* posC,
-                              unsigned int* posFSWB,
-                              unsigned int kFC,
-                              real nu,
-                              real diffusivity_coarse,
-                              unsigned int numberOfThreads)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFCThS7<<< grid.grid, grid.threads >>>(DC,
-                                             DF,
-                                             DD7C,
-                                             DD7F,
-                                             neighborCX,
-                                             neighborCY,
-                                             neighborCZ,
-                                             neighborFX,
-                                             neighborFY,
-                                             neighborFZ,
-                                             size_MatC,
-                                             size_MatF,
-                                             isEvenTimestep,
-                                             posC,
-                                             posFSWB,
-                                             kFC,
-                                             nu,
-                                             diffusivity_coarse);
-      getLastCudaError("scaleFCThS7 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void ScaleFCThS27( real* DC,
-                              real* DF,
-                              real* DD27C,
-                              real* DD27F,
-                              unsigned int* neighborCX,
-                              unsigned int* neighborCY,
-                              unsigned int* neighborCZ,
-                              unsigned int* neighborFX,
-                              unsigned int* neighborFY,
-                              unsigned int* neighborFZ,
-                              unsigned int size_MatC,
-                              unsigned int size_MatF,
-                              bool isEvenTimestep,
-                              unsigned int* posC,
-                              unsigned int* posFSWB,
-                              unsigned int kFC,
-                              real nu,
-                              real diffusivity_coarse,
-                              unsigned int numberOfThreads,
-							  OffFC offFC)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
-
-      scaleFCThS27<<< grid.grid, grid.threads >>>(  DC,
-                                                DF,
-                                                DD27C,
-                                                DD27F,
-                                                neighborCX,
-                                                neighborCY,
-                                                neighborCZ,
-                                                neighborFX,
-                                                neighborFY,
-                                                neighborFZ,
-                                                size_MatC,
-                                                size_MatF,
-                                                isEvenTimestep,
-                                                posC,
-                                                posFSWB,
-                                                kFC,
-                                                nu,
-                                                diffusivity_coarse,
-												offFC);
-      getLastCudaError("scaleFCThS27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void DragLiftPostD27(real* DD,
-								int* k_Q,
-								real* QQ,
-								int numberOfBCnodes,
-								double *DragX,
-								double *DragY,
-								double *DragZ,
-								unsigned int* neighborX,
-								unsigned int* neighborY,
-								unsigned int* neighborZ,
-								unsigned int size_Mat,
-								bool isEvenTimestep,
-								unsigned int numberOfThreads)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-	DragLiftPost27<<< grid.grid, grid.threads >>>(DD,
-										k_Q,
-										QQ,
-										numberOfBCnodes,
-										DragX,
-										DragY,
-										DragZ,
-										neighborX,
-										neighborY,
-										neighborZ,
-										size_Mat,
-										isEvenTimestep);
-	getLastCudaError("DragLift27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void DragLiftPreD27( real* DD,
-								int* k_Q,
-								real* QQ,
-								int numberOfBCnodes,
-								double *DragX,
-								double *DragY,
-								double *DragZ,
-								unsigned int* neighborX,
-								unsigned int* neighborY,
-								unsigned int* neighborZ,
-								unsigned int size_Mat,
-								bool isEvenTimestep,
-								unsigned int numberOfThreads)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-	DragLiftPre27<<< grid.grid, grid.threads >>>( DD,
-										k_Q,
-										QQ,
-										numberOfBCnodes,
-										DragX,
-										DragY,
-										DragZ,
-										neighborX,
-										neighborY,
-										neighborZ,
-										size_Mat,
-										isEvenTimestep);
-	getLastCudaError("DragLift27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcCPtop27(real* DD,
-							int* cpIndex,
-							int nonCp,
-							double *cpPress,
-							unsigned int* neighborX,
-							unsigned int* neighborY,
-							unsigned int* neighborZ,
-							unsigned int size_Mat,
-							bool isEvenTimestep,
-							unsigned int numberOfThreads)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonCp);
-
-	CalcCP27<<< grid.grid, grid.threads >>>(DD,
-								  cpIndex,
-								  nonCp,
-								  cpPress,
-								  neighborX,
-								  neighborY,
-								  neighborZ,
-								  size_Mat,
-								  isEvenTimestep);
-	getLastCudaError("CalcCP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void CalcCPbottom27( real* DD,
-								int* cpIndex,
-								int nonCp,
-								double *cpPress,
-								unsigned int* neighborX,
-								unsigned int* neighborY,
-								unsigned int* neighborZ,
-								unsigned int size_Mat,
-								bool isEvenTimestep,
-								unsigned int numberOfThreads)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonCp);
-
-	CalcCP27<<< grid.grid, grid.threads >>>(DD,
-								  cpIndex,
-								  nonCp,
-								  cpPress,
-								  neighborX,
-								  neighborY,
-								  neighborZ,
-								  size_Mat,
-								  isEvenTimestep);
-	getLastCudaError("CalcCP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void GetSendFsPreDev27(real* DD,
-								  real* bufferFs,
-								  int* sendIndex,
-								  int buffmax,
-								  unsigned int* neighborX,
-								  unsigned int* neighborY,
-								  unsigned int* neighborZ,
-								  unsigned int size_Mat,
-								  bool isEvenTimestep,
-								  unsigned int numberOfThreads,
-								  cudaStream_t stream)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
-
-	getSendFsPre27<<< grid.grid, grid.threads, 0, stream >>>(DD,
-										bufferFs,
-										sendIndex,
-										buffmax,
-										neighborX,
-										neighborY,
-										neighborZ,
-										size_Mat,
-										isEvenTimestep);
-	getLastCudaError("getSendFsPre27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void GetSendFsPostDev27(real* DD,
-								   real* bufferFs,
-								   int* sendIndex,
-								   int buffmax,
-								   unsigned int* neighborX,
-								   unsigned int* neighborY,
-								   unsigned int* neighborZ,
-								   unsigned int size_Mat,
-								   bool isEvenTimestep,
-								   unsigned int numberOfThreads,
-								   cudaStream_t stream)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
-
-	getSendFsPost27<<< grid.grid, grid.threads, 0, stream >>>(DD,
-										 bufferFs,
-										 sendIndex,
-										 buffmax,
-										 neighborX,
-										 neighborY,
-										 neighborZ,
-										 size_Mat,
-										 isEvenTimestep);
-	getLastCudaError("getSendFsPost27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void SetRecvFsPreDev27(real* DD,
-								  real* bufferFs,
-								  int* recvIndex,
-								  int buffmax,
-								  unsigned int* neighborX,
-								  unsigned int* neighborY,
-								  unsigned int* neighborZ,
-								  unsigned int size_Mat,
-								  bool isEvenTimestep,
-								  unsigned int numberOfThreads,
-	                              cudaStream_t stream)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
-
-	setRecvFsPre27<<< grid.grid, grid.threads, 0, stream >>>(DD,
-										bufferFs,
-										recvIndex,
-										buffmax,
-										neighborX,
-										neighborY,
-										neighborZ,
-										size_Mat,
-										isEvenTimestep);
-	getLastCudaError("setRecvFsPre27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void SetRecvFsPostDev27(real* DD,
-								   real* bufferFs,
-								   int* recvIndex,
-								   int buffmax,
-								   unsigned int* neighborX,
-								   unsigned int* neighborY,
-								   unsigned int* neighborZ,
-								   unsigned int size_Mat,
-								   bool isEvenTimestep,
-	                               unsigned int numberOfThreads,
-	                               cudaStream_t stream)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
-
-	setRecvFsPost27<<< grid.grid, grid.threads, 0, stream >>>(DD,
-										 bufferFs,
-										 recvIndex,
-										 buffmax,
-										 neighborX,
-										 neighborY,
-										 neighborZ,
-										 size_Mat,
-										 isEvenTimestep);
-	getLastCudaError("setRecvFsPost27 execution failed");
+    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellFC->kFC);
+    dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
+
+    scaleFC_RhoSq_comp_27<<<grid, threads, 0, stream>>>(
+        parameterDeviceC->distributions.f[0],
+        parameterDeviceF->distributions.f[0],
+        parameterDeviceC->neighborX,
+        parameterDeviceC->neighborY,
+        parameterDeviceC->neighborZ,
+        parameterDeviceF->neighborX,
+        parameterDeviceF->neighborY,
+        parameterDeviceF->neighborZ,
+        parameterDeviceC->numberOfNodes,
+        parameterDeviceF->numberOfNodes,
+        parameterDeviceC->isEvenTimestep,
+        icellFC->ICellFCC,
+        icellFC->ICellFCF,
+        icellFC->kFC,
+        parameterDeviceC->omega,
+        parameterDeviceF->omega,
+        parameterDeviceC->vis,
+        parameterDeviceC->nx,
+        parameterDeviceC->ny,
+        parameterDeviceF->nx,
+        parameterDeviceF->ny,
+        offsetFC);
+    getLastCudaError("scaleFC_RhoSq_comp_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+template<bool hasTurbulentViscosity> void ScaleFC_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC &offsetFC, CUstream_st *stream)
+{
+    dim3 grid = vf::cuda::getCudaGrid(parameterDeviceC->numberofthreads,  icellFC->kFC);
+    dim3 threads(parameterDeviceC->numberofthreads, 1, 1 );
+
+    if(hasTurbulentViscosity)
+    {
+        scaleFC_compressible<true><<<grid, threads, 0, stream>>>(
+            parameterDeviceC->distributions.f[0],
+            parameterDeviceF->distributions.f[0],
+            parameterDeviceC->neighborX,
+            parameterDeviceC->neighborY,
+            parameterDeviceC->neighborZ,
+            parameterDeviceF->neighborX,
+            parameterDeviceF->neighborY,
+            parameterDeviceF->neighborZ,
+            parameterDeviceC->numberOfNodes,
+            parameterDeviceF->numberOfNodes,
+            parameterDeviceC->isEvenTimestep,
+            icellFC->ICellFCC,
+            icellFC->ICellFCF,
+            icellFC->kFC,
+            parameterDeviceC->omega,
+            parameterDeviceF->omega,
+            parameterDeviceC->turbViscosity,
+            parameterDeviceF->turbViscosity,
+            offsetFC);
+    }
+    else
+    {
+        scaleFC_compressible<false><<<grid, threads, 0, stream>>>(
+            parameterDeviceC->distributions.f[0],
+            parameterDeviceF->distributions.f[0],
+            parameterDeviceC->neighborX,
+            parameterDeviceC->neighborY,
+            parameterDeviceC->neighborZ,
+            parameterDeviceF->neighborX,
+            parameterDeviceF->neighborY,
+            parameterDeviceF->neighborZ,
+            parameterDeviceC->numberOfNodes,
+            parameterDeviceF->numberOfNodes,
+            parameterDeviceC->isEvenTimestep,
+            icellFC->ICellFCC,
+            icellFC->ICellFCF,
+            icellFC->kFC,
+            parameterDeviceC->omega,
+            parameterDeviceF->omega,
+            parameterDeviceC->turbViscosity,
+            parameterDeviceF->turbViscosity,
+            offsetFC);
+    }
+    getLastCudaError("scaleFC_compressible execution failed");
+}
+template void ScaleFC_compressible<true>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC &offsetFC, CUstream_st *stream);
+template void ScaleFC_compressible<false>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICellFC * icellFC, OffFC &offsetFC, CUstream_st *stream);
+
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC_RhoSq_3rdMom_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC,
+    CUstream_st *stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC_RhoSq_3rdMom_comp_27<<< grid.grid, grid.threads, 0, stream >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFC_RhoSq_3rdMom_comp_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC_AA2016_comp_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC,
+    CUstream_st *stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC_AA2016_comp_27<<< grid.grid, grid.threads, 0, stream >>>(
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFC_AA2016_comp_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFC_NSPress_27(
+    real* DC,
+    real* DF,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real omCoarse,
+    real omFine,
+    real nu,
+    unsigned int nxC,
+    unsigned int nyC,
+    unsigned int nxF,
+    unsigned int nyF,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFC_NSPress_27<<< grid.grid, grid.threads >>> (
+        DC,
+        DF,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        omCoarse,
+        omFine,
+        nu,
+        nxC,
+        nyC,
+        nxF,
+        nyF,
+        offFC);
+    getLastCudaError("scaleFC_NSPress_27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFCThSMG7(
+    real* DC,
+    real* DF,
+    real* DD7C,
+    real* DD7F,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real nu,
+    real diffusivity_coarse,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFCThSMG7<<< grid.grid, grid.threads >>>(
+        DC,
+        DF,
+        DD7C,
+        DD7F,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        nu,
+        diffusivity_coarse,
+        offFC);
+    getLastCudaError("scaleFCThSMG7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFCThS7(
+    real* DC,
+    real* DF,
+    real* DD7C,
+    real* DD7F,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real nu,
+    real diffusivity_coarse,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFCThS7<<< grid.grid, grid.threads >>>(
+        DC,
+        DF,
+        DD7C,
+        DD7F,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        nu,
+        diffusivity_coarse);
+    getLastCudaError("scaleFCThS7 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void ScaleFCThS27(
+    real* DC,
+    real* DF,
+    real* DD27C,
+    real* DD27F,
+    unsigned int* neighborCX,
+    unsigned int* neighborCY,
+    unsigned int* neighborCZ,
+    unsigned int* neighborFX,
+    unsigned int* neighborFY,
+    unsigned int* neighborFZ,
+    unsigned long long numberOfLBnodesC,
+    unsigned long long numberOfLBnodesF,
+    bool isEvenTimestep,
+    unsigned int* posC,
+    unsigned int* posFSWB,
+    unsigned int kFC,
+    real nu,
+    real diffusivity_coarse,
+    unsigned int numberOfThreads,
+    OffFC offFC)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC);
+
+    scaleFCThS27<<< grid.grid, grid.threads >>>(
+        DC,
+        DF,
+        DD27C,
+        DD27F,
+        neighborCX,
+        neighborCY,
+        neighborCZ,
+        neighborFX,
+        neighborFY,
+        neighborFZ,
+        numberOfLBnodesC,
+        numberOfLBnodesF,
+        isEvenTimestep,
+        posC,
+        posFSWB,
+        kFC,
+        nu,
+        diffusivity_coarse,
+        offFC);
+    getLastCudaError("scaleFCThS27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void DragLiftPostD27(
+    real* DD,
+    int* k_Q,
+    real* QQ,
+    int numberOfBCnodes,
+    double *DragX,
+    double *DragY,
+    double *DragZ,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    DragLiftPost27<<< grid.grid, grid.threads >>>(
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        DragX,
+        DragY,
+        DragZ,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("DragLiftPost27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void DragLiftPreD27(
+    real* DD,
+    int* k_Q,
+    real* QQ,
+    int numberOfBCnodes,
+    double *DragX,
+    double *DragY,
+    double *DragZ,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    DragLiftPre27<<< grid.grid, grid.threads >>>(
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        DragX,
+        DragY,
+        DragZ,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("DragLiftPre27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcCPtop27(
+    real* DD,
+    int* cpIndex,
+    int nonCp,
+    double *cpPress,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonCp);
+
+    CalcCP27<<< grid.grid, grid.threads >>>(
+        DD,
+        cpIndex,
+        nonCp,
+        cpPress,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("CalcCP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void CalcCPbottom27(
+    real* DD,
+    int* cpIndex,
+    int nonCp,
+    double *cpPress,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonCp);
+
+    CalcCP27<<< grid.grid, grid.threads >>>(
+        DD,
+        cpIndex,
+        nonCp,
+        cpPress,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("CalcCP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void GetSendFsPreDev27(
+    real* DD,
+    real* bufferFs,
+    int* sendIndex,
+    int buffmax,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads,
+    cudaStream_t stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
+
+    getSendFsPre27<<< grid.grid, grid.threads, 0, stream >>>(
+        DD,
+        bufferFs,
+        sendIndex,
+        buffmax,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("getSendFsPre27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void GetSendFsPostDev27(
+    real* DD,
+    real* bufferFs,
+    int* sendIndex,
+    int buffmax,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads,
+    cudaStream_t stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
+
+    getSendFsPost27<<< grid.grid, grid.threads, 0, stream >>>(
+        DD,
+        bufferFs,
+        sendIndex,
+        buffmax,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("getSendFsPost27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void SetRecvFsPreDev27(
+    real* DD,
+    real* bufferFs,
+    int* recvIndex,
+    int buffmax,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads,
+    cudaStream_t stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
+
+    setRecvFsPre27<<< grid.grid, grid.threads, 0, stream >>>(
+        DD,
+        bufferFs,
+        recvIndex,
+        buffmax,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("setRecvFsPre27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void SetRecvFsPostDev27(
+    real* DD,
+    real* bufferFs,
+    int* recvIndex,
+    int buffmax,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads,
+    cudaStream_t stream)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
+
+    setRecvFsPost27<<< grid.grid, grid.threads, 0, stream >>>(
+        DD,
+        bufferFs,
+        recvIndex,
+        buffmax,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("setRecvFsPost27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void getSendGsDevF3(
-	real* G6,
-	real* bufferGs,
-	int* sendIndex,
-	int buffmax,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	unsigned int size_Mat,
-	bool isEvenTimestep,
-	unsigned int numberOfThreads)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
-
-	getSendGsF3 <<< grid.grid, grid.threads >>> (
-		G6,
-		bufferGs,
-		sendIndex,
-		buffmax,
-		neighborX,
-		neighborY,
-		neighborZ,
-		size_Mat,
-		isEvenTimestep);
-	getLastCudaError("getSendGsF3 execution failed");
+    real* G6,
+    real* bufferGs,
+    int* sendIndex,
+    int buffmax,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
+
+    getSendGsF3 <<< grid.grid, grid.threads >>> (
+        G6,
+        bufferGs,
+        sendIndex,
+        buffmax,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("getSendGsF3 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void setRecvGsDevF3(
-	real* G6,
-	real* bufferGs,
-	int* recvIndex,
-	int buffmax,
-	unsigned int* neighborX,
-	unsigned int* neighborY,
-	unsigned int* neighborZ,
-	unsigned int size_Mat,
-	bool isEvenTimestep,
-	unsigned int numberOfThreads)
-{
-	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
-
-	setRecvGsF3 <<< grid.grid, grid.threads >>> (
-		G6,
-		bufferGs,
-		recvIndex,
-		buffmax,
-		neighborX,
-		neighborY,
-		neighborZ,
-		size_Mat,
-		isEvenTimestep);
-	getLastCudaError("setRecvGsF3 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void WallFuncDev27(unsigned int numberOfThreads,
-							  real* vx,
-							  real* vy,
-							  real* vz,
-							  real* DD,
-							  int* k_Q,
-							  real* QQ,
-							  unsigned int numberOfBCnodes,
-							  real om1,
-							  unsigned int* neighborX,
-							  unsigned int* neighborY,
-							  unsigned int* neighborZ,
-							  unsigned int size_Mat,
-							  bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-      WallFunction27<<< grid.grid, grid.threads >>> (
-											  vx,
-											  vy,
-											  vz,
-											  DD,
-											  k_Q,
-											  QQ,
-											  numberOfBCnodes,
-											  om1,
-											  neighborX,
-											  neighborY,
-											  neighborZ,
-											  size_Mat,
-											  isEvenTimestep);
-      getLastCudaError("WallFunction27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void SetOutputWallVelocitySP27(unsigned int numberOfThreads,
-										  real* vxD,
-										  real* vyD,
-										  real* vzD,
-										  real* vxWall,
-										  real* vyWall,
-										  real* vzWall,
-										  int numberOfWallNodes,
-										  int* kWallNodes,
-										  real* rhoD,
-										  real* pressD,
-										  unsigned int* geoD,
-										  unsigned int* neighborX,
-										  unsigned int* neighborY,
-										  unsigned int* neighborZ,
-										  unsigned int size_Mat,
-										  real* DD,
-										  bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfWallNodes);
-
-      LBSetOutputWallVelocitySP27<<< grid.grid, grid.threads >>> (	vxD,
-															vyD,
-															vzD,
-															vxWall,
-															vyWall,
-															vzWall,
-															numberOfWallNodes,
-															kWallNodes,
-															rhoD,
-															pressD,
-															geoD,
-															neighborX,
-															neighborY,
-															neighborZ,
-															size_Mat,
-															DD,
-															isEvenTimestep);
-      getLastCudaError("LBSetOutputWallVelocitySP27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void GetVelotoForce27(unsigned int numberOfThreads,
-								 real* DD,
-								 int* bcIndex,
-								 int nonAtBC,
-								 real* Vx,
-								 real* Vy,
-								 real* Vz,
-								 unsigned int* neighborX,
-								 unsigned int* neighborY,
-								 unsigned int* neighborZ,
-								 unsigned int size_Mat,
-								 bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonAtBC);
-
-      GetVeloforForcing27<<< grid.grid, grid.threads >>> (DD,
-												bcIndex,
-												nonAtBC,
-												Vx,
-												Vy,
-												Vz,
-												neighborX,
-												neighborY,
-												neighborZ,
-												size_Mat,
-												isEvenTimestep);
-      getLastCudaError("GetVeloforForcing27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void InitParticlesDevice(real* coordX,
-									real* coordY,
-									real* coordZ,
-									real* coordParticleXlocal,
-									real* coordParticleYlocal,
-									real* coordParticleZlocal,
-									real* coordParticleXglobal,
-									real* coordParticleYglobal,
-									real* coordParticleZglobal,
-									real* veloParticleX,
-									real* veloParticleY,
-									real* veloParticleZ,
-									real* randArray,
-									unsigned int* particleID,
-									unsigned int* cellBaseID,
-									unsigned int* bcMatD,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int* neighborWSB,
-									int level,
-									unsigned int numberOfParticles,
-									unsigned int size_Mat,
-									unsigned int numberOfThreads)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfParticles);
-
-   InitParticles<<< grid.grid, grid.threads >>> (coordX,
-										coordY,
-										coordZ,
-										coordParticleXlocal,
-										coordParticleYlocal,
-										coordParticleZlocal,
-										coordParticleXglobal,
-										coordParticleYglobal,
-										coordParticleZglobal,
-										veloParticleX,
-										veloParticleY,
-										veloParticleZ,
-										randArray,
-										particleID,
-										cellBaseID,
-										bcMatD,
-										neighborX,
-										neighborY,
-										neighborZ,
-										neighborWSB,
-										level,
-										numberOfParticles,
-										size_Mat);
-      getLastCudaError("InitParticles execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void MoveParticlesDevice(real* coordX,
-									real* coordY,
-									real* coordZ,
-									real* coordParticleXlocal,
-									real* coordParticleYlocal,
-									real* coordParticleZlocal,
-									real* coordParticleXglobal,
-									real* coordParticleYglobal,
-									real* coordParticleZglobal,
-									real* veloParticleX,
-									real* veloParticleY,
-									real* veloParticleZ,
-									real* DD,
-									real  omega,
-									unsigned int* particleID,
-									unsigned int* cellBaseID,
-									unsigned int* bcMatD,
-									unsigned int* neighborX,
-									unsigned int* neighborY,
-									unsigned int* neighborZ,
-									unsigned int* neighborWSB,
-							        int level,
-									unsigned int timestep,
-									unsigned int numberOfTimesteps,
-									unsigned int numberOfParticles,
-									unsigned int size_Mat,
-									unsigned int numberOfThreads,
-									bool isEvenTimestep)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfParticles);
-
-   MoveParticles<<< grid.grid, grid.threads >>> (coordX,
-										coordY,
-										coordZ,
-										coordParticleXlocal,
-										coordParticleYlocal,
-										coordParticleZlocal,
-										coordParticleXglobal,
-										coordParticleYglobal,
-										coordParticleZglobal,
-										veloParticleX,
-										veloParticleY,
-										veloParticleZ,
-										DD,
-										omega,
-										particleID,
-										cellBaseID,
-										bcMatD,
-										neighborX,
-										neighborY,
-										neighborZ,
-										neighborWSB,
-										level,
-										timestep,
-										numberOfTimesteps,
-										numberOfParticles,
-										size_Mat,
-										isEvenTimestep);
-      getLastCudaError("MoveParticles execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void initRandomDevice(curandState* state,
-								 unsigned int size_Mat,
-								 unsigned int numberOfThreads)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-   initRandom<<< grid.grid, grid.threads >>> (state);
-   getLastCudaError("initRandom execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void generateRandomValuesDevice( curandState* state,
-											unsigned int size_Mat,
-											real* randArray,
-											unsigned int numberOfThreads)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-   generateRandomValues<<< grid.grid, grid.threads >>> (state,randArray);
-   getLastCudaError("generateRandomValues execution failed");
+    real* G6,
+    real* bufferGs,
+    int* recvIndex,
+    int buffmax,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax);
+
+    setRecvGsF3 <<< grid.grid, grid.threads >>> (
+        G6,
+        bufferGs,
+        recvIndex,
+        buffmax,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("setRecvGsF3 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void WallFuncDev27(
+    unsigned int numberOfThreads,
+    real* vx,
+    real* vy,
+    real* vz,
+    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)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
+
+    WallFunction27<<< grid.grid, grid.threads >>> (
+        vx,
+        vy,
+        vz,
+        DD,
+        k_Q,
+        QQ,
+        numberOfBCnodes,
+        om1,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("WallFunction27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void SetOutputWallVelocitySP27(
+    unsigned int numberOfThreads,
+    real* vxD,
+    real* vyD,
+    real* vzD,
+    real* vxWall,
+    real* vyWall,
+    real* vzWall,
+    int numberOfWallNodes,
+    int* kWallNodes,
+    real* rhoD,
+    real* pressD,
+    unsigned int* geoD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    real* DD,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfWallNodes);
+
+    LBSetOutputWallVelocitySP27<<< grid.grid, grid.threads >>> (
+        vxD,
+        vyD,
+        vzD,
+        vxWall,
+        vyWall,
+        vzWall,
+        numberOfWallNodes,
+        kWallNodes,
+        rhoD,
+        pressD,
+        geoD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        DD,
+        isEvenTimestep);
+    getLastCudaError("LBSetOutputWallVelocitySP27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void GetVelotoForce27(
+    unsigned int numberOfThreads,
+    real* DD,
+    int* bcIndex,
+    int nonAtBC,
+    real* Vx,
+    real* Vy,
+    real* Vz,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonAtBC);
+
+    GetVeloforForcing27<<< grid.grid, grid.threads >>> (
+        DD,
+        bcIndex,
+        nonAtBC,
+        Vx,
+        Vy,
+        Vz,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("GetVeloforForcing27 execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void InitParticlesDevice(
+    real* coordX,
+    real* coordY,
+    real* coordZ,
+    real* coordParticleXlocal,
+    real* coordParticleYlocal,
+    real* coordParticleZlocal,
+    real* coordParticleXglobal,
+    real* coordParticleYglobal,
+    real* coordParticleZglobal,
+    real* veloParticleX,
+    real* veloParticleY,
+    real* veloParticleZ,
+    real* randArray,
+    unsigned int* particleID,
+    unsigned int* cellBaseID,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int* neighborWSB,
+    int level,
+    unsigned int numberOfParticles,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfParticles);
+
+    InitParticles<<< grid.grid, grid.threads >>> (
+        coordX,
+        coordY,
+        coordZ,
+        coordParticleXlocal,
+        coordParticleYlocal,
+        coordParticleZlocal,
+        coordParticleXglobal,
+        coordParticleYglobal,
+        coordParticleZglobal,
+        veloParticleX,
+        veloParticleY,
+        veloParticleZ,
+        randArray,
+        particleID,
+        cellBaseID,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        neighborWSB,
+        level,
+        numberOfParticles,
+        numberOfLBnodes);
+    getLastCudaError("InitParticles execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void MoveParticlesDevice(
+    real* coordX,
+    real* coordY,
+    real* coordZ,
+    real* coordParticleXlocal,
+    real* coordParticleYlocal,
+    real* coordParticleZlocal,
+    real* coordParticleXglobal,
+    real* coordParticleYglobal,
+    real* coordParticleZglobal,
+    real* veloParticleX,
+    real* veloParticleY,
+    real* veloParticleZ,
+    real* DD,
+    real  omega,
+    unsigned int* particleID,
+    unsigned int* cellBaseID,
+    unsigned int* bcMatD,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned int* neighborWSB,
+    int level,
+    unsigned int timestep,
+    unsigned int numberOfTimesteps,
+    unsigned int numberOfParticles,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads,
+    bool isEvenTimestep)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfParticles);
+
+    MoveParticles<<< grid.grid, grid.threads >>> (
+        coordX,
+        coordY,
+        coordZ,
+        coordParticleXlocal,
+        coordParticleYlocal,
+        coordParticleZlocal,
+        coordParticleXglobal,
+        coordParticleYglobal,
+        coordParticleZglobal,
+        veloParticleX,
+        veloParticleY,
+        veloParticleZ,
+        DD,
+        omega,
+        particleID,
+        cellBaseID,
+        bcMatD,
+        neighborX,
+        neighborY,
+        neighborZ,
+        neighborWSB,
+        level,
+        timestep,
+        numberOfTimesteps,
+        numberOfParticles,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("MoveParticles execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void initRandomDevice(
+    curandState* state,
+    unsigned long long numberOfLBnodes,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+    initRandom<<< grid.grid, grid.threads >>> (state);
+    getLastCudaError("initRandom execution failed");
+}
+//////////////////////////////////////////////////////////////////////////
+void generateRandomValuesDevice(
+    curandState* state,
+    unsigned long long numberOfLBnodes,
+    real* randArray,
+    unsigned int numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+    generateRandomValues<<< grid.grid, grid.threads >>> (state,randArray);
+    getLastCudaError("generateRandomValues execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 void CalcTurbulenceIntensityDevice(
-   real* vxx,
-   real* vyy,
-   real* vzz,
-   real* vxy,
-   real* vxz,
-   real* vyz,
-   real* vx_mean,
-   real* vy_mean,
-   real* vz_mean,
-   real* DD,
-   uint* typeOfGridNode,
-   unsigned int* neighborX,
-   unsigned int* neighborY,
-   unsigned int* neighborZ,
-   unsigned int size_Mat,
-   bool isEvenTimestep,
-   uint numberOfThreads)
-{
-   vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat);
-   CalcTurbulenceIntensity<<<grid.grid, grid.threads>>>(
-     vxx,
-     vyy,
-     vzz,
-	 vxy,
-     vxz,
-     vyz,
-     vx_mean,
-     vy_mean,
-     vz_mean,
-     DD,
-     typeOfGridNode,
-     neighborX,
-     neighborY,
-     neighborZ,
-     size_Mat,
-     isEvenTimestep);
-
-   getLastCudaError("CalcTurbulenceIntensity execution failed");
+    real* vxx,
+    real* vyy,
+    real* vzz,
+    real* vxy,
+    real* vxz,
+    real* vyz,
+    real* vx_mean,
+    real* vy_mean,
+    real* vz_mean,
+    real* DD,
+    uint* typeOfGridNode,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep,
+    uint numberOfThreads)
+{
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfLBnodes);
+    CalcTurbulenceIntensity<<<grid.grid, grid.threads>>>(
+        vxx,
+        vyy,
+        vzz,
+        vxy,
+        vxz,
+        vyz,
+        vx_mean,
+        vy_mean,
+        vz_mean,
+        DD,
+        typeOfGridNode,
+        neighborX,
+        neighborY,
+        neighborZ,
+        numberOfLBnodes,
+        isEvenTimestep);
+    getLastCudaError("CalcTurbulenceIntensity execution failed");
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/gpu/VirtualFluids_GPU/GPU/NoSlipBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/NoSlipBCs27.cu
index 314687c4b29a32962b386d7c083f72b754388e5b..66bf6dee234e584b734a9ef7a4d191e8ac7ff6a1 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/NoSlipBCs27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/NoSlipBCs27.cu
@@ -24,69 +24,69 @@ __global__ void QDevice3rdMomentsComp27(
 													 unsigned int* neighborX,
 													 unsigned int* neighborY,
 													 unsigned int* neighborZ,
-													 unsigned int numberOfLBnodes, 
+													 unsigned long long numberOfLBnodes, 
 													 bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &distributions[DIR_P00   *numberOfLBnodes];
-      D.f[DIR_M00   ] = &distributions[DIR_M00   *numberOfLBnodes];
-      D.f[DIR_0P0   ] = &distributions[DIR_0P0   *numberOfLBnodes];
-      D.f[DIR_0M0   ] = &distributions[DIR_0M0   *numberOfLBnodes];
-      D.f[DIR_00P   ] = &distributions[DIR_00P   *numberOfLBnodes];
-      D.f[DIR_00M   ] = &distributions[DIR_00M   *numberOfLBnodes];
-      D.f[DIR_PP0  ] = &distributions[DIR_PP0  *numberOfLBnodes];
-      D.f[DIR_MM0  ] = &distributions[DIR_MM0  *numberOfLBnodes];
-      D.f[DIR_PM0  ] = &distributions[DIR_PM0  *numberOfLBnodes];
-      D.f[DIR_MP0  ] = &distributions[DIR_MP0  *numberOfLBnodes];
-      D.f[DIR_P0P  ] = &distributions[DIR_P0P  *numberOfLBnodes];
-      D.f[DIR_M0M  ] = &distributions[DIR_M0M  *numberOfLBnodes];
-      D.f[DIR_P0M  ] = &distributions[DIR_P0M  *numberOfLBnodes];
-      D.f[DIR_M0P  ] = &distributions[DIR_M0P  *numberOfLBnodes];
-      D.f[DIR_0PP  ] = &distributions[DIR_0PP  *numberOfLBnodes];
-      D.f[DIR_0MM  ] = &distributions[DIR_0MM  *numberOfLBnodes];
-      D.f[DIR_0PM  ] = &distributions[DIR_0PM  *numberOfLBnodes];
-      D.f[DIR_0MP  ] = &distributions[DIR_0MP  *numberOfLBnodes];
-      D.f[DIR_000] = &distributions[DIR_000*numberOfLBnodes];
-      D.f[DIR_PPP ] = &distributions[DIR_PPP *numberOfLBnodes];
-      D.f[DIR_MMP ] = &distributions[DIR_MMP *numberOfLBnodes];
-      D.f[DIR_PMP ] = &distributions[DIR_PMP *numberOfLBnodes];
-      D.f[DIR_MPP ] = &distributions[DIR_MPP *numberOfLBnodes];
-      D.f[DIR_PPM ] = &distributions[DIR_PPM *numberOfLBnodes];
-      D.f[DIR_MMM ] = &distributions[DIR_MMM *numberOfLBnodes];
-      D.f[DIR_PMM ] = &distributions[DIR_PMM *numberOfLBnodes];
-      D.f[DIR_MPM ] = &distributions[DIR_MPM *numberOfLBnodes];
+      D.f[DIR_P00] = &distributions[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &distributions[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &distributions[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &distributions[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &distributions[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &distributions[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &distributions[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &distributions[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &distributions[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &distributions[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &distributions[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &distributions[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &distributions[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &distributions[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &distributions[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &distributions[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &distributions[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &distributions[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &distributions[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &distributions[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &distributions[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &distributions[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &distributions[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &distributions[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &distributions[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &distributions[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &distributions[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &distributions[DIR_P00   *numberOfLBnodes];
-      D.f[DIR_P00   ] = &distributions[DIR_M00   *numberOfLBnodes];
-      D.f[DIR_0M0   ] = &distributions[DIR_0P0   *numberOfLBnodes];
-      D.f[DIR_0P0   ] = &distributions[DIR_0M0   *numberOfLBnodes];
-      D.f[DIR_00M   ] = &distributions[DIR_00P   *numberOfLBnodes];
-      D.f[DIR_00P   ] = &distributions[DIR_00M   *numberOfLBnodes];
-      D.f[DIR_MM0  ] = &distributions[DIR_PP0  *numberOfLBnodes];
-      D.f[DIR_PP0  ] = &distributions[DIR_MM0  *numberOfLBnodes];
-      D.f[DIR_MP0  ] = &distributions[DIR_PM0  *numberOfLBnodes];
-      D.f[DIR_PM0  ] = &distributions[DIR_MP0  *numberOfLBnodes];
-      D.f[DIR_M0M  ] = &distributions[DIR_P0P  *numberOfLBnodes];
-      D.f[DIR_P0P  ] = &distributions[DIR_M0M  *numberOfLBnodes];
-      D.f[DIR_M0P  ] = &distributions[DIR_P0M  *numberOfLBnodes];
-      D.f[DIR_P0M  ] = &distributions[DIR_M0P  *numberOfLBnodes];
-      D.f[DIR_0MM  ] = &distributions[DIR_0PP  *numberOfLBnodes];
-      D.f[DIR_0PP  ] = &distributions[DIR_0MM  *numberOfLBnodes];
-      D.f[DIR_0MP  ] = &distributions[DIR_0PM  *numberOfLBnodes];
-      D.f[DIR_0PM  ] = &distributions[DIR_0MP  *numberOfLBnodes];
-      D.f[DIR_000] = &distributions[DIR_000*numberOfLBnodes];
-      D.f[DIR_PPP ] = &distributions[DIR_MMM *numberOfLBnodes];
-      D.f[DIR_MMP ] = &distributions[DIR_PPM *numberOfLBnodes];
-      D.f[DIR_PMP ] = &distributions[DIR_MPM *numberOfLBnodes];
-      D.f[DIR_MPP ] = &distributions[DIR_PMM *numberOfLBnodes];
-      D.f[DIR_PPM ] = &distributions[DIR_MMP *numberOfLBnodes];
-      D.f[DIR_MMM ] = &distributions[DIR_PPP *numberOfLBnodes];
-      D.f[DIR_PMM ] = &distributions[DIR_MPP *numberOfLBnodes];
-      D.f[DIR_MPM ] = &distributions[DIR_PMP *numberOfLBnodes];
+      D.f[DIR_M00] = &distributions[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &distributions[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &distributions[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &distributions[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &distributions[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &distributions[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &distributions[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &distributions[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &distributions[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &distributions[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &distributions[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &distributions[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &distributions[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &distributions[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &distributions[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &distributions[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &distributions[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &distributions[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &distributions[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &distributions[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &distributions[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &distributions[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &distributions[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &distributions[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &distributions[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &distributions[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &distributions[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -107,24 +107,24 @@ __global__ void QDevice3rdMomentsComp27(
             *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   = &subgridDistances[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &subgridDistances[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &subgridDistances[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &subgridDistances[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &subgridDistances[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &subgridDistances[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &subgridDistances[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &subgridDistances[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &subgridDistances[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &subgridDistances[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &subgridDistances[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &subgridDistances[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &subgridDistances[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &subgridDistances[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &subgridDistances[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &subgridDistances[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &subgridDistances[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &subgridDistances[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &subgridDistances[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &subgridDistances[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &subgridDistances[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &subgridDistances[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &subgridDistances[DIR_00P * numberOfBCnodes];
+      q_dirB   = &subgridDistances[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &subgridDistances[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &subgridDistances[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &subgridDistances[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &subgridDistances[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &subgridDistances[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &subgridDistances[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &subgridDistances[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &subgridDistances[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &subgridDistances[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &subgridDistances[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &subgridDistances[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &subgridDistances[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &subgridDistances[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &subgridDistances[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &subgridDistances[DIR_PMP * numberOfBCnodes];
@@ -167,32 +167,32 @@ __global__ void QDevice3rdMomentsComp27(
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
             f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real vx1, vx2, vx3, drho, feq, q, m3;
       drho   =  f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
@@ -217,63 +217,63 @@ __global__ void QDevice3rdMomentsComp27(
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &distributions[DIR_P00   *numberOfLBnodes];
-         D.f[DIR_M00   ] = &distributions[DIR_M00   *numberOfLBnodes];
-         D.f[DIR_0P0   ] = &distributions[DIR_0P0   *numberOfLBnodes];
-         D.f[DIR_0M0   ] = &distributions[DIR_0M0   *numberOfLBnodes];
-         D.f[DIR_00P   ] = &distributions[DIR_00P   *numberOfLBnodes];
-         D.f[DIR_00M   ] = &distributions[DIR_00M   *numberOfLBnodes];
-         D.f[DIR_PP0  ] = &distributions[DIR_PP0  *numberOfLBnodes];
-         D.f[DIR_MM0  ] = &distributions[DIR_MM0  *numberOfLBnodes];
-         D.f[DIR_PM0  ] = &distributions[DIR_PM0  *numberOfLBnodes];
-         D.f[DIR_MP0  ] = &distributions[DIR_MP0  *numberOfLBnodes];
-         D.f[DIR_P0P  ] = &distributions[DIR_P0P  *numberOfLBnodes];
-         D.f[DIR_M0M  ] = &distributions[DIR_M0M  *numberOfLBnodes];
-         D.f[DIR_P0M  ] = &distributions[DIR_P0M  *numberOfLBnodes];
-         D.f[DIR_M0P  ] = &distributions[DIR_M0P  *numberOfLBnodes];
-         D.f[DIR_0PP  ] = &distributions[DIR_0PP  *numberOfLBnodes];
-         D.f[DIR_0MM  ] = &distributions[DIR_0MM  *numberOfLBnodes];
-         D.f[DIR_0PM  ] = &distributions[DIR_0PM  *numberOfLBnodes];
-         D.f[DIR_0MP  ] = &distributions[DIR_0MP  *numberOfLBnodes];
-         D.f[DIR_000] = &distributions[DIR_000*numberOfLBnodes];
-         D.f[DIR_PPP ] = &distributions[DIR_PPP *numberOfLBnodes];
-         D.f[DIR_MMP ] = &distributions[DIR_MMP *numberOfLBnodes];
-         D.f[DIR_PMP ] = &distributions[DIR_PMP *numberOfLBnodes];
-         D.f[DIR_MPP ] = &distributions[DIR_MPP *numberOfLBnodes];
-         D.f[DIR_PPM ] = &distributions[DIR_PPM *numberOfLBnodes];
-         D.f[DIR_MMM ] = &distributions[DIR_MMM *numberOfLBnodes];
-         D.f[DIR_PMM ] = &distributions[DIR_PMM *numberOfLBnodes];
-         D.f[DIR_MPM ] = &distributions[DIR_MPM *numberOfLBnodes];
+         D.f[DIR_P00] = &distributions[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &distributions[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &distributions[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &distributions[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &distributions[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &distributions[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &distributions[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &distributions[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &distributions[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &distributions[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &distributions[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &distributions[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &distributions[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &distributions[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &distributions[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &distributions[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &distributions[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &distributions[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &distributions[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &distributions[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &distributions[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &distributions[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &distributions[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &distributions[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &distributions[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &distributions[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &distributions[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &distributions[DIR_P00   *numberOfLBnodes];
-         D.f[DIR_P00   ] = &distributions[DIR_M00   *numberOfLBnodes];
-         D.f[DIR_0M0   ] = &distributions[DIR_0P0   *numberOfLBnodes];
-         D.f[DIR_0P0   ] = &distributions[DIR_0M0   *numberOfLBnodes];
-         D.f[DIR_00M   ] = &distributions[DIR_00P   *numberOfLBnodes];
-         D.f[DIR_00P   ] = &distributions[DIR_00M   *numberOfLBnodes];
-         D.f[DIR_MM0  ] = &distributions[DIR_PP0  *numberOfLBnodes];
-         D.f[DIR_PP0  ] = &distributions[DIR_MM0  *numberOfLBnodes];
-         D.f[DIR_MP0  ] = &distributions[DIR_PM0  *numberOfLBnodes];
-         D.f[DIR_PM0  ] = &distributions[DIR_MP0  *numberOfLBnodes];
-         D.f[DIR_M0M  ] = &distributions[DIR_P0P  *numberOfLBnodes];
-         D.f[DIR_P0P  ] = &distributions[DIR_M0M  *numberOfLBnodes];
-         D.f[DIR_M0P  ] = &distributions[DIR_P0M  *numberOfLBnodes];
-         D.f[DIR_P0M  ] = &distributions[DIR_M0P  *numberOfLBnodes];
-         D.f[DIR_0MM  ] = &distributions[DIR_0PP  *numberOfLBnodes];
-         D.f[DIR_0PP  ] = &distributions[DIR_0MM  *numberOfLBnodes];
-         D.f[DIR_0MP  ] = &distributions[DIR_0PM  *numberOfLBnodes];
-         D.f[DIR_0PM  ] = &distributions[DIR_0MP  *numberOfLBnodes];
-         D.f[DIR_000] = &distributions[DIR_000*numberOfLBnodes];
-         D.f[DIR_PPP ] = &distributions[DIR_MMM *numberOfLBnodes];
-         D.f[DIR_MMP ] = &distributions[DIR_PPM *numberOfLBnodes];
-         D.f[DIR_PMP ] = &distributions[DIR_MPM *numberOfLBnodes];
-         D.f[DIR_MPP ] = &distributions[DIR_PMM *numberOfLBnodes];
-         D.f[DIR_PPM ] = &distributions[DIR_MMP *numberOfLBnodes];
-         D.f[DIR_MMM ] = &distributions[DIR_PPP *numberOfLBnodes];
-         D.f[DIR_PMM ] = &distributions[DIR_MPP *numberOfLBnodes];
-         D.f[DIR_MPM ] = &distributions[DIR_PMP *numberOfLBnodes];
+         D.f[DIR_M00] = &distributions[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &distributions[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &distributions[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &distributions[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &distributions[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &distributions[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &distributions[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &distributions[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &distributions[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &distributions[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &distributions[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &distributions[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &distributions[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &distributions[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &distributions[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &distributions[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &distributions[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &distributions[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &distributions[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &distributions[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &distributions[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &distributions[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &distributions[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &distributions[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &distributions[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &distributions[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &distributions[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -567,69 +567,69 @@ __global__ void QDeviceIncompHighNu27(real* DD,
 												 unsigned int* neighborX,
 												 unsigned int* neighborY,
 												 unsigned int* neighborZ,
-												 unsigned int numberOfLBnodes, 
+												 unsigned long long numberOfLBnodes, 
 												 bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *numberOfLBnodes];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *numberOfLBnodes];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *numberOfLBnodes];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *numberOfLBnodes];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *numberOfLBnodes];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *numberOfLBnodes];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *numberOfLBnodes];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *numberOfLBnodes];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *numberOfLBnodes];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *numberOfLBnodes];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *numberOfLBnodes];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *numberOfLBnodes];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *numberOfLBnodes];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *numberOfLBnodes];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *numberOfLBnodes];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *numberOfLBnodes];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *numberOfLBnodes];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *numberOfLBnodes];
-      D.f[DIR_000] = &DD[DIR_000*numberOfLBnodes];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *numberOfLBnodes];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *numberOfLBnodes];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *numberOfLBnodes];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *numberOfLBnodes];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *numberOfLBnodes];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *numberOfLBnodes];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *numberOfLBnodes];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *numberOfLBnodes];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *numberOfLBnodes];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *numberOfLBnodes];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *numberOfLBnodes];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *numberOfLBnodes];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *numberOfLBnodes];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *numberOfLBnodes];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *numberOfLBnodes];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *numberOfLBnodes];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *numberOfLBnodes];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *numberOfLBnodes];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *numberOfLBnodes];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *numberOfLBnodes];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *numberOfLBnodes];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *numberOfLBnodes];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *numberOfLBnodes];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *numberOfLBnodes];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *numberOfLBnodes];
-      D.f[DIR_000] = &DD[DIR_000*numberOfLBnodes];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *numberOfLBnodes];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *numberOfLBnodes];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *numberOfLBnodes];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *numberOfLBnodes];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *numberOfLBnodes];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *numberOfLBnodes];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *numberOfLBnodes];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -650,24 +650,24 @@ __global__ void QDeviceIncompHighNu27(real* DD,
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -710,32 +710,32 @@ __global__ void QDeviceIncompHighNu27(real* DD,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
             f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_E   = (D.f[DIR_P00   ])[ke   ];
-      f_W   = (D.f[DIR_M00   ])[kw   ];
-      f_N   = (D.f[DIR_0P0   ])[kn   ];
-      f_S   = (D.f[DIR_0M0   ])[ks   ];
-      f_T   = (D.f[DIR_00P   ])[kt   ];
-      f_B   = (D.f[DIR_00M   ])[kb   ];
-      f_NE  = (D.f[DIR_PP0  ])[kne  ];
-      f_SW  = (D.f[DIR_MM0  ])[ksw  ];
-      f_SE  = (D.f[DIR_PM0  ])[kse  ];
-      f_NW  = (D.f[DIR_MP0  ])[knw  ];
-      f_TE  = (D.f[DIR_P0P  ])[kte  ];
-      f_BW  = (D.f[DIR_M0M  ])[kbw  ];
-      f_BE  = (D.f[DIR_P0M  ])[kbe  ];
-      f_TW  = (D.f[DIR_M0P  ])[ktw  ];
-      f_TN  = (D.f[DIR_0PP  ])[ktn  ];
-      f_BS  = (D.f[DIR_0MM  ])[kbs  ];
-      f_BN  = (D.f[DIR_0PM  ])[kbn  ];
-      f_TS  = (D.f[DIR_0MP  ])[kts  ];
-      f_TNE = (D.f[DIR_PPP ])[ktne ];
-      f_TSW = (D.f[DIR_MMP ])[ktsw ];
-      f_TSE = (D.f[DIR_PMP ])[ktse ];
-      f_TNW = (D.f[DIR_MPP ])[ktnw ];
-      f_BNE = (D.f[DIR_PPM ])[kbne ];
-      f_BSW = (D.f[DIR_MMM ])[kbsw ];
-      f_BSE = (D.f[DIR_PMM ])[kbse ];
-      f_BNW = (D.f[DIR_MPM ])[kbnw ];
+      f_E   = (D.f[DIR_P00])[ke   ];
+      f_W   = (D.f[DIR_M00])[kw   ];
+      f_N   = (D.f[DIR_0P0])[kn   ];
+      f_S   = (D.f[DIR_0M0])[ks   ];
+      f_T   = (D.f[DIR_00P])[kt   ];
+      f_B   = (D.f[DIR_00M])[kb   ];
+      f_NE  = (D.f[DIR_PP0])[kne  ];
+      f_SW  = (D.f[DIR_MM0])[ksw  ];
+      f_SE  = (D.f[DIR_PM0])[kse  ];
+      f_NW  = (D.f[DIR_MP0])[knw  ];
+      f_TE  = (D.f[DIR_P0P])[kte  ];
+      f_BW  = (D.f[DIR_M0M])[kbw  ];
+      f_BE  = (D.f[DIR_P0M])[kbe  ];
+      f_TW  = (D.f[DIR_M0P])[ktw  ];
+      f_TN  = (D.f[DIR_0PP])[ktn  ];
+      f_BS  = (D.f[DIR_0MM])[kbs  ];
+      f_BN  = (D.f[DIR_0PM])[kbn  ];
+      f_TS  = (D.f[DIR_0MP])[kts  ];
+      f_TNE = (D.f[DIR_PPP])[ktne ];
+      f_TSW = (D.f[DIR_MMP])[ktsw ];
+      f_TSE = (D.f[DIR_PMP])[ktse ];
+      f_TNW = (D.f[DIR_MPP])[ktnw ];
+      f_BNE = (D.f[DIR_PPM])[kbne ];
+      f_BSW = (D.f[DIR_MMM])[kbsw ];
+      f_BSE = (D.f[DIR_PMM])[kbse ];
+      f_BNW = (D.f[DIR_MPM])[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 +
@@ -760,63 +760,63 @@ __global__ void QDeviceIncompHighNu27(real* DD,
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *numberOfLBnodes];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *numberOfLBnodes];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *numberOfLBnodes];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *numberOfLBnodes];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *numberOfLBnodes];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *numberOfLBnodes];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *numberOfLBnodes];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *numberOfLBnodes];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *numberOfLBnodes];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *numberOfLBnodes];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *numberOfLBnodes];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *numberOfLBnodes];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *numberOfLBnodes];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *numberOfLBnodes];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *numberOfLBnodes];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *numberOfLBnodes];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *numberOfLBnodes];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *numberOfLBnodes];
-         D.f[DIR_000] = &DD[DIR_000*numberOfLBnodes];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *numberOfLBnodes];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *numberOfLBnodes];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *numberOfLBnodes];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *numberOfLBnodes];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *numberOfLBnodes];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *numberOfLBnodes];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *numberOfLBnodes];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *numberOfLBnodes];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *numberOfLBnodes];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *numberOfLBnodes];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *numberOfLBnodes];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *numberOfLBnodes];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *numberOfLBnodes];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *numberOfLBnodes];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *numberOfLBnodes];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *numberOfLBnodes];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *numberOfLBnodes];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *numberOfLBnodes];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *numberOfLBnodes];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *numberOfLBnodes];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *numberOfLBnodes];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *numberOfLBnodes];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *numberOfLBnodes];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *numberOfLBnodes];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *numberOfLBnodes];
-         D.f[DIR_000] = &DD[DIR_000*numberOfLBnodes];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *numberOfLBnodes];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *numberOfLBnodes];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *numberOfLBnodes];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *numberOfLBnodes];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *numberOfLBnodes];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *numberOfLBnodes];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *numberOfLBnodes];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -1063,69 +1063,69 @@ __global__ void QDeviceCompHighNu27(
 												 unsigned int* neighborX,
 												 unsigned int* neighborY,
 												 unsigned int* neighborZ,
-												 unsigned int size_Mat, 
+												 unsigned long long numberOfLBnodes, 
 												 bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -1146,24 +1146,24 @@ __global__ void QDeviceCompHighNu27(
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -1206,58 +1206,58 @@ __global__ void QDeviceCompHighNu27(
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
             f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_E   = (D.f[DIR_P00   ])[ke   ];
-      f_W   = (D.f[DIR_M00   ])[kw   ];
-      f_N   = (D.f[DIR_0P0   ])[kn   ];
-      f_S   = (D.f[DIR_0M0   ])[ks   ];
-      f_T   = (D.f[DIR_00P   ])[kt   ];
-      f_B   = (D.f[DIR_00M   ])[kb   ];
-      f_NE  = (D.f[DIR_PP0  ])[kne  ];
-      f_SW  = (D.f[DIR_MM0  ])[ksw  ];
-      f_SE  = (D.f[DIR_PM0  ])[kse  ];
-      f_NW  = (D.f[DIR_MP0  ])[knw  ];
-      f_TE  = (D.f[DIR_P0P  ])[kte  ];
-      f_BW  = (D.f[DIR_M0M  ])[kbw  ];
-      f_BE  = (D.f[DIR_P0M  ])[kbe  ];
-      f_TW  = (D.f[DIR_M0P  ])[ktw  ];
-      f_TN  = (D.f[DIR_0PP  ])[ktn  ];
-      f_BS  = (D.f[DIR_0MM  ])[kbs  ];
-      f_BN  = (D.f[DIR_0PM  ])[kbn  ];
-      f_TS  = (D.f[DIR_0MP  ])[kts  ];
-      f_TNE = (D.f[DIR_PPP ])[ktne ];
-      f_TSW = (D.f[DIR_MMP ])[ktsw ];
-      f_TSE = (D.f[DIR_PMP ])[ktse ];
-      f_TNW = (D.f[DIR_MPP ])[ktnw ];
-      f_BNE = (D.f[DIR_PPM ])[kbne ];
-      f_BSW = (D.f[DIR_MMM ])[kbsw ];
-      f_BSE = (D.f[DIR_PMM ])[kbse ];
-      f_BNW = (D.f[DIR_MPM ])[kbnw ];
-      //f_W    = (D.f[DIR_P00   ])[ke   ];
-      //f_E    = (D.f[DIR_M00   ])[kw   ];
-      //f_S    = (D.f[DIR_0P0   ])[kn   ];
-      //f_N    = (D.f[DIR_0M0   ])[ks   ];
-      //f_B    = (D.f[DIR_00P   ])[kt   ];
-      //f_T    = (D.f[DIR_00M   ])[kb   ];
-      //f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      //f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      //f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      //f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      //f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      //f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      //f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      //f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      //f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      //f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      //f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      //f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      //f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      //f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      //f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      //f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      //f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      //f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      //f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      //f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_E   = (D.f[DIR_P00])[ke   ];
+      f_W   = (D.f[DIR_M00])[kw   ];
+      f_N   = (D.f[DIR_0P0])[kn   ];
+      f_S   = (D.f[DIR_0M0])[ks   ];
+      f_T   = (D.f[DIR_00P])[kt   ];
+      f_B   = (D.f[DIR_00M])[kb   ];
+      f_NE  = (D.f[DIR_PP0])[kne  ];
+      f_SW  = (D.f[DIR_MM0])[ksw  ];
+      f_SE  = (D.f[DIR_PM0])[kse  ];
+      f_NW  = (D.f[DIR_MP0])[knw  ];
+      f_TE  = (D.f[DIR_P0P])[kte  ];
+      f_BW  = (D.f[DIR_M0M])[kbw  ];
+      f_BE  = (D.f[DIR_P0M])[kbe  ];
+      f_TW  = (D.f[DIR_M0P])[ktw  ];
+      f_TN  = (D.f[DIR_0PP])[ktn  ];
+      f_BS  = (D.f[DIR_0MM])[kbs  ];
+      f_BN  = (D.f[DIR_0PM])[kbn  ];
+      f_TS  = (D.f[DIR_0MP])[kts  ];
+      f_TNE = (D.f[DIR_PPP])[ktne ];
+      f_TSW = (D.f[DIR_MMP])[ktsw ];
+      f_TSE = (D.f[DIR_PMP])[ktse ];
+      f_TNW = (D.f[DIR_MPP])[ktnw ];
+      f_BNE = (D.f[DIR_PPM])[kbne ];
+      f_BSW = (D.f[DIR_MMM])[kbsw ];
+      f_BSE = (D.f[DIR_PMM])[kbse ];
+      f_BNW = (D.f[DIR_MPM])[kbnw ];
+      //f_W    = (D.f[DIR_P00])[ke   ];
+      //f_E    = (D.f[DIR_M00])[kw   ];
+      //f_S    = (D.f[DIR_0P0])[kn   ];
+      //f_N    = (D.f[DIR_0M0])[ks   ];
+      //f_B    = (D.f[DIR_00P])[kt   ];
+      //f_T    = (D.f[DIR_00M])[kb   ];
+      //f_SW   = (D.f[DIR_PP0])[kne  ];
+      //f_NE   = (D.f[DIR_MM0])[ksw  ];
+      //f_NW   = (D.f[DIR_PM0])[kse  ];
+      //f_SE   = (D.f[DIR_MP0])[knw  ];
+      //f_BW   = (D.f[DIR_P0P])[kte  ];
+      //f_TE   = (D.f[DIR_M0M])[kbw  ];
+      //f_TW   = (D.f[DIR_P0M])[kbe  ];
+      //f_BE   = (D.f[DIR_M0P])[ktw  ];
+      //f_BS   = (D.f[DIR_0PP])[ktn  ];
+      //f_TN   = (D.f[DIR_0MM])[kbs  ];
+      //f_TS   = (D.f[DIR_0PM])[kbn  ];
+      //f_BN   = (D.f[DIR_0MP])[kts  ];
+      //f_BSW  = (D.f[DIR_PPP])[ktne ];
+      //f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      //f_BNW  = (D.f[DIR_PMP])[ktse ];
+      //f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      //f_TSW  = (D.f[DIR_PPM])[kbne ];
+      //f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      //f_TNW  = (D.f[DIR_PMM])[kbse ];
+      //f_TSE  = (D.f[DIR_MPM])[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 +
@@ -1282,63 +1282,63 @@ __global__ void QDeviceCompHighNu27(
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -1637,7 +1637,7 @@ __global__ void QDeviceComp27(
 										 unsigned int* neighborX,
 										 unsigned int* neighborY,
 										 unsigned int* neighborZ,
-										 unsigned int numberOfLBnodes, 
+										 unsigned long long numberOfLBnodes, 
 										 bool isEvenTimestep)
 {
    //////////////////////////////////////////////////////////////////////////
@@ -1705,32 +1705,32 @@ __global__ void QDeviceComp27(
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - Calculate macroscopic quantities
@@ -2019,7 +2019,7 @@ __global__ void QDevice27(real* distributions,
                                      unsigned int* neighborX,
                                      unsigned int* neighborY,
                                      unsigned int* neighborZ,
-                                     unsigned int numberOfLBnodes, 
+                                     unsigned long long numberOfLBnodes, 
                                      bool isEvenTimestep)
 {
    //////////////////////////////////////////////////////////////////////////
@@ -2091,32 +2091,32 @@ __global__ void QDevice27(real* distributions,
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - Calculate macroscopic quantities
@@ -2405,7 +2405,7 @@ __global__ void BBDevice27(real* distributions,
                                      unsigned int* neighborX,
                                      unsigned int* neighborY,
                                      unsigned int* neighborZ,
-                                     unsigned int numberOfLBnodes, 
+                                     unsigned long long numberOfLBnodes, 
                                      bool isEvenTimestep)
 {
    //////////////////////////////////////////////////////////////////////////
@@ -2474,32 +2474,32 @@ __global__ void BBDevice27(real* distributions,
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - change the pointer to write the results in the correct array
@@ -2509,24 +2509,24 @@ __global__ void BBDevice27(real* distributions,
       ////////////////////////////////////////////////////////////////////////////////
       //! - rewrite distributions if there is a sub-grid distance (q) in same direction
       real q;
-      q = (subgridD.q[DIR_P00  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M00  ])[kw  ]=f_E  ;
-      q = (subgridD.q[DIR_M00  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P00  ])[ke  ]=f_W  ;
-      q = (subgridD.q[DIR_0P0  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0M0  ])[ks  ]=f_N  ;
-      q = (subgridD.q[DIR_0M0  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0P0  ])[kn  ]=f_S  ;
-      q = (subgridD.q[DIR_00P  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_00M  ])[kb  ]=f_T  ;
-      q = (subgridD.q[DIR_00M  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_00P  ])[kt  ]=f_B  ;
-      q = (subgridD.q[DIR_PP0 ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MM0 ])[ksw ]=f_NE ;
-      q = (subgridD.q[DIR_MM0 ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PP0 ])[kne ]=f_SW ;
-      q = (subgridD.q[DIR_PM0 ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MP0 ])[knw ]=f_SE ;
-      q = (subgridD.q[DIR_MP0 ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PM0 ])[kse ]=f_NW ;
-      q = (subgridD.q[DIR_P0P ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M0M ])[kbw ]=f_TE ;
-      q = (subgridD.q[DIR_M0M ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P0P ])[kte ]=f_BW ;
-      q = (subgridD.q[DIR_P0M ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M0P ])[ktw ]=f_BE ;
-      q = (subgridD.q[DIR_M0P ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P0M ])[kbe ]=f_TW ;
-      q = (subgridD.q[DIR_0PP ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0MM ])[kbs ]=f_TN ;
-      q = (subgridD.q[DIR_0MM ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0PP ])[ktn ]=f_BS ;
-      q = (subgridD.q[DIR_0PM ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0MP ])[kts ]=f_BN ;
-      q = (subgridD.q[DIR_0MP ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0PM ])[kbn ]=f_TS ;
+      q = (subgridD.q[DIR_P00])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M00])[kw  ]=f_E  ;
+      q = (subgridD.q[DIR_M00])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P00])[ke  ]=f_W  ;
+      q = (subgridD.q[DIR_0P0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0M0])[ks  ]=f_N  ;
+      q = (subgridD.q[DIR_0M0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0P0])[kn  ]=f_S  ;
+      q = (subgridD.q[DIR_00P])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_00M])[kb  ]=f_T  ;
+      q = (subgridD.q[DIR_00M])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_00P])[kt  ]=f_B  ;
+      q = (subgridD.q[DIR_PP0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MM0])[ksw ]=f_NE ;
+      q = (subgridD.q[DIR_MM0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PP0])[kne ]=f_SW ;
+      q = (subgridD.q[DIR_PM0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MP0])[knw ]=f_SE ;
+      q = (subgridD.q[DIR_MP0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PM0])[kse ]=f_NW ;
+      q = (subgridD.q[DIR_P0P])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M0M])[kbw ]=f_TE ;
+      q = (subgridD.q[DIR_M0M])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P0P])[kte ]=f_BW ;
+      q = (subgridD.q[DIR_P0M])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M0P])[ktw ]=f_BE ;
+      q = (subgridD.q[DIR_M0P])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P0M])[kbe ]=f_TW ;
+      q = (subgridD.q[DIR_0PP])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0MM])[kbs ]=f_TN ;
+      q = (subgridD.q[DIR_0MM])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0PP])[ktn ]=f_BS ;
+      q = (subgridD.q[DIR_0PM])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0MP])[kts ]=f_BN ;
+      q = (subgridD.q[DIR_0MP])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0PM])[kbn ]=f_TS ;
       q = (subgridD.q[DIR_PPP])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MMM])[kbsw]=f_TNE;
       q = (subgridD.q[DIR_MMM])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PPP])[ktne]=f_BSW;
       q = (subgridD.q[DIR_PPM])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MMP])[ktsw]=f_BNE;
diff --git a/src/gpu/VirtualFluids_GPU/GPU/Particles.cu b/src/gpu/VirtualFluids_GPU/GPU/Particles.cu
index 3a3ab784e6a7901c41d402629172c3c6154ffde9..22d9df4a3b4ae706dcf9b76d93940122015248f1 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/Particles.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/Particles.cu
@@ -29,7 +29,7 @@ __global__ void InitParticles( real* coordX,
 										  unsigned int* neighborWSB,
 										  int level,
 									      unsigned int numberOfParticles, 
-										  unsigned int size_Mat)
+										  unsigned long long numberOfLBnodes)
 {
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -72,12 +72,12 @@ __global__ void InitParticles( real* coordX,
 
 		////////////////////////////////////////////////////////////////////////////////
 		//find random node of the fluid domain
-		unsigned int cbID = (unsigned int)(randArray[k]*size_Mat);
-		for(int i = 0; i < size_Mat;i++)
+		unsigned int cbID = (unsigned int)(randArray[k]*numberOfLBnodes);
+		for(int i = 0; i < numberOfLBnodes;i++)
 		{
 			//if (coordX[cbID] < 15 && coordX[cbID] > 5 && coordY[cbID] < 15 && coordY[cbID] > 5 && coordZ[cbID] < 15 && coordZ[cbID] > 5)	break;
 			if (coordX[cbID] < 5 && coordX[cbID] > 2)	break;
-			cbID = (unsigned int)(randArray[k]*(size_Mat - i)); 
+			cbID = (unsigned int)(randArray[k]*(numberOfLBnodes - i)); 
 		}
 	   
 		real coordinateX;
@@ -183,7 +183,7 @@ __global__ void MoveParticles( real* coordX,
 										  unsigned int timestep, 
 										  unsigned int numberOfTimesteps, 
 									      unsigned int numberOfParticles, 
-										  unsigned int size_Mat,
+										  unsigned long long numberOfLBnodes,
 										  bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -248,63 +248,63 @@ __global__ void MoveParticles( real* coordX,
 		{
 		   if (isEvenTimestep==true)
 		   {
-			  feC    = &DD[DIR_P00   *size_Mat];
-			  fwC    = &DD[DIR_M00   *size_Mat];
-			  fnC    = &DD[DIR_0P0   *size_Mat];
-			  fsC    = &DD[DIR_0M0   *size_Mat];
-			  ftC    = &DD[DIR_00P   *size_Mat];
-			  fbC    = &DD[DIR_00M   *size_Mat];
-			  fneC   = &DD[DIR_PP0  *size_Mat];
-			  fswC   = &DD[DIR_MM0  *size_Mat];
-			  fseC   = &DD[DIR_PM0  *size_Mat];
-			  fnwC   = &DD[DIR_MP0  *size_Mat];
-			  fteC   = &DD[DIR_P0P  *size_Mat];
-			  fbwC   = &DD[DIR_M0M  *size_Mat];
-			  fbeC   = &DD[DIR_P0M  *size_Mat];
-			  ftwC   = &DD[DIR_M0P  *size_Mat];
-			  ftnC   = &DD[DIR_0PP  *size_Mat];
-			  fbsC   = &DD[DIR_0MM  *size_Mat];
-			  fbnC   = &DD[DIR_0PM  *size_Mat];
-			  ftsC   = &DD[DIR_0MP  *size_Mat];
-			  fzeroC = &DD[DIR_000*size_Mat];
-			  ftneC  = &DD[DIR_PPP *size_Mat];
-			  ftswC  = &DD[DIR_MMP *size_Mat];
-			  ftseC  = &DD[DIR_PMP *size_Mat];
-			  ftnwC  = &DD[DIR_MPP *size_Mat];
-			  fbneC  = &DD[DIR_PPM *size_Mat];
-			  fbswC  = &DD[DIR_MMM *size_Mat];
-			  fbseC  = &DD[DIR_PMM *size_Mat];
-			  fbnwC  = &DD[DIR_MPM *size_Mat];
+			  feC    = &DD[DIR_P00 * numberOfLBnodes];
+			  fwC    = &DD[DIR_M00 * numberOfLBnodes];
+			  fnC    = &DD[DIR_0P0 * numberOfLBnodes];
+			  fsC    = &DD[DIR_0M0 * numberOfLBnodes];
+			  ftC    = &DD[DIR_00P * numberOfLBnodes];
+			  fbC    = &DD[DIR_00M * numberOfLBnodes];
+			  fneC   = &DD[DIR_PP0 * numberOfLBnodes];
+			  fswC   = &DD[DIR_MM0 * numberOfLBnodes];
+			  fseC   = &DD[DIR_PM0 * numberOfLBnodes];
+			  fnwC   = &DD[DIR_MP0 * numberOfLBnodes];
+			  fteC   = &DD[DIR_P0P * numberOfLBnodes];
+			  fbwC   = &DD[DIR_M0M * numberOfLBnodes];
+			  fbeC   = &DD[DIR_P0M * numberOfLBnodes];
+			  ftwC   = &DD[DIR_M0P * numberOfLBnodes];
+			  ftnC   = &DD[DIR_0PP * numberOfLBnodes];
+			  fbsC   = &DD[DIR_0MM * numberOfLBnodes];
+			  fbnC   = &DD[DIR_0PM * numberOfLBnodes];
+			  ftsC   = &DD[DIR_0MP * numberOfLBnodes];
+			  fzeroC = &DD[DIR_000 * numberOfLBnodes];
+			  ftneC  = &DD[DIR_PPP * numberOfLBnodes];
+			  ftswC  = &DD[DIR_MMP * numberOfLBnodes];
+			  ftseC  = &DD[DIR_PMP * numberOfLBnodes];
+			  ftnwC  = &DD[DIR_MPP * numberOfLBnodes];
+			  fbneC  = &DD[DIR_PPM * numberOfLBnodes];
+			  fbswC  = &DD[DIR_MMM * numberOfLBnodes];
+			  fbseC  = &DD[DIR_PMM * numberOfLBnodes];
+			  fbnwC  = &DD[DIR_MPM * numberOfLBnodes];
 		   } 			 
 		   else			 
 		   {			 
-			  fwC    = &DD[DIR_P00   *size_Mat];
-			  feC    = &DD[DIR_M00   *size_Mat];
-			  fsC    = &DD[DIR_0P0   *size_Mat];
-			  fnC    = &DD[DIR_0M0   *size_Mat];
-			  fbC    = &DD[DIR_00P   *size_Mat];
-			  ftC    = &DD[DIR_00M   *size_Mat];
-			  fswC   = &DD[DIR_PP0  *size_Mat];
-			  fneC   = &DD[DIR_MM0  *size_Mat];
-			  fnwC   = &DD[DIR_PM0  *size_Mat];
-			  fseC   = &DD[DIR_MP0  *size_Mat];
-			  fbwC   = &DD[DIR_P0P  *size_Mat];
-			  fteC   = &DD[DIR_M0M  *size_Mat];
-			  ftwC   = &DD[DIR_P0M  *size_Mat];
-			  fbeC   = &DD[DIR_M0P  *size_Mat];
-			  fbsC   = &DD[DIR_0PP  *size_Mat];
-			  ftnC   = &DD[DIR_0MM  *size_Mat];
-			  ftsC   = &DD[DIR_0PM  *size_Mat];
-			  fbnC   = &DD[DIR_0MP  *size_Mat];
-			  fzeroC = &DD[DIR_000*size_Mat];
-			  fbswC  = &DD[DIR_PPP *size_Mat];
-			  fbneC  = &DD[DIR_MMP *size_Mat];
-			  fbnwC  = &DD[DIR_PMP *size_Mat];
-			  fbseC  = &DD[DIR_MPP *size_Mat];
-			  ftswC  = &DD[DIR_PPM *size_Mat];
-			  ftneC  = &DD[DIR_MMM *size_Mat];
-			  ftnwC  = &DD[DIR_PMM *size_Mat];
-			  ftseC  = &DD[DIR_MPM *size_Mat];
+			  fwC    = &DD[DIR_P00 * numberOfLBnodes];
+			  feC    = &DD[DIR_M00 * numberOfLBnodes];
+			  fsC    = &DD[DIR_0P0 * numberOfLBnodes];
+			  fnC    = &DD[DIR_0M0 * numberOfLBnodes];
+			  fbC    = &DD[DIR_00P * numberOfLBnodes];
+			  ftC    = &DD[DIR_00M * numberOfLBnodes];
+			  fswC   = &DD[DIR_PP0 * numberOfLBnodes];
+			  fneC   = &DD[DIR_MM0 * numberOfLBnodes];
+			  fnwC   = &DD[DIR_PM0 * numberOfLBnodes];
+			  fseC   = &DD[DIR_MP0 * numberOfLBnodes];
+			  fbwC   = &DD[DIR_P0P * numberOfLBnodes];
+			  fteC   = &DD[DIR_M0M * numberOfLBnodes];
+			  ftwC   = &DD[DIR_P0M * numberOfLBnodes];
+			  fbeC   = &DD[DIR_M0P * numberOfLBnodes];
+			  fbsC   = &DD[DIR_0PP * numberOfLBnodes];
+			  ftnC   = &DD[DIR_0MM * numberOfLBnodes];
+			  ftsC   = &DD[DIR_0PM * numberOfLBnodes];
+			  fbnC   = &DD[DIR_0MP * numberOfLBnodes];
+			  fzeroC = &DD[DIR_000 * numberOfLBnodes];
+			  fbswC  = &DD[DIR_PPP * numberOfLBnodes];
+			  fbneC  = &DD[DIR_MMP * numberOfLBnodes];
+			  fbnwC  = &DD[DIR_PMP * numberOfLBnodes];
+			  fbseC  = &DD[DIR_MPP * numberOfLBnodes];
+			  ftswC  = &DD[DIR_PPM * numberOfLBnodes];
+			  ftneC  = &DD[DIR_MMM * numberOfLBnodes];
+			  ftnwC  = &DD[DIR_PMM * numberOfLBnodes];
+			  ftseC  = &DD[DIR_MPM * numberOfLBnodes];
 		   }
 
 			  //////////////////////////////////////////////////////////////////////////
@@ -1055,7 +1055,7 @@ __global__ void MoveParticlesWithoutBCs(   real* coordX,
 													  unsigned int timestep, 
 													  unsigned int numberOfTimesteps, 
 													  unsigned int numberOfParticles, 
-													  unsigned int size_Mat,
+													  unsigned long long numberOfLBnodes,
 													  bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -1114,63 +1114,63 @@ __global__ void MoveParticlesWithoutBCs(   real* coordX,
 		{
 		   if (isEvenTimestep==true)
 		   {
-			  feC    = &DD[DIR_P00   *size_Mat];
-			  fwC    = &DD[DIR_M00   *size_Mat];
-			  fnC    = &DD[DIR_0P0   *size_Mat];
-			  fsC    = &DD[DIR_0M0   *size_Mat];
-			  ftC    = &DD[DIR_00P   *size_Mat];
-			  fbC    = &DD[DIR_00M   *size_Mat];
-			  fneC   = &DD[DIR_PP0  *size_Mat];
-			  fswC   = &DD[DIR_MM0  *size_Mat];
-			  fseC   = &DD[DIR_PM0  *size_Mat];
-			  fnwC   = &DD[DIR_MP0  *size_Mat];
-			  fteC   = &DD[DIR_P0P  *size_Mat];
-			  fbwC   = &DD[DIR_M0M  *size_Mat];
-			  fbeC   = &DD[DIR_P0M  *size_Mat];
-			  ftwC   = &DD[DIR_M0P  *size_Mat];
-			  ftnC   = &DD[DIR_0PP  *size_Mat];
-			  fbsC   = &DD[DIR_0MM  *size_Mat];
-			  fbnC   = &DD[DIR_0PM  *size_Mat];
-			  ftsC   = &DD[DIR_0MP  *size_Mat];
-			  fzeroC = &DD[DIR_000*size_Mat];
-			  ftneC  = &DD[DIR_PPP *size_Mat];
-			  ftswC  = &DD[DIR_MMP *size_Mat];
-			  ftseC  = &DD[DIR_PMP *size_Mat];
-			  ftnwC  = &DD[DIR_MPP *size_Mat];
-			  fbneC  = &DD[DIR_PPM *size_Mat];
-			  fbswC  = &DD[DIR_MMM *size_Mat];
-			  fbseC  = &DD[DIR_PMM *size_Mat];
-			  fbnwC  = &DD[DIR_MPM *size_Mat];
+			  feC    = &DD[DIR_P00 * numberOfLBnodes];
+			  fwC    = &DD[DIR_M00 * numberOfLBnodes];
+			  fnC    = &DD[DIR_0P0 * numberOfLBnodes];
+			  fsC    = &DD[DIR_0M0 * numberOfLBnodes];
+			  ftC    = &DD[DIR_00P * numberOfLBnodes];
+			  fbC    = &DD[DIR_00M * numberOfLBnodes];
+			  fneC   = &DD[DIR_PP0 * numberOfLBnodes];
+			  fswC   = &DD[DIR_MM0 * numberOfLBnodes];
+			  fseC   = &DD[DIR_PM0 * numberOfLBnodes];
+			  fnwC   = &DD[DIR_MP0 * numberOfLBnodes];
+			  fteC   = &DD[DIR_P0P * numberOfLBnodes];
+			  fbwC   = &DD[DIR_M0M * numberOfLBnodes];
+			  fbeC   = &DD[DIR_P0M * numberOfLBnodes];
+			  ftwC   = &DD[DIR_M0P * numberOfLBnodes];
+			  ftnC   = &DD[DIR_0PP * numberOfLBnodes];
+			  fbsC   = &DD[DIR_0MM * numberOfLBnodes];
+			  fbnC   = &DD[DIR_0PM * numberOfLBnodes];
+			  ftsC   = &DD[DIR_0MP * numberOfLBnodes];
+			  fzeroC = &DD[DIR_000 * numberOfLBnodes];
+			  ftneC  = &DD[DIR_PPP * numberOfLBnodes];
+			  ftswC  = &DD[DIR_MMP * numberOfLBnodes];
+			  ftseC  = &DD[DIR_PMP * numberOfLBnodes];
+			  ftnwC  = &DD[DIR_MPP * numberOfLBnodes];
+			  fbneC  = &DD[DIR_PPM * numberOfLBnodes];
+			  fbswC  = &DD[DIR_MMM * numberOfLBnodes];
+			  fbseC  = &DD[DIR_PMM * numberOfLBnodes];
+			  fbnwC  = &DD[DIR_MPM * numberOfLBnodes];
 		   } 			 
 		   else			 
 		   {			 
-			  fwC    = &DD[DIR_P00   *size_Mat];
-			  feC    = &DD[DIR_M00   *size_Mat];
-			  fsC    = &DD[DIR_0P0   *size_Mat];
-			  fnC    = &DD[DIR_0M0   *size_Mat];
-			  fbC    = &DD[DIR_00P   *size_Mat];
-			  ftC    = &DD[DIR_00M   *size_Mat];
-			  fswC   = &DD[DIR_PP0  *size_Mat];
-			  fneC   = &DD[DIR_MM0  *size_Mat];
-			  fnwC   = &DD[DIR_PM0  *size_Mat];
-			  fseC   = &DD[DIR_MP0  *size_Mat];
-			  fbwC   = &DD[DIR_P0P  *size_Mat];
-			  fteC   = &DD[DIR_M0M  *size_Mat];
-			  ftwC   = &DD[DIR_P0M  *size_Mat];
-			  fbeC   = &DD[DIR_M0P  *size_Mat];
-			  fbsC   = &DD[DIR_0PP  *size_Mat];
-			  ftnC   = &DD[DIR_0MM  *size_Mat];
-			  ftsC   = &DD[DIR_0PM  *size_Mat];
-			  fbnC   = &DD[DIR_0MP  *size_Mat];
-			  fzeroC = &DD[DIR_000*size_Mat];
-			  fbswC  = &DD[DIR_PPP *size_Mat];
-			  fbneC  = &DD[DIR_MMP *size_Mat];
-			  fbnwC  = &DD[DIR_PMP *size_Mat];
-			  fbseC  = &DD[DIR_MPP *size_Mat];
-			  ftswC  = &DD[DIR_PPM *size_Mat];
-			  ftneC  = &DD[DIR_MMM *size_Mat];
-			  ftnwC  = &DD[DIR_PMM *size_Mat];
-			  ftseC  = &DD[DIR_MPM *size_Mat];
+			  fwC    = &DD[DIR_P00 * numberOfLBnodes];
+			  feC    = &DD[DIR_M00 * numberOfLBnodes];
+			  fsC    = &DD[DIR_0P0 * numberOfLBnodes];
+			  fnC    = &DD[DIR_0M0 * numberOfLBnodes];
+			  fbC    = &DD[DIR_00P * numberOfLBnodes];
+			  ftC    = &DD[DIR_00M * numberOfLBnodes];
+			  fswC   = &DD[DIR_PP0 * numberOfLBnodes];
+			  fneC   = &DD[DIR_MM0 * numberOfLBnodes];
+			  fnwC   = &DD[DIR_PM0 * numberOfLBnodes];
+			  fseC   = &DD[DIR_MP0 * numberOfLBnodes];
+			  fbwC   = &DD[DIR_P0P * numberOfLBnodes];
+			  fteC   = &DD[DIR_M0M * numberOfLBnodes];
+			  ftwC   = &DD[DIR_P0M * numberOfLBnodes];
+			  fbeC   = &DD[DIR_M0P * numberOfLBnodes];
+			  fbsC   = &DD[DIR_0PP * numberOfLBnodes];
+			  ftnC   = &DD[DIR_0MM * numberOfLBnodes];
+			  ftsC   = &DD[DIR_0PM * numberOfLBnodes];
+			  fbnC   = &DD[DIR_0MP * numberOfLBnodes];
+			  fzeroC = &DD[DIR_000 * numberOfLBnodes];
+			  fbswC  = &DD[DIR_PPP * numberOfLBnodes];
+			  fbneC  = &DD[DIR_MMP * numberOfLBnodes];
+			  fbnwC  = &DD[DIR_PMP * numberOfLBnodes];
+			  fbseC  = &DD[DIR_MPP * numberOfLBnodes];
+			  ftswC  = &DD[DIR_PPM * numberOfLBnodes];
+			  ftneC  = &DD[DIR_MMM * numberOfLBnodes];
+			  ftnwC  = &DD[DIR_PMM * numberOfLBnodes];
+			  ftseC  = &DD[DIR_MPM * numberOfLBnodes];
 		   }
 
 			  //////////////////////////////////////////////////////////////////////////
@@ -1928,7 +1928,7 @@ __global__ void ParticleNoSlipDeviceComp27(real* coordX,
 													  real* NormalX,
 													  real* NormalY,
 													  real* NormalZ,
-													  unsigned int size_Mat, 
+													  unsigned long long numberOfLBnodes, 
 													  bool isEvenTimestep)
 {
 
@@ -1937,63 +1937,63 @@ __global__ void ParticleNoSlipDeviceComp27(real* coordX,
    //Distributions27 D;
    //if (isEvenTimestep==true)
    //{
-   //   D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-   //   D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-   //   D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-   //   D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-   //   D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-   //   D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-   //   D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-   //   D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-   //   D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-   //   D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-   //   D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-   //   D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-   //   D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-   //   D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-   //   D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-   //   D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-   //   D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-   //   D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-   //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //   D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-   //   D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-   //   D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-   //   D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-   //   D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-   //   D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-   //   D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-   //   D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+   //   D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+   //   D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+   //   D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+   //   D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+   //   D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+   //   D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+   //   D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+   //   D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+   //   D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+   //   D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+   //   D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+   //   D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+   //   D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+   //   D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+   //   D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+   //   D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+   //   D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+   //   D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+   //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //   D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+   //   D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+   //   D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+   //   D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+   //   D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+   //   D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+   //   D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+   //   D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
    //} 
    //else
    //{
-   //   D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-   //   D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-   //   D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-   //   D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-   //   D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-   //   D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-   //   D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-   //   D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-   //   D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-   //   D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-   //   D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-   //   D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-   //   D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-   //   D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-   //   D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-   //   D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-   //   D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-   //   D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-   //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //   D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-   //   D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-   //   D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-   //   D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-   //   D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-   //   D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-   //   D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-   //   D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+   //   D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+   //   D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+   //   D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+   //   D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+   //   D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+   //   D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+   //   D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+   //   D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+   //   D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+   //   D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+   //   D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+   //   D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+   //   D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+   //   D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+   //   D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+   //   D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+   //   D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+   //   D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+   //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //   D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+   //   D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+   //   D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+   //   D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+   //   D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+   //   D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+   //   D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+   //   D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
    //}
    //////////////////////////////////////////////////////////////////////////////////
    //const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -2015,24 +2015,24 @@ __global__ void ParticleNoSlipDeviceComp27(real* coordX,
    // //         *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[DIR_P00   * numberOfBCnodes];
-   //    q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-   // //   q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-   //    q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-   // //   q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-   //    q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-   // //   q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-   // //   q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-   // //   q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-   // //   q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-   // //   q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-   // //   q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-   // //   q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-   // //   q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-   // //   q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-   // //   q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-   // //   q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-   // //   q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+   // //   q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+   //    q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+   // //   q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+   //    q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+   // //   q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+   //    q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+   // //   q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+   // //   q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+   // //   q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+   // //   q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+   // //   q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+   // //   q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+   // //   q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+   // //   q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+   // //   q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+   // //   q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+   // //   q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+   // //   q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
    // //   q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
    // //   q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
    // //   q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -2047,24 +2047,24 @@ __global__ void ParticleNoSlipDeviceComp27(real* coordX,
    // //           *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[DIR_P00   * numberOfBCnodes];
-   // //   nx_dirW   = &NormalX[DIR_M00   * numberOfBCnodes];
-   // //   nx_dirN   = &NormalX[DIR_0P0   * numberOfBCnodes];
-   // //   nx_dirS   = &NormalX[DIR_0M0   * numberOfBCnodes];
-   // //   nx_dirT   = &NormalX[DIR_00P   * numberOfBCnodes];
-   // //   nx_dirB   = &NormalX[DIR_00M   * numberOfBCnodes];
-   // //   nx_dirNE  = &NormalX[DIR_PP0  * numberOfBCnodes];
-   // //   nx_dirSW  = &NormalX[DIR_MM0  * numberOfBCnodes];
-   // //   nx_dirSE  = &NormalX[DIR_PM0  * numberOfBCnodes];
-   // //   nx_dirNW  = &NormalX[DIR_MP0  * numberOfBCnodes];
-   // //   nx_dirTE  = &NormalX[DIR_P0P  * numberOfBCnodes];
-   // //   nx_dirBW  = &NormalX[DIR_M0M  * numberOfBCnodes];
-   // //   nx_dirBE  = &NormalX[DIR_P0M  * numberOfBCnodes];
-   // //   nx_dirTW  = &NormalX[DIR_M0P  * numberOfBCnodes];
-   // //   nx_dirTN  = &NormalX[DIR_0PP  * numberOfBCnodes];
-   // //   nx_dirBS  = &NormalX[DIR_0MM  * numberOfBCnodes];
-   // //   nx_dirBN  = &NormalX[DIR_0PM  * numberOfBCnodes];
-   // //   nx_dirTS  = &NormalX[DIR_0MP  * numberOfBCnodes];
+   // //   nx_dirE   = &NormalX[DIR_P00 * numberOfBCnodes];
+   // //   nx_dirW   = &NormalX[DIR_M00 * numberOfBCnodes];
+   // //   nx_dirN   = &NormalX[DIR_0P0 * numberOfBCnodes];
+   // //   nx_dirS   = &NormalX[DIR_0M0 * numberOfBCnodes];
+   // //   nx_dirT   = &NormalX[DIR_00P * numberOfBCnodes];
+   // //   nx_dirB   = &NormalX[DIR_00M * numberOfBCnodes];
+   // //   nx_dirNE  = &NormalX[DIR_PP0 * numberOfBCnodes];
+   // //   nx_dirSW  = &NormalX[DIR_MM0 * numberOfBCnodes];
+   // //   nx_dirSE  = &NormalX[DIR_PM0 * numberOfBCnodes];
+   // //   nx_dirNW  = &NormalX[DIR_MP0 * numberOfBCnodes];
+   // //   nx_dirTE  = &NormalX[DIR_P0P * numberOfBCnodes];
+   // //   nx_dirBW  = &NormalX[DIR_M0M * numberOfBCnodes];
+   // //   nx_dirBE  = &NormalX[DIR_P0M * numberOfBCnodes];
+   // //   nx_dirTW  = &NormalX[DIR_M0P * numberOfBCnodes];
+   // //   nx_dirTN  = &NormalX[DIR_0PP * numberOfBCnodes];
+   // //   nx_dirBS  = &NormalX[DIR_0MM * numberOfBCnodes];
+   // //   nx_dirBN  = &NormalX[DIR_0PM * numberOfBCnodes];
+   // //   nx_dirTS  = &NormalX[DIR_0MP * numberOfBCnodes];
    // //   nx_dirTNE = &NormalX[DIR_PPP * numberOfBCnodes];
    // //   nx_dirTSW = &NormalX[DIR_MMP * numberOfBCnodes];
    // //   nx_dirTSE = &NormalX[DIR_PMP * numberOfBCnodes];
@@ -2079,24 +2079,24 @@ __global__ void ParticleNoSlipDeviceComp27(real* coordX,
    // //           *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[DIR_P00   * numberOfBCnodes];
-   // //   ny_dirW   = &NormalY[DIR_M00   * numberOfBCnodes];
-   // //   ny_dirN   = &NormalY[DIR_0P0   * numberOfBCnodes];
-   // //   ny_dirS   = &NormalY[DIR_0M0   * numberOfBCnodes];
-   // //   ny_dirT   = &NormalY[DIR_00P   * numberOfBCnodes];
-   // //   ny_dirB   = &NormalY[DIR_00M   * numberOfBCnodes];
-   // //   ny_dirNE  = &NormalY[DIR_PP0  * numberOfBCnodes];
-   // //   ny_dirSW  = &NormalY[DIR_MM0  * numberOfBCnodes];
-   // //   ny_dirSE  = &NormalY[DIR_PM0  * numberOfBCnodes];
-   // //   ny_dirNW  = &NormalY[DIR_MP0  * numberOfBCnodes];
-   // //   ny_dirTE  = &NormalY[DIR_P0P  * numberOfBCnodes];
-   // //   ny_dirBW  = &NormalY[DIR_M0M  * numberOfBCnodes];
-   // //   ny_dirBE  = &NormalY[DIR_P0M  * numberOfBCnodes];
-   // //   ny_dirTW  = &NormalY[DIR_M0P  * numberOfBCnodes];
-   // //   ny_dirTN  = &NormalY[DIR_0PP  * numberOfBCnodes];
-   // //   ny_dirBS  = &NormalY[DIR_0MM  * numberOfBCnodes];
-   // //   ny_dirBN  = &NormalY[DIR_0PM  * numberOfBCnodes];
-   // //   ny_dirTS  = &NormalY[DIR_0MP  * numberOfBCnodes];
+   // //   ny_dirE   = &NormalY[DIR_P00 * numberOfBCnodes];
+   // //   ny_dirW   = &NormalY[DIR_M00 * numberOfBCnodes];
+   // //   ny_dirN   = &NormalY[DIR_0P0 * numberOfBCnodes];
+   // //   ny_dirS   = &NormalY[DIR_0M0 * numberOfBCnodes];
+   // //   ny_dirT   = &NormalY[DIR_00P * numberOfBCnodes];
+   // //   ny_dirB   = &NormalY[DIR_00M * numberOfBCnodes];
+   // //   ny_dirNE  = &NormalY[DIR_PP0 * numberOfBCnodes];
+   // //   ny_dirSW  = &NormalY[DIR_MM0 * numberOfBCnodes];
+   // //   ny_dirSE  = &NormalY[DIR_PM0 * numberOfBCnodes];
+   // //   ny_dirNW  = &NormalY[DIR_MP0 * numberOfBCnodes];
+   // //   ny_dirTE  = &NormalY[DIR_P0P * numberOfBCnodes];
+   // //   ny_dirBW  = &NormalY[DIR_M0M * numberOfBCnodes];
+   // //   ny_dirBE  = &NormalY[DIR_P0M * numberOfBCnodes];
+   // //   ny_dirTW  = &NormalY[DIR_M0P * numberOfBCnodes];
+   // //   ny_dirTN  = &NormalY[DIR_0PP * numberOfBCnodes];
+   // //   ny_dirBS  = &NormalY[DIR_0MM * numberOfBCnodes];
+   // //   ny_dirBN  = &NormalY[DIR_0PM * numberOfBCnodes];
+   // //   ny_dirTS  = &NormalY[DIR_0MP * numberOfBCnodes];
    // //   ny_dirTNE = &NormalY[DIR_PPP * numberOfBCnodes];
    // //   ny_dirTSW = &NormalY[DIR_MMP * numberOfBCnodes];
    // //   ny_dirTSE = &NormalY[DIR_PMP * numberOfBCnodes];
@@ -2111,24 +2111,24 @@ __global__ void ParticleNoSlipDeviceComp27(real* coordX,
    // //           *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[DIR_P00   * numberOfBCnodes];
-   // //   nz_dirW   = &NormalZ[DIR_M00   * numberOfBCnodes];
-   // //   nz_dirN   = &NormalZ[DIR_0P0   * numberOfBCnodes];
-   // //   nz_dirS   = &NormalZ[DIR_0M0   * numberOfBCnodes];
-   // //   nz_dirT   = &NormalZ[DIR_00P   * numberOfBCnodes];
-   // //   nz_dirB   = &NormalZ[DIR_00M   * numberOfBCnodes];
-   // //   nz_dirNE  = &NormalZ[DIR_PP0  * numberOfBCnodes];
-   // //   nz_dirSW  = &NormalZ[DIR_MM0  * numberOfBCnodes];
-   // //   nz_dirSE  = &NormalZ[DIR_PM0  * numberOfBCnodes];
-   // //   nz_dirNW  = &NormalZ[DIR_MP0  * numberOfBCnodes];
-   // //   nz_dirTE  = &NormalZ[DIR_P0P  * numberOfBCnodes];
-   // //   nz_dirBW  = &NormalZ[DIR_M0M  * numberOfBCnodes];
-   // //   nz_dirBE  = &NormalZ[DIR_P0M  * numberOfBCnodes];
-   // //   nz_dirTW  = &NormalZ[DIR_M0P  * numberOfBCnodes];
-   // //   nz_dirTN  = &NormalZ[DIR_0PP  * numberOfBCnodes];
-   // //   nz_dirBS  = &NormalZ[DIR_0MM  * numberOfBCnodes];
-   // //   nz_dirBN  = &NormalZ[DIR_0PM  * numberOfBCnodes];
-   // //   nz_dirTS  = &NormalZ[DIR_0MP  * numberOfBCnodes];
+   // //   nz_dirE   = &NormalZ[DIR_P00 * numberOfBCnodes];
+   // //   nz_dirW   = &NormalZ[DIR_M00 * numberOfBCnodes];
+   // //   nz_dirN   = &NormalZ[DIR_0P0 * numberOfBCnodes];
+   // //   nz_dirS   = &NormalZ[DIR_0M0 * numberOfBCnodes];
+   // //   nz_dirT   = &NormalZ[DIR_00P * numberOfBCnodes];
+   // //   nz_dirB   = &NormalZ[DIR_00M * numberOfBCnodes];
+   // //   nz_dirNE  = &NormalZ[DIR_PP0 * numberOfBCnodes];
+   // //   nz_dirSW  = &NormalZ[DIR_MM0 * numberOfBCnodes];
+   // //   nz_dirSE  = &NormalZ[DIR_PM0 * numberOfBCnodes];
+   // //   nz_dirNW  = &NormalZ[DIR_MP0 * numberOfBCnodes];
+   // //   nz_dirTE  = &NormalZ[DIR_P0P * numberOfBCnodes];
+   // //   nz_dirBW  = &NormalZ[DIR_M0M * numberOfBCnodes];
+   // //   nz_dirBE  = &NormalZ[DIR_P0M * numberOfBCnodes];
+   // //   nz_dirTW  = &NormalZ[DIR_M0P * numberOfBCnodes];
+   // //   nz_dirTN  = &NormalZ[DIR_0PP * numberOfBCnodes];
+   // //   nz_dirBS  = &NormalZ[DIR_0MM * numberOfBCnodes];
+   // //   nz_dirBN  = &NormalZ[DIR_0PM * numberOfBCnodes];
+   // //   nz_dirTS  = &NormalZ[DIR_0MP * numberOfBCnodes];
    // //   nz_dirTNE = &NormalZ[DIR_PPP * numberOfBCnodes];
    // //   nz_dirTSW = &NormalZ[DIR_MMP * numberOfBCnodes];
    // //   nz_dirTSE = &NormalZ[DIR_PMP * numberOfBCnodes];
@@ -2190,32 +2190,32 @@ __global__ void ParticleNoSlipDeviceComp27(real* coordX,
    //   unsigned int ktne = KQK;
    //   unsigned int kbsw = neighborZ[ksw];
    //   ////////////////////////////////////////////////////////////////////////////////
-   //   real f_W    = (D.f[DIR_P00   ])[ke   ];
-   //   real f_E    = (D.f[DIR_M00   ])[kw   ];
-   //   real f_S    = (D.f[DIR_0P0   ])[kn   ];
-   //   real f_N    = (D.f[DIR_0M0   ])[ks   ];
-   //   real f_B    = (D.f[DIR_00P   ])[kt   ];
-   //   real f_T    = (D.f[DIR_00M   ])[kb   ];
-   //   real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-   //   real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-   //   real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-   //   real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-   //   real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-   //   real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-   //   real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-   //   real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-   //   real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-   //   real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-   //   real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-   //   real f_BN   = (D.f[DIR_0MP  ])[kts  ];
-   //   real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-   //   real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-   //   real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-   //   real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-   //   real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-   //   real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-   //   real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-   //   real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+   //   real f_W    = (D.f[DIR_P00])[ke   ];
+   //   real f_E    = (D.f[DIR_M00])[kw   ];
+   //   real f_S    = (D.f[DIR_0P0])[kn   ];
+   //   real f_N    = (D.f[DIR_0M0])[ks   ];
+   //   real f_B    = (D.f[DIR_00P])[kt   ];
+   //   real f_T    = (D.f[DIR_00M])[kb   ];
+   //   real f_SW   = (D.f[DIR_PP0])[kne  ];
+   //   real f_NE   = (D.f[DIR_MM0])[ksw  ];
+   //   real f_NW   = (D.f[DIR_PM0])[kse  ];
+   //   real f_SE   = (D.f[DIR_MP0])[knw  ];
+   //   real f_BW   = (D.f[DIR_P0P])[kte  ];
+   //   real f_TE   = (D.f[DIR_M0M])[kbw  ];
+   //   real f_TW   = (D.f[DIR_P0M])[kbe  ];
+   //   real f_BE   = (D.f[DIR_M0P])[ktw  ];
+   //   real f_BS   = (D.f[DIR_0PP])[ktn  ];
+   //   real f_TN   = (D.f[DIR_0MM])[kbs  ];
+   //   real f_TS   = (D.f[DIR_0PM])[kbn  ];
+   //   real f_BN   = (D.f[DIR_0MP])[kts  ];
+   //   real f_BSW  = (D.f[DIR_PPP])[ktne ];
+   //   real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+   //   real f_BNW  = (D.f[DIR_PMP])[ktse ];
+   //   real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+   //   real f_TSW  = (D.f[DIR_PPM])[kbne ];
+   //   real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+   //   real f_TNW  = (D.f[DIR_PMM])[kbse ];
+   //   real f_TSE  = (D.f[DIR_MPM])[kbnw ];
    //   ////////////////////////////////////////////////////////////////////////////////
    //   // real feq, q;
    //   real vx1, vx2, vx3, drho;
@@ -2241,63 +2241,63 @@ __global__ void ParticleNoSlipDeviceComp27(real* coordX,
    //   //////////////////////////////////////////////////////////////////////////
    //   if (isEvenTimestep==false)
    //   {
-   //      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-   //      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-   //      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-   //      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-   //      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-   //      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-   //      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-   //      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-   //      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-   //      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-   //      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-   //      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-   //      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-   //      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-   //      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-   //      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-   //      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-   //      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-   //      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-   //      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-   //      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-   //      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-   //      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-   //      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-   //      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-   //      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+   //      D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+   //      D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+   //      D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+   //      D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+   //      D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+   //      D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+   //      D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+   //      D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+   //      D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+   //      D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+   //      D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+   //      D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+   //      D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+   //      D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+   //      D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+   //      D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+   //      D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+   //      D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+   //      D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //      D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+   //      D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+   //      D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+   //      D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+   //      D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+   //      D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+   //      D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+   //      D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
    //   } 
    //   else
    //   {
-   //      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-   //      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-   //      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-   //      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-   //      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-   //      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-   //      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-   //      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-   //      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-   //      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-   //      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-   //      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-   //      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-   //      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-   //      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-   //      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-   //      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-   //      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-   //      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-   //      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-   //      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-   //      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-   //      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-   //      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-   //      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-   //      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+   //      D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+   //      D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+   //      D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+   //      D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+   //      D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+   //      D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+   //      D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+   //      D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+   //      D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+   //      D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+   //      D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+   //      D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+   //      D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+   //      D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+   //      D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+   //      D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+   //      D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+   //      D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+   //      D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //      D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+   //      D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+   //      D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+   //      D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+   //      D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+   //      D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+   //      D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+   //      D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
    //   }
    //}
 }
diff --git a/src/gpu/VirtualFluids_GPU/GPU/PrecursorBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/PrecursorBCs27.cu
index 78b190e37ebaa395c89aae3b47cd4cc4f3147306..b17ffefd13a8a3a6048dde69ffb1db6c5def23e1 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/PrecursorBCs27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/PrecursorBCs27.cu
@@ -1,4 +1,4 @@
-#include "LBM/LB.h" 
+#include "LBM/LB.h"
 #include <lbm/constants/NumericConstants.h>
 #include <lbm/constants/D3Q27.h>
 #include <lbm/MacroscopicQuantities.h>
@@ -16,18 +16,18 @@ __global__ void QPrecursorDeviceCompZeroPress( 	int* subgridDistanceIndices,
                                                 real omega,
                                                 real* distributions,
                                                 real* subgridDistances,
-                                                uint* neighborX, 
-                                                uint* neighborY, 
+                                                uint* neighborX,
+                                                uint* neighborY,
                                                 uint* neighborZ,
-                                                uint* neighbors0PP, 
+                                                uint* neighbors0PP,
                                                 uint* neighbors0PM,
                                                 uint* neighbors0MP,
                                                 uint* neighbors0MM,
-                                                real* weights0PP, 
+                                                real* weights0PP,
                                                 real* weights0PM,
                                                 real* weights0MP,
                                                 real* weights0MM,
-                                                real* vLast, 
+                                                real* vLast,
                                                 real* vCurrent,
                                                 real velocityX,
                                                 real velocityY,
@@ -43,8 +43,8 @@ __global__ void QPrecursorDeviceCompZeroPress( 	int* subgridDistanceIndices,
 
     ////////////////////////////////////////////////////////////////////////////////
     // interpolation of velocity
-    real vxLastInterpd, vyLastInterpd, vzLastInterpd; 
-    real vxNextInterpd, vyNextInterpd, vzNextInterpd; 
+    real vxLastInterpd, vyLastInterpd, vzLastInterpd;
+    real vxNextInterpd, vyNextInterpd, vzNextInterpd;
 
     uint kNeighbor0PP = neighbors0PP[k];
     real d0PP = weights0PP[k];
@@ -90,7 +90,7 @@ __global__ void QPrecursorDeviceCompZeroPress( 	int* subgridDistanceIndices,
 
     // if(k==16300)s printf("%f %f %f\n", vxLastInterpd, vyLastInterpd, vzLastInterpd);
     real VeloX = (velocityX + (1.f-timeRatio)*vxLastInterpd + timeRatio*vxNextInterpd)/velocityRatio;
-    real VeloY = (velocityY + (1.f-timeRatio)*vyLastInterpd + timeRatio*vyNextInterpd)/velocityRatio; 
+    real VeloY = (velocityY + (1.f-timeRatio)*vyLastInterpd + timeRatio*vyNextInterpd)/velocityRatio;
     real VeloZ = (velocityZ + (1.f-timeRatio)*vzLastInterpd + timeRatio*vzNextInterpd)/velocityRatio;
     // From here on just a copy of QVelDeviceCompZeroPress
     ////////////////////////////////////////////////////////////////////////////////
@@ -156,29 +156,29 @@ __global__ void QPrecursorDeviceCompZeroPress( 	int* subgridDistanceIndices,
     real f_PPP = (dist.f[DIR_MMM])[kMMM];
     real f_MPP = (dist.f[DIR_PMM])[kPMM];
     real f_PMP = (dist.f[DIR_MPM])[kMPM];
-    
+
     SubgridDistances27 subgridD;
     getPointersToSubgridDistances(subgridD, subgridDistances, numberOfBCnodes);
-    
+
     ////////////////////////////////////////////////////////////////////////////////
       real drho   =  f_PMP + f_MPP + f_PPP + f_MMP + f_PMM + f_MPM + f_PPM + f_MMM +
-                     f_0PM + f_0PP + f_0MP + f_0MM + f_P0M + f_M0P + f_P0P + f_M0M + f_PM0 + f_MP0 + f_PP0 + f_MM0 + 
-                     f_00P + f_00M + f_0P0 + f_0M0 + f_P00 + f_M00 + ((dist.f[DIR_000])[k000]); 
+                     f_0PM + f_0PP + f_0MP + f_0MM + f_P0M + f_M0P + f_P0P + f_M0M + f_PM0 + f_MP0 + f_PP0 + f_MM0 +
+                     f_00P + f_00M + f_0P0 + f_0M0 + f_P00 + f_M00 + ((dist.f[DIR_000])[k000]);
 
       real vx1 =  (((f_PMP - f_MPM) - (f_MPP - f_PMM)) + ((f_PPP - f_MMM) - (f_MMP - f_PPM)) +
                       ((f_P0M - f_M0P)   + (f_P0P - f_M0M))   + ((f_PM0 - f_MP0)   + (f_PP0 - f_MM0)) +
-                      (f_P00 - f_M00)) / (c1o1 + drho); 
-         
+                      (f_P00 - f_M00)) / (c1o1 + drho);
+
 
       real vx2 =   ((-(f_PMP - f_MPM) + (f_MPP - f_PMM)) + ((f_PPP - f_MMM) - (f_MMP - f_PPM)) +
                        ((f_0PM - f_0MP)   + (f_0PP - f_0MM))    + (-(f_PM0 - f_MP0)  + (f_PP0 - f_MM0)) +
-                       (f_0P0 - f_0M0)) / (c1o1 + drho); 
+                       (f_0P0 - f_0M0)) / (c1o1 + drho);
 
       real vx3 =   (((f_PMP - f_MPM) + (f_MPP - f_PMM)) + ((f_PPP - f_MMM) + (f_MMP - f_PPM)) +
                        (-(f_0PM - f_0MP)  + (f_0PP - f_0MM))   + ((f_P0P - f_M0M)   - (f_P0M - f_M0P)) +
-                       (f_00P - f_00M)) / (c1o1 + drho); 
+                       (f_00P - f_00M)) / (c1o1 + drho);
+
 
-    
     // if(k==16383 || k==0) printf("k %d kQ %d drho = %f u %f v %f w %f\n",k, KQK, drho, vx1, vx2, vx3);
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3) * (c1o1 + drho);
     //////////////////////////////////////////////////////////////////////////
@@ -429,18 +429,18 @@ __global__ void PrecursorDeviceEQ27( 	int* subgridDistanceIndices,
                                         int numberOfPrecursorNodes,
                                         real omega,
                                         real* distributions,
-                                        uint* neighborX, 
-                                        uint* neighborY, 
+                                        uint* neighborX,
+                                        uint* neighborY,
                                         uint* neighborZ,
-                                        uint* neighbors0PP, 
+                                        uint* neighbors0PP,
                                         uint* neighbors0PM,
                                         uint* neighbors0MP,
                                         uint* neighbors0MM,
-                                        real* weights0PP, 
+                                        real* weights0PP,
                                         real* weights0PM,
                                         real* weights0MP,
                                         real* weights0MM,
-                                        real* vLast, 
+                                        real* vLast,
                                         real* vCurrent,
                                         real velocityX,
                                         real velocityY,
@@ -456,8 +456,8 @@ __global__ void PrecursorDeviceEQ27( 	int* subgridDistanceIndices,
 
     ////////////////////////////////////////////////////////////////////////////////
     // interpolation of velocity
-    real vxLastInterpd, vyLastInterpd, vzLastInterpd; 
-    real vxNextInterpd, vyNextInterpd, vzNextInterpd; 
+    real vxLastInterpd, vyLastInterpd, vzLastInterpd;
+    real vxNextInterpd, vyNextInterpd, vzNextInterpd;
 
     uint kNeighbor0PP = neighbors0PP[k];
     real d0PP = weights0PP[k];
@@ -503,7 +503,7 @@ __global__ void PrecursorDeviceEQ27( 	int* subgridDistanceIndices,
 
     // if(k==16300) printf("%f %f %f\n", vxLastInterpd, vyLastInterpd, vzLastInterpd);
     real VeloX = (velocityX + (1.f-timeRatio)*vxLastInterpd + timeRatio*vxNextInterpd)/velocityRatio;
-    real VeloY = (velocityY + (1.f-timeRatio)*vyLastInterpd + timeRatio*vyNextInterpd)/velocityRatio; 
+    real VeloY = (velocityY + (1.f-timeRatio)*vyLastInterpd + timeRatio*vyNextInterpd)/velocityRatio;
     real VeloZ = (velocityZ + (1.f-timeRatio)*vzLastInterpd + timeRatio*vzNextInterpd)/velocityRatio;
     // From here on just a copy of QVelDeviceCompZeroPress
     ////////////////////////////////////////////////////////////////////////////////
@@ -511,26 +511,26 @@ __global__ void PrecursorDeviceEQ27( 	int* subgridDistanceIndices,
     Distributions27 dist;
     getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep);
 
-    unsigned int KQK  = subgridDistanceIndices[k]; //QK 
+    unsigned int KQK  = subgridDistanceIndices[k]; //QK
     unsigned int k000 = KQK; //000
     unsigned int kP00 = KQK; //P00
     unsigned int kM00 = neighborX[KQK]; //M00
-    unsigned int k0P0   = KQK; //n  
-    unsigned int k0M0   = neighborY[KQK]; //s  
-    unsigned int k00P   = KQK; //t  
-    unsigned int k00M   = neighborZ[KQK]; //b  
-    unsigned int kMM0  = neighborY[kM00]; //sw 
-    unsigned int kPP0  = KQK; //ne 
-    unsigned int kPM0  = k0M0; //se 
-    unsigned int kMP0  = kM00; //nw 
-    unsigned int kM0M  = neighborZ[kM00]; //bw 
-    unsigned int kP0P  = KQK; //te 
-    unsigned int kP0M  = k00M; //be 
-    unsigned int k0PP  = KQK; //tn 
-    unsigned int k0MM  = neighborZ[k0M0]; //bs 
-    unsigned int kM0P  = kM00; //tw 
-    unsigned int k0PM  = k00M; //bn 
-    unsigned int k0MP  = k0M0; //ts 
+    unsigned int k0P0   = KQK; //n
+    unsigned int k0M0   = neighborY[KQK]; //s
+    unsigned int k00P   = KQK; //t
+    unsigned int k00M   = neighborZ[KQK]; //b
+    unsigned int kMM0  = neighborY[kM00]; //sw
+    unsigned int kPP0  = KQK; //ne
+    unsigned int kPM0  = k0M0; //se
+    unsigned int kMP0  = kM00; //nw
+    unsigned int kM0M  = neighborZ[kM00]; //bw
+    unsigned int kP0P  = KQK; //te
+    unsigned int kP0M  = k00M; //be
+    unsigned int k0PP  = KQK; //tn
+    unsigned int k0MM  = neighborZ[k0M0]; //bs
+    unsigned int kM0P  = kM00; //tw
+    unsigned int k0PM  = k00M; //bn
+    unsigned int k0MP  = k0M0; //ts
     unsigned int kPMP = k0M0; //tse
     unsigned int kMPM = kM0M; //bnw
     unsigned int kMPP = kM00; //tnw
@@ -576,11 +576,11 @@ __global__ void PrecursorDeviceEQ27( 	int* subgridDistanceIndices,
       //!
       real drho = c0o1;
 
-      real vx1  = VeloX;          
+      real vx1  = VeloX;
 
-      real vx2  = VeloY; 
+      real vx2  = VeloY;
 
-      real vx3  = VeloZ; 
+      real vx3  = VeloZ;
 
       real cusq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
 
@@ -625,7 +625,7 @@ __global__ void PrecursorDeviceEQ27( 	int* subgridDistanceIndices,
       (dist.f[DIR_PPM])[kPPM] = f_MMP;
       (dist.f[DIR_PPP])[kPPP] = f_MMM;
       (dist.f[DIR_PMM])[kPMM] = f_MPP;
-      
+
       (dist.f[DIR_M00])[kM00] = f_P00;
       (dist.f[DIR_MM0])[kMM0] = f_PP0;
       (dist.f[DIR_M0M])[kM0M] = f_P0P;
@@ -650,25 +650,25 @@ __global__ void PrecursorDeviceEQ27( 	int* subgridDistanceIndices,
 
 
 __global__ void PrecursorDeviceDistributions( 	int* subgridDistanceIndices,
-												int numberOfBCnodes,
+                                                int numberOfBCnodes,
                                                 int numberOfPrecursorNodes,
-												real* distributions,
-												uint* neighborX, 
-												uint* neighborY, 
-												uint* neighborZ,
-												uint* neighbors0PP, 
-												uint* neighbors0PM,
-												uint* neighbors0MP,
-												uint* neighbors0MM,
-												real* weights0PP, 
-												real* weights0PM,
-												real* weights0MP,
-												real* weights0MM,
-												real* fsLast, 
-												real* fsNext,
-												real timeRatio,
-												unsigned long long numberOfLBnodes,
-												bool isEvenTimestep)
+                                                real* distributions,
+                                                uint* neighborX,
+                                                uint* neighborY,
+                                                uint* neighborZ,
+                                                uint* neighbors0PP,
+                                                uint* neighbors0PM,
+                                                uint* neighbors0MP,
+                                                uint* neighbors0MM,
+                                                real* weights0PP,
+                                                real* weights0PM,
+                                                real* weights0MP,
+                                                real* weights0MM,
+                                                real* fsLast,
+                                                real* fsNext,
+                                                real timeRatio,
+                                                unsigned long long numberOfLBnodes,
+                                                bool isEvenTimestep)
 {
     const unsigned k = vf::gpu::getNodeIndex();
 
@@ -715,31 +715,31 @@ __global__ void PrecursorDeviceDistributions( 	int* subgridDistanceIndices,
 
         f0LastInterp = (f0Last[kNeighbor0PP]*d0PP + f0Last[kNeighbor0PM]*d0PM + f0Last[kNeighbor0MP]*d0MP + f0Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f0NextInterp = (f0Next[kNeighbor0PP]*d0PP + f0Next[kNeighbor0PM]*d0PM + f0Next[kNeighbor0MP]*d0MP + f0Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f1LastInterp = (f1Last[kNeighbor0PP]*d0PP + f1Last[kNeighbor0PM]*d0PM + f1Last[kNeighbor0MP]*d0MP + f1Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f1NextInterp = (f1Next[kNeighbor0PP]*d0PP + f1Next[kNeighbor0PM]*d0PM + f1Next[kNeighbor0MP]*d0MP + f1Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f2LastInterp = (f2Last[kNeighbor0PP]*d0PP + f2Last[kNeighbor0PM]*d0PM + f2Last[kNeighbor0MP]*d0MP + f2Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f2NextInterp = (f2Next[kNeighbor0PP]*d0PP + f2Next[kNeighbor0PM]*d0PM + f2Next[kNeighbor0MP]*d0MP + f2Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f3LastInterp = (f3Last[kNeighbor0PP]*d0PP + f3Last[kNeighbor0PM]*d0PM + f3Last[kNeighbor0MP]*d0MP + f3Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f3NextInterp = (f3Next[kNeighbor0PP]*d0PP + f3Next[kNeighbor0PM]*d0PM + f3Next[kNeighbor0MP]*d0MP + f3Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f4LastInterp = (f4Last[kNeighbor0PP]*d0PP + f4Last[kNeighbor0PM]*d0PM + f4Last[kNeighbor0MP]*d0MP + f4Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f4NextInterp = (f4Next[kNeighbor0PP]*d0PP + f4Next[kNeighbor0PM]*d0PM + f4Next[kNeighbor0MP]*d0MP + f4Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f5LastInterp = (f5Last[kNeighbor0PP]*d0PP + f5Last[kNeighbor0PM]*d0PM + f5Last[kNeighbor0MP]*d0MP + f5Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f5NextInterp = (f5Next[kNeighbor0PP]*d0PP + f5Next[kNeighbor0PM]*d0PM + f5Next[kNeighbor0MP]*d0MP + f5Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f6LastInterp = (f6Last[kNeighbor0PP]*d0PP + f6Last[kNeighbor0PM]*d0PM + f6Last[kNeighbor0MP]*d0MP + f6Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f6NextInterp = (f6Next[kNeighbor0PP]*d0PP + f6Next[kNeighbor0PM]*d0PM + f6Next[kNeighbor0MP]*d0MP + f6Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f7LastInterp = (f7Last[kNeighbor0PP]*d0PP + f7Last[kNeighbor0PM]*d0PM + f7Last[kNeighbor0MP]*d0MP + f7Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f7NextInterp = (f7Next[kNeighbor0PP]*d0PP + f7Next[kNeighbor0PM]*d0PM + f7Next[kNeighbor0MP]*d0MP + f7Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f8LastInterp = (f8Last[kNeighbor0PP]*d0PP + f8Last[kNeighbor0PM]*d0PM + f8Last[kNeighbor0MP]*d0MP + f8Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f8NextInterp = (f8Next[kNeighbor0PP]*d0PP + f8Next[kNeighbor0PM]*d0PM + f8Next[kNeighbor0MP]*d0MP + f8Next[kNeighbor0MM]*d0MM)*invWeightSum;
-    
+
     } else {
         f0LastInterp = f0Last[kNeighbor0PP];
         f1LastInterp = f1Last[kNeighbor0PP];
@@ -808,25 +808,25 @@ __global__ void PrecursorDeviceDistributions( 	int* subgridDistanceIndices,
 __global__ void QPrecursorDeviceDistributions( 	int* subgridDistanceIndices,
                                                 real* subgridDistances,
                                                 int sizeQ,
-												int numberOfBCnodes,
+                                                int numberOfBCnodes,
                                                 int numberOfPrecursorNodes,
-												real* distributions,
-												uint* neighborX, 
-												uint* neighborY, 
-												uint* neighborZ,
-												uint* neighbors0PP, 
-												uint* neighbors0PM,
-												uint* neighbors0MP,
-												uint* neighbors0MM,
-												real* weights0PP, 
-												real* weights0PM,
-												real* weights0MP,
-												real* weights0MM,
-												real* fsLast, 
-												real* fsNext,
-												real timeRatio,
-												unsigned long long numberOfLBnodes,
-												bool isEvenTimestep)
+                                                real* distributions,
+                                                uint* neighborX,
+                                                uint* neighborY,
+                                                uint* neighborZ,
+                                                uint* neighbors0PP,
+                                                uint* neighbors0PM,
+                                                uint* neighbors0MP,
+                                                uint* neighbors0MM,
+                                                real* weights0PP,
+                                                real* weights0PM,
+                                                real* weights0MP,
+                                                real* weights0MM,
+                                                real* fsLast,
+                                                real* fsNext,
+                                                real timeRatio,
+                                                unsigned long long numberOfLBnodes,
+                                                bool isEvenTimestep)
 {
     const unsigned k = vf::gpu::getNodeIndex();
 
@@ -873,31 +873,31 @@ __global__ void QPrecursorDeviceDistributions( 	int* subgridDistanceIndices,
 
         f0LastInterp = (f0Last[kNeighbor0PP]*d0PP + f0Last[kNeighbor0PM]*d0PM + f0Last[kNeighbor0MP]*d0MP + f0Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f0NextInterp = (f0Next[kNeighbor0PP]*d0PP + f0Next[kNeighbor0PM]*d0PM + f0Next[kNeighbor0MP]*d0MP + f0Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f1LastInterp = (f1Last[kNeighbor0PP]*d0PP + f1Last[kNeighbor0PM]*d0PM + f1Last[kNeighbor0MP]*d0MP + f1Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f1NextInterp = (f1Next[kNeighbor0PP]*d0PP + f1Next[kNeighbor0PM]*d0PM + f1Next[kNeighbor0MP]*d0MP + f1Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f2LastInterp = (f2Last[kNeighbor0PP]*d0PP + f2Last[kNeighbor0PM]*d0PM + f2Last[kNeighbor0MP]*d0MP + f2Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f2NextInterp = (f2Next[kNeighbor0PP]*d0PP + f2Next[kNeighbor0PM]*d0PM + f2Next[kNeighbor0MP]*d0MP + f2Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f3LastInterp = (f3Last[kNeighbor0PP]*d0PP + f3Last[kNeighbor0PM]*d0PM + f3Last[kNeighbor0MP]*d0MP + f3Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f3NextInterp = (f3Next[kNeighbor0PP]*d0PP + f3Next[kNeighbor0PM]*d0PM + f3Next[kNeighbor0MP]*d0MP + f3Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f4LastInterp = (f4Last[kNeighbor0PP]*d0PP + f4Last[kNeighbor0PM]*d0PM + f4Last[kNeighbor0MP]*d0MP + f4Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f4NextInterp = (f4Next[kNeighbor0PP]*d0PP + f4Next[kNeighbor0PM]*d0PM + f4Next[kNeighbor0MP]*d0MP + f4Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f5LastInterp = (f5Last[kNeighbor0PP]*d0PP + f5Last[kNeighbor0PM]*d0PM + f5Last[kNeighbor0MP]*d0MP + f5Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f5NextInterp = (f5Next[kNeighbor0PP]*d0PP + f5Next[kNeighbor0PM]*d0PM + f5Next[kNeighbor0MP]*d0MP + f5Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f6LastInterp = (f6Last[kNeighbor0PP]*d0PP + f6Last[kNeighbor0PM]*d0PM + f6Last[kNeighbor0MP]*d0MP + f6Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f6NextInterp = (f6Next[kNeighbor0PP]*d0PP + f6Next[kNeighbor0PM]*d0PM + f6Next[kNeighbor0MP]*d0MP + f6Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f7LastInterp = (f7Last[kNeighbor0PP]*d0PP + f7Last[kNeighbor0PM]*d0PM + f7Last[kNeighbor0MP]*d0MP + f7Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f7NextInterp = (f7Next[kNeighbor0PP]*d0PP + f7Next[kNeighbor0PM]*d0PM + f7Next[kNeighbor0MP]*d0MP + f7Next[kNeighbor0MM]*d0MM)*invWeightSum;
-        
+
         f8LastInterp = (f8Last[kNeighbor0PP]*d0PP + f8Last[kNeighbor0PM]*d0PM + f8Last[kNeighbor0MP]*d0MP + f8Last[kNeighbor0MM]*d0MM)*invWeightSum;
         f8NextInterp = (f8Next[kNeighbor0PP]*d0PP + f8Next[kNeighbor0PM]*d0PM + f8Next[kNeighbor0MP]*d0MP + f8Next[kNeighbor0MM]*d0MM)*invWeightSum;
-    
+
     } else {
         f0LastInterp = f0Last[kNeighbor0PP];
         f1LastInterp = f1Last[kNeighbor0PP];
diff --git a/src/gpu/VirtualFluids_GPU/GPU/PressBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/PressBCs27.cu
index 6a14cebd465a1e79acf14ea019abb34e66d9c85f..08be4b187eff21fa1a1b071337f14cbcc29ba805 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/PressBCs27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/PressBCs27.cu
@@ -1,5 +1,5 @@
 /* Device code */
-#include "LBM/LB.h" 
+#include "LBM/LB.h"
 #include "lbm/constants/D3Q27.h"
 #include "lbm/constants/NumericConstants.h"
 #include "lbm/MacroscopicQuantities.h"
@@ -12,21 +12,21 @@ using namespace vf::lbm::dir;
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 __global__ void QInflowScaleByPressDevice27(  real* rhoBC,
-														 real* DD, 
-														 int* k_Q, 
-														 int* k_N, 
-														 int numberOfBCnodes, 
-														 real om1, 
-														 unsigned int* neighborX,
-														 unsigned int* neighborY,
-														 unsigned int* neighborZ,
-														 unsigned int size_Mat, 
-														 bool isEvenTimestep)
+                                           real* DD,
+                                           int* k_Q,
+                                           int* k_N,
+                                           int numberOfBCnodes,
+                                           real om1,
+                                           unsigned int* neighborX,
+                                           unsigned int* neighborY,
+                                           unsigned int* neighborZ,
+                                           unsigned long long numberOfLBnodes,
+                                           bool 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  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;
@@ -100,141 +100,141 @@ __global__ void QInflowScaleByPressDevice27(  real* rhoBC,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real f1_E    = (D.f[DIR_P00   ])[k1e   ];
-      real f1_W    = (D.f[DIR_M00   ])[k1w   ];
-      real f1_N    = (D.f[DIR_0P0   ])[k1n   ];
-      real f1_S    = (D.f[DIR_0M0   ])[k1s   ];
-      real f1_T    = (D.f[DIR_00P   ])[k1t   ];
-      real f1_B    = (D.f[DIR_00M   ])[k1b   ];
-      real f1_NE   = (D.f[DIR_PP0  ])[k1ne  ];
-      real f1_SW   = (D.f[DIR_MM0  ])[k1sw  ];
-      real f1_SE   = (D.f[DIR_PM0  ])[k1se  ];
-      real f1_NW   = (D.f[DIR_MP0  ])[k1nw  ];
-      real f1_TE   = (D.f[DIR_P0P  ])[k1te  ];
-      real f1_BW   = (D.f[DIR_M0M  ])[k1bw  ];
-      real f1_BE   = (D.f[DIR_P0M  ])[k1be  ];
-      real f1_TW   = (D.f[DIR_M0P  ])[k1tw  ];
-      real f1_TN   = (D.f[DIR_0PP  ])[k1tn  ];
-      real f1_BS   = (D.f[DIR_0MM  ])[k1bs  ];
-      real f1_BN   = (D.f[DIR_0PM  ])[k1bn  ];
-      real f1_TS   = (D.f[DIR_0MP  ])[k1ts  ];
+      real f1_E    = (D.f[DIR_P00])[k1e   ];
+      real f1_W    = (D.f[DIR_M00])[k1w   ];
+      real f1_N    = (D.f[DIR_0P0])[k1n   ];
+      real f1_S    = (D.f[DIR_0M0])[k1s   ];
+      real f1_T    = (D.f[DIR_00P])[k1t   ];
+      real f1_B    = (D.f[DIR_00M])[k1b   ];
+      real f1_NE   = (D.f[DIR_PP0])[k1ne  ];
+      real f1_SW   = (D.f[DIR_MM0])[k1sw  ];
+      real f1_SE   = (D.f[DIR_PM0])[k1se  ];
+      real f1_NW   = (D.f[DIR_MP0])[k1nw  ];
+      real f1_TE   = (D.f[DIR_P0P])[k1te  ];
+      real f1_BW   = (D.f[DIR_M0M])[k1bw  ];
+      real f1_BE   = (D.f[DIR_P0M])[k1be  ];
+      real f1_TW   = (D.f[DIR_M0P])[k1tw  ];
+      real f1_TN   = (D.f[DIR_0PP])[k1tn  ];
+      real f1_BS   = (D.f[DIR_0MM])[k1bs  ];
+      real f1_BN   = (D.f[DIR_0PM])[k1bn  ];
+      real f1_TS   = (D.f[DIR_0MP])[k1ts  ];
       //real f1_ZERO = (D.f[DIR_000])[k1zero];
-      real f1_TNE  = (D.f[DIR_PPP ])[k1tne ];
-      real f1_TSW  = (D.f[DIR_MMP ])[k1tsw ];
-      real f1_TSE  = (D.f[DIR_PMP ])[k1tse ];
-      real f1_TNW  = (D.f[DIR_MPP ])[k1tnw ];
-      real f1_BNE  = (D.f[DIR_PPM ])[k1bne ];
-      real f1_BSW  = (D.f[DIR_MMM ])[k1bsw ];
-      real f1_BSE  = (D.f[DIR_PMM ])[k1bse ];
-      real f1_BNW  = (D.f[DIR_MPM ])[k1bnw ];
+      real f1_TNE  = (D.f[DIR_PPP])[k1tne ];
+      real f1_TSW  = (D.f[DIR_MMP])[k1tsw ];
+      real f1_TSE  = (D.f[DIR_PMP])[k1tse ];
+      real f1_TNW  = (D.f[DIR_MPP])[k1tnw ];
+      real f1_BNE  = (D.f[DIR_PPM])[k1bne ];
+      real f1_BSW  = (D.f[DIR_MMM])[k1bsw ];
+      real f1_BSE  = (D.f[DIR_PMM])[k1bse ];
+      real f1_BNW  = (D.f[DIR_MPM])[k1bnw ];
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real f_E    = (D.f[DIR_P00   ])[ke   ];
-      real f_W    = (D.f[DIR_M00   ])[kw   ];
-      real f_N    = (D.f[DIR_0P0   ])[kn   ];
-      real f_S    = (D.f[DIR_0M0   ])[ks   ];
-      real f_T    = (D.f[DIR_00P   ])[kt   ];
-      real f_B    = (D.f[DIR_00M   ])[kb   ];
-      real f_NE   = (D.f[DIR_PP0  ])[kne  ];
-      real f_SW   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_SE   = (D.f[DIR_PM0  ])[kse  ];
-      real f_NW   = (D.f[DIR_MP0  ])[knw  ];
-      real f_TE   = (D.f[DIR_P0P  ])[kte  ];
-      real f_BW   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_BE   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_TW   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_TN   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_BS   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_BN   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_TS   = (D.f[DIR_0MP  ])[kts  ];
+      real f_E    = (D.f[DIR_P00])[ke   ];
+      real f_W    = (D.f[DIR_M00])[kw   ];
+      real f_N    = (D.f[DIR_0P0])[kn   ];
+      real f_S    = (D.f[DIR_0M0])[ks   ];
+      real f_T    = (D.f[DIR_00P])[kt   ];
+      real f_B    = (D.f[DIR_00M])[kb   ];
+      real f_NE   = (D.f[DIR_PP0])[kne  ];
+      real f_SW   = (D.f[DIR_MM0])[ksw  ];
+      real f_SE   = (D.f[DIR_PM0])[kse  ];
+      real f_NW   = (D.f[DIR_MP0])[knw  ];
+      real f_TE   = (D.f[DIR_P0P])[kte  ];
+      real f_BW   = (D.f[DIR_M0M])[kbw  ];
+      real f_BE   = (D.f[DIR_P0M])[kbe  ];
+      real f_TW   = (D.f[DIR_M0P])[ktw  ];
+      real f_TN   = (D.f[DIR_0PP])[ktn  ];
+      real f_BS   = (D.f[DIR_0MM])[kbs  ];
+      real f_BN   = (D.f[DIR_0PM])[kbn  ];
+      real f_TS   = (D.f[DIR_0MP])[kts  ];
       //real f_ZERO = (D.f[DIR_000])[kzero];
-      real f_TNE  = (D.f[DIR_PPP ])[ktne ];
-      real f_TSW  = (D.f[DIR_MMP ])[ktsw ];
-      real f_TSE  = (D.f[DIR_PMP ])[ktse ];
-      real f_TNW  = (D.f[DIR_MPP ])[ktnw ];
-      real f_BNE  = (D.f[DIR_PPM ])[kbne ];
-      real f_BSW  = (D.f[DIR_MMM ])[kbsw ];
-      real f_BSE  = (D.f[DIR_PMM ])[kbse ];
-      real f_BNW  = (D.f[DIR_MPM ])[kbnw ];
+      real f_TNE  = (D.f[DIR_PPP])[ktne ];
+      real f_TSW  = (D.f[DIR_MMP])[ktsw ];
+      real f_TSE  = (D.f[DIR_PMP])[ktse ];
+      real f_TNW  = (D.f[DIR_MPP])[ktnw ];
+      real f_BNE  = (D.f[DIR_PPM])[kbne ];
+      real f_BSW  = (D.f[DIR_MMM])[kbsw ];
+      real f_BSE  = (D.f[DIR_PMM])[kbse ];
+      real f_BNW  = (D.f[DIR_MPM])[kbnw ];
       //////////////////////////////////////////////////////////////////////////
       // real vx1, vx2, vx3;
       real drho, drho1;
       //////////////////////////////////////////////////////////////////////////
-	  //Dichte
+     //Dichte
       drho1  =  f1_TSE + f1_TNW + f1_TNE + f1_TSW + f1_BSE + f1_BNW + f1_BNE + f1_BSW +
-                f1_BN + f1_TS + f1_TN + f1_BS + f1_BE + f1_TW + f1_TE + f1_BW + f1_SE + f1_NW + f1_NE + f1_SW + 
-                f1_T + f1_B + f1_N + f1_S + f1_E + f1_W + ((D.f[DIR_000])[k1zero]); 
+                f1_BN + f1_TS + f1_TN + f1_BS + f1_BE + f1_TW + f1_TE + f1_BW + f1_SE + f1_NW + f1_NE + f1_SW +
+                f1_T + f1_B + f1_N + f1_S + f1_E + f1_W + ((D.f[DIR_000])[k1zero]);
       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[DIR_000])[kzero]); 
+                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[DIR_000])[kzero]);
       //////////////////////////////////////////////////////////////////////////
-	  //Schallgeschwindigkeit
-	  real cs = c1o1 / sqrtf(c3o1);
+     //Schallgeschwindigkeit
+     real cs = c1o1 / sqrtf(c3o1);
       //////////////////////////////////////////////////////////////////////////
-	  real rhoInterpol = drho1 * cs + (c1o1 - cs) * drho; 
-	  //real diffRho = (rhoBC[k] + one) / (rhoInterpol + one);
-	  real diffRhoToAdd = rhoBC[k] - rhoInterpol;
-	  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	  //no velocity
-	  //////////////////////////////////////////
+     real rhoInterpol = drho1 * cs + (c1o1 - cs) * drho;
+     //real diffRho = (rhoBC[k] + one) / (rhoInterpol + one);
+     real diffRhoToAdd = rhoBC[k] - rhoInterpol;
+     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+     //no velocity
+     //////////////////////////////////////////
       f_E    = f1_E   * cs + (c1o1 - cs) * f_E   ;
       f_W    = f1_W   * cs + (c1o1 - cs) * f_W   ;
       f_N    = f1_N   * cs + (c1o1 - cs) * f_N   ;
@@ -261,16 +261,16 @@ __global__ void QInflowScaleByPressDevice27(  real* rhoBC,
       f_BSW  = f1_BSW * cs + (c1o1 - cs) * f_BSW ;
       f_BSE  = f1_BSE * cs + (c1o1 - cs) * f_BSE ;
       f_BNW  = f1_BNW * cs + (c1o1 - cs) * f_BNW ;
-	  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	  //scale by press
-	  //////////////////////////////////////////
-	  //f_E    = (f_E   + c2over27 ) * diffRho - c2over27 ;
+     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+     //scale by press
+     //////////////////////////////////////////
+     //f_E    = (f_E   + c2over27 ) * diffRho - c2over27 ;
    //   f_W    = (f_W   + c2over27 ) * diffRho - c2over27 ;
    //   f_N    = (f_N   + c2over27 ) * diffRho - c2over27 ;
    //   f_S    = (f_S   + c2over27 ) * diffRho - c2over27 ;
    //   f_T    = (f_T   + c2over27 ) * diffRho - c2over27 ;
    //   f_B    = (f_B   + c2over27 ) * diffRho - c2over27 ;
-	  //f_NE   = (f_NE  + c1over54 ) * diffRho - c1over54 ;
+     //f_NE   = (f_NE  + c1over54 ) * diffRho - c1over54 ;
    //   f_SW   = (f_SW  + c1over54 ) * diffRho - c1over54 ;
    //   f_SE   = (f_SE  + c1over54 ) * diffRho - c1over54 ;
    //   f_NW   = (f_NW  + c1over54 ) * diffRho - c1over54 ;
@@ -290,16 +290,16 @@ __global__ void QInflowScaleByPressDevice27(  real* rhoBC,
    //   f_BSW  = (f_BSW + c1over216) * diffRho - c1over216;
    //   f_BSE  = (f_BSE + c1over216) * diffRho - c1over216;
    //   f_BNW  = (f_BNW + c1over216) * diffRho - c1over216;
-	  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	  // add press
-	  //////////////////////////////////////////
-	  f_E    = (f_E   + c2o27  * diffRhoToAdd);
+     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+     // add press
+     //////////////////////////////////////////
+     f_E    = (f_E   + c2o27  * diffRhoToAdd);
       f_W    = (f_W   + c2o27  * diffRhoToAdd);
       f_N    = (f_N   + c2o27  * diffRhoToAdd);
       f_S    = (f_S   + c2o27  * diffRhoToAdd);
       f_T    = (f_T   + c2o27  * diffRhoToAdd);
       f_B    = (f_B   + c2o27  * diffRhoToAdd);
-	  f_NE   = (f_NE  + c1o54  * diffRhoToAdd);
+     f_NE   = (f_NE  + c1o54  * diffRhoToAdd);
       f_SW   = (f_SW  + c1o54  * diffRhoToAdd);
       f_SE   = (f_SE  + c1o54  * diffRhoToAdd);
       f_NW   = (f_NW  + c1o54  * diffRhoToAdd);
@@ -319,111 +319,111 @@ __global__ void QInflowScaleByPressDevice27(  real* rhoBC,
       f_BSW  = (f_BSW + c1o216 * diffRhoToAdd);
       f_BSE  = (f_BSE + c1o216 * diffRhoToAdd);
       f_BNW  = (f_BNW + c1o216 * diffRhoToAdd);
-	  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-	  //////////////////////////////////////////////////////////////////////////
+     //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////
       //__syncthreads();
-	  // -X
-	  //(D.f[DIR_P00   ])[ke   ] = f_E   ;
-	  //(D.f[DIR_PM0  ])[kse  ] = f_SE  ;
-	  //(D.f[DIR_PP0  ])[kne  ] = f_NE  ;
-	  //(D.f[DIR_P0M  ])[kbe  ] = f_BE  ;
-	  //(D.f[DIR_P0P  ])[kte  ] = f_TE  ;
-	  //(D.f[DIR_PMP ])[ktse ] = f_TSE ;
-	  //(D.f[DIR_PPP ])[ktne ] = f_TNE ;
-	  //(D.f[DIR_PMM ])[kbse ] = f_BSE ;
-	  //(D.f[DIR_PPM ])[kbne ] = f_BNE ;     
-	  // X
-	  (D.f[DIR_M00   ])[kw   ] = f_W   ;
-	  (D.f[DIR_MM0  ])[ksw  ] = f_SW  ;
-	  (D.f[DIR_MP0  ])[knw  ] = f_NW  ;
-	  (D.f[DIR_M0M  ])[kbw  ] = f_BW  ;
-	  (D.f[DIR_M0P  ])[ktw  ] = f_TW  ;
-	  (D.f[DIR_MMP ])[ktsw ] = f_TSW ;
-	  (D.f[DIR_MPP ])[ktnw ] = f_TNW ;
-	  (D.f[DIR_MMM ])[kbsw ] = f_BSW ;
-	  (D.f[DIR_MPM ])[kbnw ] = f_BNW ;     
-	  // Y
-	  //(D.f[DIR_0M0   ])[ks   ] = f_S   ;
-	  //(D.f[DIR_PM0  ])[kse  ] = f_SE  ;
-	  //(D.f[DIR_MM0  ])[ksw  ] = f_SW  ;
-	  //(D.f[DIR_0MP  ])[kts  ] = f_TS  ;
-	  //(D.f[DIR_0MM  ])[kbs  ] = f_BS  ;
-	  //(D.f[DIR_PMP ])[ktse ] = f_TSE ;
-	  //(D.f[DIR_MMP ])[ktsw ] = f_TSW ;
-	  //(D.f[DIR_PMM ])[kbse ] = f_BSE ;
-	  //(D.f[DIR_MMM ])[kbsw ] = f_BSW ;     
-	  // Z
-	  //(D.f[DIR_00M   ])[kb   ] = f_B   ;
-	  //(D.f[DIR_P0M  ])[kbe  ] = f_BE  ;
-	  //(D.f[DIR_M0M  ])[kbw  ] = f_BW  ;
-	  //(D.f[DIR_0PM  ])[kbn  ] = f_BN  ;
-	  //(D.f[DIR_0MM  ])[kbs  ] = f_BS  ;
-	  //(D.f[DIR_PPM ])[kbne ] = f_BNE ;
-	  //(D.f[DIR_MPM ])[kbnw ] = f_BNW ;
-	  //(D.f[DIR_PMM ])[kbse ] = f_BSE ;
-	  //(D.f[DIR_MMM ])[kbsw ] = f_BSW ;     
+     // -X
+     //(D.f[DIR_P00])[ke   ] = f_E   ;
+     //(D.f[DIR_PM0])[kse  ] = f_SE  ;
+     //(D.f[DIR_PP0])[kne  ] = f_NE  ;
+     //(D.f[DIR_P0M])[kbe  ] = f_BE  ;
+     //(D.f[DIR_P0P])[kte  ] = f_TE  ;
+     //(D.f[DIR_PMP])[ktse ] = f_TSE ;
+     //(D.f[DIR_PPP])[ktne ] = f_TNE ;
+     //(D.f[DIR_PMM])[kbse ] = f_BSE ;
+     //(D.f[DIR_PPM])[kbne ] = f_BNE ;
+     // X
+     (D.f[DIR_M00])[kw   ] = f_W   ;
+     (D.f[DIR_MM0])[ksw  ] = f_SW  ;
+     (D.f[DIR_MP0])[knw  ] = f_NW  ;
+     (D.f[DIR_M0M])[kbw  ] = f_BW  ;
+     (D.f[DIR_M0P])[ktw  ] = f_TW  ;
+     (D.f[DIR_MMP])[ktsw ] = f_TSW ;
+     (D.f[DIR_MPP])[ktnw ] = f_TNW ;
+     (D.f[DIR_MMM])[kbsw ] = f_BSW ;
+     (D.f[DIR_MPM])[kbnw ] = f_BNW ;
+     // Y
+     //(D.f[DIR_0M0])[ks   ] = f_S   ;
+     //(D.f[DIR_PM0])[kse  ] = f_SE  ;
+     //(D.f[DIR_MM0])[ksw  ] = f_SW  ;
+     //(D.f[DIR_0MP])[kts  ] = f_TS  ;
+     //(D.f[DIR_0MM])[kbs  ] = f_BS  ;
+     //(D.f[DIR_PMP])[ktse ] = f_TSE ;
+     //(D.f[DIR_MMP])[ktsw ] = f_TSW ;
+     //(D.f[DIR_PMM])[kbse ] = f_BSE ;
+     //(D.f[DIR_MMM])[kbsw ] = f_BSW ;
+     // Z
+     //(D.f[DIR_00M])[kb   ] = f_B   ;
+     //(D.f[DIR_P0M])[kbe  ] = f_BE  ;
+     //(D.f[DIR_M0M])[kbw  ] = f_BW  ;
+     //(D.f[DIR_0PM])[kbn  ] = f_BN  ;
+     //(D.f[DIR_0MM])[kbs  ] = f_BS  ;
+     //(D.f[DIR_PPM])[kbne ] = f_BNE ;
+     //(D.f[DIR_MPM])[kbnw ] = f_BNW ;
+     //(D.f[DIR_PMM])[kbse ] = f_BSE ;
+     //(D.f[DIR_MMM])[kbsw ] = f_BSW ;
       //////////////////////////////////////////////////////////////////////////
    }
 }
@@ -469,21 +469,21 @@ __global__ void QInflowScaleByPressDevice27(  real* rhoBC,
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 __global__ void QPressDeviceIncompNEQ27( real* rhoBC,
-													real* DD, 
-													int* k_Q, 
-													int* k_N, 
-													int numberOfBCnodes, 
-													real om1, 
-													unsigned int* neighborX,
-													unsigned int* neighborY,
-													unsigned int* neighborZ,
-													unsigned int size_Mat, 
-													bool isEvenTimestep)
+                                       real* DD,
+                                       int* k_Q,
+                                       int* k_N,
+                                       int numberOfBCnodes,
+                                       real om1,
+                                       unsigned int* neighborX,
+                                       unsigned int* neighborY,
+                                       unsigned int* neighborZ,
+                                       unsigned long long numberOfLBnodes,
+                                       bool 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  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;
@@ -557,112 +557,112 @@ __global__ void QPressDeviceIncompNEQ27( real* rhoBC,
       Distributions27 D;
       if (isEvenTimestep==true) //// ACHTUNG PREColl !!!!!!!!!!!!!!
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real        f1_E,f1_W,f1_N,f1_S,f1_T,f1_B,f1_NE,f1_SW,f1_SE,f1_NW,f1_TE,f1_BW,f1_BE,f1_TW,f1_TN,f1_BS,f1_BN,f1_TS,f1_ZERO,
                      f1_TNE,f1_TSW,f1_TSE,f1_TNW,f1_BNE,f1_BSW,f1_BSE,f1_BNW;
 
-      f1_W    = (D.f[DIR_P00   ])[k1e   ];
-      f1_E    = (D.f[DIR_M00   ])[k1w   ];
-      f1_S    = (D.f[DIR_0P0   ])[k1n   ];
-      f1_N    = (D.f[DIR_0M0   ])[k1s   ];
-      f1_B    = (D.f[DIR_00P   ])[k1t   ];
-      f1_T    = (D.f[DIR_00M   ])[k1b   ];
-      f1_SW   = (D.f[DIR_PP0  ])[k1ne  ];
-      f1_NE   = (D.f[DIR_MM0  ])[k1sw  ];
-      f1_NW   = (D.f[DIR_PM0  ])[k1se  ];
-      f1_SE   = (D.f[DIR_MP0  ])[k1nw  ];
-      f1_BW   = (D.f[DIR_P0P  ])[k1te  ];
-      f1_TE   = (D.f[DIR_M0M  ])[k1bw  ];
-      f1_TW   = (D.f[DIR_P0M  ])[k1be  ];
-      f1_BE   = (D.f[DIR_M0P  ])[k1tw  ];
-      f1_BS   = (D.f[DIR_0PP  ])[k1tn  ];
-      f1_TN   = (D.f[DIR_0MM  ])[k1bs  ];
-      f1_TS   = (D.f[DIR_0PM  ])[k1bn  ];
-      f1_BN   = (D.f[DIR_0MP  ])[k1ts  ];
+      f1_W    = (D.f[DIR_P00])[k1e   ];
+      f1_E    = (D.f[DIR_M00])[k1w   ];
+      f1_S    = (D.f[DIR_0P0])[k1n   ];
+      f1_N    = (D.f[DIR_0M0])[k1s   ];
+      f1_B    = (D.f[DIR_00P])[k1t   ];
+      f1_T    = (D.f[DIR_00M])[k1b   ];
+      f1_SW   = (D.f[DIR_PP0])[k1ne  ];
+      f1_NE   = (D.f[DIR_MM0])[k1sw  ];
+      f1_NW   = (D.f[DIR_PM0])[k1se  ];
+      f1_SE   = (D.f[DIR_MP0])[k1nw  ];
+      f1_BW   = (D.f[DIR_P0P])[k1te  ];
+      f1_TE   = (D.f[DIR_M0M])[k1bw  ];
+      f1_TW   = (D.f[DIR_P0M])[k1be  ];
+      f1_BE   = (D.f[DIR_M0P])[k1tw  ];
+      f1_BS   = (D.f[DIR_0PP])[k1tn  ];
+      f1_TN   = (D.f[DIR_0MM])[k1bs  ];
+      f1_TS   = (D.f[DIR_0PM])[k1bn  ];
+      f1_BN   = (D.f[DIR_0MP])[k1ts  ];
       f1_ZERO = (D.f[DIR_000])[k1zero];
-      f1_BSW  = (D.f[DIR_PPP ])[k1tne ];
-      f1_BNE  = (D.f[DIR_MMP ])[k1tsw ];
-      f1_BNW  = (D.f[DIR_PMP ])[k1tse ];
-      f1_BSE  = (D.f[DIR_MPP ])[k1tnw ];
-      f1_TSW  = (D.f[DIR_PPM ])[k1bne ];
-      f1_TNE  = (D.f[DIR_MMM ])[k1bsw ];
-      f1_TNW  = (D.f[DIR_PMM ])[k1bse ];
-      f1_TSE  = (D.f[DIR_MPM ])[k1bnw ];
+      f1_BSW  = (D.f[DIR_PPP])[k1tne ];
+      f1_BNE  = (D.f[DIR_MMP])[k1tsw ];
+      f1_BNW  = (D.f[DIR_PMP])[k1tse ];
+      f1_BSE  = (D.f[DIR_MPP])[k1tnw ];
+      f1_TSW  = (D.f[DIR_PPM])[k1bne ];
+      f1_TNE  = (D.f[DIR_MMM])[k1bsw ];
+      f1_TNW  = (D.f[DIR_PMM])[k1bse ];
+      f1_TSE  = (D.f[DIR_MPM])[k1bnw ];
 
       //////////////////////////////////////////////////////////////////////////
       real drho1    =  f1_ZERO+f1_E+f1_W+f1_N+f1_S+f1_T+f1_B+f1_NE+f1_SW+f1_SE+f1_NW+f1_TE+f1_BW+f1_BE+f1_TW+f1_TN+f1_BS+f1_BN+f1_TS+
                           f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW;
 
       real vx1      =  ((f1_TSE - f1_BNW) - (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) +
-						  ((f1_BE - f1_TW)   + (f1_TE - f1_BW))   + ((f1_SE - f1_NW)   + (f1_NE - f1_SW)) +
-						  (f1_E - f1_W); 
+                    ((f1_BE - f1_TW)   + (f1_TE - f1_BW))   + ((f1_SE - f1_NW)   + (f1_NE - f1_SW)) +
+                    (f1_E - f1_W);
 
 
       real vx2    =   (-(f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) +
-						 ((f1_BN - f1_TS)   + (f1_TN - f1_BS))    + (-(f1_SE - f1_NW)  + (f1_NE - f1_SW)) +
-						 (f1_N - f1_S); 
+                   ((f1_BN - f1_TS)   + (f1_TN - f1_BS))    + (-(f1_SE - f1_NW)  + (f1_NE - f1_SW)) +
+                   (f1_N - f1_S);
 
       real vx3    =   ((f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) + (f1_TSW - f1_BNE)) +
-						 (-(f1_BN - f1_TS)  + (f1_TN - f1_BS))   + ((f1_TE - f1_BW)   - (f1_BE - f1_TW)) +
-						 (f1_T - f1_B); 
+                   (-(f1_BN - f1_TS)  + (f1_TN - f1_BS))   + ((f1_TE - f1_BW)   - (f1_BE - f1_TW)) +
+                   (f1_T - f1_B);
 
       real cusq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
@@ -693,15 +693,15 @@ __global__ void QPressDeviceIncompNEQ27( real* rhoBC,
       f1_BNW   -=  c1o216*(drho1+(drho1+c1o1)*(c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cusq));
       f1_BSE   -=  c1o216*(drho1+(drho1+c1o1)*(c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cusq));
       f1_TNW   -=  c1o216*(drho1+(drho1+c1o1)*(c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq));
-	   
-	  drho1 = rhoBC[k];
 
-	  //if(vx1 < zero){
-		 // vx1 *= 0.9;
-	  //}
-	  //if(vx2 < zero){
-		 // vx2 *= c1o10;//0.9;
-	  //}
+     drho1 = rhoBC[k];
+
+     //if(vx1 < zero){
+       // vx1 *= 0.9;
+     //}
+     //if(vx2 < zero){
+       // vx2 *= c1o10;//0.9;
+     //}
 
       f1_ZERO  += c8o27*  (drho1-(drho1+c1o1)*cusq);
       f1_E     += c2o27*  (drho1+(drho1+c1o1)*(c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cusq));
@@ -731,39 +731,39 @@ __global__ void QPressDeviceIncompNEQ27( real* rhoBC,
       f1_BSE   +=  c1o216*(drho1+(drho1+c1o1)*(c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cusq));
       f1_TNW   +=  c1o216*(drho1+(drho1+c1o1)*(c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq));
 
-	  //drho1 = (drho1 + rhoBC[k])/2.f;
-	  //drho1 = drho1 - rhoBC[k];
+     //drho1 = (drho1 + rhoBC[k])/2.f;
+     //drho1 = drho1 - rhoBC[k];
       //////////////////////////////////////////////////////////////////////////
 
       __syncthreads();
 
-      (D.f[DIR_P00   ])[ke   ] = f1_W   ;  
-      (D.f[DIR_M00   ])[kw   ] = f1_E   ;	
-      (D.f[DIR_0P0   ])[kn   ] = f1_S   ;	
-      (D.f[DIR_0M0   ])[ks   ] = f1_N   ;	
-      (D.f[DIR_00P   ])[kt   ] = f1_B   ;	
-      (D.f[DIR_00M   ])[kb   ] = f1_T   ;	
-      (D.f[DIR_PP0  ])[kne  ] = f1_SW  ;	
-      (D.f[DIR_MM0  ])[ksw  ] = f1_NE  ;	
-      (D.f[DIR_PM0  ])[kse  ] = f1_NW  ;	
-      (D.f[DIR_MP0  ])[knw  ] = f1_SE  ;	
-      (D.f[DIR_P0P  ])[kte  ] = f1_BW  ;	
-      (D.f[DIR_M0M  ])[kbw  ] = f1_TE  ;	
-      (D.f[DIR_P0M  ])[kbe  ] = f1_TW  ;	
-      (D.f[DIR_M0P  ])[ktw  ] = f1_BE  ;	
-      (D.f[DIR_0PP  ])[ktn  ] = f1_BS  ;	
-      (D.f[DIR_0MM  ])[kbs  ] = f1_TN  ;	
-      (D.f[DIR_0PM  ])[kbn  ] = f1_TS  ;	
-      (D.f[DIR_0MP  ])[kts  ] = f1_BN  ;	
-      (D.f[DIR_000])[kzero] = f1_ZERO;	
-      (D.f[DIR_PPP ])[ktne ] = f1_BSW ;	
-      (D.f[DIR_MMP ])[ktsw ] = f1_BNE ;	
-      (D.f[DIR_PMP ])[ktse ] = f1_BNW ;	
-      (D.f[DIR_MPP ])[ktnw ] = f1_BSE ;	
-      (D.f[DIR_PPM ])[kbne ] = f1_TSW ;	
-      (D.f[DIR_MMM ])[kbsw ] = f1_TNE ;	
-      (D.f[DIR_PMM ])[kbse ] = f1_TNW ;	
-      (D.f[DIR_MPM ])[kbnw ] = f1_TSE ;       
+      (D.f[DIR_P00])[ke   ] = f1_W   ;
+      (D.f[DIR_M00])[kw   ] = f1_E   ;
+      (D.f[DIR_0P0])[kn   ] = f1_S   ;
+      (D.f[DIR_0M0])[ks   ] = f1_N   ;
+      (D.f[DIR_00P])[kt   ] = f1_B   ;
+      (D.f[DIR_00M])[kb   ] = f1_T   ;
+      (D.f[DIR_PP0])[kne  ] = f1_SW  ;
+      (D.f[DIR_MM0])[ksw  ] = f1_NE  ;
+      (D.f[DIR_PM0])[kse  ] = f1_NW  ;
+      (D.f[DIR_MP0])[knw  ] = f1_SE  ;
+      (D.f[DIR_P0P])[kte  ] = f1_BW  ;
+      (D.f[DIR_M0M])[kbw  ] = f1_TE  ;
+      (D.f[DIR_P0M])[kbe  ] = f1_TW  ;
+      (D.f[DIR_M0P])[ktw  ] = f1_BE  ;
+      (D.f[DIR_0PP])[ktn  ] = f1_BS  ;
+      (D.f[DIR_0MM])[kbs  ] = f1_TN  ;
+      (D.f[DIR_0PM])[kbn  ] = f1_TS  ;
+      (D.f[DIR_0MP])[kts  ] = f1_BN  ;
+      (D.f[DIR_000])[kzero] = f1_ZERO;
+      (D.f[DIR_PPP])[ktne ] = f1_BSW ;
+      (D.f[DIR_MMP])[ktsw ] = f1_BNE ;
+      (D.f[DIR_PMP])[ktse ] = f1_BNW ;
+      (D.f[DIR_MPP])[ktnw ] = f1_BSE ;
+      (D.f[DIR_PPM])[kbne ] = f1_TSW ;
+      (D.f[DIR_MMM])[kbsw ] = f1_TNE ;
+      (D.f[DIR_PMM])[kbse ] = f1_TNW ;
+      (D.f[DIR_MPM])[kbnw ] = f1_TSE ;
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -808,26 +808,26 @@ __global__ void QPressDeviceIncompNEQ27( real* rhoBC,
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 __global__ void QPressDeviceNEQ27(real* rhoBC,
-                                             real* distribution, 
+                                             real* distribution,
                                              int* bcNodeIndices,
                                              int* bcNeighborIndices,
                                              int numberOfBCnodes,
-                                             real omega1, 
+                                             real omega1,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int numberOfLBnodes, 
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep)
 {
    //////////////////////////////////////////////////////////////////////////
-	//! The pressure boundary condition is executed in the following steps
-	//!
-	////////////////////////////////////////////////////////////////////////////////
-	//! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
-	//!
-   const unsigned x = threadIdx.x;    // global x-index 
-   const unsigned y = blockIdx.x;     // global y-index 
-   const unsigned z = blockIdx.y;     // global z-index 
+   //! The pressure boundary condition is executed in the following steps
+   //!
+   ////////////////////////////////////////////////////////////////////////////////
+   //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
+   //!
+   const unsigned x = threadIdx.x;    // global x-index
+   const unsigned y = blockIdx.x;     // global y-index
+   const unsigned z = blockIdx.y;     // global z-index
 
    const unsigned nx = blockDim.x;
    const unsigned ny = gridDim.x;
@@ -917,52 +917,52 @@ __global__ void QPressDeviceNEQ27(real* rhoBC,
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions for neighboring node
       //!
-      real f1_W    = (dist.f[DIR_P00   ])[k1e   ];
-      real f1_E    = (dist.f[DIR_M00   ])[k1w   ];
-      real f1_S    = (dist.f[DIR_0P0   ])[k1n   ];
-      real f1_N    = (dist.f[DIR_0M0   ])[k1s   ];
-      real f1_B    = (dist.f[DIR_00P   ])[k1t   ];
-      real f1_T    = (dist.f[DIR_00M   ])[k1b   ];
-      real f1_SW   = (dist.f[DIR_PP0  ])[k1ne  ];
-      real f1_NE   = (dist.f[DIR_MM0  ])[k1sw  ];
-      real f1_NW   = (dist.f[DIR_PM0  ])[k1se  ];
-      real f1_SE   = (dist.f[DIR_MP0  ])[k1nw  ];
-      real f1_BW   = (dist.f[DIR_P0P  ])[k1te  ];
-      real f1_TE   = (dist.f[DIR_M0M  ])[k1bw  ];
-      real f1_TW   = (dist.f[DIR_P0M  ])[k1be  ];
-      real f1_BE   = (dist.f[DIR_M0P  ])[k1tw  ];
-      real f1_BS   = (dist.f[DIR_0PP  ])[k1tn  ];
-      real f1_TN   = (dist.f[DIR_0MM  ])[k1bs  ];
-      real f1_TS   = (dist.f[DIR_0PM  ])[k1bn  ];
-      real f1_BN   = (dist.f[DIR_0MP  ])[k1ts  ];
+      real f1_W    = (dist.f[DIR_P00])[k1e   ];
+      real f1_E    = (dist.f[DIR_M00])[k1w   ];
+      real f1_S    = (dist.f[DIR_0P0])[k1n   ];
+      real f1_N    = (dist.f[DIR_0M0])[k1s   ];
+      real f1_B    = (dist.f[DIR_00P])[k1t   ];
+      real f1_T    = (dist.f[DIR_00M])[k1b   ];
+      real f1_SW   = (dist.f[DIR_PP0])[k1ne  ];
+      real f1_NE   = (dist.f[DIR_MM0])[k1sw  ];
+      real f1_NW   = (dist.f[DIR_PM0])[k1se  ];
+      real f1_SE   = (dist.f[DIR_MP0])[k1nw  ];
+      real f1_BW   = (dist.f[DIR_P0P])[k1te  ];
+      real f1_TE   = (dist.f[DIR_M0M])[k1bw  ];
+      real f1_TW   = (dist.f[DIR_P0M])[k1be  ];
+      real f1_BE   = (dist.f[DIR_M0P])[k1tw  ];
+      real f1_BS   = (dist.f[DIR_0PP])[k1tn  ];
+      real f1_TN   = (dist.f[DIR_0MM])[k1bs  ];
+      real f1_TS   = (dist.f[DIR_0PM])[k1bn  ];
+      real f1_BN   = (dist.f[DIR_0MP])[k1ts  ];
       real f1_ZERO = (dist.f[DIR_000])[k1zero];
-      real f1_BSW  = (dist.f[DIR_PPP ])[k1tne ];
-      real f1_BNE  = (dist.f[DIR_MMP ])[k1tsw ];
-      real f1_BNW  = (dist.f[DIR_PMP ])[k1tse ];
-      real f1_BSE  = (dist.f[DIR_MPP ])[k1tnw ];
-      real f1_TSW  = (dist.f[DIR_PPM ])[k1bne ];
-      real f1_TNE  = (dist.f[DIR_MMM ])[k1bsw ];
-      real f1_TNW  = (dist.f[DIR_PMM ])[k1bse ];
-      real f1_TSE  = (dist.f[DIR_MPM ])[k1bnw ];
+      real f1_BSW  = (dist.f[DIR_PPP])[k1tne ];
+      real f1_BNE  = (dist.f[DIR_MMP])[k1tsw ];
+      real f1_BNW  = (dist.f[DIR_PMP])[k1tse ];
+      real f1_BSE  = (dist.f[DIR_MPP])[k1tnw ];
+      real f1_TSW  = (dist.f[DIR_PPM])[k1bne ];
+      real f1_TNE  = (dist.f[DIR_MMM])[k1bsw ];
+      real f1_TNW  = (dist.f[DIR_PMM])[k1bse ];
+      real f1_TSE  = (dist.f[DIR_MPM])[k1bnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - Calculate macroscopic quantities (for neighboring node)
       //!
       real drho1 = f1_TSE + f1_TNW + f1_TNE + f1_TSW + f1_BSE + f1_BNW + f1_BNE + f1_BSW +
-                   f1_BN + f1_TS + f1_TN + f1_BS + f1_BE + f1_TW + f1_TE + f1_BW + f1_SE + f1_NW + f1_NE + f1_SW + 
-                   f1_T + f1_B + f1_N + f1_S + f1_E + f1_W + ((dist.f[DIR_000])[kzero]); 
+                   f1_BN + f1_TS + f1_TN + f1_BS + f1_BE + f1_TW + f1_TE + f1_BW + f1_SE + f1_NW + f1_NE + f1_SW +
+                   f1_T + f1_B + f1_N + f1_S + f1_E + f1_W + ((dist.f[DIR_000])[kzero]);
 
       real vx1  = (((f1_TSE - f1_BNW) - (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) +
                    ((f1_BE - f1_TW)   + (f1_TE - f1_BW))   + ((f1_SE - f1_NW)   + (f1_NE - f1_SW)) +
-                   (f1_E - f1_W)) / (c1o1 + drho1);          
+                   (f1_E - f1_W)) / (c1o1 + drho1);
 
       real vx2  = ((-(f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) +
                    ((f1_BN - f1_TS)   + (f1_TN - f1_BS))    + (-(f1_SE - f1_NW)  + (f1_NE - f1_SW)) +
-                   (f1_N - f1_S)) / (c1o1 + drho1); 
+                   (f1_N - f1_S)) / (c1o1 + drho1);
 
       real vx3  = (((f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) + (f1_TSW - f1_BNE)) +
                    (-(f1_BN - f1_TS)  + (f1_TN - f1_BS))   + ((f1_TE - f1_BW)   - (f1_BE - f1_TW)) +
-                   (f1_T - f1_B)) / (c1o1 + drho1); 
+                   (f1_T - f1_B)) / (c1o1 + drho1);
 
       real cusq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
 
@@ -1040,33 +1040,33 @@ __global__ void QPressDeviceNEQ27(real* rhoBC,
       ////////////////////////////////////////////////////////////////////////////////
       //! write the new distributions to the bc nodes
       //!
-      (dist.f[DIR_P00   ])[ke   ] = f1_W   ;
-      (dist.f[DIR_M00   ])[kw   ] = f1_E   ;
-      (dist.f[DIR_0P0   ])[kn   ] = f1_S   ;
-      (dist.f[DIR_0M0   ])[ks   ] = f1_N   ;
-      (dist.f[DIR_00P   ])[kt   ] = f1_B   ;
-      (dist.f[DIR_00M   ])[kb   ] = f1_T   ;
-      (dist.f[DIR_PP0  ])[kne  ] = f1_SW  ;
-      (dist.f[DIR_MM0  ])[ksw  ] = f1_NE  ;
-      (dist.f[DIR_PM0  ])[kse  ] = f1_NW  ;
-      (dist.f[DIR_MP0  ])[knw  ] = f1_SE  ;
-      (dist.f[DIR_P0P  ])[kte  ] = f1_BW  ;
-      (dist.f[DIR_M0M  ])[kbw  ] = f1_TE  ;
-      (dist.f[DIR_P0M  ])[kbe  ] = f1_TW  ;
-      (dist.f[DIR_M0P  ])[ktw  ] = f1_BE  ;
-      (dist.f[DIR_0PP  ])[ktn  ] = f1_BS  ;
-      (dist.f[DIR_0MM  ])[kbs  ] = f1_TN  ;
-      (dist.f[DIR_0PM  ])[kbn  ] = f1_TS  ;
-      (dist.f[DIR_0MP  ])[kts  ] = f1_BN  ;
+      (dist.f[DIR_P00])[ke   ] = f1_W   ;
+      (dist.f[DIR_M00])[kw   ] = f1_E   ;
+      (dist.f[DIR_0P0])[kn   ] = f1_S   ;
+      (dist.f[DIR_0M0])[ks   ] = f1_N   ;
+      (dist.f[DIR_00P])[kt   ] = f1_B   ;
+      (dist.f[DIR_00M])[kb   ] = f1_T   ;
+      (dist.f[DIR_PP0])[kne  ] = f1_SW  ;
+      (dist.f[DIR_MM0])[ksw  ] = f1_NE  ;
+      (dist.f[DIR_PM0])[kse  ] = f1_NW  ;
+      (dist.f[DIR_MP0])[knw  ] = f1_SE  ;
+      (dist.f[DIR_P0P])[kte  ] = f1_BW  ;
+      (dist.f[DIR_M0M])[kbw  ] = f1_TE  ;
+      (dist.f[DIR_P0M])[kbe  ] = f1_TW  ;
+      (dist.f[DIR_M0P])[ktw  ] = f1_BE  ;
+      (dist.f[DIR_0PP])[ktn  ] = f1_BS  ;
+      (dist.f[DIR_0MM])[kbs  ] = f1_TN  ;
+      (dist.f[DIR_0PM])[kbn  ] = f1_TS  ;
+      (dist.f[DIR_0MP])[kts  ] = f1_BN  ;
       (dist.f[DIR_000])[kzero] = f1_ZERO;
-      (dist.f[DIR_PPP ])[ktne ] = f1_BSW ;
-      (dist.f[DIR_MMP ])[ktsw ] = f1_BNE ;
-      (dist.f[DIR_PMP ])[ktse ] = f1_BNW ;
-      (dist.f[DIR_MPP ])[ktnw ] = f1_BSE ;
-      (dist.f[DIR_PPM ])[kbne ] = f1_TSW ;
-      (dist.f[DIR_MMM ])[kbsw ] = f1_TNE ;
-      (dist.f[DIR_PMM ])[kbse ] = f1_TNW ;
-      (dist.f[DIR_MPM ])[kbnw ] = f1_TSE ;
+      (dist.f[DIR_PPP])[ktne ] = f1_BSW ;
+      (dist.f[DIR_MMP])[ktsw ] = f1_BNE ;
+      (dist.f[DIR_PMP])[ktse ] = f1_BNW ;
+      (dist.f[DIR_MPP])[ktnw ] = f1_BSE ;
+      (dist.f[DIR_PPM])[kbne ] = f1_TSW ;
+      (dist.f[DIR_MMM])[kbsw ] = f1_TNE ;
+      (dist.f[DIR_PMM])[kbse ] = f1_TNW ;
+      (dist.f[DIR_MPM])[kbnw ] = f1_TSE ;
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1110,16 +1110,16 @@ __global__ void QPressDeviceNEQ27(real* rhoBC,
 
 
 ////////////////////////////////////////////////////////////////////////////////
-__global__ void LB_BC_Press_East27( int nx, 
-                                               int ny, 
-                                               int tz, 
-                                               unsigned int* bcMatD, 
+__global__ void LB_BC_Press_East27( int nx,
+                                               int ny,
+                                               int tz,
+                                               unsigned int* bcMatD,
                                                unsigned int* neighborX,
                                                unsigned int* neighborY,
                                                unsigned int* neighborZ,
-                                               real* DD, 
-                                               unsigned int size_Mat, 
-                                               bool isEvenTimestep) 
+                                               real* DD,
+                                               unsigned long long numberOfLBnodes,
+                                               bool isEvenTimestep)
 {
    //thread-index
    int ty = blockIdx.x;
@@ -1127,9 +1127,9 @@ __global__ void LB_BC_Press_East27( int nx,
 
    int  k, k1, nxny;                   // Zugriff auf arrays im device
 
-   int  x = tx + STARTOFFX;  // Globaler x-Index 
-   int  y = ty + STARTOFFY;  // Globaler y-Index 
-   int  z = tz + STARTOFFZ;  // Globaler z-Index 
+   int  x = tx + STARTOFFX;  // Globaler x-Index
+   int  y = ty + STARTOFFY;  // Globaler y-Index
+   int  z = tz + STARTOFFZ;  // Globaler z-Index
 
    k = nx*(ny*z + y) + x;
    nxny = nx*ny;
@@ -1140,63 +1140,63 @@ __global__ void LB_BC_Press_East27( int nx,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////
       ////////////////////////////////////////////////////////////////////////////////
@@ -1315,69 +1315,69 @@ __global__ void LB_BC_Press_East27( int nx,
       real        f1_E,f1_W,f1_N,f1_S,f1_T,f1_B,f1_NE,f1_SW,f1_SE,f1_NW,f1_TE,f1_BW,f1_BE,f1_TW,f1_TN,f1_BS,f1_BN,f1_TS,f1_ZERO,
                    f1_TNE,f1_TSW,f1_TSE,f1_TNW,f1_BNE,f1_BSW,f1_BSE,f1_BNW;
 
-      f1_W    = (D.f[DIR_P00   ])[k1e   ];
-      f1_E    = (D.f[DIR_M00   ])[k1w   ];
-      f1_S    = (D.f[DIR_0P0   ])[k1n   ];
-      f1_N    = (D.f[DIR_0M0   ])[k1s   ];
-      f1_B    = (D.f[DIR_00P   ])[k1t   ];
-      f1_T    = (D.f[DIR_00M   ])[k1b   ];
-      f1_SW   = (D.f[DIR_PP0  ])[k1ne  ];
-      f1_NE   = (D.f[DIR_MM0  ])[k1sw  ];
-      f1_NW   = (D.f[DIR_PM0  ])[k1se  ];
-      f1_SE   = (D.f[DIR_MP0  ])[k1nw  ];
-      f1_BW   = (D.f[DIR_P0P  ])[k1te  ];
-      f1_TE   = (D.f[DIR_M0M  ])[k1bw  ];
-      f1_TW   = (D.f[DIR_P0M  ])[k1be  ];
-      f1_BE   = (D.f[DIR_M0P  ])[k1tw  ];
-      f1_BS   = (D.f[DIR_0PP  ])[k1tn  ];
-      f1_TN   = (D.f[DIR_0MM  ])[k1bs  ];
-      f1_TS   = (D.f[DIR_0PM  ])[k1bn  ];
-      f1_BN   = (D.f[DIR_0MP  ])[k1ts  ];
+      f1_W    = (D.f[DIR_P00])[k1e   ];
+      f1_E    = (D.f[DIR_M00])[k1w   ];
+      f1_S    = (D.f[DIR_0P0])[k1n   ];
+      f1_N    = (D.f[DIR_0M0])[k1s   ];
+      f1_B    = (D.f[DIR_00P])[k1t   ];
+      f1_T    = (D.f[DIR_00M])[k1b   ];
+      f1_SW   = (D.f[DIR_PP0])[k1ne  ];
+      f1_NE   = (D.f[DIR_MM0])[k1sw  ];
+      f1_NW   = (D.f[DIR_PM0])[k1se  ];
+      f1_SE   = (D.f[DIR_MP0])[k1nw  ];
+      f1_BW   = (D.f[DIR_P0P])[k1te  ];
+      f1_TE   = (D.f[DIR_M0M])[k1bw  ];
+      f1_TW   = (D.f[DIR_P0M])[k1be  ];
+      f1_BE   = (D.f[DIR_M0P])[k1tw  ];
+      f1_BS   = (D.f[DIR_0PP])[k1tn  ];
+      f1_TN   = (D.f[DIR_0MM])[k1bs  ];
+      f1_TS   = (D.f[DIR_0PM])[k1bn  ];
+      f1_BN   = (D.f[DIR_0MP])[k1ts  ];
       f1_ZERO = (D.f[DIR_000])[k1zero];
-      f1_BSW  = (D.f[DIR_PPP ])[k1tne ];
-      f1_BNE  = (D.f[DIR_MMP ])[k1tsw ];
-      f1_BNW  = (D.f[DIR_PMP ])[k1tse ];
-      f1_BSE  = (D.f[DIR_MPP ])[k1tnw ];
-      f1_TSW  = (D.f[DIR_PPM ])[k1bne ];
-      f1_TNE  = (D.f[DIR_MMM ])[k1bsw ];
-      f1_TNW  = (D.f[DIR_PMM ])[k1bse ];
-      f1_TSE  = (D.f[DIR_MPM ])[k1bnw ];
+      f1_BSW  = (D.f[DIR_PPP])[k1tne ];
+      f1_BNE  = (D.f[DIR_MMP])[k1tsw ];
+      f1_BNW  = (D.f[DIR_PMP])[k1tse ];
+      f1_BSE  = (D.f[DIR_MPP])[k1tnw ];
+      f1_TSW  = (D.f[DIR_PPM])[k1bne ];
+      f1_TNE  = (D.f[DIR_MMM])[k1bsw ];
+      f1_TNW  = (D.f[DIR_PMM])[k1bse ];
+      f1_TSE  = (D.f[DIR_MPM])[k1bnw ];
 
       real drho1    =  f1_ZERO+f1_E+f1_W+f1_N+f1_S+f1_T+f1_B+f1_NE+f1_SW+f1_SE+f1_NW+f1_TE+f1_BW+f1_BE+f1_TW+f1_TN+f1_BS+f1_BN+f1_TS+
                         f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW;
 
       __syncthreads();
 
-      (D.f[DIR_P00   ])[ke   ] = f1_W   -c2o27*drho1;
-      (D.f[DIR_M00   ])[kw   ] = f1_E   -c2o27*drho1;
-      (D.f[DIR_0P0   ])[kn   ] = f1_S   -c2o27*drho1;
-      (D.f[DIR_0M0   ])[ks   ] = f1_N   -c2o27*drho1;
-      (D.f[DIR_00P   ])[kt   ] = f1_B   -c2o27*drho1;
-      (D.f[DIR_00M   ])[kb   ] = f1_T   -c2o27*drho1;
-      (D.f[DIR_PP0  ])[kne  ] = f1_SW  -c1o54*drho1;
-      (D.f[DIR_MM0  ])[ksw  ] = f1_NE  -c1o54*drho1;
-      (D.f[DIR_PM0  ])[kse  ] = f1_NW  -c1o54*drho1;
-      (D.f[DIR_MP0  ])[knw  ] = f1_SE  -c1o54*drho1;
-      (D.f[DIR_P0P  ])[kte  ] = f1_BW  -c1o54*drho1;
-      (D.f[DIR_M0M  ])[kbw  ] = f1_TE  -c1o54*drho1;
-      (D.f[DIR_P0M  ])[kbe  ] = f1_TW  -c1o54*drho1;
-      (D.f[DIR_M0P  ])[ktw  ] = f1_BE  -c1o54*drho1;
-      (D.f[DIR_0PP  ])[ktn  ] = f1_BS  -c1o54*drho1;
-      (D.f[DIR_0MM  ])[kbs  ] = f1_TN  -c1o54*drho1;
-      (D.f[DIR_0PM  ])[kbn  ] = f1_TS  -c1o54*drho1;
-      (D.f[DIR_0MP  ])[kts  ] = f1_BN  -c1o54*drho1;
+      (D.f[DIR_P00])[ke   ] = f1_W   -c2o27*drho1;
+      (D.f[DIR_M00])[kw   ] = f1_E   -c2o27*drho1;
+      (D.f[DIR_0P0])[kn   ] = f1_S   -c2o27*drho1;
+      (D.f[DIR_0M0])[ks   ] = f1_N   -c2o27*drho1;
+      (D.f[DIR_00P])[kt   ] = f1_B   -c2o27*drho1;
+      (D.f[DIR_00M])[kb   ] = f1_T   -c2o27*drho1;
+      (D.f[DIR_PP0])[kne  ] = f1_SW  -c1o54*drho1;
+      (D.f[DIR_MM0])[ksw  ] = f1_NE  -c1o54*drho1;
+      (D.f[DIR_PM0])[kse  ] = f1_NW  -c1o54*drho1;
+      (D.f[DIR_MP0])[knw  ] = f1_SE  -c1o54*drho1;
+      (D.f[DIR_P0P])[kte  ] = f1_BW  -c1o54*drho1;
+      (D.f[DIR_M0M])[kbw  ] = f1_TE  -c1o54*drho1;
+      (D.f[DIR_P0M])[kbe  ] = f1_TW  -c1o54*drho1;
+      (D.f[DIR_M0P])[ktw  ] = f1_BE  -c1o54*drho1;
+      (D.f[DIR_0PP])[ktn  ] = f1_BS  -c1o54*drho1;
+      (D.f[DIR_0MM])[kbs  ] = f1_TN  -c1o54*drho1;
+      (D.f[DIR_0PM])[kbn  ] = f1_TS  -c1o54*drho1;
+      (D.f[DIR_0MP])[kts  ] = f1_BN  -c1o54*drho1;
       (D.f[DIR_000])[kzero] = f1_ZERO-c8o27*drho1;
-      (D.f[DIR_PPP ])[ktne ] = f1_BSW -c1o216*drho1;
-      (D.f[DIR_MMP ])[ktsw ] = f1_BNE -c1o216*drho1;
-      (D.f[DIR_PMP ])[ktse ] = f1_BNW -c1o216*drho1;
-      (D.f[DIR_MPP ])[ktnw ] = f1_BSE -c1o216*drho1;
-      (D.f[DIR_PPM ])[kbne ] = f1_TSW -c1o216*drho1;
-      (D.f[DIR_MMM ])[kbsw ] = f1_TNE -c1o216*drho1;
-      (D.f[DIR_PMM ])[kbse ] = f1_TNW -c1o216*drho1;
-      (D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1o216*drho1;       
+      (D.f[DIR_PPP])[ktne ] = f1_BSW -c1o216*drho1;
+      (D.f[DIR_MMP])[ktsw ] = f1_BNE -c1o216*drho1;
+      (D.f[DIR_PMP])[ktse ] = f1_BNW -c1o216*drho1;
+      (D.f[DIR_MPP])[ktnw ] = f1_BSE -c1o216*drho1;
+      (D.f[DIR_PPM])[kbne ] = f1_TSW -c1o216*drho1;
+      (D.f[DIR_MMM])[kbsw ] = f1_TNE -c1o216*drho1;
+      (D.f[DIR_PMM])[kbse ] = f1_TNW -c1o216*drho1;
+      (D.f[DIR_MPM])[kbnw ] = f1_TSE -c1o216*drho1;
    }
    __syncthreads();
-}          
+}
 //////////////////////////////////////////////////////////////////////////////
 
 
@@ -1420,82 +1420,82 @@ __global__ void LB_BC_Press_East27( int nx,
 
 //////////////////////////////////////////////////////////////////////////////
 __global__ void QPressDevice27(real* rhoBC,
-                                           real* DD, 
-                                           int* k_Q, 
+                                           real* DD,
+                                           int* k_Q,
                                            real* QQ,
-                                           unsigned int numberOfBCnodes, 
-                                           real om1, 
+                                           unsigned int numberOfBCnodes,
+                                           real om1,
                                            unsigned int* neighborX,
                                            unsigned int* neighborY,
                                            unsigned int* neighborZ,
-                                           unsigned int size_Mat, 
+                                           unsigned long long numberOfLBnodes,
                                            bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-   } 
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+   }
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * 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  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;
@@ -1505,29 +1505,29 @@ __global__ void QPressDevice27(real* rhoBC,
 
    if(k<numberOfBCnodes)
    {
-      real *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB, 
+      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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+         *q_dirBSE, *q_dirBNW;
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -1570,46 +1570,46 @@ __global__ void QPressDevice27(real* rhoBC,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       real q, vx1, vx2, vx3, drho;
       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); 
+                  (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); 
+                  (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); 
+                  (f_T - f_B);
 
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       //////////////////////////////////////////////////////////////////////////
@@ -1619,245 +1619,245 @@ __global__ void QPressDevice27(real* rhoBC,
       ////////////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       q = q_dirE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_M00])[kw]=c2o27* (drho+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq); 
-         //(D.f[DIR_P00])[ke]=c2over27* (drho+three*( vx1        )+c9over2*( vx1        )*( vx1        )-cu_sq); 
+         (D.f[DIR_M00])[kw]=c2o27* (drho+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
+         //(D.f[DIR_P00])[ke]=c2over27* (drho+three*( vx1        )+c9over2*( vx1        )*( vx1        )-cu_sq);
       }
 
       q = q_dirW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_P00])[ke]=c2o27* (drho+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq); 
-         //(D.f[DIR_M00])[kw]=c2over27* (drho+three*(-vx1        )+c9over2*(-vx1        )*(-vx1        )-cu_sq); 
+         (D.f[DIR_P00])[ke]=c2o27* (drho+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
+         //(D.f[DIR_M00])[kw]=c2over27* (drho+three*(-vx1        )+c9over2*(-vx1        )*(-vx1        )-cu_sq);
       }
 
       q = q_dirN[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_0M0])[ks]=c2o27* (drho+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq); 
-         //(D.f[DIR_0P0])[kn]=c2over27* (drho+three*(    vx2     )+c9over2*(     vx2    )*(     vx2    )-cu_sq); 
+         (D.f[DIR_0M0])[ks]=c2o27* (drho+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
+         //(D.f[DIR_0P0])[kn]=c2over27* (drho+three*(    vx2     )+c9over2*(     vx2    )*(     vx2    )-cu_sq);
       }
 
       q = q_dirS[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_0P0])[kn]=c2o27* (drho+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq); 
-         //(D.f[DIR_0M0])[ks]=c2over27* (drho+three*(   -vx2     )+c9over2*(    -vx2    )*(    -vx2    )-cu_sq); 
+         (D.f[DIR_0P0])[kn]=c2o27* (drho+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
+         //(D.f[DIR_0M0])[ks]=c2over27* (drho+three*(   -vx2     )+c9over2*(    -vx2    )*(    -vx2    )-cu_sq);
       }
 
       q = q_dirT[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_00M])[kb]=c2o27* (drho+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq); 
-         //(D.f[DIR_00P])[kt]=c2over27* (drho+three*(         vx3)+c9over2*(         vx3)*(         vx3)-cu_sq); 
+         (D.f[DIR_00M])[kb]=c2o27* (drho+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
+         //(D.f[DIR_00P])[kt]=c2over27* (drho+three*(         vx3)+c9over2*(         vx3)*(         vx3)-cu_sq);
       }
 
       q = q_dirB[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_00P])[kt]=c2o27* (drho+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq); 
-         //(D.f[DIR_00M])[kb]=c2over27* (drho+three*(        -vx3)+c9over2*(        -vx3)*(        -vx3)-cu_sq); 
+         (D.f[DIR_00P])[kt]=c2o27* (drho+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
+         //(D.f[DIR_00M])[kb]=c2over27* (drho+three*(        -vx3)+c9over2*(        -vx3)*(        -vx3)-cu_sq);
       }
 
       q = q_dirNE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_MM0])[ksw]=c1o54* (drho+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq); 
-         //(D.f[DIR_PP0])[kne]=c1over54* (drho+three*( vx1+vx2    )+c9over2*( vx1+vx2    )*( vx1+vx2    )-cu_sq); 
+         (D.f[DIR_MM0])[ksw]=c1o54* (drho+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
+         //(D.f[DIR_PP0])[kne]=c1over54* (drho+three*( vx1+vx2    )+c9over2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
       }
 
       q = q_dirSW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_PP0])[kne]=c1o54* (drho+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq); 
-         //(D.f[DIR_MM0])[ksw]=c1over54* (drho+three*(-vx1-vx2    )+c9over2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq); 
+         (D.f[DIR_PP0])[kne]=c1o54* (drho+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
+         //(D.f[DIR_MM0])[ksw]=c1over54* (drho+three*(-vx1-vx2    )+c9over2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
       }
 
       q = q_dirSE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_MP0])[knw]=c1o54* (drho+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq); 
-         //(D.f[DIR_PM0])[kse]=c1over54* (drho+three*( vx1-vx2    )+c9over2*( vx1-vx2    )*( vx1-vx2    )-cu_sq); 
+         (D.f[DIR_MP0])[knw]=c1o54* (drho+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
+         //(D.f[DIR_PM0])[kse]=c1over54* (drho+three*( vx1-vx2    )+c9over2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
       }
 
       q = q_dirNW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_PM0])[kse]=c1o54* (drho+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq); 
-         //(D.f[DIR_MP0])[knw]=c1over54* (drho+three*(-vx1+vx2    )+c9over2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq); 
+         (D.f[DIR_PM0])[kse]=c1o54* (drho+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
+         //(D.f[DIR_MP0])[knw]=c1over54* (drho+three*(-vx1+vx2    )+c9over2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
       }
 
       q = q_dirTE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_M0M])[kbw]=c1o54* (drho+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq); 
-         //(D.f[DIR_P0P])[kte]=c1over54* (drho+three*( vx1    +vx3)+c9over2*( vx1    +vx3)*( vx1    +vx3)-cu_sq); 
+         (D.f[DIR_M0M])[kbw]=c1o54* (drho+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
+         //(D.f[DIR_P0P])[kte]=c1over54* (drho+three*( vx1    +vx3)+c9over2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
       }
 
       q = q_dirBW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_P0P])[kte]=c1o54* (drho+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq); 
-         //(D.f[DIR_M0M])[kbw]=c1over54* (drho+three*(-vx1    -vx3)+c9over2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq); 
+         (D.f[DIR_P0P])[kte]=c1o54* (drho+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
+         //(D.f[DIR_M0M])[kbw]=c1over54* (drho+three*(-vx1    -vx3)+c9over2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
       }
 
       q = q_dirBE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_M0P])[ktw]=c1o54* (drho+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq); 
-         //(D.f[DIR_P0M])[kbe]=c1over54* (drho+three*( vx1    -vx3)+c9over2*( vx1    -vx3)*( vx1    -vx3)-cu_sq); 
+         (D.f[DIR_M0P])[ktw]=c1o54* (drho+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
+         //(D.f[DIR_P0M])[kbe]=c1over54* (drho+three*( vx1    -vx3)+c9over2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
       }
 
       q = q_dirTW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_P0M])[kbe]=c1o54* (drho+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq); 
-         //(D.f[DIR_M0P])[ktw]=c1over54* (drho+three*(-vx1    +vx3)+c9over2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq); 
+         (D.f[DIR_P0M])[kbe]=c1o54* (drho+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
+         //(D.f[DIR_M0P])[ktw]=c1over54* (drho+three*(-vx1    +vx3)+c9over2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
       }
 
       q = q_dirTN[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_0MM])[kbs]=c1o54* (drho+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq); 
-         //(D.f[DIR_0PP])[ktn]=c1over54* (drho+three*(     vx2+vx3)+c9over2*(     vx2+vx3)*(     vx2+vx3)-cu_sq); 
+         (D.f[DIR_0MM])[kbs]=c1o54* (drho+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
+         //(D.f[DIR_0PP])[ktn]=c1over54* (drho+three*(     vx2+vx3)+c9over2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
       }
 
       q = q_dirBS[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_0PP])[ktn]=c1o54* (drho+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq); 
-         //(D.f[DIR_0MM])[kbs]=c1over54* (drho+three*(    -vx2-vx3)+c9over2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq); 
+         (D.f[DIR_0PP])[ktn]=c1o54* (drho+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
+         //(D.f[DIR_0MM])[kbs]=c1over54* (drho+three*(    -vx2-vx3)+c9over2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
       }
 
       q = q_dirBN[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_0MP])[kts]=c1o54* (drho+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq); 
-         //(D.f[DIR_0PM])[kbn]=c1over54* (drho+three*(     vx2-vx3)+c9over2*(     vx2-vx3)*(     vx2-vx3)-cu_sq); 
+         (D.f[DIR_0MP])[kts]=c1o54* (drho+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
+         //(D.f[DIR_0PM])[kbn]=c1over54* (drho+three*(     vx2-vx3)+c9over2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
       }
 
       q = q_dirTS[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_0PM])[kbn]=c1o54* (drho+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq); 
-         //(D.f[DIR_0MP])[kts]=c1over54* (drho+three*(    -vx2+vx3)+c9over2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq); 
+         (D.f[DIR_0PM])[kbn]=c1o54* (drho+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
+         //(D.f[DIR_0MP])[kts]=c1over54* (drho+three*(    -vx2+vx3)+c9over2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
       }
 
       q = q_dirTNE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_MMM])[kbsw]=c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); 
-         //(D.f[DIR_PPP])[ktne]=c1over216*(drho+three*( vx1+vx2+vx3)+c9over2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); 
+         (D.f[DIR_MMM])[kbsw]=c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+         //(D.f[DIR_PPP])[ktne]=c1over216*(drho+three*( vx1+vx2+vx3)+c9over2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
       }
 
       q = q_dirBSW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_PPP])[ktne]=c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); 
-         //(D.f[DIR_MMM])[kbsw]=c1over216*(drho+three*(-vx1-vx2-vx3)+c9over2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); 
+         (D.f[DIR_PPP])[ktne]=c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+         //(D.f[DIR_MMM])[kbsw]=c1over216*(drho+three*(-vx1-vx2-vx3)+c9over2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
       }
 
       q = q_dirBNE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_MMP])[ktsw]=c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); 
-         //(D.f[DIR_PPM])[kbne]=c1over216*(drho+three*( vx1+vx2-vx3)+c9over2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); 
+         (D.f[DIR_MMP])[ktsw]=c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+         //(D.f[DIR_PPM])[kbne]=c1over216*(drho+three*( vx1+vx2-vx3)+c9over2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
       }
 
       q = q_dirTSW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_PPM])[kbne]=c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); 
-         //(D.f[DIR_MMP])[ktsw]=c1over216*(drho+three*(-vx1-vx2+vx3)+c9over2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); 
+         (D.f[DIR_PPM])[kbne]=c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+         //(D.f[DIR_MMP])[ktsw]=c1over216*(drho+three*(-vx1-vx2+vx3)+c9over2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
       }
 
       q = q_dirTSE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_MPM])[kbnw]=c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); 
-         //(D.f[DIR_PMP])[ktse]=c1over216*(drho+three*( vx1-vx2+vx3)+c9over2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); 
+         (D.f[DIR_MPM])[kbnw]=c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+         //(D.f[DIR_PMP])[ktse]=c1over216*(drho+three*( vx1-vx2+vx3)+c9over2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
       }
 
       q = q_dirBNW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_PMP])[ktse]=c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); 
-         //(D.f[DIR_MPM])[kbnw]=c1over216*(drho+three*(-vx1+vx2-vx3)+c9over2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); 
+         (D.f[DIR_PMP])[ktse]=c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+         //(D.f[DIR_MPM])[kbnw]=c1over216*(drho+three*(-vx1+vx2-vx3)+c9over2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
       }
 
       q = q_dirBSE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_MPP])[ktnw]=c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); 
-         //(D.f[DIR_PMM])[kbse]=c1over216*(drho+three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); 
+         (D.f[DIR_MPP])[ktnw]=c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+         //(D.f[DIR_PMM])[kbse]=c1over216*(drho+three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
       }
 
       q = q_dirTNW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_PMM])[kbse]=c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); 
-         //(D.f[DIR_MPP])[ktnw]=c1over216*(drho+three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); 
+         (D.f[DIR_PMM])[kbse]=c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+         //(D.f[DIR_MPP])[ktnw]=c1over216*(drho+three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
       }
    }
 }
@@ -1903,85 +1903,85 @@ __global__ void QPressDevice27(real* rhoBC,
 
 //////////////////////////////////////////////////////////////////////////////
 __global__ void QPressDeviceAntiBB27(   real* rhoBC,
-												   real* vx,
-												   real* vy,
-												   real* vz,
-												   real* DD, 
-												   int* k_Q, 
-												   real* QQ,
-												   int numberOfBCnodes, 
-												   real om1, 
-												   unsigned int* neighborX,
-												   unsigned int* neighborY,
-												   unsigned int* neighborZ,
-												   unsigned int size_Mat, 
-												   bool isEvenTimestep)
+                                       real* vx,
+                                       real* vy,
+                                       real* vz,
+                                       real* DD,
+                                       int* k_Q,
+                                       real* QQ,
+                                       int numberOfBCnodes,
+                                       real om1,
+                                       unsigned int* neighborX,
+                                       unsigned int* neighborY,
+                                       unsigned int* neighborZ,
+                                       unsigned long long numberOfLBnodes,
+                                       bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-   } 
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+   }
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * 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  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;
@@ -1991,37 +1991,37 @@ __global__ void QPressDeviceAntiBB27(   real* rhoBC,
 
    if(k<numberOfBCnodes)
    {
-      real *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB, 
+      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[DIR_P00   *numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   *numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   *numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   *numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   *numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   *numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  *numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  *numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  *numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  *numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  *numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  *numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  *numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  *numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  *numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  *numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  *numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  *numberOfBCnodes];
-      q_dirTNE = &QQ[DIR_PPP *numberOfBCnodes];
-      q_dirTSW = &QQ[DIR_MMP *numberOfBCnodes];
-      q_dirTSE = &QQ[DIR_PMP *numberOfBCnodes];
-      q_dirTNW = &QQ[DIR_MPP *numberOfBCnodes];
-      q_dirBNE = &QQ[DIR_PPM *numberOfBCnodes];
-      q_dirBSW = &QQ[DIR_MMM *numberOfBCnodes];
-      q_dirBSE = &QQ[DIR_PMM *numberOfBCnodes];
-      q_dirBNW = &QQ[DIR_MPM *numberOfBCnodes];
+         *q_dirBSE, *q_dirBNW;
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
+      q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
+      q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
+      q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
+      q_dirTNW = &QQ[DIR_MPP * numberOfBCnodes];
+      q_dirBNE = &QQ[DIR_PPM * numberOfBCnodes];
+      q_dirBSW = &QQ[DIR_MMM * numberOfBCnodes];
+      q_dirBSE = &QQ[DIR_PMM * numberOfBCnodes];
+      q_dirBNW = &QQ[DIR_MPM * numberOfBCnodes];
       ////////////////////////////////////////////////////////////////////////////////
       //index
       unsigned int KQK  = k_Q[k];
@@ -2056,123 +2056,123 @@ __global__ void QPressDeviceAntiBB27(   real* rhoBC,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW, f_ZERO;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
       f_ZERO = (D.f[DIR_000])[kzero];
       ////////////////////////////////////////////////////////////////////////////////
       //real vx1, vx2, vx3, drho;
       //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); 
+      //            (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); 
+      //            (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); 
+      //            (f_T - f_B);
 
       //real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       //////////////////////////////////////////////////////////////////////////
       real drho    = f_ZERO+f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+
-						f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
+                  f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW;
       drho = drho - rhoBC[k];
-	  drho *= 0.01f;
+     drho *= 0.01f;
       ////////////////////////////////////////////////////////////////////////////////
-	  real q;
+     real q;
       //deltaRho = (rhoBC[k] + one) / (deltaRho + one);
       ////////////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       q = q_dirE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_M00])[kw]=f_W-c2o27*drho; 
+         (D.f[DIR_M00])[kw]=f_W-c2o27*drho;
       }
 
       q = q_dirW[k];
@@ -2184,19 +2184,19 @@ __global__ void QPressDeviceAntiBB27(   real* rhoBC,
       q = q_dirN[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_0M0])[ks]=f_S-c2o27*drho; 
+         (D.f[DIR_0M0])[ks]=f_S-c2o27*drho;
       }
 
       q = q_dirS[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_0P0])[kn]=f_N-c2o27*drho; 
+         (D.f[DIR_0P0])[kn]=f_N-c2o27*drho;
       }
 
       q = q_dirT[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_00M])[kb]=f_B-c2o27*drho; 
+         (D.f[DIR_00M])[kb]=f_B-c2o27*drho;
       }
 
       q = q_dirB[k];
@@ -2232,13 +2232,13 @@ __global__ void QPressDeviceAntiBB27(   real* rhoBC,
       q = q_dirTE[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_M0M])[kbw]=f_BW-c1o54*drho; 
+         (D.f[DIR_M0M])[kbw]=f_BW-c1o54*drho;
       }
 
       q = q_dirBW[k];
       if (q>=c0o1 && q<=c1o1)
       {
-         (D.f[DIR_P0P])[kte]=f_TE-c1o54*drho; 
+         (D.f[DIR_P0P])[kte]=f_TE-c1o54*drho;
       }
 
       q = q_dirBE[k];
@@ -2368,20 +2368,20 @@ __global__ void QPressDeviceAntiBB27(   real* rhoBC,
 
 //////////////////////////////////////////////////////////////////////////////
 __global__ void QPressDeviceFixBackflow27( real* rhoBC,
-                                                      real* DD, 
-                                                      int* k_Q, 
-                                                      int numberOfBCnodes, 
-                                                      real om1, 
+                                                      real* DD,
+                                                      int* k_Q,
+                                                      int numberOfBCnodes,
+                                                      real om1,
                                                       unsigned int* neighborX,
                                                       unsigned int* neighborY,
                                                       unsigned int* neighborZ,
-                                                      unsigned int size_Mat, 
+                                                      unsigned long long numberOfLBnodes,
                                                       bool 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  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;
@@ -2429,63 +2429,63 @@ __global__ void QPressDeviceFixBackflow27( real* rhoBC,
       Distributions27 D;
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
          (D.f[DIR_M00])[kw]       = c2o27  * deltaRho;
@@ -2559,20 +2559,20 @@ __global__ void QPressDeviceFixBackflow27( real* rhoBC,
 
 //////////////////////////////////////////////////////////////////////////////
 __global__ void QPressDeviceDirDepBot27(  real* rhoBC,
-                                                     real* DD, 
-                                                     int* k_Q, 
-                                                     int numberOfBCnodes, 
-                                                     real om1, 
+                                                     real* DD,
+                                                     int* k_Q,
+                                                     int numberOfBCnodes,
+                                                     real om1,
                                                      unsigned int* neighborX,
                                                      unsigned int* neighborY,
                                                      unsigned int* neighborZ,
-                                                     unsigned int size_Mat, 
+                                                     unsigned long long numberOfLBnodes,
                                                      bool 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  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;
@@ -2620,86 +2620,86 @@ __global__ void QPressDeviceDirDepBot27(  real* rhoBC,
       Distributions27 D;
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real f_E,f_W,f_N,f_S,f_T,f_NE,f_SW,f_SE,f_NW,f_TE,f_TW,f_TN,f_TS,f_ZERO,f_TNE,f_TSW,f_TSE,f_TNW;//,
             //f_B,f_BW,f_BE,f_BS,f_BN,f_BSW,f_BNE,f_BNW,f_BSE;
 
-      f_E    = (D.f[DIR_P00   ])[ke   ];
-      f_W    = (D.f[DIR_M00   ])[kw   ];
-      f_N    = (D.f[DIR_0P0   ])[kn   ];
-      f_S    = (D.f[DIR_0M0   ])[ks   ];
-      f_T    = (D.f[DIR_00P   ])[kt   ];
-      f_NE   = (D.f[DIR_PP0  ])[kne  ];
-      f_SW   = (D.f[DIR_MM0  ])[ksw  ];
-      f_SE   = (D.f[DIR_PM0  ])[kse  ];
-      f_NW   = (D.f[DIR_MP0  ])[knw  ];
-      f_TE   = (D.f[DIR_P0P  ])[kte  ];
-      f_TW   = (D.f[DIR_M0P  ])[ktw  ];
-      f_TN   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TS   = (D.f[DIR_0MP  ])[kts  ];
+      f_E    = (D.f[DIR_P00])[ke   ];
+      f_W    = (D.f[DIR_M00])[kw   ];
+      f_N    = (D.f[DIR_0P0])[kn   ];
+      f_S    = (D.f[DIR_0M0])[ks   ];
+      f_T    = (D.f[DIR_00P])[kt   ];
+      f_NE   = (D.f[DIR_PP0])[kne  ];
+      f_SW   = (D.f[DIR_MM0])[ksw  ];
+      f_SE   = (D.f[DIR_PM0])[kse  ];
+      f_NW   = (D.f[DIR_MP0])[knw  ];
+      f_TE   = (D.f[DIR_P0P])[kte  ];
+      f_TW   = (D.f[DIR_M0P])[ktw  ];
+      f_TN   = (D.f[DIR_0PP])[ktn  ];
+      f_TS   = (D.f[DIR_0MP])[kts  ];
       f_ZERO = (D.f[DIR_000])[kzero];
-      f_TNE  = (D.f[DIR_PPP ])[ktne ];
-      f_TSW  = (D.f[DIR_MMP ])[ktsw ];
-      f_TSE  = (D.f[DIR_PMP ])[ktse ];
-      f_TNW  = (D.f[DIR_MPP ])[ktnw ];
+      f_TNE  = (D.f[DIR_PPP])[ktne ];
+      f_TSW  = (D.f[DIR_MMP])[ktsw ];
+      f_TSE  = (D.f[DIR_PMP])[ktse ];
+      f_TNW  = (D.f[DIR_MPP])[ktnw ];
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
       //f_B   = (four*rho- four*f_SW-     eight*f_TSW-four*f_W-   eight*f_TW- four*f_NW-     eight*f_TNW-four*f_S-   eight*f_TS-four*f_ZERO+     f_T-four*f_N-   eight*f_TN- four*f_SE-     eight*f_TSE-four*f_E-   eight*f_TE- four*f_NE-     eight*f_TNE)/nine;
@@ -2803,16 +2803,16 @@ __host__ __device__ real computeOutflowDistribution(const real* const &f, const
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 __global__ void QPressNoRhoDevice27( real* rhoBC,
-												 real* distributions, 
-												 int* k_Q, 
-												 int* k_N, 
-												 int numberOfBCnodes, 
-												 real om1, 
-												 unsigned int* neighborX,
-												 unsigned int* neighborY,
-												 unsigned int* neighborZ,
-												 unsigned int numberOfLBnodes, 
-												 bool isEvenTimestep,
+                                     real* distributions,
+                                     int* k_Q,
+                                     int* k_N,
+                                     int numberOfBCnodes,
+                                     real om1,
+                                     unsigned int* neighborX,
+                                     unsigned int* neighborY,
+                                     unsigned int* neighborZ,
+                                     unsigned long long numberOfLBnodes,
+                                     bool isEvenTimestep,
                                      int direction)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -2885,8 +2885,8 @@ __global__ void QPressNoRhoDevice27( real* rhoBC,
    unsigned int k1bsw = neighborZ[k1sw];
    ////////////////////////////////////////////////////////////////////////////////
    Distributions27 dist;
-   getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep);      
-   real f[27], f1[27]; 
+   getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep);
+   real f[27], f1[27];
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    f1[DIR_P00] = (dist.f[DIR_P00])[k1e   ];
    f1[DIR_M00] = (dist.f[DIR_M00])[k1w   ];
@@ -2986,9 +2986,9 @@ __global__ void QPressNoRhoDevice27( real* rhoBC,
          (dist.f[DIR_MPP])[ktnw ] = computeOutflowDistribution(f, f1, DIR_MPP, cs);
          (dist.f[DIR_PPM])[kbne ] = computeOutflowDistribution(f, f1, DIR_PPM, cs);
          (dist.f[DIR_MPM])[kbnw ] = computeOutflowDistribution(f, f1, DIR_MPM, cs);
-         break;  
+         break;
 
-      case ZPZ:   
+      case ZPZ:
          (dist.f[DIR_0M0])[ks   ] = computeOutflowDistribution(f, f1, DIR_0M0, cs);
          (dist.f[DIR_PM0])[kse  ] = computeOutflowDistribution(f, f1, DIR_PM0, cs);
          (dist.f[DIR_MM0])[ksw  ] = computeOutflowDistribution(f, f1, DIR_MM0, cs);
@@ -3009,7 +3009,7 @@ __global__ void QPressNoRhoDevice27( real* rhoBC,
          (dist.f[DIR_PPP])[ktne ] = computeOutflowDistribution(f, f1, DIR_PPP, cs);
          (dist.f[DIR_MPP])[ktnw ] = computeOutflowDistribution(f, f1, DIR_MPP, cs);
          (dist.f[DIR_PMP])[ktse ] = computeOutflowDistribution(f, f1, DIR_PMP, cs);
-         (dist.f[DIR_MMP])[ktsw ] = computeOutflowDistribution(f, f1, DIR_MMP, cs); 
+         (dist.f[DIR_MMP])[ktsw ] = computeOutflowDistribution(f, f1, DIR_MMP, cs);
          break;
 
       case ZZP:
@@ -3021,7 +3021,7 @@ __global__ void QPressNoRhoDevice27( real* rhoBC,
          (dist.f[DIR_PPM])[kbne ] = computeOutflowDistribution(f, f1, DIR_PPM, cs);
          (dist.f[DIR_MPM])[kbnw ] = computeOutflowDistribution(f, f1, DIR_MPM, cs);
          (dist.f[DIR_PMM])[kbse ] = computeOutflowDistribution(f, f1, DIR_PMM, cs);
-         (dist.f[DIR_MMM])[kbsw ] = computeOutflowDistribution(f, f1, DIR_MMM, cs);     
+         (dist.f[DIR_MMM])[kbsw ] = computeOutflowDistribution(f, f1, DIR_MMM, cs);
          break;
       default:
          break;
@@ -3036,22 +3036,22 @@ __host__ __device__ real computeOutflowDistribution(const real* const &f, const
 }
 
 __global__ void QPressZeroRhoOutflowDevice27(  real* rhoBC,
-												 real* distributions, 
-												 int* k_Q, 
-												 int* k_N, 
-												 int numberOfBCnodes, 
-												 real om1, 
-												 unsigned int* neighborX,
-												 unsigned int* neighborY,
-												 unsigned int* neighborZ,
-												 unsigned int numberOfLBnodes, 
-												 bool isEvenTimestep,
+                                     real* distributions,
+                                     int* k_Q,
+                                     int* k_N,
+                                     int numberOfBCnodes,
+                                     real om1,
+                                     unsigned int* neighborX,
+                                     unsigned int* neighborY,
+                                     unsigned int* neighborZ,
+                                     unsigned long long numberOfLBnodes,
+                                     bool isEvenTimestep,
                                      int direction,
                                      real densityCorrectionFactor)
 {
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned k = vf::gpu::getNodeIndex();
-   
+
    //////////////////////////////////////////////////////////////////////////
 
    if(k>=numberOfBCnodes) return;
@@ -3079,8 +3079,8 @@ __global__ void QPressZeroRhoOutflowDevice27(  real* rhoBC,
    uint kN_MMM = neighborZ[k_MM0];
    ////////////////////////////////////////////////////////////////////////////////
    Distributions27 dist;
-   getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep);   
-   real f[27], fN[27];   
+   getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep);
+   real f[27], fN[27];
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    f[DIR_000] = (dist.f[DIR_000])[k_000];
    f[DIR_P00] = (dist.f[DIR_P00])[k_000];
@@ -3139,9 +3139,9 @@ __global__ void QPressZeroRhoOutflowDevice27(  real* rhoBC,
    fN[DIR_MMM] = (dist.f[DIR_MMM])[kN_MMM];
    //////////////////////////////////////////////////////////////////////////
    real drho = vf::lbm::getDensity(f);
-   
+
    real rhoCorrection = densityCorrectionFactor*drho;
-   
+
    real cs = c1o1 / sqrtf(c3o1);
 
    getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep);
@@ -3182,9 +3182,9 @@ __global__ void QPressZeroRhoOutflowDevice27(  real* rhoBC,
          (dist.f[DIR_MPP])[k_M00] = computeOutflowDistribution(f, fN, DIR_MPP, rhoCorrection, cs, c1o216);
          (dist.f[DIR_PPM])[k_00M] = computeOutflowDistribution(f, fN, DIR_PPM, rhoCorrection, cs, c1o216);
          (dist.f[DIR_MPM])[k_M0M] = computeOutflowDistribution(f, fN, DIR_MPM, rhoCorrection, cs, c1o216);
-         break;  
+         break;
 
-      case ZPZ:   
+      case ZPZ:
          (dist.f[DIR_0M0])[k_0M0] =computeOutflowDistribution(f, fN, DIR_0M0, rhoCorrection, cs, c2o27);
          (dist.f[DIR_PM0])[k_0M0] =computeOutflowDistribution(f, fN, DIR_PM0, rhoCorrection, cs, c1o54);
          (dist.f[DIR_MM0])[k_MM0] =computeOutflowDistribution(f, fN, DIR_MM0, rhoCorrection, cs, c1o54);
@@ -3205,7 +3205,7 @@ __global__ void QPressZeroRhoOutflowDevice27(  real* rhoBC,
          (dist.f[DIR_PPP])[k_000] = computeOutflowDistribution(f, fN, DIR_PPP, rhoCorrection, cs, c1o216);
          (dist.f[DIR_MPP])[k_M00] = computeOutflowDistribution(f, fN, DIR_MPP, rhoCorrection, cs, c1o216);
          (dist.f[DIR_PMP])[k_0M0] = computeOutflowDistribution(f, fN, DIR_PMP, rhoCorrection, cs, c1o216);
-         (dist.f[DIR_MMP])[k_MM0] = computeOutflowDistribution(f, fN, DIR_MMP, rhoCorrection, cs, c1o216); 
+         (dist.f[DIR_MMP])[k_MM0] = computeOutflowDistribution(f, fN, DIR_MMP, rhoCorrection, cs, c1o216);
          break;
 
       case ZZP:
@@ -3217,7 +3217,7 @@ __global__ void QPressZeroRhoOutflowDevice27(  real* rhoBC,
          (dist.f[DIR_PPM])[k_00M] = computeOutflowDistribution(f, fN, DIR_PPM, rhoCorrection, cs, c1o216);
          (dist.f[DIR_MPM])[k_M0M] = computeOutflowDistribution(f, fN, DIR_MPM, rhoCorrection, cs, c1o216);
          (dist.f[DIR_PMM])[k_0MM] = computeOutflowDistribution(f, fN, DIR_PMM, rhoCorrection, cs, c1o216);
-         (dist.f[DIR_MMM])[k_MMM] = computeOutflowDistribution(f, fN, DIR_MMM, rhoCorrection, cs, c1o216);     
+         (dist.f[DIR_MMM])[k_MMM] = computeOutflowDistribution(f, fN, DIR_MMM, rhoCorrection, cs, c1o216);
          break;
       default:
          break;
@@ -3256,21 +3256,21 @@ __global__ void QPressZeroRhoOutflowDevice27(  real* rhoBC,
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 __global__ void QPressDeviceOld27(real* rhoBC,
-                                             real* DD, 
-                                             int* k_Q, 
-                                             int* k_N, 
-                                             int numberOfBCnodes, 
-                                             real om1, 
+                                             real* DD,
+                                             int* k_Q,
+                                             int* k_N,
+                                             int numberOfBCnodes,
+                                             real om1,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int size_Mat, 
+                                             unsigned long long numberOfLBnodes,
                                              bool 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  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;
@@ -3344,133 +3344,133 @@ __global__ void QPressDeviceOld27(real* rhoBC,
       Distributions27 D;
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real        f1_E,f1_W,f1_N,f1_S,f1_T,f1_B,f1_NE,f1_SW,f1_SE,f1_NW,f1_TE,f1_BW,f1_BE,f1_TW,f1_TN,f1_BS,f1_BN,f1_TS,f1_ZERO,
                      f1_TNE,f1_TSW,f1_TSE,f1_TNW,f1_BNE,f1_BSW,f1_BSE,f1_BNW;
 
-      f1_W    = (D.f[DIR_P00   ])[k1e   ];
-      f1_E    = (D.f[DIR_M00   ])[k1w   ];
-      f1_S    = (D.f[DIR_0P0   ])[k1n   ];
-      f1_N    = (D.f[DIR_0M0   ])[k1s   ];
-      f1_B    = (D.f[DIR_00P   ])[k1t   ];
-      f1_T    = (D.f[DIR_00M   ])[k1b   ];
-      f1_SW   = (D.f[DIR_PP0  ])[k1ne  ];
-      f1_NE   = (D.f[DIR_MM0  ])[k1sw  ];
-      f1_NW   = (D.f[DIR_PM0  ])[k1se  ];
-      f1_SE   = (D.f[DIR_MP0  ])[k1nw  ];
-      f1_BW   = (D.f[DIR_P0P  ])[k1te  ];
-      f1_TE   = (D.f[DIR_M0M  ])[k1bw  ];
-      f1_TW   = (D.f[DIR_P0M  ])[k1be  ];
-      f1_BE   = (D.f[DIR_M0P  ])[k1tw  ];
-      f1_BS   = (D.f[DIR_0PP  ])[k1tn  ];
-      f1_TN   = (D.f[DIR_0MM  ])[k1bs  ];
-      f1_TS   = (D.f[DIR_0PM  ])[k1bn  ];
-      f1_BN   = (D.f[DIR_0MP  ])[k1ts  ];
+      f1_W    = (D.f[DIR_P00])[k1e   ];
+      f1_E    = (D.f[DIR_M00])[k1w   ];
+      f1_S    = (D.f[DIR_0P0])[k1n   ];
+      f1_N    = (D.f[DIR_0M0])[k1s   ];
+      f1_B    = (D.f[DIR_00P])[k1t   ];
+      f1_T    = (D.f[DIR_00M])[k1b   ];
+      f1_SW   = (D.f[DIR_PP0])[k1ne  ];
+      f1_NE   = (D.f[DIR_MM0])[k1sw  ];
+      f1_NW   = (D.f[DIR_PM0])[k1se  ];
+      f1_SE   = (D.f[DIR_MP0])[k1nw  ];
+      f1_BW   = (D.f[DIR_P0P])[k1te  ];
+      f1_TE   = (D.f[DIR_M0M])[k1bw  ];
+      f1_TW   = (D.f[DIR_P0M])[k1be  ];
+      f1_BE   = (D.f[DIR_M0P])[k1tw  ];
+      f1_BS   = (D.f[DIR_0PP])[k1tn  ];
+      f1_TN   = (D.f[DIR_0MM])[k1bs  ];
+      f1_TS   = (D.f[DIR_0PM])[k1bn  ];
+      f1_BN   = (D.f[DIR_0MP])[k1ts  ];
       f1_ZERO = (D.f[DIR_000])[k1zero];
-      f1_BSW  = (D.f[DIR_PPP ])[k1tne ];
-      f1_BNE  = (D.f[DIR_MMP ])[k1tsw ];
-      f1_BNW  = (D.f[DIR_PMP ])[k1tse ];
-      f1_BSE  = (D.f[DIR_MPP ])[k1tnw ];
-      f1_TSW  = (D.f[DIR_PPM ])[k1bne ];
-      f1_TNE  = (D.f[DIR_MMM ])[k1bsw ];
-      f1_TNW  = (D.f[DIR_PMM ])[k1bse ];
-      f1_TSE  = (D.f[DIR_MPM ])[k1bnw ];
+      f1_BSW  = (D.f[DIR_PPP])[k1tne ];
+      f1_BNE  = (D.f[DIR_MMP])[k1tsw ];
+      f1_BNW  = (D.f[DIR_PMP])[k1tse ];
+      f1_BSE  = (D.f[DIR_MPP])[k1tnw ];
+      f1_TSW  = (D.f[DIR_PPM])[k1bne ];
+      f1_TNE  = (D.f[DIR_MMM])[k1bsw ];
+      f1_TNW  = (D.f[DIR_PMM])[k1bse ];
+      f1_TSE  = (D.f[DIR_MPM])[k1bnw ];
 
       //////////////////////////////////////////////////////////////////////////
       real drho1    =  f1_ZERO+f1_E+f1_W+f1_N+f1_S+f1_T+f1_B+f1_NE+f1_SW+f1_SE+f1_NW+f1_TE+f1_BW+f1_BE+f1_TW+f1_TN+f1_BS+f1_BN+f1_TS+
                           f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW;
 
-	  //drho1 = (drho1 + rhoBC[k])/2.f;
-	  drho1 = drho1 - rhoBC[k];
+     //drho1 = (drho1 + rhoBC[k])/2.f;
+     drho1 = drho1 - rhoBC[k];
       //////////////////////////////////////////////////////////////////////////
 
       __syncthreads();
 
-      (D.f[DIR_P00   ])[ke   ] = f1_W   -c2o27*drho1;   //  c1o100;  // zero;  //
-      (D.f[DIR_M00   ])[kw   ] = f1_E   -c2o27*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0P0   ])[kn   ] = f1_S   -c2o27*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0M0   ])[ks   ] = f1_N   -c2o27*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_00P   ])[kt   ] = f1_B   -c2o27*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_00M   ])[kb   ] = f1_T   -c2o27*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PP0  ])[kne  ] = f1_SW  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MM0  ])[ksw  ] = f1_NE  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PM0  ])[kse  ] = f1_NW  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MP0  ])[knw  ] = f1_SE  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_P0P  ])[kte  ] = f1_BW  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_M0M  ])[kbw  ] = f1_TE  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_P0M  ])[kbe  ] = f1_TW  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_M0P  ])[ktw  ] = f1_BE  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0PP  ])[ktn  ] = f1_BS  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0MM  ])[kbs  ] = f1_TN  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0PM  ])[kbn  ] = f1_TS  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0MP  ])[kts  ] = f1_BN  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_P00])[ke   ] = f1_W   -c2o27*drho1;   //  c1o100;  // zero;  //
+      (D.f[DIR_M00])[kw   ] = f1_E   -c2o27*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0P0])[kn   ] = f1_S   -c2o27*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0M0])[ks   ] = f1_N   -c2o27*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_00P])[kt   ] = f1_B   -c2o27*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_00M])[kb   ] = f1_T   -c2o27*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_PP0])[kne  ] = f1_SW  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MM0])[ksw  ] = f1_NE  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_PM0])[kse  ] = f1_NW  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MP0])[knw  ] = f1_SE  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_P0P])[kte  ] = f1_BW  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_M0M])[kbw  ] = f1_TE  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_P0M])[kbe  ] = f1_TW  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_M0P])[ktw  ] = f1_BE  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0PP])[ktn  ] = f1_BS  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0MM])[kbs  ] = f1_TN  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0PM])[kbn  ] = f1_TS  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0MP])[kts  ] = f1_BN  -c1o54*drho1;	//  c1o100;  // zero;  //
       (D.f[DIR_000])[kzero] = f1_ZERO-c8o27*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PPP ])[ktne ] = f1_BSW -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MMP ])[ktsw ] = f1_BNE -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PMP ])[ktse ] = f1_BNW -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MPP ])[ktnw ] = f1_BSE -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PPM ])[kbne ] = f1_TSW -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MMM ])[kbsw ] = f1_TNE -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PMM ])[kbse ] = f1_TNW -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1o216*drho1;  //  c1o100;  // zero;  //      
+      (D.f[DIR_PPP])[ktne ] = f1_BSW -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MMP])[ktsw ] = f1_BNE -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_PMP])[ktse ] = f1_BNW -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MPP])[ktnw ] = f1_BSE -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_PPM])[kbne ] = f1_TSW -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MMM])[kbsw ] = f1_TNE -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_PMM])[kbse ] = f1_TNW -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MPM])[kbnw ] = f1_TSE -c1o216*drho1;  //  c1o100;  // zero;  //
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -3515,22 +3515,22 @@ __global__ void QPressDeviceOld27(real* rhoBC,
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 __global__ void QPressDeviceEQZ27(real* rhoBC,
-                                             real* DD, 
-                                             int* k_Q, 
+                                             real* DD,
+                                             int* k_Q,
                                              int* k_N,
-											 real* kTestRE,
-                                             int numberOfBCnodes, 
-                                             real om1, 
+                                  real* kTestRE,
+                                             int numberOfBCnodes,
+                                             real om1,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int size_Mat, 
+                                             unsigned long long numberOfLBnodes,
                                              bool 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  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;
@@ -3604,168 +3604,168 @@ __global__ void QPressDeviceEQZ27(real* rhoBC,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////
     //   Distributions27 kDistTest;
-    //      kDistTest.f[DIR_P00   ] = &kTestRE[DIR_P00   *numberOfBCnodes];
-    //      kDistTest.f[DIR_M00   ] = &kTestRE[DIR_M00   *numberOfBCnodes];
-    //      kDistTest.f[DIR_0P0   ] = &kTestRE[DIR_0P0   *numberOfBCnodes];
-    //      kDistTest.f[DIR_0M0   ] = &kTestRE[DIR_0M0   *numberOfBCnodes];
-    //      kDistTest.f[DIR_00P   ] = &kTestRE[DIR_00P   *numberOfBCnodes];
-    //      kDistTest.f[DIR_00M   ] = &kTestRE[DIR_00M   *numberOfBCnodes];
-    //      kDistTest.f[DIR_PP0  ] = &kTestRE[DIR_PP0  *numberOfBCnodes];
-    //      kDistTest.f[DIR_MM0  ] = &kTestRE[DIR_MM0  *numberOfBCnodes];
-    //      kDistTest.f[DIR_PM0  ] = &kTestRE[DIR_PM0  *numberOfBCnodes];
-    //      kDistTest.f[DIR_MP0  ] = &kTestRE[DIR_MP0  *numberOfBCnodes];
-    //      kDistTest.f[DIR_P0P  ] = &kTestRE[DIR_P0P  *numberOfBCnodes];
-    //      kDistTest.f[DIR_M0M  ] = &kTestRE[DIR_M0M  *numberOfBCnodes];
-    //      kDistTest.f[DIR_P0M  ] = &kTestRE[DIR_P0M  *numberOfBCnodes];
-    //      kDistTest.f[DIR_M0P  ] = &kTestRE[DIR_M0P  *numberOfBCnodes];
-    //      kDistTest.f[DIR_0PP  ] = &kTestRE[DIR_0PP  *numberOfBCnodes];
-    //      kDistTest.f[DIR_0MM  ] = &kTestRE[DIR_0MM  *numberOfBCnodes];
-    //      kDistTest.f[DIR_0PM  ] = &kTestRE[DIR_0PM  *numberOfBCnodes];
-    //      kDistTest.f[DIR_0MP  ] = &kTestRE[DIR_0MP  *numberOfBCnodes];
-    //      kDistTest.f[DIR_000] = &kTestRE[DIR_000*numberOfBCnodes];
-    //      kDistTest.f[DIR_PPP ] = &kTestRE[DIR_PPP *numberOfBCnodes];
-    //      kDistTest.f[DIR_MMP ] = &kTestRE[DIR_MMP *numberOfBCnodes];
-    //      kDistTest.f[DIR_PMP ] = &kTestRE[DIR_PMP *numberOfBCnodes];
-    //      kDistTest.f[DIR_MPP ] = &kTestRE[DIR_MPP *numberOfBCnodes];
-    //      kDistTest.f[DIR_PPM ] = &kTestRE[DIR_PPM *numberOfBCnodes];
-    //      kDistTest.f[DIR_MMM ] = &kTestRE[DIR_MMM *numberOfBCnodes];
-    //      kDistTest.f[DIR_PMM ] = &kTestRE[DIR_PMM *numberOfBCnodes];
-    //      kDistTest.f[DIR_MPM ] = &kTestRE[DIR_MPM *numberOfBCnodes];
+    //      kDistTest.f[DIR_P00] = &kTestRE[DIR_P00 * numberOfBCnodes];
+    //      kDistTest.f[DIR_M00] = &kTestRE[DIR_M00 * numberOfBCnodes];
+    //      kDistTest.f[DIR_0P0] = &kTestRE[DIR_0P0 * numberOfBCnodes];
+    //      kDistTest.f[DIR_0M0] = &kTestRE[DIR_0M0 * numberOfBCnodes];
+    //      kDistTest.f[DIR_00P] = &kTestRE[DIR_00P * numberOfBCnodes];
+    //      kDistTest.f[DIR_00M] = &kTestRE[DIR_00M * numberOfBCnodes];
+    //      kDistTest.f[DIR_PP0] = &kTestRE[DIR_PP0 * numberOfBCnodes];
+    //      kDistTest.f[DIR_MM0] = &kTestRE[DIR_MM0 * numberOfBCnodes];
+    //      kDistTest.f[DIR_PM0] = &kTestRE[DIR_PM0 * numberOfBCnodes];
+    //      kDistTest.f[DIR_MP0] = &kTestRE[DIR_MP0 * numberOfBCnodes];
+    //      kDistTest.f[DIR_P0P] = &kTestRE[DIR_P0P * numberOfBCnodes];
+    //      kDistTest.f[DIR_M0M] = &kTestRE[DIR_M0M * numberOfBCnodes];
+    //      kDistTest.f[DIR_P0M] = &kTestRE[DIR_P0M * numberOfBCnodes];
+    //      kDistTest.f[DIR_M0P] = &kTestRE[DIR_M0P * numberOfBCnodes];
+    //      kDistTest.f[DIR_0PP] = &kTestRE[DIR_0PP * numberOfBCnodes];
+    //      kDistTest.f[DIR_0MM] = &kTestRE[DIR_0MM * numberOfBCnodes];
+    //      kDistTest.f[DIR_0PM] = &kTestRE[DIR_0PM * numberOfBCnodes];
+    //      kDistTest.f[DIR_0MP] = &kTestRE[DIR_0MP * numberOfBCnodes];
+    //      kDistTest.f[DIR_000] = &kTestRE[DIR_000 * numberOfBCnodes];
+    //      kDistTest.f[DIR_PPP] = &kTestRE[DIR_PPP * numberOfBCnodes];
+    //      kDistTest.f[DIR_MMP] = &kTestRE[DIR_MMP * numberOfBCnodes];
+    //      kDistTest.f[DIR_PMP] = &kTestRE[DIR_PMP * numberOfBCnodes];
+    //      kDistTest.f[DIR_MPP] = &kTestRE[DIR_MPP * numberOfBCnodes];
+    //      kDistTest.f[DIR_PPM] = &kTestRE[DIR_PPM * numberOfBCnodes];
+    //      kDistTest.f[DIR_MMM] = &kTestRE[DIR_MMM * numberOfBCnodes];
+    //      kDistTest.f[DIR_PMM] = &kTestRE[DIR_PMM * numberOfBCnodes];
+    //      kDistTest.f[DIR_MPM] = &kTestRE[DIR_MPM * numberOfBCnodes];
    //   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //   //real f1_E,f1_W,f1_N,f1_S,f1_T,f1_B,f1_NE,f1_SW,f1_SE,f1_NW,f1_TE,f1_BW,f1_BE,f1_TW,f1_TN,f1_BS,f1_BN,f1_TS,f1_ZERO,f1_TNE,f1_TSW,f1_TSE,f1_TNW,f1_BNE,f1_BSW,f1_BSE,f1_BNW;
-   //   //f1_W    = (D.f[DIR_P00   ])[k1e   ];
-   //   //f1_E    = (D.f[DIR_M00   ])[k1w   ];
-   //   //f1_S    = (D.f[DIR_0P0   ])[k1n   ];
-   //   //f1_N    = (D.f[DIR_0M0   ])[k1s   ];
-   //   //f1_B    = (D.f[DIR_00P   ])[k1t   ];
-   //   //f1_T    = (D.f[DIR_00M   ])[k1b   ];
-   //   //f1_SW   = (D.f[DIR_PP0  ])[k1ne  ];
-   //   //f1_NE   = (D.f[DIR_MM0  ])[k1sw  ];
-   //   //f1_NW   = (D.f[DIR_PM0  ])[k1se  ];
-   //   //f1_SE   = (D.f[DIR_MP0  ])[k1nw  ];
-   //   //f1_BW   = (D.f[DIR_P0P  ])[k1te  ];
-   //   //f1_TE   = (D.f[DIR_M0M  ])[k1bw  ];
-   //   //f1_TW   = (D.f[DIR_P0M  ])[k1be  ];
-   //   //f1_BE   = (D.f[DIR_M0P  ])[k1tw  ];
-   //   //f1_BS   = (D.f[DIR_0PP  ])[k1tn  ];
-   //   //f1_TN   = (D.f[DIR_0MM  ])[k1bs  ];
-   //   //f1_TS   = (D.f[DIR_0PM  ])[k1bn  ];
-   //   //f1_BN   = (D.f[DIR_0MP  ])[k1ts  ];
+   //   //f1_W    = (D.f[DIR_P00])[k1e   ];
+   //   //f1_E    = (D.f[DIR_M00])[k1w   ];
+   //   //f1_S    = (D.f[DIR_0P0])[k1n   ];
+   //   //f1_N    = (D.f[DIR_0M0])[k1s   ];
+   //   //f1_B    = (D.f[DIR_00P])[k1t   ];
+   //   //f1_T    = (D.f[DIR_00M])[k1b   ];
+   //   //f1_SW   = (D.f[DIR_PP0])[k1ne  ];
+   //   //f1_NE   = (D.f[DIR_MM0])[k1sw  ];
+   //   //f1_NW   = (D.f[DIR_PM0])[k1se  ];
+   //   //f1_SE   = (D.f[DIR_MP0])[k1nw  ];
+   //   //f1_BW   = (D.f[DIR_P0P])[k1te  ];
+   //   //f1_TE   = (D.f[DIR_M0M])[k1bw  ];
+   //   //f1_TW   = (D.f[DIR_P0M])[k1be  ];
+   //   //f1_BE   = (D.f[DIR_M0P])[k1tw  ];
+   //   //f1_BS   = (D.f[DIR_0PP])[k1tn  ];
+   //   //f1_TN   = (D.f[DIR_0MM])[k1bs  ];
+   //   //f1_TS   = (D.f[DIR_0PM])[k1bn  ];
+   //   //f1_BN   = (D.f[DIR_0MP])[k1ts  ];
    //   //f1_ZERO = (D.f[DIR_000])[k1zero];
-   //   //f1_BSW  = (D.f[DIR_PPP ])[k1tne ];
-   //   //f1_BNE  = (D.f[DIR_MMP ])[k1tsw ];
-   //   //f1_BNW  = (D.f[DIR_PMP ])[k1tse ];
-   //   //f1_BSE  = (D.f[DIR_MPP ])[k1tnw ];
-   //   //f1_TSW  = (D.f[DIR_PPM ])[k1bne ];
-   //   //f1_TNE  = (D.f[DIR_MMM ])[k1bsw ];
-   //   //f1_TNW  = (D.f[DIR_PMM ])[k1bse ];
-   //   //f1_TSE  = (D.f[DIR_MPM ])[k1bnw ];
+   //   //f1_BSW  = (D.f[DIR_PPP])[k1tne ];
+   //   //f1_BNE  = (D.f[DIR_MMP])[k1tsw ];
+   //   //f1_BNW  = (D.f[DIR_PMP])[k1tse ];
+   //   //f1_BSE  = (D.f[DIR_MPP])[k1tnw ];
+   //   //f1_TSW  = (D.f[DIR_PPM])[k1bne ];
+   //   //f1_TNE  = (D.f[DIR_MMM])[k1bsw ];
+   //   //f1_TNW  = (D.f[DIR_PMM])[k1bse ];
+   //   //f1_TSE  = (D.f[DIR_MPM])[k1bnw ];
    //   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    //   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //   real f1_E,f1_W,f1_N,f1_S,f1_T,f1_B,f1_NE,f1_SW,f1_SE,f1_NW,f1_TE,f1_BW,f1_BE,f1_TW,f1_TN,f1_BS,f1_BN,f1_TS,f1_ZERO,f1_TNE,f1_TSW,f1_TSE,f1_TNW,f1_BNE,f1_BSW,f1_BSE,f1_BNW;
-   //   f1_E    = (D.f[DIR_P00   ])[k1e   ];
-   //   f1_W    = (D.f[DIR_M00   ])[k1w   ];
-   //   f1_N    = (D.f[DIR_0P0   ])[k1n   ];
-   //   f1_S    = (D.f[DIR_0M0   ])[k1s   ];
-   //   f1_T    = (D.f[DIR_00P   ])[k1t   ];
-   //   f1_B    = (D.f[DIR_00M   ])[k1b   ];
-   //   f1_NE   = (D.f[DIR_PP0  ])[k1ne  ];
-   //   f1_SW   = (D.f[DIR_MM0  ])[k1sw  ];
-   //   f1_SE   = (D.f[DIR_PM0  ])[k1se  ];
-   //   f1_NW   = (D.f[DIR_MP0  ])[k1nw  ];
-   //   f1_TE   = (D.f[DIR_P0P  ])[k1te  ];
-   //   f1_BW   = (D.f[DIR_M0M  ])[k1bw  ];
-   //   f1_BE   = (D.f[DIR_P0M  ])[k1be  ];
-   //   f1_TW   = (D.f[DIR_M0P  ])[k1tw  ];
-   //   f1_TN   = (D.f[DIR_0PP  ])[k1tn  ];
-   //   f1_BS   = (D.f[DIR_0MM  ])[k1bs  ];
-   //   f1_BN   = (D.f[DIR_0PM  ])[k1bn  ];
-   //   f1_TS   = (D.f[DIR_0MP  ])[k1ts  ];
+   //   f1_E    = (D.f[DIR_P00])[k1e   ];
+   //   f1_W    = (D.f[DIR_M00])[k1w   ];
+   //   f1_N    = (D.f[DIR_0P0])[k1n   ];
+   //   f1_S    = (D.f[DIR_0M0])[k1s   ];
+   //   f1_T    = (D.f[DIR_00P])[k1t   ];
+   //   f1_B    = (D.f[DIR_00M])[k1b   ];
+   //   f1_NE   = (D.f[DIR_PP0])[k1ne  ];
+   //   f1_SW   = (D.f[DIR_MM0])[k1sw  ];
+   //   f1_SE   = (D.f[DIR_PM0])[k1se  ];
+   //   f1_NW   = (D.f[DIR_MP0])[k1nw  ];
+   //   f1_TE   = (D.f[DIR_P0P])[k1te  ];
+   //   f1_BW   = (D.f[DIR_M0M])[k1bw  ];
+   //   f1_BE   = (D.f[DIR_P0M])[k1be  ];
+   //   f1_TW   = (D.f[DIR_M0P])[k1tw  ];
+   //   f1_TN   = (D.f[DIR_0PP])[k1tn  ];
+   //   f1_BS   = (D.f[DIR_0MM])[k1bs  ];
+   //   f1_BN   = (D.f[DIR_0PM])[k1bn  ];
+   //   f1_TS   = (D.f[DIR_0MP])[k1ts  ];
    //   f1_ZERO = (D.f[DIR_000])[k1zero];
-   //   f1_TNE  = (D.f[DIR_PPP ])[k1tne ];
-   //   f1_TSW  = (D.f[DIR_MMP ])[k1tsw ];
-   //   f1_TSE  = (D.f[DIR_PMP ])[k1tse ];
-   //   f1_TNW  = (D.f[DIR_MPP ])[k1tnw ];
-   //   f1_BNE  = (D.f[DIR_PPM ])[k1bne ];
-   //   f1_BSW  = (D.f[DIR_MMM ])[k1bsw ];
-   //   f1_BSE  = (D.f[DIR_PMM ])[k1bse ];
-   //   f1_BNW  = (D.f[DIR_MPM ])[k1bnw ];
+   //   f1_TNE  = (D.f[DIR_PPP])[k1tne ];
+   //   f1_TSW  = (D.f[DIR_MMP])[k1tsw ];
+   //   f1_TSE  = (D.f[DIR_PMP])[k1tse ];
+   //   f1_TNW  = (D.f[DIR_MPP])[k1tnw ];
+   //   f1_BNE  = (D.f[DIR_PPM])[k1bne ];
+   //   f1_BSW  = (D.f[DIR_MMM])[k1bsw ];
+   //   f1_BSE  = (D.f[DIR_PMM])[k1bse ];
+   //   f1_BNW  = (D.f[DIR_MPM])[k1bnw ];
    //   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    //   //////////////////////////////////////////////////////////////////////////
    //   real drho1    =  f1_ZERO+f1_E+f1_W+f1_N+f1_S+f1_T+f1_B+f1_NE+f1_SW+f1_SE+f1_NW+f1_TE+f1_BW+f1_BE+f1_TW+f1_TN+f1_BS+f1_BN+f1_TS+ f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW;
-	  //real vx1      = (((f1_TNE-f1_BSW)+(f1_BSE-f1_TNW)+(f1_BNE-f1_TSW)+(f1_TSE-f1_BNW)) + (((f1_NE-f1_SW)+(f1_TE-f1_BW))+((f1_SE-f1_NW)+(f1_BE-f1_TW))) + (f1_E-f1_W)) / (one + drho1);
-	  //real vx2      = (((f1_TNE-f1_BSW)+(f1_TNW-f1_BSE)+(f1_BNE-f1_TSW)+(f1_BNW-f1_TSE)) + (((f1_NE-f1_SW)+(f1_TN-f1_BS))+((f1_BN-f1_TS)+(f1_NW-f1_SE))) + (f1_N-f1_S)) / (one + drho1);
-	  //real vx3      = (((f1_TNE-f1_BSW)+(f1_TNW-f1_BSE)+(f1_TSW-f1_BNE)+(f1_TSE-f1_BNW)) + (((f1_TE-f1_BW)+(f1_TN-f1_BS))+((f1_TW-f1_BE)+(f1_TS-f1_BN))) + (f1_T-f1_B)) / (one + drho1);
+     //real vx1      = (((f1_TNE-f1_BSW)+(f1_BSE-f1_TNW)+(f1_BNE-f1_TSW)+(f1_TSE-f1_BNW)) + (((f1_NE-f1_SW)+(f1_TE-f1_BW))+((f1_SE-f1_NW)+(f1_BE-f1_TW))) + (f1_E-f1_W)) / (one + drho1);
+     //real vx2      = (((f1_TNE-f1_BSW)+(f1_TNW-f1_BSE)+(f1_BNE-f1_TSW)+(f1_BNW-f1_TSE)) + (((f1_NE-f1_SW)+(f1_TN-f1_BS))+((f1_BN-f1_TS)+(f1_NW-f1_SE))) + (f1_N-f1_S)) / (one + drho1);
+     //real vx3      = (((f1_TNE-f1_BSW)+(f1_TNW-f1_BSE)+(f1_TSW-f1_BNE)+(f1_TSE-f1_BNW)) + (((f1_TE-f1_BW)+(f1_TN-f1_BS))+((f1_TW-f1_BE)+(f1_TS-f1_BN))) + (f1_T-f1_B)) / (one + drho1);
    //   //////////////////////////////////////////////////////////////////////////
-	  ////real omega = om1;
+     ////real omega = om1;
    //   real cusq  = c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
    //   //////////////////////////////////////////////////////////////////////////
-	  ////T�st MK
-	  ////if(vx1 < zero) vx1 = zero;
+     ////T�st MK
+     ////if(vx1 < zero) vx1 = zero;
    //   //////////////////////////////////////////////////////////////////////////
-	  ////becomes higher with neighbor source and lower with local source
+     ////becomes higher with neighbor source and lower with local source
    //   //real fZERO = c8over27*  (rhoBC[k]-(one + rhoBC[k])*(cusq))                                                           ;
    //   //real fE    = c2over27*  (rhoBC[k]+(one + rhoBC[k])*(three*( vx1        )+c9over2*( vx1        )*( vx1        )-cusq));
    //   //real fW    = c2over27*  (rhoBC[k]+(one + rhoBC[k])*(three*(-vx1        )+c9over2*(-vx1        )*(-vx1        )-cusq));
@@ -3794,7 +3794,7 @@ __global__ void QPressDeviceEQZ27(real* rhoBC,
    //   //real fBSE  = c1over216* (rhoBC[k]+(one + rhoBC[k])*(three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cusq));
    //   //real fTNW  = c1over216* (rhoBC[k]+(one + rhoBC[k])*(three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq));
    //   //////////////////////////////////////////////////////////////////////////
-	  //// based on VirtualFluids (kucher + fard)
+     //// based on VirtualFluids (kucher + fard)
    //   real fZERO = c8over27  * rhoBC[k] * (one                                                                      - cusq);
    //   real fE    = c2over27  * rhoBC[k] * (one + three * ( vx1        ) + c9over2 * ( vx1        ) * ( vx1        ) - cusq);
    //   real fW    = c2over27  * rhoBC[k] * (one + three * (-vx1        ) + c9over2 * (-vx1        ) * (-vx1        ) - cusq);
@@ -3823,7 +3823,7 @@ __global__ void QPressDeviceEQZ27(real* rhoBC,
    //   real fBSE  = c1over216 * rhoBC[k] * (one + three * ( vx1-vx2-vx3) + c9over2 * ( vx1-vx2-vx3) * ( vx1-vx2-vx3) - cusq);
    //   real fTNW  = c1over216 * rhoBC[k] * (one + three * (-vx1+vx2+vx3) + c9over2 * (-vx1+vx2+vx3) * (-vx1+vx2+vx3) - cusq);
    ////   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	  //////test
+     //////test
    ////   real fZERO = c8over27  * ((drho1 + rhoBC[k]) / two) * (one                                                                      - cusq);
    ////   real fE    = c2over27  * ((drho1 + rhoBC[k]) / two) * (one + three * ( vx1        ) + c9over2 * ( vx1        ) * ( vx1        ) - cusq);
    ////   real fW    = c2over27  * ((drho1 + rhoBC[k]) / two) * (one + three * (-vx1        ) + c9over2 * (-vx1        ) * (-vx1        ) - cusq);
@@ -3852,190 +3852,190 @@ __global__ void QPressDeviceEQZ27(real* rhoBC,
    ////   real fBSE  = c1over216 * ((drho1 + rhoBC[k]) / two) * (one + three * ( vx1-vx2-vx3) + c9over2 * ( vx1-vx2-vx3) * ( vx1-vx2-vx3) - cusq);
    ////   real fTNW  = c1over216 * ((drho1 + rhoBC[k]) / two) * (one + three * (-vx1+vx2+vx3) + c9over2 * (-vx1+vx2+vx3) * (-vx1+vx2+vx3) - cusq);
 
-			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
             // based on BGK Plus Comp
-			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			//double mfabb = (D.f[DIR_P00   ])[k1e   ];
-			//double mfcbb = (D.f[DIR_M00   ])[k1w   ];
-			//double mfbab = (D.f[DIR_0P0   ])[k1n   ];
-			//double mfbcb = (D.f[DIR_0M0   ])[k1s   ];
-			//double mfbba = (D.f[DIR_00P   ])[k1t   ];
-			//double mfbbc = (D.f[DIR_00M   ])[k1b   ];
-			//double mfaab = (D.f[DIR_PP0  ])[k1ne  ];
-			//double mfccb = (D.f[DIR_MM0  ])[k1sw  ];
-			//double mfacb = (D.f[DIR_PM0  ])[k1se  ];
-			//double mfcab = (D.f[DIR_MP0  ])[k1nw  ];
-			//double mfaba = (D.f[DIR_P0P  ])[k1te  ];
-			//double mfcbc = (D.f[DIR_M0M  ])[k1bw  ];
-			//double mfabc = (D.f[DIR_P0M  ])[k1be  ];
-			//double mfcba = (D.f[DIR_M0P  ])[k1tw  ];
-			//double mfbaa = (D.f[DIR_0PP  ])[k1tn  ];
-			//double mfbcc = (D.f[DIR_0MM  ])[k1bs  ];
-			//double mfbac = (D.f[DIR_0PM  ])[k1bn  ];
-			//double mfbca = (D.f[DIR_0MP  ])[k1ts  ];
-			//double mfbbb = (D.f[DIR_000])[k1zero];
-			//double mfaaa = (D.f[DIR_PPP ])[k1tne ];
-			//double mfcca = (D.f[DIR_MMP ])[k1tsw ];
-			//double mfaca = (D.f[DIR_PMP ])[k1tse ];
-			//double mfcaa = (D.f[DIR_MPP ])[k1tnw ];
-			//double mfaac = (D.f[DIR_PPM ])[k1bne ];
-			//double mfccc = (D.f[DIR_MMM ])[k1bsw ];
-			//double mfacc = (D.f[DIR_PMM ])[k1bse ];
-			//double mfcac = (D.f[DIR_MPM ])[k1bnw ];
-			real mfabb = (D.f[DIR_P00   ])[k1e   ];
-			real mfcbb = (D.f[DIR_M00   ])[k1w   ];
-			real mfbab = (D.f[DIR_0P0   ])[k1n   ];
-			real mfbcb = (D.f[DIR_0M0   ])[k1s   ];
-			real mfbba = (D.f[DIR_00P   ])[k1t   ];
-			real mfbbc = (D.f[DIR_00M   ])[k1b   ];
-			real mfaab = (D.f[DIR_PP0  ])[k1ne  ];
-			real mfccb = (D.f[DIR_MM0  ])[k1sw  ];
-			real mfacb = (D.f[DIR_PM0  ])[k1se  ];
-			real mfcab = (D.f[DIR_MP0  ])[k1nw  ];
-			real mfaba = (D.f[DIR_P0P  ])[k1te  ];
-			real mfcbc = (D.f[DIR_M0M  ])[k1bw  ];
-			real mfabc = (D.f[DIR_P0M  ])[k1be  ];
-			real mfcba = (D.f[DIR_M0P  ])[k1tw  ];
-			real mfbaa = (D.f[DIR_0PP  ])[k1tn  ];
-			real mfbcc = (D.f[DIR_0MM  ])[k1bs  ];
-			real mfbac = (D.f[DIR_0PM  ])[k1bn  ];
-			real mfbca = (D.f[DIR_0MP  ])[k1ts  ];
-			real mfbbb = (D.f[DIR_000])[k1zero];
-			real mfaaa = (D.f[DIR_PPP ])[k1tne ];
-			real mfcca = (D.f[DIR_MMP ])[k1tsw ];
-			real mfaca = (D.f[DIR_PMP ])[k1tse ];
-			real mfcaa = (D.f[DIR_MPP ])[k1tnw ];
-			real mfaac = (D.f[DIR_PPM ])[k1bne ];
-			real mfccc = (D.f[DIR_MMM ])[k1bsw ];
-			real mfacc = (D.f[DIR_PMM ])[k1bse ];
-			real mfcac = (D.f[DIR_MPM ])[k1bnw ];
-
-			//real mfcbb = (D.f[DIR_P00   ])[ke   ];
-			//real mfabb = (D.f[DIR_M00   ])[kw   ];
-			//real mfbcb = (D.f[DIR_0P0   ])[kn   ];
-			//real mfbab = (D.f[DIR_0M0   ])[ks   ];
-			//real mfbbc = (D.f[DIR_00P   ])[kt   ];
-			//real mfbba = (D.f[DIR_00M   ])[kb   ];
-			//real mfccb = (D.f[DIR_PP0  ])[kne  ];
-			//real mfaab = (D.f[DIR_MM0  ])[ksw  ];
-			//real mfcab = (D.f[DIR_PM0  ])[kse  ];
-			//real mfacb = (D.f[DIR_MP0  ])[knw  ];
-			//real mfcbc = (D.f[DIR_P0P  ])[kte  ];
-			//real mfaba = (D.f[DIR_M0M  ])[kbw  ];
-			//real mfcba = (D.f[DIR_P0M  ])[kbe  ];
-			//real mfabc = (D.f[DIR_M0P  ])[ktw  ];
-			//real mfbcc = (D.f[DIR_0PP  ])[ktn  ];
-			//real mfbaa = (D.f[DIR_0MM  ])[kbs  ];
-			//real mfbca = (D.f[DIR_0PM  ])[kbn  ];
-			//real mfbac = (D.f[DIR_0MP  ])[kts  ];
-			//real mfbbb = (D.f[DIR_000])[kzero];
-			//real mfccc = (D.f[DIR_PPP ])[ktne ];
-			//real mfaac = (D.f[DIR_MMP ])[ktsw ];
-			//real mfcac = (D.f[DIR_PMP ])[ktse ];
-			//real mfacc = (D.f[DIR_MPP ])[ktnw ];
-			//real mfcca = (D.f[DIR_PPM ])[kbne ];
-			//real mfaaa = (D.f[DIR_MMM ])[kbsw ];
-			//real mfcaa = (D.f[DIR_PMM ])[kbse ];
-			//real mfaca = (D.f[DIR_MPM ])[kbnw ];
-			////////////////////////////////////////////////////////////////////////////////////
-			//real rho   = (((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
-			//				(((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) +
-			//				((mfabb+mfcbb) + (mfbab+mfbcb)) + (mfbba+mfbbc)) + mfbbb) + one;//!!!!Achtung + one
-			////////////////////////////////////////////////////////////////////////////////////
-			real rho = rhoBC[k];
-			////////////////////////////////////////////////////////////////////////////////////
-			real OoRho = c1o1 / (rho * 1.5f);
-			////////////////////////////////////////////////////////////////////////////////////
-			real vvx    = ((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfcaa-mfacc) + (mfcca-mfaac))) + 
-						     (((mfcba-mfabc) + (mfcbc-mfaba)) + ((mfcab-mfacb) + (mfccb-mfaab))) +
-						       (mfcbb-mfabb)) * OoRho;
-			real vvy    =((((mfccc-mfaaa) + (mfaca-mfcac)) + ((mfacc-mfcaa) + (mfcca-mfaac))) + 
-				             (((mfbca-mfbac) + (mfbcc-mfbaa)) + ((mfacb-mfcab) + (mfccb-mfaab))) +
-				               (mfbcb-mfbab)) * OoRho;
-			real vvz    =((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfacc-mfcaa) + (mfaac-mfcca))) + 
-				             (((mfbac-mfbca) + (mfbcc-mfbaa)) + ((mfabc-mfcba) + (mfcbc-mfaba))) +
-				               (mfbbc-mfbba)) * OoRho;
-			/////////////////////////
-			//Test Values
-			//double vvx    = 0.016;
-			//double vvy    = zero;
-			//double vvz    = zero;
-			////////////////////////////////////////////////////////////////////////////////////////
-			////round off error test
-			//if(vvx!=zero){
-			//	(kDistTest.f[DIR_P00   ])[k] = mfabb;
-			//	(kDistTest.f[DIR_M00   ])[k] = mfcbb;
-			//	(kDistTest.f[DIR_0P0   ])[k] = mfbab;
-			//	(kDistTest.f[DIR_0M0   ])[k] = mfbcb;
-			//	(kDistTest.f[DIR_00P   ])[k] = mfbba;
-			//	(kDistTest.f[DIR_00M   ])[k] = mfbbc;
-			//	(kDistTest.f[DIR_PP0  ])[k] = mfaab;
-			//	(kDistTest.f[DIR_MM0  ])[k] = mfccb;
-			//	(kDistTest.f[DIR_PM0  ])[k] = mfacb;
-			//	(kDistTest.f[DIR_MP0  ])[k] = mfcab;
-			//	(kDistTest.f[DIR_P0P  ])[k] = mfaba;
-			//	(kDistTest.f[DIR_M0M  ])[k] = mfcbc;
-			//	(kDistTest.f[DIR_P0M  ])[k] = mfabc;
-			//	(kDistTest.f[DIR_M0P  ])[k] = mfcba;
-			//	(kDistTest.f[DIR_0PP  ])[k] = mfbaa;
-			//	(kDistTest.f[DIR_0MM  ])[k] = mfbcc;
-			//	(kDistTest.f[DIR_0PM  ])[k] = mfbac;
-			//	(kDistTest.f[DIR_0MP  ])[k] = mfbca;
-			//	(kDistTest.f[DIR_000])[k] = KQK;
-			//	(kDistTest.f[DIR_PPP ])[k] = mfaaa;
-			//	(kDistTest.f[DIR_MMP ])[k] = mfcca;
-			//	(kDistTest.f[DIR_PMP ])[k] = mfaca;
-			//	(kDistTest.f[DIR_MPP ])[k] = mfcaa;
-			//	(kDistTest.f[DIR_PPM ])[k] = mfaac;
-			//	(kDistTest.f[DIR_MMM ])[k] = mfccc;
-			//	(kDistTest.f[DIR_PMM ])[k] = mfacc;
-			//	(kDistTest.f[DIR_MPM ])[k] = mfcac;
-			//}else{
-			//	(kDistTest.f[DIR_P00   ])[k] = zero;
-			//	(kDistTest.f[DIR_M00   ])[k] = zero;
-			//	(kDistTest.f[DIR_0P0   ])[k] = zero;
-			//	(kDistTest.f[DIR_0M0   ])[k] = zero;
-			//	(kDistTest.f[DIR_00P   ])[k] = zero;
-			//	(kDistTest.f[DIR_00M   ])[k] = zero;
-			//	(kDistTest.f[DIR_PP0  ])[k] = zero;
-			//	(kDistTest.f[DIR_MM0  ])[k] = zero;
-			//	(kDistTest.f[DIR_PM0  ])[k] = zero;
-			//	(kDistTest.f[DIR_MP0  ])[k] = zero;
-			//	(kDistTest.f[DIR_P0P  ])[k] = zero;
-			//	(kDistTest.f[DIR_M0M  ])[k] = zero;
-			//	(kDistTest.f[DIR_P0M  ])[k] = zero;
-			//	(kDistTest.f[DIR_M0P  ])[k] = zero;
-			//	(kDistTest.f[DIR_0PP  ])[k] = zero;
-			//	(kDistTest.f[DIR_0MM  ])[k] = zero;
-			//	(kDistTest.f[DIR_0PM  ])[k] = zero;
-			//	(kDistTest.f[DIR_0MP  ])[k] = zero;
-			//	(kDistTest.f[DIR_000])[k] = zero;
-			//	(kDistTest.f[DIR_PPP ])[k] = zero;
-			//	(kDistTest.f[DIR_MMP ])[k] = zero;
-			//	(kDistTest.f[DIR_PMP ])[k] = zero;
-			//	(kDistTest.f[DIR_MPP ])[k] = zero;
-			//	(kDistTest.f[DIR_PPM ])[k] = zero;
-			//	(kDistTest.f[DIR_MMM ])[k] = zero;
-			//	(kDistTest.f[DIR_PMM ])[k] = zero;
-			//	(kDistTest.f[DIR_MPM ])[k] = zero;
-			//}
-
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// first bad fix for negative x velocity
-			////if(vvx > zero) vvx = zero;
-			//////////////////////////////////////////////////////////////////////////////////////
-			////// second bad fix for negative x velocity
-			////if(vvx > zero){
-			////	vvx = -vvx;
-			////	vvy = -vvy;
-			////	vvz = -vvz;
-			////}
-			////////////////////////////////////////////////////////////////////////////////////
-			double vx2    = vvx * vvx;
-			double vy2    = vvy * vvy;
-			double vz2    = vvz * vvz;
-			//////////////////////////////////////////////////////////////////////////////////
-			//original
+         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+         //double mfabb = (D.f[DIR_P00])[k1e   ];
+         //double mfcbb = (D.f[DIR_M00])[k1w   ];
+         //double mfbab = (D.f[DIR_0P0])[k1n   ];
+         //double mfbcb = (D.f[DIR_0M0])[k1s   ];
+         //double mfbba = (D.f[DIR_00P])[k1t   ];
+         //double mfbbc = (D.f[DIR_00M])[k1b   ];
+         //double mfaab = (D.f[DIR_PP0])[k1ne  ];
+         //double mfccb = (D.f[DIR_MM0])[k1sw  ];
+         //double mfacb = (D.f[DIR_PM0])[k1se  ];
+         //double mfcab = (D.f[DIR_MP0])[k1nw  ];
+         //double mfaba = (D.f[DIR_P0P])[k1te  ];
+         //double mfcbc = (D.f[DIR_M0M])[k1bw  ];
+         //double mfabc = (D.f[DIR_P0M])[k1be  ];
+         //double mfcba = (D.f[DIR_M0P])[k1tw  ];
+         //double mfbaa = (D.f[DIR_0PP])[k1tn  ];
+         //double mfbcc = (D.f[DIR_0MM])[k1bs  ];
+         //double mfbac = (D.f[DIR_0PM])[k1bn  ];
+         //double mfbca = (D.f[DIR_0MP])[k1ts  ];
+         //double mfbbb = (D.f[DIR_000])[k1zero];
+         //double mfaaa = (D.f[DIR_PPP])[k1tne ];
+         //double mfcca = (D.f[DIR_MMP])[k1tsw ];
+         //double mfaca = (D.f[DIR_PMP])[k1tse ];
+         //double mfcaa = (D.f[DIR_MPP])[k1tnw ];
+         //double mfaac = (D.f[DIR_PPM])[k1bne ];
+         //double mfccc = (D.f[DIR_MMM])[k1bsw ];
+         //double mfacc = (D.f[DIR_PMM])[k1bse ];
+         //double mfcac = (D.f[DIR_MPM])[k1bnw ];
+         real mfabb = (D.f[DIR_P00])[k1e   ];
+         real mfcbb = (D.f[DIR_M00])[k1w   ];
+         real mfbab = (D.f[DIR_0P0])[k1n   ];
+         real mfbcb = (D.f[DIR_0M0])[k1s   ];
+         real mfbba = (D.f[DIR_00P])[k1t   ];
+         real mfbbc = (D.f[DIR_00M])[k1b   ];
+         real mfaab = (D.f[DIR_PP0])[k1ne  ];
+         real mfccb = (D.f[DIR_MM0])[k1sw  ];
+         real mfacb = (D.f[DIR_PM0])[k1se  ];
+         real mfcab = (D.f[DIR_MP0])[k1nw  ];
+         real mfaba = (D.f[DIR_P0P])[k1te  ];
+         real mfcbc = (D.f[DIR_M0M])[k1bw  ];
+         real mfabc = (D.f[DIR_P0M])[k1be  ];
+         real mfcba = (D.f[DIR_M0P])[k1tw  ];
+         real mfbaa = (D.f[DIR_0PP])[k1tn  ];
+         real mfbcc = (D.f[DIR_0MM])[k1bs  ];
+         real mfbac = (D.f[DIR_0PM])[k1bn  ];
+         real mfbca = (D.f[DIR_0MP])[k1ts  ];
+         real mfbbb = (D.f[DIR_000])[k1zero];
+         real mfaaa = (D.f[DIR_PPP])[k1tne ];
+         real mfcca = (D.f[DIR_MMP])[k1tsw ];
+         real mfaca = (D.f[DIR_PMP])[k1tse ];
+         real mfcaa = (D.f[DIR_MPP])[k1tnw ];
+         real mfaac = (D.f[DIR_PPM])[k1bne ];
+         real mfccc = (D.f[DIR_MMM])[k1bsw ];
+         real mfacc = (D.f[DIR_PMM])[k1bse ];
+         real mfcac = (D.f[DIR_MPM])[k1bnw ];
+
+         //real mfcbb = (D.f[DIR_P00])[ke   ];
+         //real mfabb = (D.f[DIR_M00])[kw   ];
+         //real mfbcb = (D.f[DIR_0P0])[kn   ];
+         //real mfbab = (D.f[DIR_0M0])[ks   ];
+         //real mfbbc = (D.f[DIR_00P])[kt   ];
+         //real mfbba = (D.f[DIR_00M])[kb   ];
+         //real mfccb = (D.f[DIR_PP0])[kne  ];
+         //real mfaab = (D.f[DIR_MM0])[ksw  ];
+         //real mfcab = (D.f[DIR_PM0])[kse  ];
+         //real mfacb = (D.f[DIR_MP0])[knw  ];
+         //real mfcbc = (D.f[DIR_P0P])[kte  ];
+         //real mfaba = (D.f[DIR_M0M])[kbw  ];
+         //real mfcba = (D.f[DIR_P0M])[kbe  ];
+         //real mfabc = (D.f[DIR_M0P])[ktw  ];
+         //real mfbcc = (D.f[DIR_0PP])[ktn  ];
+         //real mfbaa = (D.f[DIR_0MM])[kbs  ];
+         //real mfbca = (D.f[DIR_0PM])[kbn  ];
+         //real mfbac = (D.f[DIR_0MP])[kts  ];
+         //real mfbbb = (D.f[DIR_000])[kzero];
+         //real mfccc = (D.f[DIR_PPP])[ktne ];
+         //real mfaac = (D.f[DIR_MMP])[ktsw ];
+         //real mfcac = (D.f[DIR_PMP])[ktse ];
+         //real mfacc = (D.f[DIR_MPP])[ktnw ];
+         //real mfcca = (D.f[DIR_PPM])[kbne ];
+         //real mfaaa = (D.f[DIR_MMM])[kbsw ];
+         //real mfcaa = (D.f[DIR_PMM])[kbse ];
+         //real mfaca = (D.f[DIR_MPM])[kbnw ];
+         ////////////////////////////////////////////////////////////////////////////////////
+         //real rho   = (((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) +
+         //				(((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) +
+         //				((mfabb+mfcbb) + (mfbab+mfbcb)) + (mfbba+mfbbc)) + mfbbb) + one;//!!!!Achtung + one
+         ////////////////////////////////////////////////////////////////////////////////////
+         real rho = rhoBC[k];
+         ////////////////////////////////////////////////////////////////////////////////////
+         real OoRho = c1o1 / (rho * 1.5f);
+         ////////////////////////////////////////////////////////////////////////////////////
+         real vvx    = ((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfcaa-mfacc) + (mfcca-mfaac))) +
+                       (((mfcba-mfabc) + (mfcbc-mfaba)) + ((mfcab-mfacb) + (mfccb-mfaab))) +
+                         (mfcbb-mfabb)) * OoRho;
+         real vvy    =((((mfccc-mfaaa) + (mfaca-mfcac)) + ((mfacc-mfcaa) + (mfcca-mfaac))) +
+                         (((mfbca-mfbac) + (mfbcc-mfbaa)) + ((mfacb-mfcab) + (mfccb-mfaab))) +
+                           (mfbcb-mfbab)) * OoRho;
+         real vvz    =((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfacc-mfcaa) + (mfaac-mfcca))) +
+                         (((mfbac-mfbca) + (mfbcc-mfbaa)) + ((mfabc-mfcba) + (mfcbc-mfaba))) +
+                           (mfbbc-mfbba)) * OoRho;
+         /////////////////////////
+         //Test Values
+         //double vvx    = 0.016;
+         //double vvy    = zero;
+         //double vvz    = zero;
+         ////////////////////////////////////////////////////////////////////////////////////////
+         ////round off error test
+         //if(vvx!=zero){
+         //	(kDistTest.f[DIR_P00])[k] = mfabb;
+         //	(kDistTest.f[DIR_M00])[k] = mfcbb;
+         //	(kDistTest.f[DIR_0P0])[k] = mfbab;
+         //	(kDistTest.f[DIR_0M0])[k] = mfbcb;
+         //	(kDistTest.f[DIR_00P])[k] = mfbba;
+         //	(kDistTest.f[DIR_00M])[k] = mfbbc;
+         //	(kDistTest.f[DIR_PP0])[k] = mfaab;
+         //	(kDistTest.f[DIR_MM0])[k] = mfccb;
+         //	(kDistTest.f[DIR_PM0])[k] = mfacb;
+         //	(kDistTest.f[DIR_MP0])[k] = mfcab;
+         //	(kDistTest.f[DIR_P0P])[k] = mfaba;
+         //	(kDistTest.f[DIR_M0M])[k] = mfcbc;
+         //	(kDistTest.f[DIR_P0M])[k] = mfabc;
+         //	(kDistTest.f[DIR_M0P])[k] = mfcba;
+         //	(kDistTest.f[DIR_0PP])[k] = mfbaa;
+         //	(kDistTest.f[DIR_0MM])[k] = mfbcc;
+         //	(kDistTest.f[DIR_0PM])[k] = mfbac;
+         //	(kDistTest.f[DIR_0MP])[k] = mfbca;
+         //	(kDistTest.f[DIR_000])[k] = KQK;
+         //	(kDistTest.f[DIR_PPP])[k] = mfaaa;
+         //	(kDistTest.f[DIR_MMP])[k] = mfcca;
+         //	(kDistTest.f[DIR_PMP])[k] = mfaca;
+         //	(kDistTest.f[DIR_MPP])[k] = mfcaa;
+         //	(kDistTest.f[DIR_PPM])[k] = mfaac;
+         //	(kDistTest.f[DIR_MMM])[k] = mfccc;
+         //	(kDistTest.f[DIR_PMM])[k] = mfacc;
+         //	(kDistTest.f[DIR_MPM])[k] = mfcac;
+         //}else{
+         //	(kDistTest.f[DIR_P00])[k] = zero;
+         //	(kDistTest.f[DIR_M00])[k] = zero;
+         //	(kDistTest.f[DIR_0P0])[k] = zero;
+         //	(kDistTest.f[DIR_0M0])[k] = zero;
+         //	(kDistTest.f[DIR_00P])[k] = zero;
+         //	(kDistTest.f[DIR_00M])[k] = zero;
+         //	(kDistTest.f[DIR_PP0])[k] = zero;
+         //	(kDistTest.f[DIR_MM0])[k] = zero;
+         //	(kDistTest.f[DIR_PM0])[k] = zero;
+         //	(kDistTest.f[DIR_MP0])[k] = zero;
+         //	(kDistTest.f[DIR_P0P])[k] = zero;
+         //	(kDistTest.f[DIR_M0M])[k] = zero;
+         //	(kDistTest.f[DIR_P0M])[k] = zero;
+         //	(kDistTest.f[DIR_M0P])[k] = zero;
+         //	(kDistTest.f[DIR_0PP])[k] = zero;
+         //	(kDistTest.f[DIR_0MM])[k] = zero;
+         //	(kDistTest.f[DIR_0PM])[k] = zero;
+         //	(kDistTest.f[DIR_0MP])[k] = zero;
+         //	(kDistTest.f[DIR_000])[k] = zero;
+         //	(kDistTest.f[DIR_PPP])[k] = zero;
+         //	(kDistTest.f[DIR_MMP])[k] = zero;
+         //	(kDistTest.f[DIR_PMP])[k] = zero;
+         //	(kDistTest.f[DIR_MPP])[k] = zero;
+         //	(kDistTest.f[DIR_PPM])[k] = zero;
+         //	(kDistTest.f[DIR_MMM])[k] = zero;
+         //	(kDistTest.f[DIR_PMM])[k] = zero;
+         //	(kDistTest.f[DIR_MPM])[k] = zero;
+         //}
+
+         //////////////////////////////////////////////////////////////////////////////////////
+         //// first bad fix for negative x velocity
+         ////if(vvx > zero) vvx = zero;
+         //////////////////////////////////////////////////////////////////////////////////////
+         ////// second bad fix for negative x velocity
+         ////if(vvx > zero){
+         ////	vvx = -vvx;
+         ////	vvy = -vvy;
+         ////	vvz = -vvz;
+         ////}
+         ////////////////////////////////////////////////////////////////////////////////////
+         double vx2    = vvx * vvx;
+         double vy2    = vvy * vvy;
+         double vz2    = vvz * vvz;
+         //////////////////////////////////////////////////////////////////////////////////
+         //original
             real XXb    = -c2o3 + vx2;
             real XXc    = -c1o2 * (XXb + c1o1 + vvx);
             real XXa    = XXc + vvx;
@@ -4045,213 +4045,213 @@ __global__ void QPressDeviceEQZ27(real* rhoBC,
             real ZZb    = -c2o3 + vz2;
             real ZZc    = -c1o2 * (ZZb + c1o1 + vvz);
             real ZZa    = ZZc + vvz;
-			//////////////////////////////////////////////////////////////////////////////////
-			//unkonditioniert
-            mfcbb = -(rhoBC[k] + c1o1) * XXc * YYb * ZZb - c2o27; 
-			mfabb = -(rhoBC[k] + c1o1) * XXa * YYb * ZZb - c2o27;
-			mfbcb = -(rhoBC[k] + c1o1) * XXb * YYc * ZZb - c2o27;
-			mfbab = -(rhoBC[k] + c1o1) * XXb * YYa * ZZb - c2o27;
-			mfbbc = -(rhoBC[k] + c1o1) * XXb * YYb * ZZc - c2o27;
-			mfbba = -(rhoBC[k] + c1o1) * XXb * YYb * ZZa - c2o27;
-			mfccb = -(rhoBC[k] + c1o1) * XXc * YYc * ZZb - c1o54;
-			mfaab = -(rhoBC[k] + c1o1) * XXa * YYa * ZZb - c1o54;
-			mfcab = -(rhoBC[k] + c1o1) * XXc * YYa * ZZb - c1o54;
-			mfacb = -(rhoBC[k] + c1o1) * XXa * YYc * ZZb - c1o54;
-			mfcbc = -(rhoBC[k] + c1o1) * XXc * YYb * ZZc - c1o54;
-			mfaba = -(rhoBC[k] + c1o1) * XXa * YYb * ZZa - c1o54;
-			mfcba = -(rhoBC[k] + c1o1) * XXc * YYb * ZZa - c1o54;
-			mfabc = -(rhoBC[k] + c1o1) * XXa * YYb * ZZc - c1o54;
-			mfbcc = -(rhoBC[k] + c1o1) * XXb * YYc * ZZc - c1o54;
-			mfbaa = -(rhoBC[k] + c1o1) * XXb * YYa * ZZa - c1o54;
-			mfbca = -(rhoBC[k] + c1o1) * XXb * YYc * ZZa - c1o54;
-			mfbac = -(rhoBC[k] + c1o1) * XXb * YYa * ZZc - c1o54;
-			mfbbb = -(rhoBC[k] + c1o1) * XXb * YYb * ZZb - c8o27;
-			mfccc = -(rhoBC[k] + c1o1) * XXc * YYc * ZZc - c1o216;
-			mfaac = -(rhoBC[k] + c1o1) * XXa * YYa * ZZc - c1o216;
-			mfcac = -(rhoBC[k] + c1o1) * XXc * YYa * ZZc - c1o216;
-			mfacc = -(rhoBC[k] + c1o1) * XXa * YYc * ZZc - c1o216;
-			mfcca = -(rhoBC[k] + c1o1) * XXc * YYc * ZZa - c1o216;
-			mfaaa = -(rhoBC[k] + c1o1) * XXa * YYa * ZZa - c1o216;
-			mfcaa = -(rhoBC[k] + c1o1) * XXc * YYa * ZZa - c1o216;
-			mfaca = -(rhoBC[k] + c1o1) * XXa * YYc * ZZa - c1o216;
-			//////////////////////////////////////////////////////////
-			////konditioniert
-			//double OneOver216RhoPlusOne = c1over216*(rhoBC[k]+one);
-			//double OnoOver216Rho        = c1over216*rhoBC[k];
-			//mfcbb = OnoOver216Rho*sixteen + OneOver216RhoPlusOne*twelve*(-(two*vy2) - two*vz2 + three*vy2*vz2 + vvx*(-two + three*vy2)*(-two + three*vz2) + vx2*(-two + three*vy2)*(-two + three*vz2));
-			//mfabb = OnoOver216Rho*sixteen - OneOver216RhoPlusOne*twelve*(two*vy2 + two*vz2 - three*vy2*vz2 + vvx*(-two + three*vy2)*(-two + three*vz2) + vx2*(-four + six*vy2 + six*vz2 - nine*vy2*vz2));
-			//mfbcb = four*(-(four*OneOver216RhoPlusOne) + four*OnoOver216Rho + OneOver216RhoPlusOne*(-two + three*vx2)*(one + three*vvy + three*vy2)*(-two + three*vz2));
-			//mfbab = four*(four*OnoOver216Rho - OneOver216RhoPlusOne*three*(vvy*(-two + three*vx2)*(-two + three*vz2) - one*vx2*(one + three*vy2)*(-two + three*vz2) + two*(-(two*vy2) + vz2 + three*vy2*vz2)));
-			//mfbbc = four*(-(four*OneOver216RhoPlusOne) + four*OnoOver216Rho + OneOver216RhoPlusOne*(-two + three*vx2)*(-two + three*vy2)*(one + three*vvz + three*vz2));
-			//mfbba = four*(four*OnoOver216Rho - OneOver216RhoPlusOne*three*(vvz*(-two + three*vx2)*(-two + three*vy2) - one*vx2*(-two + three*vy2)*(one + three*vz2) + two*(vy2 - two*vz2 + three*vy2*vz2)));
-			//mfccb = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) - two*vy2 - six*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(one + three*vvy + three*vy2)*(-two + three*vz2))));
-			//mfaab = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) - two*vy2 - six*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-two + three*vz2))));
-			//mfcab = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 + two*vy2 + six*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-two + three*vz2)));
-			//mfacb = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 + two*vy2 + six*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(one + three*vvy + three*vy2)*(-two + three*vz2)));
-			//mfcbc = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) + vy2 + three*vx2*vy2 + vvz*(one + three*vx2)*(-two + three*vy2) - two*vz2 - six*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(one + three*vvz + three*vz2))));
-			//mfaba = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) + vy2 + three*vx2*vy2 - one*vvz*(one + three*vx2)*(-two + three*vy2) - two*vz2 - six*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(-one + three*vvz - three*vz2))));
-			//mfcba = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 - one*vy2 - three*vx2*vy2 + vvz*(one + three*vx2)*(-two + three*vy2) + two*vz2 + six*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(-one + three*vvz - three*vz2)));
-			//mfabc = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 - one*vy2 - three*vx2*vy2 - one*vvz*(one + three*vx2)*(-two + three*vy2) + two*vz2 + six*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(one + three*vvz + three*vz2)));
-			//mfbcc = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(vx2 - two*vy2 + three*vx2*vy2 + vvz*(-two + three*vx2)*(one + three*vy2) - two*vz2 + three*vx2*vz2 - six*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(one + three*vvz + three*vz2))));
-			//mfbaa = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(vx2 - two*vy2 + three*vx2*vy2 - one*vvz*(-two + three*vx2)*(one + three*vy2) - two*vz2 + three*vx2*vz2 - six*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(-one + three*vvz - three*vz2))));
-			//mfbca = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(-(one*vx2) + two*vy2 - three*vx2*vy2 + vvz*(-two + three*vx2)*(one + three*vy2) + two*vz2 - three*vx2*vz2 + six*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(-one + three*vvz - three*vz2)));
-			//mfbac = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(-(one*vx2) + two*vy2 - three*vx2*vy2 - one*vvz*(-two + three*vx2)*(one + three*vy2) + two*vz2 - three*vx2*vz2 + six*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(one + three*vvz + three*vz2)));
-			//mfbbb = eight*(eight*OnoOver216Rho + OneOver216RhoPlusOne*three*(four*vy2 + four*vz2 - six*vy2*vz2 + vx2*(-two + three*vy2)*(-two + three*vz2)));
-			//mfccc = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(one + three*vvz + three*vz2) + vvx*(one + three*vvy + three*vy2)*(one + three*vvz + three*vz2));
-			//mfaac = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(one + three*vvz + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(one + three*vvz + three*vz2));
-			//mfcac = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(one + three*vvz + three*vz2) - one*vvx*(-one + three*vvy - three*vy2)*(one + three*vvz + three*vz2));
-			//mfacc = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(one + three*vvz + three*vz2) - one*vvx*(one + three*vvy + three*vy2)*(one + three*vvz + three*vz2));
-			//mfcca = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) - one*vvx*(one + three*vvy + three*vy2)*(-one + three*vvz - three*vz2));
-			//mfaaa = OnoOver216Rho - OneOver216RhoPlusOne*three*(vvz - one*vx2 + three*vvz*vx2 - one*vy2 + three*vvz*vy2 - three*vx2*vy2 + nine*vvz*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-one + three*vvz - three*vz2));
-			//mfcaa = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-one + three*vvz - three*vz2));
-			//mfaca = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(one + three*vvy + three*vy2)*(-one + three*vvz - three*vz2));
+         //////////////////////////////////////////////////////////////////////////////////
+         //unkonditioniert
+            mfcbb = -(rhoBC[k] + c1o1) * XXc * YYb * ZZb - c2o27;
+         mfabb = -(rhoBC[k] + c1o1) * XXa * YYb * ZZb - c2o27;
+         mfbcb = -(rhoBC[k] + c1o1) * XXb * YYc * ZZb - c2o27;
+         mfbab = -(rhoBC[k] + c1o1) * XXb * YYa * ZZb - c2o27;
+         mfbbc = -(rhoBC[k] + c1o1) * XXb * YYb * ZZc - c2o27;
+         mfbba = -(rhoBC[k] + c1o1) * XXb * YYb * ZZa - c2o27;
+         mfccb = -(rhoBC[k] + c1o1) * XXc * YYc * ZZb - c1o54;
+         mfaab = -(rhoBC[k] + c1o1) * XXa * YYa * ZZb - c1o54;
+         mfcab = -(rhoBC[k] + c1o1) * XXc * YYa * ZZb - c1o54;
+         mfacb = -(rhoBC[k] + c1o1) * XXa * YYc * ZZb - c1o54;
+         mfcbc = -(rhoBC[k] + c1o1) * XXc * YYb * ZZc - c1o54;
+         mfaba = -(rhoBC[k] + c1o1) * XXa * YYb * ZZa - c1o54;
+         mfcba = -(rhoBC[k] + c1o1) * XXc * YYb * ZZa - c1o54;
+         mfabc = -(rhoBC[k] + c1o1) * XXa * YYb * ZZc - c1o54;
+         mfbcc = -(rhoBC[k] + c1o1) * XXb * YYc * ZZc - c1o54;
+         mfbaa = -(rhoBC[k] + c1o1) * XXb * YYa * ZZa - c1o54;
+         mfbca = -(rhoBC[k] + c1o1) * XXb * YYc * ZZa - c1o54;
+         mfbac = -(rhoBC[k] + c1o1) * XXb * YYa * ZZc - c1o54;
+         mfbbb = -(rhoBC[k] + c1o1) * XXb * YYb * ZZb - c8o27;
+         mfccc = -(rhoBC[k] + c1o1) * XXc * YYc * ZZc - c1o216;
+         mfaac = -(rhoBC[k] + c1o1) * XXa * YYa * ZZc - c1o216;
+         mfcac = -(rhoBC[k] + c1o1) * XXc * YYa * ZZc - c1o216;
+         mfacc = -(rhoBC[k] + c1o1) * XXa * YYc * ZZc - c1o216;
+         mfcca = -(rhoBC[k] + c1o1) * XXc * YYc * ZZa - c1o216;
+         mfaaa = -(rhoBC[k] + c1o1) * XXa * YYa * ZZa - c1o216;
+         mfcaa = -(rhoBC[k] + c1o1) * XXc * YYa * ZZa - c1o216;
+         mfaca = -(rhoBC[k] + c1o1) * XXa * YYc * ZZa - c1o216;
+         //////////////////////////////////////////////////////////
+         ////konditioniert
+         //double OneOver216RhoPlusOne = c1over216*(rhoBC[k]+one);
+         //double OnoOver216Rho        = c1over216*rhoBC[k];
+         //mfcbb = OnoOver216Rho*sixteen + OneOver216RhoPlusOne*twelve*(-(two*vy2) - two*vz2 + three*vy2*vz2 + vvx*(-two + three*vy2)*(-two + three*vz2) + vx2*(-two + three*vy2)*(-two + three*vz2));
+         //mfabb = OnoOver216Rho*sixteen - OneOver216RhoPlusOne*twelve*(two*vy2 + two*vz2 - three*vy2*vz2 + vvx*(-two + three*vy2)*(-two + three*vz2) + vx2*(-four + six*vy2 + six*vz2 - nine*vy2*vz2));
+         //mfbcb = four*(-(four*OneOver216RhoPlusOne) + four*OnoOver216Rho + OneOver216RhoPlusOne*(-two + three*vx2)*(one + three*vvy + three*vy2)*(-two + three*vz2));
+         //mfbab = four*(four*OnoOver216Rho - OneOver216RhoPlusOne*three*(vvy*(-two + three*vx2)*(-two + three*vz2) - one*vx2*(one + three*vy2)*(-two + three*vz2) + two*(-(two*vy2) + vz2 + three*vy2*vz2)));
+         //mfbbc = four*(-(four*OneOver216RhoPlusOne) + four*OnoOver216Rho + OneOver216RhoPlusOne*(-two + three*vx2)*(-two + three*vy2)*(one + three*vvz + three*vz2));
+         //mfbba = four*(four*OnoOver216Rho - OneOver216RhoPlusOne*three*(vvz*(-two + three*vx2)*(-two + three*vy2) - one*vx2*(-two + three*vy2)*(one + three*vz2) + two*(vy2 - two*vz2 + three*vy2*vz2)));
+         //mfccb = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) - two*vy2 - six*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(one + three*vvy + three*vy2)*(-two + three*vz2))));
+         //mfaab = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) - two*vy2 - six*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-two + three*vz2))));
+         //mfcab = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 + two*vy2 + six*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-two + three*vz2)));
+         //mfacb = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 + two*vy2 + six*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(one + three*vvy + three*vy2)*(-two + three*vz2)));
+         //mfcbc = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) + vy2 + three*vx2*vy2 + vvz*(one + three*vx2)*(-two + three*vy2) - two*vz2 - six*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(one + three*vvz + three*vz2))));
+         //mfaba = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) + vy2 + three*vx2*vy2 - one*vvz*(one + three*vx2)*(-two + three*vy2) - two*vz2 - six*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(-one + three*vvz - three*vz2))));
+         //mfcba = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 - one*vy2 - three*vx2*vy2 + vvz*(one + three*vx2)*(-two + three*vy2) + two*vz2 + six*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(-one + three*vvz - three*vz2)));
+         //mfabc = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 - one*vy2 - three*vx2*vy2 - one*vvz*(one + three*vx2)*(-two + three*vy2) + two*vz2 + six*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(one + three*vvz + three*vz2)));
+         //mfbcc = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(vx2 - two*vy2 + three*vx2*vy2 + vvz*(-two + three*vx2)*(one + three*vy2) - two*vz2 + three*vx2*vz2 - six*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(one + three*vvz + three*vz2))));
+         //mfbaa = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(vx2 - two*vy2 + three*vx2*vy2 - one*vvz*(-two + three*vx2)*(one + three*vy2) - two*vz2 + three*vx2*vz2 - six*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(-one + three*vvz - three*vz2))));
+         //mfbca = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(-(one*vx2) + two*vy2 - three*vx2*vy2 + vvz*(-two + three*vx2)*(one + three*vy2) + two*vz2 - three*vx2*vz2 + six*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(-one + three*vvz - three*vz2)));
+         //mfbac = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(-(one*vx2) + two*vy2 - three*vx2*vy2 - one*vvz*(-two + three*vx2)*(one + three*vy2) + two*vz2 - three*vx2*vz2 + six*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(one + three*vvz + three*vz2)));
+         //mfbbb = eight*(eight*OnoOver216Rho + OneOver216RhoPlusOne*three*(four*vy2 + four*vz2 - six*vy2*vz2 + vx2*(-two + three*vy2)*(-two + three*vz2)));
+         //mfccc = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(one + three*vvz + three*vz2) + vvx*(one + three*vvy + three*vy2)*(one + three*vvz + three*vz2));
+         //mfaac = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(one + three*vvz + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(one + three*vvz + three*vz2));
+         //mfcac = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(one + three*vvz + three*vz2) - one*vvx*(-one + three*vvy - three*vy2)*(one + three*vvz + three*vz2));
+         //mfacc = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(one + three*vvz + three*vz2) - one*vvx*(one + three*vvy + three*vy2)*(one + three*vvz + three*vz2));
+         //mfcca = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) - one*vvx*(one + three*vvy + three*vy2)*(-one + three*vvz - three*vz2));
+         //mfaaa = OnoOver216Rho - OneOver216RhoPlusOne*three*(vvz - one*vx2 + three*vvz*vx2 - one*vy2 + three*vvz*vy2 - three*vx2*vy2 + nine*vvz*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-one + three*vvz - three*vz2));
+         //mfcaa = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-one + three*vvz - three*vz2));
+         //mfaca = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(one + three*vvy + three*vy2)*(-one + three*vvz - three*vz2));
 
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //if (isEvenTimestep==true)
       //{
-      //   D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      //   D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      //   D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      //   D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      //   D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      //   D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      //   D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      //   D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      //   D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      //   D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      //   D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      //   D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      //   D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      //   D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      //   D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      //   D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      //   D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      //   D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      //   D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      //   D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      //   D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      //   D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      //   D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      //   D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      //   D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      //   D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      //} 
+      //   D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+      //   D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+      //   D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+      //   D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+      //   D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+      //   D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+      //   D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+      //   D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+      //   D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+      //   D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+      //   D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+      //   D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+      //   D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+      //   D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+      //   D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+      //   D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+      //   D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+      //   D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+      //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+      //   D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+      //   D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+      //   D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+      //   D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+      //   D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+      //   D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+      //   D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+      //   D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
+      //}
       //else
       //{
-      //   D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      //   D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      //   D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      //   D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      //   D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      //   D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      //   D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      //   D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      //   D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      //   D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      //   D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      //   D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      //   D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      //   D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      //   D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      //   D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      //   D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      //   D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      //   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      //   D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      //   D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      //   D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      //   D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      //   D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      //   D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      //   D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      //   D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      //   D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+      //   D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+      //   D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+      //   D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+      //   D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+      //   D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+      //   D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+      //   D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+      //   D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+      //   D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+      //   D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+      //   D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+      //   D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+      //   D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+      //   D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+      //   D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+      //   D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+      //   D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+      //   D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+      //   D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+      //   D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+      //   D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+      //   D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+      //   D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+      //   D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+      //   D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+      //   D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
       //}
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //__syncthreads();
 
-			(D.f[DIR_P00   ])[ke   ] = mfabb;//mfcbb;
-			(D.f[DIR_M00   ])[kw   ] = mfcbb;//mfabb;
-			(D.f[DIR_0P0   ])[kn   ] = mfbab;//mfbcb;
-			(D.f[DIR_0M0   ])[ks   ] = mfbcb;//mfbab;
-			(D.f[DIR_00P   ])[kt   ] = mfbba;//mfbbc;
-			(D.f[DIR_00M   ])[kb   ] = mfbbc;//mfbba;
-			(D.f[DIR_PP0  ])[kne  ] = mfaab;//mfccb;
-			(D.f[DIR_MM0  ])[ksw  ] = mfccb;//mfaab;
-			(D.f[DIR_PM0  ])[kse  ] = mfacb;//mfcab;
-			(D.f[DIR_MP0  ])[knw  ] = mfcab;//mfacb;
-			(D.f[DIR_P0P  ])[kte  ] = mfaba;//mfcbc;
-			(D.f[DIR_M0M  ])[kbw  ] = mfcbc;//mfaba;
-			(D.f[DIR_P0M  ])[kbe  ] = mfabc;//mfcba;
-			(D.f[DIR_M0P  ])[ktw  ] = mfcba;//mfabc;
-			(D.f[DIR_0PP  ])[ktn  ] = mfbaa;//mfbcc;
-			(D.f[DIR_0MM  ])[kbs  ] = mfbcc;//mfbaa;
-			(D.f[DIR_0PM  ])[kbn  ] = mfbac;//mfbca;
-			(D.f[DIR_0MP  ])[kts  ] = mfbca;//mfbac;
-			(D.f[DIR_000])[kzero] = mfbbb;//mfbbb;
-			(D.f[DIR_PPP ])[ktne ] = mfaaa;//mfccc;
-			(D.f[DIR_MMP ])[ktsw ] = mfcca;//mfaac;
-			(D.f[DIR_PMP ])[ktse ] = mfaca;//mfcac;
-			(D.f[DIR_MPP ])[ktnw ] = mfcaa;//mfacc;
-			(D.f[DIR_PPM ])[kbne ] = mfaac;//mfcca;
-			(D.f[DIR_MMM ])[kbsw ] = mfccc;//mfaaa;
-			(D.f[DIR_PMM ])[kbse ] = mfacc;//mfcaa;
-			(D.f[DIR_MPM ])[kbnw ] = mfcac;//mfaca;
-			//(D.f[DIR_P00   ])[ke   ] = mfcbb;
-			//(D.f[DIR_M00   ])[kw   ] = mfabb;
-			//(D.f[DIR_0P0   ])[kn   ] = mfbcb;
-			//(D.f[DIR_0M0   ])[ks   ] = mfbab;
-			//(D.f[DIR_00P   ])[kt   ] = mfbbc;
-			//(D.f[DIR_00M   ])[kb   ] = mfbba;
-			//(D.f[DIR_PP0  ])[kne  ] = mfccb;
-			//(D.f[DIR_MM0  ])[ksw  ] = mfaab;
-			//(D.f[DIR_PM0  ])[kse  ] = mfcab;
-			//(D.f[DIR_MP0  ])[knw  ] = mfacb;
-			//(D.f[DIR_P0P  ])[kte  ] = mfcbc;
-			//(D.f[DIR_M0M  ])[kbw  ] = mfaba;
-			//(D.f[DIR_P0M  ])[kbe  ] = mfcba;
-			//(D.f[DIR_M0P  ])[ktw  ] = mfabc;
-			//(D.f[DIR_0PP  ])[ktn  ] = mfbcc;
-			//(D.f[DIR_0MM  ])[kbs  ] = mfbaa;
-			//(D.f[DIR_0PM  ])[kbn  ] = mfbca;
-			//(D.f[DIR_0MP  ])[kts  ] = mfbac;
-			//(D.f[DIR_000])[kzero] = mfbbb;
-			//(D.f[DIR_PPP ])[ktne ] = mfccc;
-			//(D.f[DIR_MMP ])[ktsw ] = mfaac;
-			//(D.f[DIR_PMP ])[ktse ] = mfcac;
-			//(D.f[DIR_MPP ])[ktnw ] = mfacc;
-			//(D.f[DIR_PPM ])[kbne ] = mfcca;
-			//(D.f[DIR_MMM ])[kbsw ] = mfaaa;
-			//(D.f[DIR_PMM ])[kbse ] = mfcaa;
-			//(D.f[DIR_MPM ])[kbnw ] = mfaca;
-
-      //(D.f[DIR_P00   ])[ke   ] = fE ;  //f1_E ;   //fW;    //fE ;  
-      //(D.f[DIR_M00   ])[kw   ] = fW ;  //f1_W ;   //fE;    //fW ;  
-      //(D.f[DIR_0P0   ])[kn   ] = fN ;  //f1_N ;   //fS;    //fN ;  
-      //(D.f[DIR_0M0   ])[ks   ] = fS ;  //f1_S ;   //fN;    //fS ;  
-      //(D.f[DIR_00P   ])[kt   ] = fT ;  //f1_T ;   //fB;    //fT ;  
-      //(D.f[DIR_00M   ])[kb   ] = fB ;  //f1_B ;   //fT;    //fB ;  
-      //(D.f[DIR_PP0  ])[kne  ] = fNE;  //f1_NE;   //fSW;   //fNE;  
-      //(D.f[DIR_MM0  ])[ksw  ] = fSW;  //f1_SW;   //fNE;   //fSW;  
-      //(D.f[DIR_PM0  ])[kse  ] = fSE;  //f1_SE;   //fNW;   //fSE;  
-      //(D.f[DIR_MP0  ])[knw  ] = fNW;  //f1_NW;   //fSE;   //fNW;  
-      //(D.f[DIR_P0P  ])[kte  ] = fTE;  //f1_TE;   //fBW;   //fTE;  
-      //(D.f[DIR_M0M  ])[kbw  ] = fBW;  //f1_BW;   //fTE;   //fBW;  
-      //(D.f[DIR_P0M  ])[kbe  ] = fBE;  //f1_BE;   //fTW;   //fBE;  
-      //(D.f[DIR_M0P  ])[ktw  ] = fTW;  //f1_TW;   //fBE;   //fTW;  
-      //(D.f[DIR_0PP  ])[ktn  ] = fTN;  //f1_TN;   //fBS;   //fTN;  
-      //(D.f[DIR_0MM  ])[kbs  ] = fBS;  //f1_BS;   //fTN;   //fBS;  
-      //(D.f[DIR_0PM  ])[kbn  ] = fBN;  //f1_BN;   //fTS;   //fBN;  
-      //(D.f[DIR_0MP  ])[kts  ] = fTS;  //f1_TS;   //fBN;   //fTS;  
+         (D.f[DIR_P00])[ke   ] = mfabb;//mfcbb;
+         (D.f[DIR_M00])[kw   ] = mfcbb;//mfabb;
+         (D.f[DIR_0P0])[kn   ] = mfbab;//mfbcb;
+         (D.f[DIR_0M0])[ks   ] = mfbcb;//mfbab;
+         (D.f[DIR_00P])[kt   ] = mfbba;//mfbbc;
+         (D.f[DIR_00M])[kb   ] = mfbbc;//mfbba;
+         (D.f[DIR_PP0])[kne  ] = mfaab;//mfccb;
+         (D.f[DIR_MM0])[ksw  ] = mfccb;//mfaab;
+         (D.f[DIR_PM0])[kse  ] = mfacb;//mfcab;
+         (D.f[DIR_MP0])[knw  ] = mfcab;//mfacb;
+         (D.f[DIR_P0P])[kte  ] = mfaba;//mfcbc;
+         (D.f[DIR_M0M])[kbw  ] = mfcbc;//mfaba;
+         (D.f[DIR_P0M])[kbe  ] = mfabc;//mfcba;
+         (D.f[DIR_M0P])[ktw  ] = mfcba;//mfabc;
+         (D.f[DIR_0PP])[ktn  ] = mfbaa;//mfbcc;
+         (D.f[DIR_0MM])[kbs  ] = mfbcc;//mfbaa;
+         (D.f[DIR_0PM])[kbn  ] = mfbac;//mfbca;
+         (D.f[DIR_0MP])[kts  ] = mfbca;//mfbac;
+         (D.f[DIR_000])[kzero] = mfbbb;//mfbbb;
+         (D.f[DIR_PPP])[ktne ] = mfaaa;//mfccc;
+         (D.f[DIR_MMP])[ktsw ] = mfcca;//mfaac;
+         (D.f[DIR_PMP])[ktse ] = mfaca;//mfcac;
+         (D.f[DIR_MPP])[ktnw ] = mfcaa;//mfacc;
+         (D.f[DIR_PPM])[kbne ] = mfaac;//mfcca;
+         (D.f[DIR_MMM])[kbsw ] = mfccc;//mfaaa;
+         (D.f[DIR_PMM])[kbse ] = mfacc;//mfcaa;
+         (D.f[DIR_MPM])[kbnw ] = mfcac;//mfaca;
+         //(D.f[DIR_P00])[ke   ] = mfcbb;
+         //(D.f[DIR_M00])[kw   ] = mfabb;
+         //(D.f[DIR_0P0])[kn   ] = mfbcb;
+         //(D.f[DIR_0M0])[ks   ] = mfbab;
+         //(D.f[DIR_00P])[kt   ] = mfbbc;
+         //(D.f[DIR_00M])[kb   ] = mfbba;
+         //(D.f[DIR_PP0])[kne  ] = mfccb;
+         //(D.f[DIR_MM0])[ksw  ] = mfaab;
+         //(D.f[DIR_PM0])[kse  ] = mfcab;
+         //(D.f[DIR_MP0])[knw  ] = mfacb;
+         //(D.f[DIR_P0P])[kte  ] = mfcbc;
+         //(D.f[DIR_M0M])[kbw  ] = mfaba;
+         //(D.f[DIR_P0M])[kbe  ] = mfcba;
+         //(D.f[DIR_M0P])[ktw  ] = mfabc;
+         //(D.f[DIR_0PP])[ktn  ] = mfbcc;
+         //(D.f[DIR_0MM])[kbs  ] = mfbaa;
+         //(D.f[DIR_0PM])[kbn  ] = mfbca;
+         //(D.f[DIR_0MP])[kts  ] = mfbac;
+         //(D.f[DIR_000])[kzero] = mfbbb;
+         //(D.f[DIR_PPP])[ktne ] = mfccc;
+         //(D.f[DIR_MMP])[ktsw ] = mfaac;
+         //(D.f[DIR_PMP])[ktse ] = mfcac;
+         //(D.f[DIR_MPP])[ktnw ] = mfacc;
+         //(D.f[DIR_PPM])[kbne ] = mfcca;
+         //(D.f[DIR_MMM])[kbsw ] = mfaaa;
+         //(D.f[DIR_PMM])[kbse ] = mfcaa;
+         //(D.f[DIR_MPM])[kbnw ] = mfaca;
+
+      //(D.f[DIR_P00])[ke   ] = fE ;  //f1_E ;   //fW;    //fE ;
+      //(D.f[DIR_M00])[kw   ] = fW ;  //f1_W ;   //fE;    //fW ;
+      //(D.f[DIR_0P0])[kn   ] = fN ;  //f1_N ;   //fS;    //fN ;
+      //(D.f[DIR_0M0])[ks   ] = fS ;  //f1_S ;   //fN;    //fS ;
+      //(D.f[DIR_00P])[kt   ] = fT ;  //f1_T ;   //fB;    //fT ;
+      //(D.f[DIR_00M])[kb   ] = fB ;  //f1_B ;   //fT;    //fB ;
+      //(D.f[DIR_PP0])[kne  ] = fNE;  //f1_NE;   //fSW;   //fNE;
+      //(D.f[DIR_MM0])[ksw  ] = fSW;  //f1_SW;   //fNE;   //fSW;
+      //(D.f[DIR_PM0])[kse  ] = fSE;  //f1_SE;   //fNW;   //fSE;
+      //(D.f[DIR_MP0])[knw  ] = fNW;  //f1_NW;   //fSE;   //fNW;
+      //(D.f[DIR_P0P])[kte  ] = fTE;  //f1_TE;   //fBW;   //fTE;
+      //(D.f[DIR_M0M])[kbw  ] = fBW;  //f1_BW;   //fTE;   //fBW;
+      //(D.f[DIR_P0M])[kbe  ] = fBE;  //f1_BE;   //fTW;   //fBE;
+      //(D.f[DIR_M0P])[ktw  ] = fTW;  //f1_TW;   //fBE;   //fTW;
+      //(D.f[DIR_0PP])[ktn  ] = fTN;  //f1_TN;   //fBS;   //fTN;
+      //(D.f[DIR_0MM])[kbs  ] = fBS;  //f1_BS;   //fTN;   //fBS;
+      //(D.f[DIR_0PM])[kbn  ] = fBN;  //f1_BN;   //fTS;   //fBN;
+      //(D.f[DIR_0MP])[kts  ] = fTS;  //f1_TS;   //fBN;   //fTS;
       //(D.f[DIR_000])[kzero] = fZERO;//f1_ZERO; //fZERO; //fZERO;
-      //(D.f[DIR_PPP ])[ktne ] = fTNE; //f1_TNE;  //fBSW;  //fTNE; 
-      //(D.f[DIR_MMM ])[kbsw ] = fBSW; //f1_BSW;  //fTNE;  //fBSW; 
-      //(D.f[DIR_PPM ])[kbne ] = fBNE; //f1_BNE;  //fTSW;  //fBNE; 
-      //(D.f[DIR_MMP ])[ktsw ] = fTSW; //f1_TSW;  //fBNE;  //fTSW; 
-      //(D.f[DIR_PMP ])[ktse ] = fTSE; //f1_TSE;  //fBNW;  //fTSE; 
-      //(D.f[DIR_MPM ])[kbnw ] = fBNW; //f1_BNW;  //fTSE;  //fBNW; 
-      //(D.f[DIR_PMM ])[kbse ] = fBSE; //f1_BSE;  //fTNW;  //fBSE; 
-      //(D.f[DIR_MPP ])[ktnw ] = fTNW; //f1_TNW;  //fBSE;  //fTNW; 
+      //(D.f[DIR_PPP])[ktne ] = fTNE; //f1_TNE;  //fBSW;  //fTNE;
+      //(D.f[DIR_MMM])[kbsw ] = fBSW; //f1_BSW;  //fTNE;  //fBSW;
+      //(D.f[DIR_PPM])[kbne ] = fBNE; //f1_BNE;  //fTSW;  //fBNE;
+      //(D.f[DIR_MMP])[ktsw ] = fTSW; //f1_TSW;  //fBNE;  //fTSW;
+      //(D.f[DIR_PMP])[ktse ] = fTSE; //f1_TSE;  //fBNW;  //fTSE;
+      //(D.f[DIR_MPM])[kbnw ] = fBNW; //f1_BNW;  //fTSE;  //fBNW;
+      //(D.f[DIR_PMM])[kbse ] = fBSE; //f1_BSE;  //fTNW;  //fBSE;
+      //(D.f[DIR_MPP])[ktnw ] = fTNW; //f1_TNW;  //fBSE;  //fTNW;
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4295,19 +4295,19 @@ __global__ void QPressDeviceEQZ27(real* rhoBC,
 
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-__global__ void QPressDeviceZero27(	 real* DD, 
-												 int* k_Q, 
-												 unsigned int numberOfBCnodes, 
-												 unsigned int* neighborX,
-												 unsigned int* neighborY,
-												 unsigned int* neighborZ,
-												 unsigned int size_Mat, 
-												 bool isEvenTimestep)
+__global__ void QPressDeviceZero27(	 real* DD,
+                                     int* k_Q,
+                                     unsigned int numberOfBCnodes,
+                                     unsigned int* neighborX,
+                                     unsigned int* neighborY,
+                                     unsigned int* neighborZ,
+                                     unsigned long long numberOfLBnodes,
+                                     bool 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  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;
@@ -4351,94 +4351,94 @@ __global__ void QPressDeviceZero27(	 real* DD,
       Distributions27 D;
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //__syncthreads();
-	  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      (D.f[DIR_P00   ])[ke   ] =c0o1;
-      (D.f[DIR_M00   ])[kw   ] =c0o1;
-      (D.f[DIR_0P0   ])[kn   ] =c0o1;
-      (D.f[DIR_0M0   ])[ks   ] =c0o1;
-      (D.f[DIR_00P   ])[kt   ] =c0o1;
-      (D.f[DIR_00M   ])[kb   ] =c0o1;
-      (D.f[DIR_PP0  ])[kne  ] =c0o1;
-      (D.f[DIR_MM0  ])[ksw  ] =c0o1;
-      (D.f[DIR_PM0  ])[kse  ] =c0o1;
-      (D.f[DIR_MP0  ])[knw  ] =c0o1;
-      (D.f[DIR_P0P  ])[kte  ] =c0o1;
-      (D.f[DIR_M0M  ])[kbw  ] =c0o1;
-      (D.f[DIR_P0M  ])[kbe  ] =c0o1;
-      (D.f[DIR_M0P  ])[ktw  ] =c0o1;
-      (D.f[DIR_0PP  ])[ktn  ] =c0o1;
-      (D.f[DIR_0MM  ])[kbs  ] =c0o1;
-      (D.f[DIR_0PM  ])[kbn  ] =c0o1;
-      (D.f[DIR_0MP  ])[kts  ] =c0o1;
+     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+      (D.f[DIR_P00])[ke   ] =c0o1;
+      (D.f[DIR_M00])[kw   ] =c0o1;
+      (D.f[DIR_0P0])[kn   ] =c0o1;
+      (D.f[DIR_0M0])[ks   ] =c0o1;
+      (D.f[DIR_00P])[kt   ] =c0o1;
+      (D.f[DIR_00M])[kb   ] =c0o1;
+      (D.f[DIR_PP0])[kne  ] =c0o1;
+      (D.f[DIR_MM0])[ksw  ] =c0o1;
+      (D.f[DIR_PM0])[kse  ] =c0o1;
+      (D.f[DIR_MP0])[knw  ] =c0o1;
+      (D.f[DIR_P0P])[kte  ] =c0o1;
+      (D.f[DIR_M0M])[kbw  ] =c0o1;
+      (D.f[DIR_P0M])[kbe  ] =c0o1;
+      (D.f[DIR_M0P])[ktw  ] =c0o1;
+      (D.f[DIR_0PP])[ktn  ] =c0o1;
+      (D.f[DIR_0MM])[kbs  ] =c0o1;
+      (D.f[DIR_0PM])[kbn  ] =c0o1;
+      (D.f[DIR_0MP])[kts  ] =c0o1;
       (D.f[DIR_000])[kzero] =c0o1;
-      (D.f[DIR_PPP ])[ktne ] =c0o1;
-      (D.f[DIR_MMP ])[ktsw ] =c0o1;
-      (D.f[DIR_PMP ])[ktse ] =c0o1;
-      (D.f[DIR_MPP ])[ktnw ] =c0o1;
-      (D.f[DIR_PPM ])[kbne ] =c0o1;
-      (D.f[DIR_MMM ])[kbsw ] =c0o1;
-      (D.f[DIR_PMM ])[kbse ] =c0o1;
-      (D.f[DIR_MPM ])[kbnw ] =c0o1;
+      (D.f[DIR_PPP])[ktne ] =c0o1;
+      (D.f[DIR_MMP])[ktsw ] =c0o1;
+      (D.f[DIR_PMP])[ktse ] =c0o1;
+      (D.f[DIR_MPP])[ktnw ] =c0o1;
+      (D.f[DIR_PPM])[kbne ] =c0o1;
+      (D.f[DIR_MMM])[kbsw ] =c0o1;
+      (D.f[DIR_PMM])[kbse ] =c0o1;
+      (D.f[DIR_MPM])[kbnw ] =c0o1;
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4483,21 +4483,21 @@ __global__ void QPressDeviceZero27(	 real* DD,
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 __global__ void QPressDeviceFake27(	 real* rhoBC,
-												 real* DD, 
-												 int* k_Q, 
-												 int* k_N, 
-												 int numberOfBCnodes, 
-												 real om1, 
-												 unsigned int* neighborX,
-												 unsigned int* neighborY,
-												 unsigned int* neighborZ,
-												 unsigned int size_Mat, 
-												 bool isEvenTimestep)
+                                     real* DD,
+                                     int* k_Q,
+                                     int* k_N,
+                                     int numberOfBCnodes,
+                                     real om1,
+                                     unsigned int* neighborX,
+                                     unsigned int* neighborY,
+                                     unsigned int* neighborZ,
+                                     unsigned long long numberOfLBnodes,
+                                     bool 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  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;
@@ -4571,148 +4571,148 @@ __global__ void QPressDeviceFake27(	 real* rhoBC,
       Distributions27 D;
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-      } 
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real        f1_E,f1_W,f1_N,f1_S,f1_T,f1_B,f1_NE,f1_SW,f1_SE,f1_NW,f1_TE,f1_BW,f1_BE,f1_TW,f1_TN,f1_BS,f1_BN,f1_TS,f1_ZERO,
          f1_TNE,f1_TSW,f1_TSE,f1_TNW,f1_BNE,f1_BSW,f1_BSE,f1_BNW;
 
-      f1_W    = (D.f[DIR_P00   ])[k1e   ];
-      f1_E    = (D.f[DIR_M00   ])[k1w   ];
-      f1_S    = (D.f[DIR_0P0   ])[k1n   ];
-      f1_N    = (D.f[DIR_0M0   ])[k1s   ];
-      f1_B    = (D.f[DIR_00P   ])[k1t   ];
-      f1_T    = (D.f[DIR_00M   ])[k1b   ];
-      f1_SW   = (D.f[DIR_PP0  ])[k1ne  ];
-      f1_NE   = (D.f[DIR_MM0  ])[k1sw  ];
-      f1_NW   = (D.f[DIR_PM0  ])[k1se  ];
-      f1_SE   = (D.f[DIR_MP0  ])[k1nw  ];
-      f1_BW   = (D.f[DIR_P0P  ])[k1te  ];
-      f1_TE   = (D.f[DIR_M0M  ])[k1bw  ];
-      f1_TW   = (D.f[DIR_P0M  ])[k1be  ];
-      f1_BE   = (D.f[DIR_M0P  ])[k1tw  ];
-      f1_BS   = (D.f[DIR_0PP  ])[k1tn  ];
-      f1_TN   = (D.f[DIR_0MM  ])[k1bs  ];
-      f1_TS   = (D.f[DIR_0PM  ])[k1bn  ];
-      f1_BN   = (D.f[DIR_0MP  ])[k1ts  ];
+      f1_W    = (D.f[DIR_P00])[k1e   ];
+      f1_E    = (D.f[DIR_M00])[k1w   ];
+      f1_S    = (D.f[DIR_0P0])[k1n   ];
+      f1_N    = (D.f[DIR_0M0])[k1s   ];
+      f1_B    = (D.f[DIR_00P])[k1t   ];
+      f1_T    = (D.f[DIR_00M])[k1b   ];
+      f1_SW   = (D.f[DIR_PP0])[k1ne  ];
+      f1_NE   = (D.f[DIR_MM0])[k1sw  ];
+      f1_NW   = (D.f[DIR_PM0])[k1se  ];
+      f1_SE   = (D.f[DIR_MP0])[k1nw  ];
+      f1_BW   = (D.f[DIR_P0P])[k1te  ];
+      f1_TE   = (D.f[DIR_M0M])[k1bw  ];
+      f1_TW   = (D.f[DIR_P0M])[k1be  ];
+      f1_BE   = (D.f[DIR_M0P])[k1tw  ];
+      f1_BS   = (D.f[DIR_0PP])[k1tn  ];
+      f1_TN   = (D.f[DIR_0MM])[k1bs  ];
+      f1_TS   = (D.f[DIR_0PM])[k1bn  ];
+      f1_BN   = (D.f[DIR_0MP])[k1ts  ];
       f1_ZERO = (D.f[DIR_000])[k1zero];
-      f1_BSW  = (D.f[DIR_PPP ])[k1tne ];
-      f1_BNE  = (D.f[DIR_MMP ])[k1tsw ];
-      f1_BNW  = (D.f[DIR_PMP ])[k1tse ];
-      f1_BSE  = (D.f[DIR_MPP ])[k1tnw ];
-      f1_TSW  = (D.f[DIR_PPM ])[k1bne ];
-      f1_TNE  = (D.f[DIR_MMM ])[k1bsw ];
-      f1_TNW  = (D.f[DIR_PMM ])[k1bse ];
-      f1_TSE  = (D.f[DIR_MPM ])[k1bnw ];
+      f1_BSW  = (D.f[DIR_PPP])[k1tne ];
+      f1_BNE  = (D.f[DIR_MMP])[k1tsw ];
+      f1_BNW  = (D.f[DIR_PMP])[k1tse ];
+      f1_BSE  = (D.f[DIR_MPP])[k1tnw ];
+      f1_TSW  = (D.f[DIR_PPM])[k1bne ];
+      f1_TNE  = (D.f[DIR_MMM])[k1bsw ];
+      f1_TNW  = (D.f[DIR_PMM])[k1bse ];
+      f1_TSE  = (D.f[DIR_MPM])[k1bnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       real vx1, vx2, vx3;
       vx1    =  ((f1_TSE - f1_BNW) - (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) +
                   ((f1_BE - f1_TW)   + (f1_TE - f1_BW))   + ((f1_SE - f1_NW)   + (f1_NE - f1_SW)) +
-                  (f1_E - f1_W); 
+                  (f1_E - f1_W);
 
 
       vx2    =   (-(f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) +
                   ((f1_BN - f1_TS)   + (f1_TN - f1_BS))    + (-(f1_SE - f1_NW)  + (f1_NE - f1_SW)) +
-                  (f1_N - f1_S); 
+                  (f1_N - f1_S);
 
       vx3    =   ((f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) + (f1_TSW - f1_BNE)) +
                   (-(f1_BN - f1_TS)  + (f1_TN - f1_BS))   + ((f1_TE - f1_BW)   - (f1_BE - f1_TW)) +
-                  (f1_T - f1_B); 
+                  (f1_T - f1_B);
 
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
       //////////////////////////////////////////////////////////////////////////
       real drho1    =  f1_ZERO+f1_E+f1_W+f1_N+f1_S+f1_T+f1_B+f1_NE+f1_SW+f1_SE+f1_NW+f1_TE+f1_BW+f1_BE+f1_TW+f1_TN+f1_BS+f1_BN+f1_TS+
          f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW;
 
-	  //drho1 = (drho1 + rhoBC[k])/2.f;
-	  drho1 = drho1 - rhoBC[k];
+     //drho1 = (drho1 + rhoBC[k])/2.f;
+     drho1 = drho1 - rhoBC[k];
 
       __syncthreads();
 
-      (D.f[DIR_P00   ])[ke   ] = c2o27* (rhoBC[k]+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
-      (D.f[DIR_M00   ])[kw   ] = c2o27* (rhoBC[k]+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
-      (D.f[DIR_0P0   ])[kn   ] = c2o27* (rhoBC[k]+c3o1*(    -vx2    )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
-      (D.f[DIR_0M0   ])[ks   ] = c2o27* (rhoBC[k]+c3o1*(     vx2    )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
-      (D.f[DIR_00P   ])[kt   ] = c2o27* (rhoBC[k]+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
-      (D.f[DIR_00M   ])[kb   ] = c2o27* (rhoBC[k]+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
-      (D.f[DIR_PP0  ])[kne  ] = f1_SW  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MM0  ])[ksw  ] = f1_NE  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PM0  ])[kse  ] = f1_NW  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MP0  ])[knw  ] = f1_SE  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_P0P  ])[kte  ] = f1_BW  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_M0M  ])[kbw  ] = f1_TE  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_P0M  ])[kbe  ] = f1_TW  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_M0P  ])[ktw  ] = f1_BE  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0PP  ])[ktn  ] = f1_BS  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0MM  ])[kbs  ] = f1_TN  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0PM  ])[kbn  ] = f1_TS  -c1o54*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_0MP  ])[kts  ] = f1_BN  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_P00])[ke   ] = c2o27* (rhoBC[k]+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
+      (D.f[DIR_M00])[kw   ] = c2o27* (rhoBC[k]+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
+      (D.f[DIR_0P0])[kn   ] = c2o27* (rhoBC[k]+c3o1*(    -vx2    )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
+      (D.f[DIR_0M0])[ks   ] = c2o27* (rhoBC[k]+c3o1*(     vx2    )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
+      (D.f[DIR_00P])[kt   ] = c2o27* (rhoBC[k]+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
+      (D.f[DIR_00M])[kb   ] = c2o27* (rhoBC[k]+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
+      (D.f[DIR_PP0])[kne  ] = f1_SW  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MM0])[ksw  ] = f1_NE  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_PM0])[kse  ] = f1_NW  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MP0])[knw  ] = f1_SE  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_P0P])[kte  ] = f1_BW  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_M0M])[kbw  ] = f1_TE  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_P0M])[kbe  ] = f1_TW  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_M0P])[ktw  ] = f1_BE  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0PP])[ktn  ] = f1_BS  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0MM])[kbs  ] = f1_TN  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0PM])[kbn  ] = f1_TS  -c1o54*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_0MP])[kts  ] = f1_BN  -c1o54*drho1;	//  c1o100;  // zero;  //
       (D.f[DIR_000])[kzero] = f1_ZERO-c8o27*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PPP ])[ktne ] = f1_BSW -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MMP ])[ktsw ] = f1_BNE -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PMP ])[ktse ] = f1_BNW -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MPP ])[ktnw ] = f1_BSE -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PPM ])[kbne ] = f1_TSW -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MMM ])[kbsw ] = f1_TNE -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_PMM ])[kbse ] = f1_TNW -c1o216*drho1;	//  c1o100;  // zero;  //
-      (D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1o216*drho1;  //  c1o100;  // zero;  //      
+      (D.f[DIR_PPP])[ktne ] = f1_BSW -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MMP])[ktsw ] = f1_BNE -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_PMP])[ktse ] = f1_BNW -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MPP])[ktnw ] = f1_BSE -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_PPM])[kbne ] = f1_TSW -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MMM])[kbsw ] = f1_TNE -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_PMM])[kbse ] = f1_TNW -c1o216*drho1;	//  c1o100;  // zero;  //
+      (D.f[DIR_MPM])[kbnw ] = f1_TSE -c1o216*drho1;  //  c1o100;  // zero;  //
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4757,460 +4757,460 @@ __global__ void QPressDeviceFake27(	 real* rhoBC,
 
 //////////////////////////////////////////////////////////////////////////
 __global__ void QPressDevice27_IntBB(real* rho,
-												real* DD, 
-												int* k_Q, 
-												real* QQ,
-												unsigned int numberOfBCnodes, 
-												real om1, 
-												unsigned int* neighborX,
-												unsigned int* neighborY,
-												unsigned int* neighborZ,
-												unsigned int size_Mat, 
-												bool isEvenTimestep)
+                                    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;
-	if (isEvenTimestep==true)
-	{
-		D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-	} 
-	else
-	{
-		D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_PMP *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 VeloX = vx[k];
-		//real VeloY = vy[k];
-		//real VeloZ = vz[k]; //(16.0*(u0*2.0)*bbx*bby*(grid_nx-bbx)*(grid_ny-bby))/(grid_nx*grid_nx*grid_ny*grid_ny)
-		////////////////////////////////////////////////////////////////////////////////
-		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[DIR_P00   * numberOfBCnodes];
-		q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-		q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-		q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-		q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-		q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-		q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-		q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-		q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-		q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-		q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-		q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-		q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-		q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-		q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-		q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-		q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-		q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
-		q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
-		q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
-		q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
-		q_dirTNW = &QQ[DIR_MPP * numberOfBCnodes];
-		q_dirBNE = &QQ[DIR_PPM * numberOfBCnodes];
-		q_dirBSW = &QQ[DIR_MMM * numberOfBCnodes];
-		q_dirBSE = &QQ[DIR_PMM * numberOfBCnodes];
-		q_dirBNW = &QQ[DIR_MPM * 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_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
-			f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
-
-		f_W    = (D.f[DIR_P00   ])[ke   ];
-		f_E    = (D.f[DIR_M00   ])[kw   ];
-		f_S    = (D.f[DIR_0P0   ])[kn   ];
-		f_N    = (D.f[DIR_0M0   ])[ks   ];
-		f_B    = (D.f[DIR_00P   ])[kt   ];
-		f_T    = (D.f[DIR_00M   ])[kb   ];
-		f_SW   = (D.f[DIR_PP0  ])[kne  ];
-		f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-		f_NW   = (D.f[DIR_PM0  ])[kse  ];
-		f_SE   = (D.f[DIR_MP0  ])[knw  ];
-		f_BW   = (D.f[DIR_P0P  ])[kte  ];
-		f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-		f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-		f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-		f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-		f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-		f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-		f_BN   = (D.f[DIR_0MP  ])[kts  ];
-		f_BSW  = (D.f[DIR_PPP ])[ktne ];
-		f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-		f_BNW  = (D.f[DIR_PMP ])[ktse ];
-		f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-		f_TSW  = (D.f[DIR_PPM ])[kbne ];
-		f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-		f_TNW  = (D.f[DIR_PMM ])[kbse ];
-		f_TSE  = (D.f[DIR_MPM ])[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[DIR_000])[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);
-
-		//////////////////////////////////////////////////////////////////////////
-		if (isEvenTimestep==false)
-		{
-			D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-			D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-			D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-			D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-			D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-			D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-			D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-			D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-			D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-			D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-			D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-			D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-			D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-			D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-			D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-			D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-			D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-			D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-			D.f[DIR_000] = &DD[DIR_000*size_Mat];
-			D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-			D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-			D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-			D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-			D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-			D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-			D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-			D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
-		} 
-		else
-		{
-			D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-			D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-			D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-			D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-			D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-			D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-			D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-			D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-			D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-			D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-			D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-			D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-			D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-			D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-			D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-			D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-			D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-			D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-			D.f[DIR_000] = &DD[DIR_000*size_Mat];
-			D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-			D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-			D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-			D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-			D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-			D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-			D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-			D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
-		}
-		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		//Test
-		//(D.f[DIR_000])[k]=c1o10;
-		real rhoDiff = drho - rho[k];
-		real VeloX = vx1;
-		real VeloY = vx2;
-		real VeloZ = vx3;
-		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-		q = q_dirE[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c2o27* (drho+c9o2*( vx1        )*( vx1        )-cu_sq); 
-			(D.f[DIR_M00])[kw]=(c1o1-q)/(c1o1+q)*(f_E-f_W+(f_E+f_W-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_E+f_W)-c2o27*(rhoDiff + c6o1*( VeloX     )))/(c1o1+q);
-		}
-
-		q = q_dirW[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c2o27* (drho+c9o2*(-vx1        )*(-vx1        )-cu_sq); 
-			(D.f[DIR_P00])[ke]=(c1o1-q)/(c1o1+q)*(f_W-f_E+(f_W+f_E-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_W+f_E)-c2o27*(rhoDiff + c6o1*(-VeloX     )))/(c1o1+q);
-		}
-
-		q = q_dirN[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c2o27* (drho+c9o2*(     vx2    )*(     vx2    )-cu_sq); 
-			(D.f[DIR_0M0])[ks]=(c1o1-q)/(c1o1+q)*(f_N-f_S+(f_N+f_S-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_N+f_S)-c2o27*(rhoDiff + c6o1*( VeloY     )))/(c1o1+q);
-		}
-
-		q = q_dirS[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c2o27* (drho+c9o2*(    -vx2    )*(    -vx2    )-cu_sq); 
-			(D.f[DIR_0P0])[kn]=(c1o1-q)/(c1o1+q)*(f_S-f_N+(f_S+f_N-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_S+f_N)-c2o27*(rhoDiff + c6o1*(-VeloY     )))/(c1o1+q);
-		}
-
-		q = q_dirT[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c2o27* (drho+c9o2*(         vx3)*(         vx3)-cu_sq); 
-			(D.f[DIR_00M])[kb]=(c1o1-q)/(c1o1+q)*(f_T-f_B+(f_T+f_B-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_T+f_B)-c2o27*(rhoDiff + c6o1*( VeloZ     )))/(c1o1+q);
-		}
-
-		q = q_dirB[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c2o27* (drho+c9o2*(        -vx3)*(        -vx3)-cu_sq); 
-			(D.f[DIR_00P])[kt]=(c1o1-q)/(c1o1+q)*(f_B-f_T+(f_B+f_T-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_B+f_T)-c2o27*(rhoDiff + c6o1*(-VeloZ     )))/(c1o1+q);
-		}
-
-		q = q_dirNE[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq); 
-			(D.f[DIR_MM0])[ksw]=(c1o1-q)/(c1o1+q)*(f_NE-f_SW+(f_NE+f_SW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NE+f_SW)-c1o54*(rhoDiff + c6o1*(VeloX+VeloY)))/(c1o1+q);
-		}
-
-		q = q_dirSW[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq); 
-			(D.f[DIR_PP0])[kne]=(c1o1-q)/(c1o1+q)*(f_SW-f_NE+(f_SW+f_NE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SW+f_NE)-c1o54*(rhoDiff + c6o1*(-VeloX-VeloY)))/(c1o1+q);
-		}
-
-		q = q_dirSE[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq); 
-			(D.f[DIR_MP0])[knw]=(c1o1-q)/(c1o1+q)*(f_SE-f_NW+(f_SE+f_NW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SE+f_NW)-c1o54*(rhoDiff + c6o1*( VeloX-VeloY)))/(c1o1+q);
-		}
-
-		q = q_dirNW[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq); 
-			(D.f[DIR_PM0])[kse]=(c1o1-q)/(c1o1+q)*(f_NW-f_SE+(f_NW+f_SE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NW+f_SE)-c1o54*(rhoDiff + c6o1*(-VeloX+VeloY)))/(c1o1+q);
-		}
-
-		q = q_dirTE[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq); 
-			(D.f[DIR_M0M])[kbw]=(c1o1-q)/(c1o1+q)*(f_TE-f_BW+(f_TE+f_BW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TE+f_BW)-c1o54*(rhoDiff + c6o1*( VeloX+VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirBW[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq); 
-			(D.f[DIR_P0P])[kte]=(c1o1-q)/(c1o1+q)*(f_BW-f_TE+(f_BW+f_TE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BW+f_TE)-c1o54*(rhoDiff + c6o1*(-VeloX-VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirBE[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq); 
-			(D.f[DIR_M0P])[ktw]=(c1o1-q)/(c1o1+q)*(f_BE-f_TW+(f_BE+f_TW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BE+f_TW)-c1o54*(rhoDiff + c6o1*( VeloX-VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirTW[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq); 
-			(D.f[DIR_P0M])[kbe]=(c1o1-q)/(c1o1+q)*(f_TW-f_BE+(f_TW+f_BE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TW+f_BE)-c1o54*(rhoDiff + c6o1*(-VeloX+VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirTN[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq); 
-			(D.f[DIR_0MM])[kbs]=(c1o1-q)/(c1o1+q)*(f_TN-f_BS+(f_TN+f_BS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TN+f_BS)-c1o54*(rhoDiff + c6o1*( VeloY+VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirBS[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq); 
-			(D.f[DIR_0PP])[ktn]=(c1o1-q)/(c1o1+q)*(f_BS-f_TN+(f_BS+f_TN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BS+f_TN)-c1o54*(rhoDiff + c6o1*( -VeloY-VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirBN[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq); 
-			(D.f[DIR_0MP])[kts]=(c1o1-q)/(c1o1+q)*(f_BN-f_TS+(f_BN+f_TS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BN+f_TS)-c1o54*(rhoDiff + c6o1*( VeloY-VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirTS[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o54* (drho+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq); 
-			(D.f[DIR_0PM])[kbn]=(c1o1-q)/(c1o1+q)*(f_TS-f_BN+(f_TS+f_BN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TS+f_BN)-c1o54*(rhoDiff + c6o1*( -VeloY+VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirTNE[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o216*(drho+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); 
-			(D.f[DIR_MMM])[kbsw]=(c1o1-q)/(c1o1+q)*(f_TNE-f_BSW+(f_TNE+f_BSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNE+f_BSW)-c1o216*(rhoDiff + c6o1*( VeloX+VeloY+VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirBSW[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o216*(drho+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); 
-			(D.f[DIR_PPP])[ktne]=(c1o1-q)/(c1o1+q)*(f_BSW-f_TNE+(f_BSW+f_TNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSW+f_TNE)-c1o216*(rhoDiff + c6o1*(-VeloX-VeloY-VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirBNE[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o216*(drho+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); 
-			(D.f[DIR_MMP])[ktsw]=(c1o1-q)/(c1o1+q)*(f_BNE-f_TSW+(f_BNE+f_TSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNE+f_TSW)-c1o216*(rhoDiff + c6o1*( VeloX+VeloY-VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirTSW[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o216*(drho+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); 
-			(D.f[DIR_PPM])[kbne]=(c1o1-q)/(c1o1+q)*(f_TSW-f_BNE+(f_TSW+f_BNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSW+f_BNE)-c1o216*(rhoDiff + c6o1*(-VeloX-VeloY+VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirTSE[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o216*(drho+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); 
-			(D.f[DIR_MPM])[kbnw]=(c1o1-q)/(c1o1+q)*(f_TSE-f_BNW+(f_TSE+f_BNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSE+f_BNW)-c1o216*(rhoDiff + c6o1*( VeloX-VeloY+VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirBNW[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o216*(drho+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); 
-			(D.f[DIR_PMP])[ktse]=(c1o1-q)/(c1o1+q)*(f_BNW-f_TSE+(f_BNW+f_TSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNW+f_TSE)-c1o216*(rhoDiff + c6o1*(-VeloX+VeloY-VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirBSE[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o216*(drho+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); 
-			(D.f[DIR_MPP])[ktnw]=(c1o1-q)/(c1o1+q)*(f_BSE-f_TNW+(f_BSE+f_TNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSE+f_TNW)-c1o216*(rhoDiff + c6o1*( VeloX-VeloY-VeloZ)))/(c1o1+q);
-		}
-
-		q = q_dirTNW[k];
-		if (q>=c0o1 && q<=c1o1)
-		{
-			feq=c1o216*(drho+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); 
-			(D.f[DIR_PMM])[kbse]=(c1o1-q)/(c1o1+q)*(f_TNW-f_BSE+(f_TNW+f_BSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNW+f_BSE)-c1o216*(rhoDiff + c6o1*(-VeloX+VeloY+VeloZ)))/(c1o1+q);
-		}
-	}
+   Distributions27 D;
+   if (isEvenTimestep==true)
+   {
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+   }
+   else
+   {
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * 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 VeloX = vx[k];
+      //real VeloY = vy[k];
+      //real VeloZ = vz[k]; //(16.0*(u0*2.0)*bbx*bby*(grid_nx-bbx)*(grid_ny-bby))/(grid_nx*grid_nx*grid_ny*grid_ny)
+      ////////////////////////////////////////////////////////////////////////////////
+      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[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
+      q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
+      q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
+      q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
+      q_dirTNW = &QQ[DIR_MPP * numberOfBCnodes];
+      q_dirBNE = &QQ[DIR_PPM * numberOfBCnodes];
+      q_dirBSW = &QQ[DIR_MMM * numberOfBCnodes];
+      q_dirBSE = &QQ[DIR_PMM * numberOfBCnodes];
+      q_dirBNW = &QQ[DIR_MPM * 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_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
+         f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
+
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[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[DIR_000])[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);
+
+      //////////////////////////////////////////////////////////////////////////
+      if (isEvenTimestep==false)
+      {
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
+      }
+      else
+      {
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
+      }
+      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+      //Test
+      //(D.f[DIR_000])[k]=c1o10;
+      real rhoDiff = drho - rho[k];
+      real VeloX = vx1;
+      real VeloY = vx2;
+      real VeloZ = vx3;
+      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+      q = q_dirE[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c2o27* (drho+c9o2*( vx1        )*( vx1        )-cu_sq);
+         (D.f[DIR_M00])[kw]=(c1o1-q)/(c1o1+q)*(f_E-f_W+(f_E+f_W-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_E+f_W)-c2o27*(rhoDiff + c6o1*( VeloX     )))/(c1o1+q);
+      }
+
+      q = q_dirW[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c2o27* (drho+c9o2*(-vx1        )*(-vx1        )-cu_sq);
+         (D.f[DIR_P00])[ke]=(c1o1-q)/(c1o1+q)*(f_W-f_E+(f_W+f_E-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_W+f_E)-c2o27*(rhoDiff + c6o1*(-VeloX     )))/(c1o1+q);
+      }
+
+      q = q_dirN[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c2o27* (drho+c9o2*(     vx2    )*(     vx2    )-cu_sq);
+         (D.f[DIR_0M0])[ks]=(c1o1-q)/(c1o1+q)*(f_N-f_S+(f_N+f_S-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_N+f_S)-c2o27*(rhoDiff + c6o1*( VeloY     )))/(c1o1+q);
+      }
+
+      q = q_dirS[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c2o27* (drho+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
+         (D.f[DIR_0P0])[kn]=(c1o1-q)/(c1o1+q)*(f_S-f_N+(f_S+f_N-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_S+f_N)-c2o27*(rhoDiff + c6o1*(-VeloY     )))/(c1o1+q);
+      }
+
+      q = q_dirT[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c2o27* (drho+c9o2*(         vx3)*(         vx3)-cu_sq);
+         (D.f[DIR_00M])[kb]=(c1o1-q)/(c1o1+q)*(f_T-f_B+(f_T+f_B-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_T+f_B)-c2o27*(rhoDiff + c6o1*( VeloZ     )))/(c1o1+q);
+      }
+
+      q = q_dirB[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c2o27* (drho+c9o2*(        -vx3)*(        -vx3)-cu_sq);
+         (D.f[DIR_00P])[kt]=(c1o1-q)/(c1o1+q)*(f_B-f_T+(f_B+f_T-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_B+f_T)-c2o27*(rhoDiff + c6o1*(-VeloZ     )))/(c1o1+q);
+      }
+
+      q = q_dirNE[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
+         (D.f[DIR_MM0])[ksw]=(c1o1-q)/(c1o1+q)*(f_NE-f_SW+(f_NE+f_SW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NE+f_SW)-c1o54*(rhoDiff + c6o1*(VeloX+VeloY)))/(c1o1+q);
+      }
+
+      q = q_dirSW[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
+         (D.f[DIR_PP0])[kne]=(c1o1-q)/(c1o1+q)*(f_SW-f_NE+(f_SW+f_NE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SW+f_NE)-c1o54*(rhoDiff + c6o1*(-VeloX-VeloY)))/(c1o1+q);
+      }
+
+      q = q_dirSE[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
+         (D.f[DIR_MP0])[knw]=(c1o1-q)/(c1o1+q)*(f_SE-f_NW+(f_SE+f_NW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SE+f_NW)-c1o54*(rhoDiff + c6o1*( VeloX-VeloY)))/(c1o1+q);
+      }
+
+      q = q_dirNW[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
+         (D.f[DIR_PM0])[kse]=(c1o1-q)/(c1o1+q)*(f_NW-f_SE+(f_NW+f_SE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NW+f_SE)-c1o54*(rhoDiff + c6o1*(-VeloX+VeloY)))/(c1o1+q);
+      }
+
+      q = q_dirTE[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
+         (D.f[DIR_M0M])[kbw]=(c1o1-q)/(c1o1+q)*(f_TE-f_BW+(f_TE+f_BW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TE+f_BW)-c1o54*(rhoDiff + c6o1*( VeloX+VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirBW[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
+         (D.f[DIR_P0P])[kte]=(c1o1-q)/(c1o1+q)*(f_BW-f_TE+(f_BW+f_TE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BW+f_TE)-c1o54*(rhoDiff + c6o1*(-VeloX-VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirBE[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
+         (D.f[DIR_M0P])[ktw]=(c1o1-q)/(c1o1+q)*(f_BE-f_TW+(f_BE+f_TW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BE+f_TW)-c1o54*(rhoDiff + c6o1*( VeloX-VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirTW[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
+         (D.f[DIR_P0M])[kbe]=(c1o1-q)/(c1o1+q)*(f_TW-f_BE+(f_TW+f_BE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TW+f_BE)-c1o54*(rhoDiff + c6o1*(-VeloX+VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirTN[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
+         (D.f[DIR_0MM])[kbs]=(c1o1-q)/(c1o1+q)*(f_TN-f_BS+(f_TN+f_BS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TN+f_BS)-c1o54*(rhoDiff + c6o1*( VeloY+VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirBS[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
+         (D.f[DIR_0PP])[ktn]=(c1o1-q)/(c1o1+q)*(f_BS-f_TN+(f_BS+f_TN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BS+f_TN)-c1o54*(rhoDiff + c6o1*( -VeloY-VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirBN[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
+         (D.f[DIR_0MP])[kts]=(c1o1-q)/(c1o1+q)*(f_BN-f_TS+(f_BN+f_TS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BN+f_TS)-c1o54*(rhoDiff + c6o1*( VeloY-VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirTS[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o54* (drho+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
+         (D.f[DIR_0PM])[kbn]=(c1o1-q)/(c1o1+q)*(f_TS-f_BN+(f_TS+f_BN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TS+f_BN)-c1o54*(rhoDiff + c6o1*( -VeloY+VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirTNE[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o216*(drho+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+         (D.f[DIR_MMM])[kbsw]=(c1o1-q)/(c1o1+q)*(f_TNE-f_BSW+(f_TNE+f_BSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNE+f_BSW)-c1o216*(rhoDiff + c6o1*( VeloX+VeloY+VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirBSW[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o216*(drho+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+         (D.f[DIR_PPP])[ktne]=(c1o1-q)/(c1o1+q)*(f_BSW-f_TNE+(f_BSW+f_TNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSW+f_TNE)-c1o216*(rhoDiff + c6o1*(-VeloX-VeloY-VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirBNE[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o216*(drho+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+         (D.f[DIR_MMP])[ktsw]=(c1o1-q)/(c1o1+q)*(f_BNE-f_TSW+(f_BNE+f_TSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNE+f_TSW)-c1o216*(rhoDiff + c6o1*( VeloX+VeloY-VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirTSW[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o216*(drho+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+         (D.f[DIR_PPM])[kbne]=(c1o1-q)/(c1o1+q)*(f_TSW-f_BNE+(f_TSW+f_BNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSW+f_BNE)-c1o216*(rhoDiff + c6o1*(-VeloX-VeloY+VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirTSE[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o216*(drho+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+         (D.f[DIR_MPM])[kbnw]=(c1o1-q)/(c1o1+q)*(f_TSE-f_BNW+(f_TSE+f_BNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSE+f_BNW)-c1o216*(rhoDiff + c6o1*( VeloX-VeloY+VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirBNW[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o216*(drho+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+         (D.f[DIR_PMP])[ktse]=(c1o1-q)/(c1o1+q)*(f_BNW-f_TSE+(f_BNW+f_TSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNW+f_TSE)-c1o216*(rhoDiff + c6o1*(-VeloX+VeloY-VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirBSE[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o216*(drho+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+         (D.f[DIR_MPP])[ktnw]=(c1o1-q)/(c1o1+q)*(f_BSE-f_TNW+(f_BSE+f_TNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSE+f_TNW)-c1o216*(rhoDiff + c6o1*( VeloX-VeloY-VeloZ)))/(c1o1+q);
+      }
+
+      q = q_dirTNW[k];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         feq=c1o216*(drho+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+         (D.f[DIR_PMM])[kbse]=(c1o1-q)/(c1o1+q)*(f_TNW-f_BSE+(f_TNW+f_BSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNW+f_BSE)-c1o216*(rhoDiff + c6o1*(-VeloX+VeloY+VeloZ)))/(c1o1+q);
+      }
+   }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/SchlafferBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/SchlafferBCs27.cu
index 8675780d26e63656b04fdfc1f9836b1eba8d1b87..5d4572e234fdcad072e9b666c911f3250c32346a 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/SchlafferBCs27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/SchlafferBCs27.cu
@@ -21,7 +21,7 @@ __global__ void PressSchlaff27(real* rhoBC,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -71,94 +71,94 @@ __global__ void PressSchlaff27(real* rhoBC,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real        f1_E,f1_W,f1_N,f1_S,f1_T,f1_B,f1_NE,f1_SW,f1_SE,f1_NW,f1_TE,f1_BW,f1_BE,f1_TW,f1_TN,f1_BS,f1_BN,f1_TS,f1_ZERO,f1_TNE,f1_TSW,f1_TSE,f1_TNW,f1_BNE,f1_BSW,f1_BSE,f1_BNW;
 
-      f1_E    = (D.f[DIR_P00   ])[ke   ];
-      f1_W    = (D.f[DIR_M00   ])[kw   ];
-      f1_N    = (D.f[DIR_0P0   ])[kn   ];
-      f1_S    = (D.f[DIR_0M0   ])[ks   ];
-      f1_T    = (D.f[DIR_00P   ])[kt   ];
-      f1_B    = (D.f[DIR_00M   ])[kb   ];
-      f1_NE   = (D.f[DIR_PP0  ])[kne  ];
-      f1_SW   = (D.f[DIR_MM0  ])[ksw  ];
-      f1_SE   = (D.f[DIR_PM0  ])[kse  ];
-      f1_NW   = (D.f[DIR_MP0  ])[knw  ];
-      f1_TE   = (D.f[DIR_P0P  ])[kte  ];
-      f1_BW   = (D.f[DIR_M0M  ])[kbw  ];
-      f1_BE   = (D.f[DIR_P0M  ])[kbe  ];
-      f1_TW   = (D.f[DIR_M0P  ])[ktw  ];
-      f1_TN   = (D.f[DIR_0PP  ])[ktn  ];
-      f1_BS   = (D.f[DIR_0MM  ])[kbs  ];
-      f1_BN   = (D.f[DIR_0PM  ])[kbn  ];
-      f1_TS   = (D.f[DIR_0MP  ])[kts  ];
+      f1_E    = (D.f[DIR_P00])[ke   ];
+      f1_W    = (D.f[DIR_M00])[kw   ];
+      f1_N    = (D.f[DIR_0P0])[kn   ];
+      f1_S    = (D.f[DIR_0M0])[ks   ];
+      f1_T    = (D.f[DIR_00P])[kt   ];
+      f1_B    = (D.f[DIR_00M])[kb   ];
+      f1_NE   = (D.f[DIR_PP0])[kne  ];
+      f1_SW   = (D.f[DIR_MM0])[ksw  ];
+      f1_SE   = (D.f[DIR_PM0])[kse  ];
+      f1_NW   = (D.f[DIR_MP0])[knw  ];
+      f1_TE   = (D.f[DIR_P0P])[kte  ];
+      f1_BW   = (D.f[DIR_M0M])[kbw  ];
+      f1_BE   = (D.f[DIR_P0M])[kbe  ];
+      f1_TW   = (D.f[DIR_M0P])[ktw  ];
+      f1_TN   = (D.f[DIR_0PP])[ktn  ];
+      f1_BS   = (D.f[DIR_0MM])[kbs  ];
+      f1_BN   = (D.f[DIR_0PM])[kbn  ];
+      f1_TS   = (D.f[DIR_0MP])[kts  ];
       f1_ZERO = (D.f[DIR_000])[kzero];
-      f1_TNE  = (D.f[DIR_PPP ])[ktne ];
-      f1_TSW  = (D.f[DIR_MMP ])[ktsw ];
-      f1_TSE  = (D.f[DIR_PMP ])[ktse ];
-      f1_TNW  = (D.f[DIR_MPP ])[ktnw ];
-      f1_BNE  = (D.f[DIR_PPM ])[kbne ];
-      f1_BSW  = (D.f[DIR_MMM ])[kbsw ];
-      f1_BSE  = (D.f[DIR_PMM ])[kbse ];
-      f1_BNW  = (D.f[DIR_MPM ])[kbnw ];
+      f1_TNE  = (D.f[DIR_PPP])[ktne ];
+      f1_TSW  = (D.f[DIR_MMP])[ktsw ];
+      f1_TSE  = (D.f[DIR_PMP])[ktse ];
+      f1_TNW  = (D.f[DIR_MPP])[ktnw ];
+      f1_BNE  = (D.f[DIR_PPM])[kbne ];
+      f1_BSW  = (D.f[DIR_MMM])[kbsw ];
+      f1_BSE  = (D.f[DIR_PMM])[kbse ];
+      f1_BNW  = (D.f[DIR_MPM])[kbnw ];
       //////////////////////////////////////////////////////////////////////////
       real cs       = c1o1/sqrt(c3o1);
       real csp1     = cs + c1o1;
@@ -222,15 +222,15 @@ __global__ void PressSchlaff27(real* rhoBC,
 
       deltaVz0[k] = tempDeltaV;
 
-      (D.f[DIR_00M   ])[kb   ] = f1_B   ;
-      (D.f[DIR_M0M  ])[kbw  ] = f1_BW  ;
-      (D.f[DIR_P0M  ])[kbe  ] = f1_BE  ;
-      (D.f[DIR_0MM  ])[kbs  ] = f1_BS  ;
-      (D.f[DIR_0PM  ])[kbn  ] = f1_BN  ;
-      (D.f[DIR_PPM ])[kbne ] = f1_BNE ;
-      (D.f[DIR_MMM ])[kbsw ] = f1_BSW ;
-      (D.f[DIR_PMM ])[kbse ] = f1_BSE ;
-      (D.f[DIR_MPM ])[kbnw ] = f1_BNW ;
+      (D.f[DIR_00M])[kb   ] = f1_B   ;
+      (D.f[DIR_M0M])[kbw  ] = f1_BW  ;
+      (D.f[DIR_P0M])[kbe  ] = f1_BE  ;
+      (D.f[DIR_0MM])[kbs  ] = f1_BS  ;
+      (D.f[DIR_0PM])[kbn  ] = f1_BN  ;
+      (D.f[DIR_PPM])[kbne ] = f1_BNE ;
+      (D.f[DIR_MMM])[kbsw ] = f1_BSW ;
+      (D.f[DIR_PMM])[kbse ] = f1_BSE ;
+      (D.f[DIR_MPM])[kbnw ] = f1_BNW ;
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -285,7 +285,7 @@ __global__ void VelSchlaff27(  int t,
                                           unsigned int* neighborX,
                                           unsigned int* neighborY,
                                           unsigned int* neighborZ,
-                                          unsigned int size_Mat,
+                                          unsigned long long numberOfLBnodes,
                                           bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -335,122 +335,122 @@ __global__ void VelSchlaff27(  int t,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       }
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real        f1_E,f1_W,f1_N,f1_S,f1_T,f1_B,f1_NE,f1_SW,f1_SE,f1_NW,f1_TE,f1_BW,f1_BE,f1_TW,f1_TN,f1_BS,f1_BN,f1_TS,f1_ZERO,
                      f1_TNE,f1_TSW,f1_TSE,f1_TNW,f1_BNE,f1_BSW,f1_BSE,f1_BNW;
 
-      f1_E    = (D.f[DIR_P00   ])[ke   ];
-      f1_W    = (D.f[DIR_M00   ])[kw   ];
-      f1_N    = (D.f[DIR_0P0   ])[kn   ];
-      f1_S    = (D.f[DIR_0M0   ])[ks   ];
-      f1_T    = (D.f[DIR_00P   ])[kt   ];
-      f1_B    = (D.f[DIR_00M   ])[kb   ];
-      f1_NE   = (D.f[DIR_PP0  ])[kne  ];
-      f1_SW   = (D.f[DIR_MM0  ])[ksw  ];
-      f1_SE   = (D.f[DIR_PM0  ])[kse  ];
-      f1_NW   = (D.f[DIR_MP0  ])[knw  ];
-      f1_TE   = (D.f[DIR_P0P  ])[kte  ];
-      f1_BW   = (D.f[DIR_M0M  ])[kbw  ];
-      f1_BE   = (D.f[DIR_P0M  ])[kbe  ];
-      f1_TW   = (D.f[DIR_M0P  ])[ktw  ];
-      f1_TN   = (D.f[DIR_0PP  ])[ktn  ];
-      f1_BS   = (D.f[DIR_0MM  ])[kbs  ];
-      f1_BN   = (D.f[DIR_0PM  ])[kbn  ];
-      f1_TS   = (D.f[DIR_0MP  ])[kts  ];
+      f1_E    = (D.f[DIR_P00])[ke   ];
+      f1_W    = (D.f[DIR_M00])[kw   ];
+      f1_N    = (D.f[DIR_0P0])[kn   ];
+      f1_S    = (D.f[DIR_0M0])[ks   ];
+      f1_T    = (D.f[DIR_00P])[kt   ];
+      f1_B    = (D.f[DIR_00M])[kb   ];
+      f1_NE   = (D.f[DIR_PP0])[kne  ];
+      f1_SW   = (D.f[DIR_MM0])[ksw  ];
+      f1_SE   = (D.f[DIR_PM0])[kse  ];
+      f1_NW   = (D.f[DIR_MP0])[knw  ];
+      f1_TE   = (D.f[DIR_P0P])[kte  ];
+      f1_BW   = (D.f[DIR_M0M])[kbw  ];
+      f1_BE   = (D.f[DIR_P0M])[kbe  ];
+      f1_TW   = (D.f[DIR_M0P])[ktw  ];
+      f1_TN   = (D.f[DIR_0PP])[ktn  ];
+      f1_BS   = (D.f[DIR_0MM])[kbs  ];
+      f1_BN   = (D.f[DIR_0PM])[kbn  ];
+      f1_TS   = (D.f[DIR_0MP])[kts  ];
       f1_ZERO = (D.f[DIR_000])[kzero];
-      f1_TNE  = (D.f[DIR_PPP ])[ktne ];
-      f1_TSW  = (D.f[DIR_MMP ])[ktsw ];
-      f1_TSE  = (D.f[DIR_PMP ])[ktse ];
-      f1_TNW  = (D.f[DIR_MPP ])[ktnw ];
-      f1_BNE  = (D.f[DIR_PPM ])[kbne ];
-      f1_BSW  = (D.f[DIR_MMM ])[kbsw ];
-      f1_BSE  = (D.f[DIR_PMM ])[kbse ];
-      f1_BNW  = (D.f[DIR_MPM ])[kbnw ];
-      //f1_W    = (D.f[DIR_P00   ])[ke   ];
-      //f1_E    = (D.f[DIR_M00   ])[kw   ];
-      //f1_S    = (D.f[DIR_0P0   ])[kn   ];
-      //f1_N    = (D.f[DIR_0M0   ])[ks   ];
-      //f1_B    = (D.f[DIR_00P   ])[kt   ];
-      //f1_T    = (D.f[DIR_00M   ])[kb   ];
-      //f1_SW   = (D.f[DIR_PP0  ])[kne  ];
-      //f1_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      //f1_NW   = (D.f[DIR_PM0  ])[kse  ];
-      //f1_SE   = (D.f[DIR_MP0  ])[knw  ];
-      //f1_BW   = (D.f[DIR_P0P  ])[kte  ];
-      //f1_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      //f1_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      //f1_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      //f1_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      //f1_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      //f1_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      //f1_BN   = (D.f[DIR_0MP  ])[kts  ];
+      f1_TNE  = (D.f[DIR_PPP])[ktne ];
+      f1_TSW  = (D.f[DIR_MMP])[ktsw ];
+      f1_TSE  = (D.f[DIR_PMP])[ktse ];
+      f1_TNW  = (D.f[DIR_MPP])[ktnw ];
+      f1_BNE  = (D.f[DIR_PPM])[kbne ];
+      f1_BSW  = (D.f[DIR_MMM])[kbsw ];
+      f1_BSE  = (D.f[DIR_PMM])[kbse ];
+      f1_BNW  = (D.f[DIR_MPM])[kbnw ];
+      //f1_W    = (D.f[DIR_P00])[ke   ];
+      //f1_E    = (D.f[DIR_M00])[kw   ];
+      //f1_S    = (D.f[DIR_0P0])[kn   ];
+      //f1_N    = (D.f[DIR_0M0])[ks   ];
+      //f1_B    = (D.f[DIR_00P])[kt   ];
+      //f1_T    = (D.f[DIR_00M])[kb   ];
+      //f1_SW   = (D.f[DIR_PP0])[kne  ];
+      //f1_NE   = (D.f[DIR_MM0])[ksw  ];
+      //f1_NW   = (D.f[DIR_PM0])[kse  ];
+      //f1_SE   = (D.f[DIR_MP0])[knw  ];
+      //f1_BW   = (D.f[DIR_P0P])[kte  ];
+      //f1_TE   = (D.f[DIR_M0M])[kbw  ];
+      //f1_TW   = (D.f[DIR_P0M])[kbe  ];
+      //f1_BE   = (D.f[DIR_M0P])[ktw  ];
+      //f1_BS   = (D.f[DIR_0PP])[ktn  ];
+      //f1_TN   = (D.f[DIR_0MM])[kbs  ];
+      //f1_TS   = (D.f[DIR_0PM])[kbn  ];
+      //f1_BN   = (D.f[DIR_0MP])[kts  ];
       //f1_ZERO = (D.f[DIR_000])[kzero];
-      //f1_BSW  = (D.f[DIR_PPP ])[ktne ];
-      //f1_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      //f1_BNW  = (D.f[DIR_PMP ])[ktse ];
-      //f1_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      //f1_TSW  = (D.f[DIR_PPM ])[kbne ];
-      //f1_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      //f1_TNW  = (D.f[DIR_PMM ])[kbse ];
-      //f1_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      //f1_BSW  = (D.f[DIR_PPP])[ktne ];
+      //f1_BNE  = (D.f[DIR_MMP])[ktsw ];
+      //f1_BNW  = (D.f[DIR_PMP])[ktse ];
+      //f1_BSE  = (D.f[DIR_MPP])[ktnw ];
+      //f1_TSW  = (D.f[DIR_PPM])[kbne ];
+      //f1_TNE  = (D.f[DIR_MMM])[kbsw ];
+      //f1_TNW  = (D.f[DIR_PMM])[kbse ];
+      //f1_TSE  = (D.f[DIR_MPM])[kbnw ];
       //////////////////////////////////////////////////////////////////////////
       real cs       = c1o1/sqrt(c3o1);
       real csp1     = cs + c1o1;
@@ -522,64 +522,64 @@ __global__ void VelSchlaff27(  int t,
       f1_TNW = f1_BSE - c1o36 * (VX - VY - VZ);
 
       deltaVz0[k] = tempDeltaV;
-      (D.f[DIR_00P   ])[kt   ] = f1_T  ;
-      (D.f[DIR_P0P  ])[kte  ] = f1_TE ;
-      (D.f[DIR_M0P  ])[ktw  ] = f1_TW ;
-      (D.f[DIR_0PP  ])[ktn  ] = f1_TN ;
-      (D.f[DIR_0MP  ])[kts  ] = f1_TS ;
-      (D.f[DIR_PPP ])[ktne ] = f1_TNE;
-      (D.f[DIR_MMP ])[ktsw ] = f1_TSW;
-      (D.f[DIR_PMP ])[ktse ] = f1_TSE;
-      (D.f[DIR_MPP ])[ktnw ] = f1_TNW;
-
-      //(D.f[DIR_00M   ])[kb   ] = f1_B   ;
-      //(D.f[DIR_M0M  ])[kbw  ] = f1_BW  ;
-      //(D.f[DIR_P0M  ])[kbe  ] = f1_BE  ;
-      //(D.f[DIR_0MM  ])[kbs  ] = f1_BS  ;
-      //(D.f[DIR_0PM  ])[kbn  ] = f1_BN  ;
-      //(D.f[DIR_PPM ])[kbne ] = f1_BNE ;
-      //(D.f[DIR_MMM ])[kbsw ] = f1_BSW ;
-      //(D.f[DIR_PMM ])[kbse ] = f1_BSE ;
-      //(D.f[DIR_MPM ])[kbnw ] = f1_BNW ;
-
-
-      //(D.f[DIR_00P   ])[kt   ] = f1_B  ;
-      //(D.f[DIR_P0P  ])[kte  ] = f1_BW ;
-      //(D.f[DIR_M0P  ])[ktw  ] = f1_BE ;
-      //(D.f[DIR_0PP  ])[ktn  ] = f1_BS ;
-      //(D.f[DIR_0MP  ])[kts  ] = f1_BN ;
-      //(D.f[DIR_PPP ])[ktne ] = f1_BSW;
-      //(D.f[DIR_MMP ])[ktsw ] = f1_BNE;
-      //(D.f[DIR_PMP ])[ktse ] = f1_BNW;
-      //(D.f[DIR_MPP ])[ktnw ] = f1_BSE;
-
-      //(D.f[DIR_P00   ])[ke   ] = f1_W   -c2over27*drho1;
-      //(D.f[DIR_M00   ])[kw   ] = f1_E   -c2over27*drho1;
-      //(D.f[DIR_0P0   ])[kn   ] = f1_S   -c2over27*drho1;
-      //(D.f[DIR_0M0   ])[ks   ] = f1_N   -c2over27*drho1;
-      //(D.f[DIR_00P   ])[kt   ] = f1_B   -c2over27*drho1;
-      //(D.f[DIR_00M   ])[kb   ] = f1_T   -c2over27*drho1;
-      //(D.f[DIR_PP0  ])[kne  ] = f1_SW  -c1over54*drho1;
-      //(D.f[DIR_MM0  ])[ksw  ] = f1_NE  -c1over54*drho1;
-      //(D.f[DIR_PM0  ])[kse  ] = f1_NW  -c1over54*drho1;
-      //(D.f[DIR_MP0  ])[knw  ] = f1_SE  -c1over54*drho1;
-      //(D.f[DIR_P0P  ])[kte  ] = f1_BW  -c1over54*drho1;
-      //(D.f[DIR_M0M  ])[kbw  ] = f1_TE  -c1over54*drho1;
-      //(D.f[DIR_P0M  ])[kbe  ] = f1_TW  -c1over54*drho1;
-      //(D.f[DIR_M0P  ])[ktw  ] = f1_BE  -c1over54*drho1;
-      //(D.f[DIR_0PP  ])[ktn  ] = f1_BS  -c1over54*drho1;
-      //(D.f[DIR_0MM  ])[kbs  ] = f1_TN  -c1over54*drho1;
-      //(D.f[DIR_0PM  ])[kbn  ] = f1_TS  -c1over54*drho1;
-      //(D.f[DIR_0MP  ])[kts  ] = f1_BN  -c1over54*drho1;
+      (D.f[DIR_00P])[kt   ] = f1_T  ;
+      (D.f[DIR_P0P])[kte  ] = f1_TE ;
+      (D.f[DIR_M0P])[ktw  ] = f1_TW ;
+      (D.f[DIR_0PP])[ktn  ] = f1_TN ;
+      (D.f[DIR_0MP])[kts  ] = f1_TS ;
+      (D.f[DIR_PPP])[ktne ] = f1_TNE;
+      (D.f[DIR_MMP])[ktsw ] = f1_TSW;
+      (D.f[DIR_PMP])[ktse ] = f1_TSE;
+      (D.f[DIR_MPP])[ktnw ] = f1_TNW;
+
+      //(D.f[DIR_00M])[kb   ] = f1_B   ;
+      //(D.f[DIR_M0M])[kbw  ] = f1_BW  ;
+      //(D.f[DIR_P0M])[kbe  ] = f1_BE  ;
+      //(D.f[DIR_0MM])[kbs  ] = f1_BS  ;
+      //(D.f[DIR_0PM])[kbn  ] = f1_BN  ;
+      //(D.f[DIR_PPM])[kbne ] = f1_BNE ;
+      //(D.f[DIR_MMM])[kbsw ] = f1_BSW ;
+      //(D.f[DIR_PMM])[kbse ] = f1_BSE ;
+      //(D.f[DIR_MPM])[kbnw ] = f1_BNW ;
+
+
+      //(D.f[DIR_00P])[kt   ] = f1_B  ;
+      //(D.f[DIR_P0P])[kte  ] = f1_BW ;
+      //(D.f[DIR_M0P])[ktw  ] = f1_BE ;
+      //(D.f[DIR_0PP])[ktn  ] = f1_BS ;
+      //(D.f[DIR_0MP])[kts  ] = f1_BN ;
+      //(D.f[DIR_PPP])[ktne ] = f1_BSW;
+      //(D.f[DIR_MMP])[ktsw ] = f1_BNE;
+      //(D.f[DIR_PMP])[ktse ] = f1_BNW;
+      //(D.f[DIR_MPP])[ktnw ] = f1_BSE;
+
+      //(D.f[DIR_P00])[ke   ] = f1_W   -c2over27*drho1;
+      //(D.f[DIR_M00])[kw   ] = f1_E   -c2over27*drho1;
+      //(D.f[DIR_0P0])[kn   ] = f1_S   -c2over27*drho1;
+      //(D.f[DIR_0M0])[ks   ] = f1_N   -c2over27*drho1;
+      //(D.f[DIR_00P])[kt   ] = f1_B   -c2over27*drho1;
+      //(D.f[DIR_00M])[kb   ] = f1_T   -c2over27*drho1;
+      //(D.f[DIR_PP0])[kne  ] = f1_SW  -c1over54*drho1;
+      //(D.f[DIR_MM0])[ksw  ] = f1_NE  -c1over54*drho1;
+      //(D.f[DIR_PM0])[kse  ] = f1_NW  -c1over54*drho1;
+      //(D.f[DIR_MP0])[knw  ] = f1_SE  -c1over54*drho1;
+      //(D.f[DIR_P0P])[kte  ] = f1_BW  -c1over54*drho1;
+      //(D.f[DIR_M0M])[kbw  ] = f1_TE  -c1over54*drho1;
+      //(D.f[DIR_P0M])[kbe  ] = f1_TW  -c1over54*drho1;
+      //(D.f[DIR_M0P])[ktw  ] = f1_BE  -c1over54*drho1;
+      //(D.f[DIR_0PP])[ktn  ] = f1_BS  -c1over54*drho1;
+      //(D.f[DIR_0MM])[kbs  ] = f1_TN  -c1over54*drho1;
+      //(D.f[DIR_0PM])[kbn  ] = f1_TS  -c1over54*drho1;
+      //(D.f[DIR_0MP])[kts  ] = f1_BN  -c1over54*drho1;
       //(D.f[DIR_000])[kzero] = f1_ZERO-c8over27*drho1;
-      //(D.f[DIR_PPP ])[ktne ] = f1_BSW -c1over216*drho1;
-      //(D.f[DIR_MMP ])[ktsw ] = f1_BNE -c1over216*drho1;
-      //(D.f[DIR_PMP ])[ktse ] = f1_BNW -c1over216*drho1;
-      //(D.f[DIR_MPP ])[ktnw ] = f1_BSE -c1over216*drho1;
-      //(D.f[DIR_PPM ])[kbne ] = f1_TSW -c1over216*drho1;
-      //(D.f[DIR_MMM ])[kbsw ] = f1_TNE -c1over216*drho1;
-      //(D.f[DIR_PMM ])[kbse ] = f1_TNW -c1over216*drho1;
-      //(D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1over216*drho1;
+      //(D.f[DIR_PPP])[ktne ] = f1_BSW -c1over216*drho1;
+      //(D.f[DIR_MMP])[ktsw ] = f1_BNE -c1over216*drho1;
+      //(D.f[DIR_PMP])[ktse ] = f1_BNW -c1over216*drho1;
+      //(D.f[DIR_MPP])[ktnw ] = f1_BSE -c1over216*drho1;
+      //(D.f[DIR_PPM])[kbne ] = f1_TSW -c1over216*drho1;
+      //(D.f[DIR_MMM])[kbsw ] = f1_TNE -c1over216*drho1;
+      //(D.f[DIR_PMM])[kbse ] = f1_TNW -c1over216*drho1;
+      //(D.f[DIR_MPM])[kbnw ] = f1_TSE -c1over216*drho1;
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/GPU/SetForcing27.cu b/src/gpu/VirtualFluids_GPU/GPU/SetForcing27.cu
index 8dbf2c670a549f9a6afe581510205c31246b50cb..07fc5853eb7042d5567c38a03cb27418142bf642 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/SetForcing27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/SetForcing27.cu
@@ -16,69 +16,69 @@ __global__ void GetVeloforForcing27( real* DD,
 												unsigned int* neighborX,
 												unsigned int* neighborY,
 												unsigned int* neighborZ,
-												unsigned int size_Mat, 
+												unsigned long long numberOfLBnodes, 
 												bool isEvenTimestep)
 {
 	Distributions27 D;
 	if (isEvenTimestep==false)
 	{
-		D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	} 
 	else
 	{
-		D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+		D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -123,33 +123,33 @@ __global__ void GetVeloforForcing27( real* DD,
 		unsigned int ktne = KQK;
 		unsigned int kbsw = neighborZ[ksw];
 		////////////////////////////////////////////////////////////////////////////////
-		real mfcbb = (D.f[DIR_P00   ])[ke   ];
-		real mfabb = (D.f[DIR_M00   ])[kw   ];
-		real mfbcb = (D.f[DIR_0P0   ])[kn   ];
-		real mfbab = (D.f[DIR_0M0   ])[ks   ];
-		real mfbbc = (D.f[DIR_00P   ])[kt   ];
-		real mfbba = (D.f[DIR_00M   ])[kb   ];
-		real mfccb = (D.f[DIR_PP0  ])[kne  ];
-		real mfaab = (D.f[DIR_MM0  ])[ksw  ];
-		real mfcab = (D.f[DIR_PM0  ])[kse  ];
-		real mfacb = (D.f[DIR_MP0  ])[knw  ];
-		real mfcbc = (D.f[DIR_P0P  ])[kte  ];
-		real mfaba = (D.f[DIR_M0M  ])[kbw  ];
-		real mfcba = (D.f[DIR_P0M  ])[kbe  ];
-		real mfabc = (D.f[DIR_M0P  ])[ktw  ];
-		real mfbcc = (D.f[DIR_0PP  ])[ktn  ];
-		real mfbaa = (D.f[DIR_0MM  ])[kbs  ];
-		real mfbca = (D.f[DIR_0PM  ])[kbn  ];
-		real mfbac = (D.f[DIR_0MP  ])[kts  ];
+		real mfcbb = (D.f[DIR_P00])[ke   ];
+		real mfabb = (D.f[DIR_M00])[kw   ];
+		real mfbcb = (D.f[DIR_0P0])[kn   ];
+		real mfbab = (D.f[DIR_0M0])[ks   ];
+		real mfbbc = (D.f[DIR_00P])[kt   ];
+		real mfbba = (D.f[DIR_00M])[kb   ];
+		real mfccb = (D.f[DIR_PP0])[kne  ];
+		real mfaab = (D.f[DIR_MM0])[ksw  ];
+		real mfcab = (D.f[DIR_PM0])[kse  ];
+		real mfacb = (D.f[DIR_MP0])[knw  ];
+		real mfcbc = (D.f[DIR_P0P])[kte  ];
+		real mfaba = (D.f[DIR_M0M])[kbw  ];
+		real mfcba = (D.f[DIR_P0M])[kbe  ];
+		real mfabc = (D.f[DIR_M0P])[ktw  ];
+		real mfbcc = (D.f[DIR_0PP])[ktn  ];
+		real mfbaa = (D.f[DIR_0MM])[kbs  ];
+		real mfbca = (D.f[DIR_0PM])[kbn  ];
+		real mfbac = (D.f[DIR_0MP])[kts  ];
 		real mfbbb = (D.f[DIR_000])[kzero];
-		real mfccc = (D.f[DIR_PPP ])[ktne ];
-		real mfaac = (D.f[DIR_MMP ])[ktsw ];
-		real mfcac = (D.f[DIR_PMP ])[ktse ];
-		real mfacc = (D.f[DIR_MPP ])[ktnw ];
-		real mfcca = (D.f[DIR_PPM ])[kbne ];
-		real mfaaa = (D.f[DIR_MMM ])[kbsw ];
-		real mfcaa = (D.f[DIR_PMM ])[kbse ];
-		real mfaca = (D.f[DIR_MPM ])[kbnw ];
+		real mfccc = (D.f[DIR_PPP])[ktne ];
+		real mfaac = (D.f[DIR_MMP])[ktsw ];
+		real mfcac = (D.f[DIR_PMP])[ktse ];
+		real mfacc = (D.f[DIR_MPP])[ktnw ];
+		real mfcca = (D.f[DIR_PPM])[kbne ];
+		real mfaaa = (D.f[DIR_MMM])[kbsw ];
+		real mfcaa = (D.f[DIR_PMM])[kbse ];
+		real mfaca = (D.f[DIR_MPM])[kbnw ];
 		////////////////////////////////////////////////////////////////////////////////////
 		real rho   = (mfccc+mfaaa + mfaca+mfcac + mfacc+mfcaa + mfaac+mfcca + 
 					 	 mfbac+mfbca + mfbaa+mfbcc + mfabc+mfcba + mfaba+mfcbc + mfacb+mfcab + mfaab+mfccb +
diff --git a/src/gpu/VirtualFluids_GPU/GPU/SlipBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/SlipBCs27.cu
index c7e3f3fa747d0555206c230b2f56ca0149cffdfc..dcbb67ffdddce8f01678a92b029fed9842d12043 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/SlipBCs27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/SlipBCs27.cu
@@ -17,10 +17,10 @@ __global__ void QSlipDevice27(real* DD,
                                          unsigned int* neighborX,
                                          unsigned int* neighborY,
                                          unsigned int* neighborZ,
-                                         unsigned int size_Mat, 
+                                         unsigned long long numberOfLBnodes, 
                                          bool isEvenTimestep)
 {
-   Distributions27 D = vf::gpu::getDistributionReferences27(DD, size_Mat, isEvenTimestep);
+   Distributions27 D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, isEvenTimestep);
 
    // Distributions27 D;
    // if (isEvenTimestep==true)
@@ -102,24 +102,24 @@ __global__ void QSlipDevice27(real* DD,
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -159,32 +159,32 @@ __global__ void QSlipDevice27(real* DD,
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[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 +
@@ -208,7 +208,7 @@ __global__ void QSlipDevice27(real* DD,
 
       //////////////////////////////////////////////////////////////////////////
 
-      D = vf::gpu::getDistributionReferences27(DD, size_Mat, !isEvenTimestep);
+      D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, !isEvenTimestep);
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
       //(D.f[DIR_000])[k]=c1o10;
@@ -612,7 +612,7 @@ __global__ void QSlipDeviceComp27(
                                     unsigned int* neighborX,
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
-                                    unsigned int numberOfLBnodes, 
+                                    unsigned long long numberOfLBnodes, 
                                     bool isEvenTimestep)
 {
    //! The slip boundary condition is executed in the following steps
@@ -679,32 +679,32 @@ __global__ void QSlipDeviceComp27(
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - Calculate macroscopic quantities
@@ -1124,7 +1124,7 @@ __global__ void BBSlipDeviceComp27(
                                     unsigned int* neighborX,
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
-                                    unsigned int numberOfLBnodes, 
+                                    unsigned long long numberOfLBnodes, 
                                     bool isEvenTimestep)
 {
    //! The slip boundary condition is executed in the following steps
@@ -1189,32 +1189,32 @@ __global__ void BBSlipDeviceComp27(
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - Calculate macroscopic quantities
@@ -1235,7 +1235,7 @@ __global__ void BBSlipDeviceComp27(
                    (-(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);
+      // real cu_sq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3) * (c1o1 + drho);
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - change the pointer to write the results in the correct array
@@ -1592,7 +1592,7 @@ __global__ void QSlipDeviceComp27TurbViscosity(
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
                                     real* turbViscosity,
-                                    unsigned int numberOfLBnodes, 
+                                    unsigned long long numberOfLBnodes, 
                                     bool isEvenTimestep)
 {
    //! The slip boundary condition is executed in the following steps
@@ -1659,32 +1659,32 @@ __global__ void QSlipDeviceComp27TurbViscosity(
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - Calculate macroscopic quantities
@@ -2110,7 +2110,7 @@ __global__ void QSlipPressureDeviceComp27TurbViscosity(
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
                                     real* turbViscosity,
-                                    unsigned int numberOfLBnodes, 
+                                    unsigned long long numberOfLBnodes, 
                                     bool isEvenTimestep)
 {
    //! The slip boundary condition is executed in the following steps
@@ -2177,32 +2177,32 @@ __global__ void QSlipPressureDeviceComp27TurbViscosity(
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - Calculate macroscopic quantities
@@ -2631,63 +2631,63 @@ __global__ void QSlipPressureDeviceComp27TurbViscosity(
 //    Distributions27 D;
 //    if (isEvenTimestep==true)
 //    {
-//       D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-//       D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-//       D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-//       D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-//       D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-//       D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-//       D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-//       D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-//       D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-//       D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-//       D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-//       D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-//       D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-//       D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-//       D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-//       D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-//       D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-//       D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-//       D.f[DIR_000] = &DD[DIR_000*size_Mat];
-//       D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-//       D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-//       D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-//       D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-//       D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-//       D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-//       D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-//       D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+//       D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+//       D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+//       D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+//       D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+//       D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+//       D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+//       D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+//       D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+//       D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+//       D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+//       D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+//       D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+//       D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+//       D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+//       D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+//       D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+//       D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+//       D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+//       D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+//       D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+//       D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+//       D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+//       D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+//       D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+//       D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+//       D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+//       D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
 //    } 
 //    else
 //    {
-//       D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-//       D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-//       D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-//       D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-//       D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-//       D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-//       D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-//       D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-//       D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-//       D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-//       D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-//       D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-//       D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-//       D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-//       D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-//       D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-//       D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-//       D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-//       D.f[DIR_000] = &DD[DIR_000*size_Mat];
-//       D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-//       D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-//       D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-//       D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-//       D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-//       D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-//       D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-//       D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+//       D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+//       D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+//       D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+//       D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+//       D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+//       D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+//       D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+//       D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+//       D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+//       D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+//       D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+//       D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+//       D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+//       D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+//       D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+//       D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+//       D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+//       D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+//       D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+//       D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+//       D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+//       D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+//       D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+//       D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+//       D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+//       D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+//       D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
 //    }
 //    ////////////////////////////////////////////////////////////////////////////////
 //    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -2708,24 +2708,24 @@ __global__ void QSlipPressureDeviceComp27TurbViscosity(
 //             *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[DIR_P00   * numberOfBCnodes];
-//       q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-//       q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-//       q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-//       q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-//       q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-//       q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-//       q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-//       q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-//       q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-//       q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-//       q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-//       q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-//       q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-//       q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-//       q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-//       q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-//       q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+//       q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+//       q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+//       q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+//       q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+//       q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+//       q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+//       q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+//       q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+//       q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+//       q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+//       q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+//       q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+//       q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+//       q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+//       q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+//       q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+//       q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+//       q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
 //       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
 //       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
 //       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -2766,32 +2766,32 @@ __global__ void QSlipPressureDeviceComp27TurbViscosity(
 //       unsigned int kbsw = neighborZ[ksw];
       
 //       ////////////////////////////////////////////////////////////////////////////////
-//       real f_W    = (D.f[DIR_P00   ])[ke   ];
-//       real f_E    = (D.f[DIR_M00   ])[kw   ];
-//       real f_S    = (D.f[DIR_0P0   ])[kn   ];
-//       real f_N    = (D.f[DIR_0M0   ])[ks   ];
-//       real f_B    = (D.f[DIR_00P   ])[kt   ];
-//       real f_T    = (D.f[DIR_00M   ])[kb   ];
-//       real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-//       real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-//       real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-//       real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-//       real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-//       real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-//       real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-//       real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-//       real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-//       real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-//       real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-//       real f_BN   = (D.f[DIR_0MP  ])[kts  ];
-//       real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-//       real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-//       real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-//       real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-//       real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-//       real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-//       real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-//       real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+//       real f_W    = (D.f[DIR_P00])[ke   ];
+//       real f_E    = (D.f[DIR_M00])[kw   ];
+//       real f_S    = (D.f[DIR_0P0])[kn   ];
+//       real f_N    = (D.f[DIR_0M0])[ks   ];
+//       real f_B    = (D.f[DIR_00P])[kt   ];
+//       real f_T    = (D.f[DIR_00M])[kb   ];
+//       real f_SW   = (D.f[DIR_PP0])[kne  ];
+//       real f_NE   = (D.f[DIR_MM0])[ksw  ];
+//       real f_NW   = (D.f[DIR_PM0])[kse  ];
+//       real f_SE   = (D.f[DIR_MP0])[knw  ];
+//       real f_BW   = (D.f[DIR_P0P])[kte  ];
+//       real f_TE   = (D.f[DIR_M0M])[kbw  ];
+//       real f_TW   = (D.f[DIR_P0M])[kbe  ];
+//       real f_BE   = (D.f[DIR_M0P])[ktw  ];
+//       real f_BS   = (D.f[DIR_0PP])[ktn  ];
+//       real f_TN   = (D.f[DIR_0MM])[kbs  ];
+//       real f_TS   = (D.f[DIR_0PM])[kbn  ];
+//       real f_BN   = (D.f[DIR_0MP])[kts  ];
+//       real f_BSW  = (D.f[DIR_PPP])[ktne ];
+//       real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+//       real f_BNW  = (D.f[DIR_PMP])[ktse ];
+//       real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+//       real f_TSW  = (D.f[DIR_PPM])[kbne ];
+//       real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+//       real f_TNW  = (D.f[DIR_PMM])[kbse ];
+//       real f_TSE  = (D.f[DIR_MPM])[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 +
@@ -2816,63 +2816,63 @@ __global__ void QSlipPressureDeviceComp27TurbViscosity(
 //       //////////////////////////////////////////////////////////////////////////
 //       if (isEvenTimestep==false)
 //       {
-//          D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-//          D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-//          D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-//          D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-//          D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-//          D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-//          D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-//          D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-//          D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-//          D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-//          D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-//          D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-//          D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-//          D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-//          D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-//          D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-//          D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-//          D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-//          D.f[DIR_000] = &DD[DIR_000*size_Mat];
-//          D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-//          D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-//          D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-//          D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-//          D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-//          D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-//          D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-//          D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+//          D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+//          D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+//          D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+//          D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+//          D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+//          D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+//          D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+//          D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+//          D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+//          D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+//          D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+//          D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+//          D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+//          D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+//          D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+//          D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+//          D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+//          D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+//          D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+//          D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+//          D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+//          D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+//          D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+//          D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+//          D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+//          D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+//          D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
 //       } 
 //       else
 //       {
-//          D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-//          D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-//          D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-//          D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-//          D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-//          D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-//          D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-//          D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-//          D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-//          D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-//          D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-//          D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-//          D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-//          D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-//          D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-//          D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-//          D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-//          D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-//          D.f[DIR_000] = &DD[DIR_000*size_Mat];
-//          D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-//          D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-//          D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-//          D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-//          D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-//          D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-//          D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-//          D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+//          D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+//          D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+//          D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+//          D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+//          D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+//          D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+//          D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+//          D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+//          D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+//          D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+//          D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+//          D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+//          D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+//          D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+//          D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+//          D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+//          D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+//          D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+//          D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+//          D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+//          D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+//          D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+//          D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+//          D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+//          D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+//          D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+//          D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
 //       }
 //       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //       //Test
@@ -3332,69 +3332,69 @@ __global__ void QSlipGeomDeviceComp27(real* DD,
 												 unsigned int* neighborX,
 												 unsigned int* neighborY,
 												 unsigned int* neighborZ,
-												 unsigned int size_Mat, 
+												 unsigned long long numberOfLBnodes, 
 												 bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -3415,24 +3415,24 @@ __global__ void QSlipGeomDeviceComp27(real* DD,
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -3447,24 +3447,24 @@ __global__ void QSlipGeomDeviceComp27(real* DD,
               *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[DIR_P00   * numberOfBCnodes];
-      nx_dirW   = &NormalX[DIR_M00   * numberOfBCnodes];
-      nx_dirN   = &NormalX[DIR_0P0   * numberOfBCnodes];
-      nx_dirS   = &NormalX[DIR_0M0   * numberOfBCnodes];
-      nx_dirT   = &NormalX[DIR_00P   * numberOfBCnodes];
-      nx_dirB   = &NormalX[DIR_00M   * numberOfBCnodes];
-      nx_dirNE  = &NormalX[DIR_PP0  * numberOfBCnodes];
-      nx_dirSW  = &NormalX[DIR_MM0  * numberOfBCnodes];
-      nx_dirSE  = &NormalX[DIR_PM0  * numberOfBCnodes];
-      nx_dirNW  = &NormalX[DIR_MP0  * numberOfBCnodes];
-      nx_dirTE  = &NormalX[DIR_P0P  * numberOfBCnodes];
-      nx_dirBW  = &NormalX[DIR_M0M  * numberOfBCnodes];
-      nx_dirBE  = &NormalX[DIR_P0M  * numberOfBCnodes];
-      nx_dirTW  = &NormalX[DIR_M0P  * numberOfBCnodes];
-      nx_dirTN  = &NormalX[DIR_0PP  * numberOfBCnodes];
-      nx_dirBS  = &NormalX[DIR_0MM  * numberOfBCnodes];
-      nx_dirBN  = &NormalX[DIR_0PM  * numberOfBCnodes];
-      nx_dirTS  = &NormalX[DIR_0MP  * numberOfBCnodes];
+      nx_dirE   = &NormalX[DIR_P00 * numberOfBCnodes];
+      nx_dirW   = &NormalX[DIR_M00 * numberOfBCnodes];
+      nx_dirN   = &NormalX[DIR_0P0 * numberOfBCnodes];
+      nx_dirS   = &NormalX[DIR_0M0 * numberOfBCnodes];
+      nx_dirT   = &NormalX[DIR_00P * numberOfBCnodes];
+      nx_dirB   = &NormalX[DIR_00M * numberOfBCnodes];
+      nx_dirNE  = &NormalX[DIR_PP0 * numberOfBCnodes];
+      nx_dirSW  = &NormalX[DIR_MM0 * numberOfBCnodes];
+      nx_dirSE  = &NormalX[DIR_PM0 * numberOfBCnodes];
+      nx_dirNW  = &NormalX[DIR_MP0 * numberOfBCnodes];
+      nx_dirTE  = &NormalX[DIR_P0P * numberOfBCnodes];
+      nx_dirBW  = &NormalX[DIR_M0M * numberOfBCnodes];
+      nx_dirBE  = &NormalX[DIR_P0M * numberOfBCnodes];
+      nx_dirTW  = &NormalX[DIR_M0P * numberOfBCnodes];
+      nx_dirTN  = &NormalX[DIR_0PP * numberOfBCnodes];
+      nx_dirBS  = &NormalX[DIR_0MM * numberOfBCnodes];
+      nx_dirBN  = &NormalX[DIR_0PM * numberOfBCnodes];
+      nx_dirTS  = &NormalX[DIR_0MP * numberOfBCnodes];
       nx_dirTNE = &NormalX[DIR_PPP * numberOfBCnodes];
       nx_dirTSW = &NormalX[DIR_MMP * numberOfBCnodes];
       nx_dirTSE = &NormalX[DIR_PMP * numberOfBCnodes];
@@ -3479,24 +3479,24 @@ __global__ void QSlipGeomDeviceComp27(real* DD,
               *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[DIR_P00   * numberOfBCnodes];
-      ny_dirW   = &NormalY[DIR_M00   * numberOfBCnodes];
-      ny_dirN   = &NormalY[DIR_0P0   * numberOfBCnodes];
-      ny_dirS   = &NormalY[DIR_0M0   * numberOfBCnodes];
-      ny_dirT   = &NormalY[DIR_00P   * numberOfBCnodes];
-      ny_dirB   = &NormalY[DIR_00M   * numberOfBCnodes];
-      ny_dirNE  = &NormalY[DIR_PP0  * numberOfBCnodes];
-      ny_dirSW  = &NormalY[DIR_MM0  * numberOfBCnodes];
-      ny_dirSE  = &NormalY[DIR_PM0  * numberOfBCnodes];
-      ny_dirNW  = &NormalY[DIR_MP0  * numberOfBCnodes];
-      ny_dirTE  = &NormalY[DIR_P0P  * numberOfBCnodes];
-      ny_dirBW  = &NormalY[DIR_M0M  * numberOfBCnodes];
-      ny_dirBE  = &NormalY[DIR_P0M  * numberOfBCnodes];
-      ny_dirTW  = &NormalY[DIR_M0P  * numberOfBCnodes];
-      ny_dirTN  = &NormalY[DIR_0PP  * numberOfBCnodes];
-      ny_dirBS  = &NormalY[DIR_0MM  * numberOfBCnodes];
-      ny_dirBN  = &NormalY[DIR_0PM  * numberOfBCnodes];
-      ny_dirTS  = &NormalY[DIR_0MP  * numberOfBCnodes];
+      ny_dirE   = &NormalY[DIR_P00 * numberOfBCnodes];
+      ny_dirW   = &NormalY[DIR_M00 * numberOfBCnodes];
+      ny_dirN   = &NormalY[DIR_0P0 * numberOfBCnodes];
+      ny_dirS   = &NormalY[DIR_0M0 * numberOfBCnodes];
+      ny_dirT   = &NormalY[DIR_00P * numberOfBCnodes];
+      ny_dirB   = &NormalY[DIR_00M * numberOfBCnodes];
+      ny_dirNE  = &NormalY[DIR_PP0 * numberOfBCnodes];
+      ny_dirSW  = &NormalY[DIR_MM0 * numberOfBCnodes];
+      ny_dirSE  = &NormalY[DIR_PM0 * numberOfBCnodes];
+      ny_dirNW  = &NormalY[DIR_MP0 * numberOfBCnodes];
+      ny_dirTE  = &NormalY[DIR_P0P * numberOfBCnodes];
+      ny_dirBW  = &NormalY[DIR_M0M * numberOfBCnodes];
+      ny_dirBE  = &NormalY[DIR_P0M * numberOfBCnodes];
+      ny_dirTW  = &NormalY[DIR_M0P * numberOfBCnodes];
+      ny_dirTN  = &NormalY[DIR_0PP * numberOfBCnodes];
+      ny_dirBS  = &NormalY[DIR_0MM * numberOfBCnodes];
+      ny_dirBN  = &NormalY[DIR_0PM * numberOfBCnodes];
+      ny_dirTS  = &NormalY[DIR_0MP * numberOfBCnodes];
       ny_dirTNE = &NormalY[DIR_PPP * numberOfBCnodes];
       ny_dirTSW = &NormalY[DIR_MMP * numberOfBCnodes];
       ny_dirTSE = &NormalY[DIR_PMP * numberOfBCnodes];
@@ -3511,24 +3511,24 @@ __global__ void QSlipGeomDeviceComp27(real* DD,
               *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[DIR_P00   * numberOfBCnodes];
-      nz_dirW   = &NormalZ[DIR_M00   * numberOfBCnodes];
-      nz_dirN   = &NormalZ[DIR_0P0   * numberOfBCnodes];
-      nz_dirS   = &NormalZ[DIR_0M0   * numberOfBCnodes];
-      nz_dirT   = &NormalZ[DIR_00P   * numberOfBCnodes];
-      nz_dirB   = &NormalZ[DIR_00M   * numberOfBCnodes];
-      nz_dirNE  = &NormalZ[DIR_PP0  * numberOfBCnodes];
-      nz_dirSW  = &NormalZ[DIR_MM0  * numberOfBCnodes];
-      nz_dirSE  = &NormalZ[DIR_PM0  * numberOfBCnodes];
-      nz_dirNW  = &NormalZ[DIR_MP0  * numberOfBCnodes];
-      nz_dirTE  = &NormalZ[DIR_P0P  * numberOfBCnodes];
-      nz_dirBW  = &NormalZ[DIR_M0M  * numberOfBCnodes];
-      nz_dirBE  = &NormalZ[DIR_P0M  * numberOfBCnodes];
-      nz_dirTW  = &NormalZ[DIR_M0P  * numberOfBCnodes];
-      nz_dirTN  = &NormalZ[DIR_0PP  * numberOfBCnodes];
-      nz_dirBS  = &NormalZ[DIR_0MM  * numberOfBCnodes];
-      nz_dirBN  = &NormalZ[DIR_0PM  * numberOfBCnodes];
-      nz_dirTS  = &NormalZ[DIR_0MP  * numberOfBCnodes];
+      nz_dirE   = &NormalZ[DIR_P00 * numberOfBCnodes];
+      nz_dirW   = &NormalZ[DIR_M00 * numberOfBCnodes];
+      nz_dirN   = &NormalZ[DIR_0P0 * numberOfBCnodes];
+      nz_dirS   = &NormalZ[DIR_0M0 * numberOfBCnodes];
+      nz_dirT   = &NormalZ[DIR_00P * numberOfBCnodes];
+      nz_dirB   = &NormalZ[DIR_00M * numberOfBCnodes];
+      nz_dirNE  = &NormalZ[DIR_PP0 * numberOfBCnodes];
+      nz_dirSW  = &NormalZ[DIR_MM0 * numberOfBCnodes];
+      nz_dirSE  = &NormalZ[DIR_PM0 * numberOfBCnodes];
+      nz_dirNW  = &NormalZ[DIR_MP0 * numberOfBCnodes];
+      nz_dirTE  = &NormalZ[DIR_P0P * numberOfBCnodes];
+      nz_dirBW  = &NormalZ[DIR_M0M * numberOfBCnodes];
+      nz_dirBE  = &NormalZ[DIR_P0M * numberOfBCnodes];
+      nz_dirTW  = &NormalZ[DIR_M0P * numberOfBCnodes];
+      nz_dirTN  = &NormalZ[DIR_0PP * numberOfBCnodes];
+      nz_dirBS  = &NormalZ[DIR_0MM * numberOfBCnodes];
+      nz_dirBN  = &NormalZ[DIR_0PM * numberOfBCnodes];
+      nz_dirTS  = &NormalZ[DIR_0MP * numberOfBCnodes];
       nz_dirTNE = &NormalZ[DIR_PPP * numberOfBCnodes];
       nz_dirTSW = &NormalZ[DIR_MMP * numberOfBCnodes];
       nz_dirTSE = &NormalZ[DIR_PMP * numberOfBCnodes];
@@ -3568,32 +3568,32 @@ __global__ void QSlipGeomDeviceComp27(real* DD,
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[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 +
@@ -3618,63 +3618,63 @@ __global__ void QSlipGeomDeviceComp27(real* DD,
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  real VeloX = vx1;
@@ -4218,69 +4218,69 @@ __global__ void QSlipNormDeviceComp27(real* DD,
 												 unsigned int* neighborX,
 												 unsigned int* neighborY,
 												 unsigned int* neighborZ,
-												 unsigned int size_Mat, 
+												 unsigned long long numberOfLBnodes, 
 												 bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -4301,24 +4301,24 @@ __global__ void QSlipNormDeviceComp27(real* DD,
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -4333,24 +4333,24 @@ __global__ void QSlipNormDeviceComp27(real* DD,
               *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[DIR_P00   * numberOfBCnodes];
-      nx_dirW   = &NormalX[DIR_M00   * numberOfBCnodes];
-      nx_dirN   = &NormalX[DIR_0P0   * numberOfBCnodes];
-      nx_dirS   = &NormalX[DIR_0M0   * numberOfBCnodes];
-      nx_dirT   = &NormalX[DIR_00P   * numberOfBCnodes];
-      nx_dirB   = &NormalX[DIR_00M   * numberOfBCnodes];
-      nx_dirNE  = &NormalX[DIR_PP0  * numberOfBCnodes];
-      nx_dirSW  = &NormalX[DIR_MM0  * numberOfBCnodes];
-      nx_dirSE  = &NormalX[DIR_PM0  * numberOfBCnodes];
-      nx_dirNW  = &NormalX[DIR_MP0  * numberOfBCnodes];
-      nx_dirTE  = &NormalX[DIR_P0P  * numberOfBCnodes];
-      nx_dirBW  = &NormalX[DIR_M0M  * numberOfBCnodes];
-      nx_dirBE  = &NormalX[DIR_P0M  * numberOfBCnodes];
-      nx_dirTW  = &NormalX[DIR_M0P  * numberOfBCnodes];
-      nx_dirTN  = &NormalX[DIR_0PP  * numberOfBCnodes];
-      nx_dirBS  = &NormalX[DIR_0MM  * numberOfBCnodes];
-      nx_dirBN  = &NormalX[DIR_0PM  * numberOfBCnodes];
-      nx_dirTS  = &NormalX[DIR_0MP  * numberOfBCnodes];
+      nx_dirE   = &NormalX[DIR_P00 * numberOfBCnodes];
+      nx_dirW   = &NormalX[DIR_M00 * numberOfBCnodes];
+      nx_dirN   = &NormalX[DIR_0P0 * numberOfBCnodes];
+      nx_dirS   = &NormalX[DIR_0M0 * numberOfBCnodes];
+      nx_dirT   = &NormalX[DIR_00P * numberOfBCnodes];
+      nx_dirB   = &NormalX[DIR_00M * numberOfBCnodes];
+      nx_dirNE  = &NormalX[DIR_PP0 * numberOfBCnodes];
+      nx_dirSW  = &NormalX[DIR_MM0 * numberOfBCnodes];
+      nx_dirSE  = &NormalX[DIR_PM0 * numberOfBCnodes];
+      nx_dirNW  = &NormalX[DIR_MP0 * numberOfBCnodes];
+      nx_dirTE  = &NormalX[DIR_P0P * numberOfBCnodes];
+      nx_dirBW  = &NormalX[DIR_M0M * numberOfBCnodes];
+      nx_dirBE  = &NormalX[DIR_P0M * numberOfBCnodes];
+      nx_dirTW  = &NormalX[DIR_M0P * numberOfBCnodes];
+      nx_dirTN  = &NormalX[DIR_0PP * numberOfBCnodes];
+      nx_dirBS  = &NormalX[DIR_0MM * numberOfBCnodes];
+      nx_dirBN  = &NormalX[DIR_0PM * numberOfBCnodes];
+      nx_dirTS  = &NormalX[DIR_0MP * numberOfBCnodes];
       nx_dirTNE = &NormalX[DIR_PPP * numberOfBCnodes];
       nx_dirTSW = &NormalX[DIR_MMP * numberOfBCnodes];
       nx_dirTSE = &NormalX[DIR_PMP * numberOfBCnodes];
@@ -4365,24 +4365,24 @@ __global__ void QSlipNormDeviceComp27(real* DD,
               *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[DIR_P00   * numberOfBCnodes];
-      ny_dirW   = &NormalY[DIR_M00   * numberOfBCnodes];
-      ny_dirN   = &NormalY[DIR_0P0   * numberOfBCnodes];
-      ny_dirS   = &NormalY[DIR_0M0   * numberOfBCnodes];
-      ny_dirT   = &NormalY[DIR_00P   * numberOfBCnodes];
-      ny_dirB   = &NormalY[DIR_00M   * numberOfBCnodes];
-      ny_dirNE  = &NormalY[DIR_PP0  * numberOfBCnodes];
-      ny_dirSW  = &NormalY[DIR_MM0  * numberOfBCnodes];
-      ny_dirSE  = &NormalY[DIR_PM0  * numberOfBCnodes];
-      ny_dirNW  = &NormalY[DIR_MP0  * numberOfBCnodes];
-      ny_dirTE  = &NormalY[DIR_P0P  * numberOfBCnodes];
-      ny_dirBW  = &NormalY[DIR_M0M  * numberOfBCnodes];
-      ny_dirBE  = &NormalY[DIR_P0M  * numberOfBCnodes];
-      ny_dirTW  = &NormalY[DIR_M0P  * numberOfBCnodes];
-      ny_dirTN  = &NormalY[DIR_0PP  * numberOfBCnodes];
-      ny_dirBS  = &NormalY[DIR_0MM  * numberOfBCnodes];
-      ny_dirBN  = &NormalY[DIR_0PM  * numberOfBCnodes];
-      ny_dirTS  = &NormalY[DIR_0MP  * numberOfBCnodes];
+      ny_dirE   = &NormalY[DIR_P00 * numberOfBCnodes];
+      ny_dirW   = &NormalY[DIR_M00 * numberOfBCnodes];
+      ny_dirN   = &NormalY[DIR_0P0 * numberOfBCnodes];
+      ny_dirS   = &NormalY[DIR_0M0 * numberOfBCnodes];
+      ny_dirT   = &NormalY[DIR_00P * numberOfBCnodes];
+      ny_dirB   = &NormalY[DIR_00M * numberOfBCnodes];
+      ny_dirNE  = &NormalY[DIR_PP0 * numberOfBCnodes];
+      ny_dirSW  = &NormalY[DIR_MM0 * numberOfBCnodes];
+      ny_dirSE  = &NormalY[DIR_PM0 * numberOfBCnodes];
+      ny_dirNW  = &NormalY[DIR_MP0 * numberOfBCnodes];
+      ny_dirTE  = &NormalY[DIR_P0P * numberOfBCnodes];
+      ny_dirBW  = &NormalY[DIR_M0M * numberOfBCnodes];
+      ny_dirBE  = &NormalY[DIR_P0M * numberOfBCnodes];
+      ny_dirTW  = &NormalY[DIR_M0P * numberOfBCnodes];
+      ny_dirTN  = &NormalY[DIR_0PP * numberOfBCnodes];
+      ny_dirBS  = &NormalY[DIR_0MM * numberOfBCnodes];
+      ny_dirBN  = &NormalY[DIR_0PM * numberOfBCnodes];
+      ny_dirTS  = &NormalY[DIR_0MP * numberOfBCnodes];
       ny_dirTNE = &NormalY[DIR_PPP * numberOfBCnodes];
       ny_dirTSW = &NormalY[DIR_MMP * numberOfBCnodes];
       ny_dirTSE = &NormalY[DIR_PMP * numberOfBCnodes];
@@ -4397,24 +4397,24 @@ __global__ void QSlipNormDeviceComp27(real* DD,
               *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[DIR_P00   * numberOfBCnodes];
-      nz_dirW   = &NormalZ[DIR_M00   * numberOfBCnodes];
-      nz_dirN   = &NormalZ[DIR_0P0   * numberOfBCnodes];
-      nz_dirS   = &NormalZ[DIR_0M0   * numberOfBCnodes];
-      nz_dirT   = &NormalZ[DIR_00P   * numberOfBCnodes];
-      nz_dirB   = &NormalZ[DIR_00M   * numberOfBCnodes];
-      nz_dirNE  = &NormalZ[DIR_PP0  * numberOfBCnodes];
-      nz_dirSW  = &NormalZ[DIR_MM0  * numberOfBCnodes];
-      nz_dirSE  = &NormalZ[DIR_PM0  * numberOfBCnodes];
-      nz_dirNW  = &NormalZ[DIR_MP0  * numberOfBCnodes];
-      nz_dirTE  = &NormalZ[DIR_P0P  * numberOfBCnodes];
-      nz_dirBW  = &NormalZ[DIR_M0M  * numberOfBCnodes];
-      nz_dirBE  = &NormalZ[DIR_P0M  * numberOfBCnodes];
-      nz_dirTW  = &NormalZ[DIR_M0P  * numberOfBCnodes];
-      nz_dirTN  = &NormalZ[DIR_0PP  * numberOfBCnodes];
-      nz_dirBS  = &NormalZ[DIR_0MM  * numberOfBCnodes];
-      nz_dirBN  = &NormalZ[DIR_0PM  * numberOfBCnodes];
-      nz_dirTS  = &NormalZ[DIR_0MP  * numberOfBCnodes];
+      nz_dirE   = &NormalZ[DIR_P00 * numberOfBCnodes];
+      nz_dirW   = &NormalZ[DIR_M00 * numberOfBCnodes];
+      nz_dirN   = &NormalZ[DIR_0P0 * numberOfBCnodes];
+      nz_dirS   = &NormalZ[DIR_0M0 * numberOfBCnodes];
+      nz_dirT   = &NormalZ[DIR_00P * numberOfBCnodes];
+      nz_dirB   = &NormalZ[DIR_00M * numberOfBCnodes];
+      nz_dirNE  = &NormalZ[DIR_PP0 * numberOfBCnodes];
+      nz_dirSW  = &NormalZ[DIR_MM0 * numberOfBCnodes];
+      nz_dirSE  = &NormalZ[DIR_PM0 * numberOfBCnodes];
+      nz_dirNW  = &NormalZ[DIR_MP0 * numberOfBCnodes];
+      nz_dirTE  = &NormalZ[DIR_P0P * numberOfBCnodes];
+      nz_dirBW  = &NormalZ[DIR_M0M * numberOfBCnodes];
+      nz_dirBE  = &NormalZ[DIR_P0M * numberOfBCnodes];
+      nz_dirTW  = &NormalZ[DIR_M0P * numberOfBCnodes];
+      nz_dirTN  = &NormalZ[DIR_0PP * numberOfBCnodes];
+      nz_dirBS  = &NormalZ[DIR_0MM * numberOfBCnodes];
+      nz_dirBN  = &NormalZ[DIR_0PM * numberOfBCnodes];
+      nz_dirTS  = &NormalZ[DIR_0MP * numberOfBCnodes];
       nz_dirTNE = &NormalZ[DIR_PPP * numberOfBCnodes];
       nz_dirTSW = &NormalZ[DIR_MMP * numberOfBCnodes];
       nz_dirTSE = &NormalZ[DIR_PMP * numberOfBCnodes];
@@ -4454,32 +4454,32 @@ __global__ void QSlipNormDeviceComp27(real* DD,
       unsigned int ktne = KQK;
       unsigned int kbsw = neighborZ[ksw];
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[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 +
@@ -4504,63 +4504,63 @@ __global__ void QSlipNormDeviceComp27(real* DD,
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  real VeloX = vx1;
diff --git a/src/gpu/VirtualFluids_GPU/GPU/StressBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/StressBCs27.cu
index 18e5b2800f4c395848a53dfa3b9ed6cbd6162fcd..0f9c2f5878a1e32e504d1c3e40fb89fc54811a83 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/StressBCs27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/StressBCs27.cu
@@ -106,7 +106,7 @@ __host__ __device__ __forceinline__ void iMEM(uint k, uint kN,
       real _vz_w = vz_w_inst-vDotN_w*wallNormalZ;
 
       //Compute wall shear stress tau_w via MOST
-      real z = (real)samplingOffset[k] + 0.5; //assuming q=0.5, could be replaced by wall distance via wall normal
+      real z = (real)samplingOffset[k] + q; //assuming q=0.5, could be replaced by wall distance via wall normal
       real kappa = 0.4;
       real u_star = vMag_el*kappa/(log(z/z0[k]));
       if(hasWallModelMonitor) u_star_monitor[k] = u_star;
@@ -136,6 +136,7 @@ __host__ __device__ __forceinline__ void iMEM(uint k, uint kN,
       wallVelocityZ = clipVz > -clipVz? min(clipVz, max(-clipVz, -3.0*F_z*forceFactor)): max(clipVz, min(-clipVz, -3.0*F_z*forceFactor));
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
 __global__ void QStressDeviceComp27(real* DD,
 											   int* k_Q,
@@ -166,11 +167,11 @@ __global__ void QStressDeviceComp27(real* DD,
 											   unsigned int* neighborX,
                                     unsigned int* neighborY,
                                     unsigned int* neighborZ,
-                                    unsigned int size_Mat,
+                                    unsigned long long numberOfLBnodes,
                                     bool isEvenTimestep)
 {
 
-   Distributions27 D = vf::gpu::getDistributionReferences27(DD, size_Mat, isEvenTimestep);
+   Distributions27 D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, isEvenTimestep);
 
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index
@@ -191,24 +192,24 @@ __global__ void QStressDeviceComp27(real* DD,
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -251,32 +252,32 @@ __global__ void QStressDeviceComp27(real* DD,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];     //post-coll f's
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];     //post-coll f's
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       real vx1, vx2, vx3, drho, feq, q;
@@ -302,7 +303,7 @@ __global__ void QStressDeviceComp27(real* DD,
       real om_turb = om1 / (c1o1 + c3o1*om1*max(c0o1, turbViscosity[k_Q[k]]));
       //////////////////////////////////////////////////////////////////////////
 
-      D = vf::gpu::getDistributionReferences27(DD, size_Mat, !isEvenTimestep);
+      D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, !isEvenTimestep);
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Compute incoming f's with zero wall velocity
       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -318,7 +319,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx1;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         f_W_in = getInterpolatedDistributionForNoSlipBC(q, f_E, f_W, feq, om_turb);
+         // f_W_in = getInterpolatedDistributionForNoSlipBC(q, f_E, f_W, feq, om_turb);
+         f_W_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_E, f_W, feq, om_turb, drho, c2o27);
          wallMomentumX += f_E+f_W_in;
       }
 
@@ -327,7 +329,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx1;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         f_E_in = getInterpolatedDistributionForNoSlipBC(q, f_W, f_E, feq, om_turb);
+         // f_E_in = getInterpolatedDistributionForNoSlipBC(q, f_W, f_E, feq, om_turb);
+         f_E_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_W, f_E, feq, om_turb, drho, c2o27);
          wallMomentumX -= f_W+f_E_in;
       }
 
@@ -336,7 +339,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx2;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         f_S_in = getInterpolatedDistributionForNoSlipBC(q, f_N, f_S, feq, om_turb);
+         // f_S_in = getInterpolatedDistributionForNoSlipBC(q, f_N, f_S, feq, om_turb);
+         f_S_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_N, f_S, feq, om_turb, drho, c2o27);
          wallMomentumY += f_N+f_S_in;
       }
 
@@ -345,7 +349,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx2;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         f_N_in = getInterpolatedDistributionForNoSlipBC(q, f_S, f_N, feq, om_turb);
+         // f_N_in = getInterpolatedDistributionForNoSlipBC(q, f_S, f_N, feq, om_turb);
+         f_N_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_S, f_N, feq, om_turb, drho, c2o27);
          wallMomentumY -= f_S+f_N_in;
       }
 
@@ -354,7 +359,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         f_B_in = getInterpolatedDistributionForNoSlipBC(q, f_T, f_B, feq, om_turb);
+         // f_B_in = getInterpolatedDistributionForNoSlipBC(q, f_T, f_B, feq, om_turb);
+         f_B_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_T, f_B, feq, om_turb, drho, c2o27);
          wallMomentumZ += f_T+f_B_in;
       }
 
@@ -363,7 +369,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         f_T_in = getInterpolatedDistributionForNoSlipBC(q, f_B, f_T, feq, om_turb);
+         // f_T_in = getInterpolatedDistributionForNoSlipBC(q, f_B, f_T, feq, om_turb);
+         f_T_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_B, f_T, feq, om_turb, drho, c2o27);
          wallMomentumZ -= f_B+f_T_in;
       }
 
@@ -372,7 +379,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx1 + vx2;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_SW_in = getInterpolatedDistributionForNoSlipBC(q, f_NE, f_SW, feq, om_turb);
+         // f_SW_in = getInterpolatedDistributionForNoSlipBC(q, f_NE, f_SW, feq, om_turb);
+         f_SW_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_NE, f_SW, feq, om_turb, drho, c2o27);
          wallMomentumX += f_NE+f_SW_in;
          wallMomentumY += f_NE+f_SW_in;
       }
@@ -382,7 +390,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx1 - vx2;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_NE_in = getInterpolatedDistributionForNoSlipBC(q, f_SW, f_NE, feq, om_turb);
+         // f_NE_in = getInterpolatedDistributionForNoSlipBC(q, f_SW, f_NE, feq, om_turb);
+         f_NE_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_SW, f_NE, feq, om_turb, drho, c1o54);
          wallMomentumX -= f_SW+f_NE_in;
          wallMomentumY -= f_SW+f_NE_in;
       }
@@ -392,7 +401,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx1 - vx2;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_NW_in = getInterpolatedDistributionForNoSlipBC(q, f_SE, f_NW, feq, om_turb);
+         // f_NW_in = getInterpolatedDistributionForNoSlipBC(q, f_SE, f_NW, feq, om_turb);
+         f_NW_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_SE, f_NW, feq, om_turb, drho, c1o54);
          wallMomentumX += f_SE+f_NW_in;
          wallMomentumY -= f_SE+f_NW_in;
       }
@@ -402,7 +412,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx1 + vx2;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_SE_in = getInterpolatedDistributionForNoSlipBC(q, f_NW, f_SE, feq, om_turb);
+         // f_SE_in = getInterpolatedDistributionForNoSlipBC(q, f_NW, f_SE, feq, om_turb);
+         f_SE_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_NW, f_SE, feq, om_turb, drho, c1o54);
          wallMomentumX -= f_NW+f_SE_in;
          wallMomentumY += f_NW+f_SE_in;
       }
@@ -412,7 +423,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx1 + vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_BW_in = getInterpolatedDistributionForNoSlipBC(q, f_TE, f_BW, feq, om_turb);
+         // f_BW_in = getInterpolatedDistributionForNoSlipBC(q, f_TE, f_BW, feq, om_turb);
+         f_BW_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_TE, f_BW, feq, om_turb, drho, c1o54);
          wallMomentumX += f_TE+f_BW_in;
          wallMomentumZ += f_TE+f_BW_in;
       }
@@ -422,7 +434,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx1 - vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_TE_in = getInterpolatedDistributionForNoSlipBC(q, f_BW, f_TE, feq, om_turb);
+         // f_TE_in = getInterpolatedDistributionForNoSlipBC(q, f_BW, f_TE, feq, om_turb);
+         f_TE_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_BW, f_TE, feq, om_turb, drho, c1o54);
          wallMomentumX -= f_BW+f_TE_in;
          wallMomentumZ -= f_BW+f_TE_in;
       }
@@ -432,7 +445,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx1 - vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_TW_in = getInterpolatedDistributionForNoSlipBC(q, f_BE, f_TW, feq, om_turb);
+         // f_TW_in = getInterpolatedDistributionForNoSlipBC(q, f_BE, f_TW, feq, om_turb);
+         f_TW_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_BE, f_TW, feq, om_turb, drho, c1o54);
          wallMomentumX += f_BE+f_TW_in;
          wallMomentumZ -= f_BE+f_TW_in;
       }
@@ -442,7 +456,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx1 + vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_BE_in = getInterpolatedDistributionForNoSlipBC(q, f_TW, f_BE, feq, om_turb);
+         // f_BE_in = getInterpolatedDistributionForNoSlipBC(q, f_TW, f_BE, feq, om_turb);
+         f_BE_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_TW, f_BE, feq, om_turb, drho, c1o54);
          wallMomentumX -= f_TW+f_BE_in;
          wallMomentumZ += f_TW+f_BE_in;
       }
@@ -452,7 +467,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx2 + vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_BS_in = getInterpolatedDistributionForNoSlipBC(q, f_TN, f_BS, feq, om_turb);
+         // f_BS_in = getInterpolatedDistributionForNoSlipBC(q, f_TN, f_BS, feq, om_turb);
+         f_BS_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_TN, f_BS, feq, om_turb, drho, c1o54);
          wallMomentumY += f_TN+f_BS_in;
          wallMomentumZ += f_TN+f_BS_in;
       }
@@ -462,7 +478,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx2 - vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_TN_in = getInterpolatedDistributionForNoSlipBC(q, f_BS, f_TN, feq, om_turb);
+         // f_TN_in = getInterpolatedDistributionForNoSlipBC(q, f_BS, f_TN, feq, om_turb);
+         f_TN_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_BS, f_TN, feq, om_turb, drho, c1o54);
          wallMomentumY -= f_BS+f_TN_in;
          wallMomentumZ -= f_BS+f_TN_in;
       }
@@ -472,7 +489,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx2 - vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_TS_in = getInterpolatedDistributionForNoSlipBC(q, f_BN, f_TS, feq, om_turb);
+         // f_TS_in = getInterpolatedDistributionForNoSlipBC(q, f_BN, f_TS, feq, om_turb);
+         f_TS_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_BN, f_TS, feq, om_turb, drho, c1o54);
          wallMomentumY += f_BN+f_TS_in;
          wallMomentumZ -= f_BN+f_TS_in;
       }
@@ -482,7 +500,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx2 + vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         f_BN_in = getInterpolatedDistributionForNoSlipBC(q, f_TS, f_BN, feq, om_turb);
+         // f_BN_in = getInterpolatedDistributionForNoSlipBC(q, f_TS, f_BN, feq, om_turb);
+         f_BN_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_TS, f_BN, feq, om_turb, drho, c1o54);
          wallMomentumY -= f_TS+f_BN_in;
          wallMomentumZ += f_TS+f_BN_in;
       }
@@ -492,7 +511,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx1 + vx2 + vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         f_BSW_in = getInterpolatedDistributionForNoSlipBC(q, f_TNE, f_BSW, feq, om_turb);
+         // f_BSW_in = getInterpolatedDistributionForNoSlipBC(q, f_TNE, f_BSW, feq, om_turb);
+         f_BSW_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_TNE, f_BSW, feq, om_turb, drho, c1o216);
          wallMomentumX += f_TNE+f_BSW_in;
          wallMomentumY += f_TNE+f_BSW_in;
          wallMomentumZ += f_TNE+f_BSW_in;
@@ -503,7 +523,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx1 - vx2 - vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         f_TNE_in = getInterpolatedDistributionForNoSlipBC(q, f_BSW, f_TNE, feq, om_turb);
+         // f_TNE_in = getInterpolatedDistributionForNoSlipBC(q, f_BSW, f_TNE, feq, om_turb);
+         f_TNE_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_BSW, f_TNE, feq, om_turb, drho, c1o216);
          wallMomentumX -= f_BSW+f_TNE_in;
          wallMomentumY -= f_BSW+f_TNE_in;
          wallMomentumZ -= f_BSW+f_TNE_in;
@@ -514,7 +535,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx1 + vx2 - vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         f_TSW_in = getInterpolatedDistributionForNoSlipBC(q, f_BNE, f_TSW, feq, om_turb);
+         // f_TSW_in = getInterpolatedDistributionForNoSlipBC(q, f_BNE, f_TSW, feq, om_turb);
+         f_TSW_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_BNE, f_TSW, feq, om_turb, drho, c1o216);
          wallMomentumX += f_BNE+f_TSW_in;
          wallMomentumY += f_BNE+f_TSW_in;
          wallMomentumZ -= f_BNE+f_TSW_in;
@@ -525,7 +547,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx1 - vx2 + vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         f_BNE_in = getInterpolatedDistributionForNoSlipBC(q, f_TSW, f_BNE, feq, om_turb);
+         // f_BNE_in = getInterpolatedDistributionForNoSlipBC(q, f_TSW, f_BNE, feq, om_turb);
+         f_BNE_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_TSW, f_BNE, feq, om_turb, drho, c1o216);
          wallMomentumX -= f_TSW+f_BNE_in;
          wallMomentumY -= f_TSW+f_BNE_in;
          wallMomentumZ += f_TSW+f_BNE_in;
@@ -536,7 +559,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx1 - vx2 + vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         f_BNW_in = getInterpolatedDistributionForNoSlipBC(q, f_TSE, f_BNW, feq, om_turb);
+         // f_BNW_in = getInterpolatedDistributionForNoSlipBC(q, f_TSE, f_BNW, feq, om_turb);
+         f_BNW_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_TSE, f_BNW, feq, om_turb, drho, c1o216);
          wallMomentumX += f_TSE+f_BNW_in;
          wallMomentumY -= f_TSE+f_BNW_in;
          wallMomentumZ += f_TSE+f_BNW_in;
@@ -547,7 +571,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx1 + vx2 - vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         f_TSE_in = getInterpolatedDistributionForNoSlipBC(q, f_BNW, f_TSE, feq, om_turb);
+         // f_TSE_in = getInterpolatedDistributionForNoSlipBC(q, f_BNW, f_TSE, feq, om_turb);
+         f_TSE_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_BNW, f_TSE, feq, om_turb, drho, c1o216);
          wallMomentumX -= f_BNW+f_TSE_in;
          wallMomentumY += f_BNW+f_TSE_in;
          wallMomentumZ -= f_BNW+f_TSE_in;
@@ -558,7 +583,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = vx1 - vx2 - vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         f_TNW_in = getInterpolatedDistributionForNoSlipBC(q, f_BSE, f_TNW, feq, om_turb);
+         // f_TNW_in = getInterpolatedDistributionForNoSlipBC(q, f_BSE, f_TNW, feq, om_turb);
+         f_TNW_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_BSE, f_TNW, feq, om_turb, drho, c1o216);
          wallMomentumX += f_BSE+f_TNW_in;
          wallMomentumY -= f_BSE+f_TNW_in;
          wallMomentumZ -= f_BSE+f_TNW_in;
@@ -569,7 +595,8 @@ __global__ void QStressDeviceComp27(real* DD,
       {
          velocityLB = -vx1 + vx2 + vx3;
          feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         f_BSE_in = getInterpolatedDistributionForNoSlipBC(q, f_TNW, f_BSE, feq, om_turb);
+         // f_BSE_in = getInterpolatedDistributionForNoSlipBC(q, f_TNW, f_BSE, feq, om_turb);
+         f_BSE_in = getInterpolatedDistributionForNoSlipWithPressureBC(q, f_TNW, f_BSE, feq, om_turb, drho, c1o216);
          wallMomentumX -= f_TNW+f_BSE_in;
          wallMomentumY += f_TNW+f_BSE_in;
          wallMomentumZ += f_TNW+f_BSE_in;
@@ -580,7 +607,7 @@ __global__ void QStressDeviceComp27(real* DD,
       // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real VeloX=0.0, VeloY=0.0, VeloZ=0.0;
 
-      q = 0.5f;
+      q = q_dirB[k];
       real eps = 0.001f;
 
       iMEM( k, k_N[k],
@@ -852,11 +879,11 @@ __global__ void BBStressDevice27( real* DD,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int size_Mat,
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep)
 {
 
-   Distributions27 D = vf::gpu::getDistributionReferences27(DD, size_Mat, isEvenTimestep);
+   Distributions27 D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, isEvenTimestep);
 
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index
@@ -877,24 +904,24 @@ __global__ void BBStressDevice27( real* DD,
          *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -938,32 +965,32 @@ __global__ void BBStressDevice27( real* DD,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       real vx1, vx2, vx3, drho;
@@ -986,7 +1013,7 @@ __global__ void BBStressDevice27( real* DD,
 
       //////////////////////////////////////////////////////////////////////////
 
-      D = vf::gpu::getDistributionReferences27(DD, size_Mat, !isEvenTimestep);
+      D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, !isEvenTimestep);
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real f_E_in,  f_W_in,  f_N_in,  f_S_in,  f_T_in,  f_B_in,   f_NE_in,  f_SW_in,  f_SE_in,  f_NW_in,  f_TE_in,  f_BW_in,  f_BE_in,
          f_TW_in, f_TN_in, f_BS_in, f_BN_in, f_TS_in, f_TNE_in, f_TSW_in, f_TSE_in, f_TNW_in, f_BNE_in, f_BSW_in, f_BSE_in, f_BNW_in;
@@ -1210,7 +1237,7 @@ __global__ void BBStressDevice27( real* DD,
       // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real VeloX=0.0, VeloY=0.0, VeloZ=0.0;
 
-      q = 0.5f;
+      q = q_dirB[k];
       real eps = 0.001f;
 
       iMEM( k, k_N[k],
@@ -1483,10 +1510,10 @@ __global__ void BBStressPressureDevice27( real* DD,
                                              unsigned int* neighborX,
                                              unsigned int* neighborY,
                                              unsigned int* neighborZ,
-                                             unsigned int size_Mat,
+                                             unsigned long long numberOfLBnodes,
                                              bool isEvenTimestep)
 {
-   Distributions27 D = vf::gpu::getDistributionReferences27(DD, size_Mat, isEvenTimestep);
+   Distributions27 D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, isEvenTimestep);
 
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index
@@ -1507,24 +1534,24 @@ __global__ void BBStressPressureDevice27( real* DD,
          *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -1568,32 +1595,32 @@ __global__ void BBStressPressureDevice27( real* DD,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       real vx1, vx2, vx3, drho;
@@ -1615,7 +1642,7 @@ __global__ void BBStressPressureDevice27( real* DD,
                  (f_T - f_B)) / (c1o1 + drho);
 
       //////////////////////////////////////////////////////////////////////////
-      D = vf::gpu::getDistributionReferences27(DD, size_Mat, !isEvenTimestep);
+      D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, !isEvenTimestep);
 
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real f_E_in,  f_W_in,  f_N_in,  f_S_in,  f_T_in,  f_B_in,   f_NE_in,  f_SW_in,  f_SE_in,  f_NW_in,  f_TE_in,  f_BW_in,  f_BE_in,
@@ -1840,7 +1867,7 @@ __global__ void BBStressPressureDevice27( real* DD,
       // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       real VeloX=0.0, VeloY=0.0, VeloZ=0.0;
 
-      q = 0.5f;
+      q = q_dirB[k];
       real eps = 0.001f;
 
       iMEM( k, k_N[k],
diff --git a/src/gpu/VirtualFluids_GPU/GPU/ThinWallBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/ThinWallBCs27.cu
index 55f810628f370976289d1492e9916d5d3fa0dbb8..b96d961c9b92ae5d041beeb23482d7144e7a8acb 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/ThinWallBCs27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/ThinWallBCs27.cu
@@ -27,69 +27,69 @@ __global__ void QVelDeviceCompThinWallsPartOne27(
 	uint* neighborX,
 	uint* neighborY,
 	uint* neighborZ,
-	uint size_Mat, 
+	unsigned long long numberOfLBnodes, 
 	bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -114,24 +114,24 @@ __global__ void QVelDeviceCompThinWallsPartOne27(
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -174,32 +174,32 @@ __global__ void QVelDeviceCompThinWallsPartOne27(
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[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 +
@@ -456,69 +456,69 @@ __global__ void QDeviceCompThinWallsPartOne27(
 	unsigned int* neighborX,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
-	unsigned int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool isEvenTimestep)
 {
 	Distributions27 D;
 	if (isEvenTimestep == true)
 	{
-		D.f[DIR_P00] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM] = &DD[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	}
 	else
 	{
-		D.f[DIR_M00] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM] = &DD[DIR_PMP *size_Mat];
+		D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -539,24 +539,24 @@ __global__ void QDeviceCompThinWallsPartOne27(
 			*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[DIR_P00   * numberOfBCnodes];
-		q_dirW = &QQ[DIR_M00   * numberOfBCnodes];
-		q_dirN = &QQ[DIR_0P0   * numberOfBCnodes];
-		q_dirS = &QQ[DIR_0M0   * numberOfBCnodes];
-		q_dirT = &QQ[DIR_00P   * numberOfBCnodes];
-		q_dirB = &QQ[DIR_00M   * numberOfBCnodes];
-		q_dirNE = &QQ[DIR_PP0  * numberOfBCnodes];
-		q_dirSW = &QQ[DIR_MM0  * numberOfBCnodes];
-		q_dirSE = &QQ[DIR_PM0  * numberOfBCnodes];
-		q_dirNW = &QQ[DIR_MP0  * numberOfBCnodes];
-		q_dirTE = &QQ[DIR_P0P  * numberOfBCnodes];
-		q_dirBW = &QQ[DIR_M0M  * numberOfBCnodes];
-		q_dirBE = &QQ[DIR_P0M  * numberOfBCnodes];
-		q_dirTW = &QQ[DIR_M0P  * numberOfBCnodes];
-		q_dirTN = &QQ[DIR_0PP  * numberOfBCnodes];
-		q_dirBS = &QQ[DIR_0MM  * numberOfBCnodes];
-		q_dirBN = &QQ[DIR_0PM  * numberOfBCnodes];
-		q_dirTS = &QQ[DIR_0MP  * numberOfBCnodes];
+		q_dirE = &QQ[DIR_P00 * numberOfBCnodes];
+		q_dirW = &QQ[DIR_M00 * numberOfBCnodes];
+		q_dirN = &QQ[DIR_0P0 * numberOfBCnodes];
+		q_dirS = &QQ[DIR_0M0 * numberOfBCnodes];
+		q_dirT = &QQ[DIR_00P * numberOfBCnodes];
+		q_dirB = &QQ[DIR_00M * numberOfBCnodes];
+		q_dirNE = &QQ[DIR_PP0 * numberOfBCnodes];
+		q_dirSW = &QQ[DIR_MM0 * numberOfBCnodes];
+		q_dirSE = &QQ[DIR_PM0 * numberOfBCnodes];
+		q_dirNW = &QQ[DIR_MP0 * numberOfBCnodes];
+		q_dirTE = &QQ[DIR_P0P * numberOfBCnodes];
+		q_dirBW = &QQ[DIR_M0M * numberOfBCnodes];
+		q_dirBE = &QQ[DIR_P0M * numberOfBCnodes];
+		q_dirTW = &QQ[DIR_M0P * numberOfBCnodes];
+		q_dirTN = &QQ[DIR_0PP * numberOfBCnodes];
+		q_dirBS = &QQ[DIR_0MM * numberOfBCnodes];
+		q_dirBN = &QQ[DIR_0PM * numberOfBCnodes];
+		q_dirTS = &QQ[DIR_0MP * numberOfBCnodes];
 		q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
 		q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
 		q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -882,7 +882,7 @@ __global__ void QThinWallsPartTwo27(
 	uint* neighborY,
 	uint* neighborZ,
 	uint* neighborWSB,
-	uint size_Mat, 
+	unsigned long long numberOfLBnodes, 
 	bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -904,24 +904,24 @@ __global__ void QThinWallsPartTwo27(
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -980,123 +980,123 @@ __global__ void QThinWallsPartTwo27(
 	  Distributions27 D, DN;
 	  if (isEvenTimestep == true)
 	  {
-		  D.f[DIR_P00] = &DD[DIR_P00   *size_Mat];
-		  D.f[DIR_M00] = &DD[DIR_M00   *size_Mat];
-		  D.f[DIR_0P0] = &DD[DIR_0P0   *size_Mat];
-		  D.f[DIR_0M0] = &DD[DIR_0M0   *size_Mat];
-		  D.f[DIR_00P] = &DD[DIR_00P   *size_Mat];
-		  D.f[DIR_00M] = &DD[DIR_00M   *size_Mat];
-		  D.f[DIR_PP0] = &DD[DIR_PP0  *size_Mat];
-		  D.f[DIR_MM0] = &DD[DIR_MM0  *size_Mat];
-		  D.f[DIR_PM0] = &DD[DIR_PM0  *size_Mat];
-		  D.f[DIR_MP0] = &DD[DIR_MP0  *size_Mat];
-		  D.f[DIR_P0P] = &DD[DIR_P0P  *size_Mat];
-		  D.f[DIR_M0M] = &DD[DIR_M0M  *size_Mat];
-		  D.f[DIR_P0M] = &DD[DIR_P0M  *size_Mat];
-		  D.f[DIR_M0P] = &DD[DIR_M0P  *size_Mat];
-		  D.f[DIR_0PP] = &DD[DIR_0PP  *size_Mat];
-		  D.f[DIR_0MM] = &DD[DIR_0MM  *size_Mat];
-		  D.f[DIR_0PM] = &DD[DIR_0PM  *size_Mat];
-		  D.f[DIR_0MP] = &DD[DIR_0MP  *size_Mat];
-		  D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		  D.f[DIR_PPP] = &DD[DIR_PPP *size_Mat];
-		  D.f[DIR_MMP] = &DD[DIR_MMP *size_Mat];
-		  D.f[DIR_PMP] = &DD[DIR_PMP *size_Mat];
-		  D.f[DIR_MPP] = &DD[DIR_MPP *size_Mat];
-		  D.f[DIR_PPM] = &DD[DIR_PPM *size_Mat];
-		  D.f[DIR_MMM] = &DD[DIR_MMM *size_Mat];
-		  D.f[DIR_PMM] = &DD[DIR_PMM *size_Mat];
-		  D.f[DIR_MPM] = &DD[DIR_MPM *size_Mat];
+		  D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		  D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		  D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		  D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		  D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		  D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		  D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		  D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		  D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		  D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		  D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		  D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		  D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		  D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		  D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		  D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		  D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		  D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		  D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		  D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		  D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		  D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		  D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		  D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		  D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		  D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		  D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	  }
 	  else
 	  {
-		  D.f[DIR_M00] = &DD[DIR_P00   *size_Mat];
-		  D.f[DIR_P00] = &DD[DIR_M00   *size_Mat];
-		  D.f[DIR_0M0] = &DD[DIR_0P0   *size_Mat];
-		  D.f[DIR_0P0] = &DD[DIR_0M0   *size_Mat];
-		  D.f[DIR_00M] = &DD[DIR_00P   *size_Mat];
-		  D.f[DIR_00P] = &DD[DIR_00M   *size_Mat];
-		  D.f[DIR_MM0] = &DD[DIR_PP0  *size_Mat];
-		  D.f[DIR_PP0] = &DD[DIR_MM0  *size_Mat];
-		  D.f[DIR_MP0] = &DD[DIR_PM0  *size_Mat];
-		  D.f[DIR_PM0] = &DD[DIR_MP0  *size_Mat];
-		  D.f[DIR_M0M] = &DD[DIR_P0P  *size_Mat];
-		  D.f[DIR_P0P] = &DD[DIR_M0M  *size_Mat];
-		  D.f[DIR_M0P] = &DD[DIR_P0M  *size_Mat];
-		  D.f[DIR_P0M] = &DD[DIR_M0P  *size_Mat];
-		  D.f[DIR_0MM] = &DD[DIR_0PP  *size_Mat];
-		  D.f[DIR_0PP] = &DD[DIR_0MM  *size_Mat];
-		  D.f[DIR_0MP] = &DD[DIR_0PM  *size_Mat];
-		  D.f[DIR_0PM] = &DD[DIR_0MP  *size_Mat];
-		  D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		  D.f[DIR_PPP] = &DD[DIR_MMM *size_Mat];
-		  D.f[DIR_MMP] = &DD[DIR_PPM *size_Mat];
-		  D.f[DIR_PMP] = &DD[DIR_MPM *size_Mat];
-		  D.f[DIR_MPP] = &DD[DIR_PMM *size_Mat];
-		  D.f[DIR_PPM] = &DD[DIR_MMP *size_Mat];
-		  D.f[DIR_MMM] = &DD[DIR_PPP *size_Mat];
-		  D.f[DIR_PMM] = &DD[DIR_MPP *size_Mat];
-		  D.f[DIR_MPM] = &DD[DIR_PMP *size_Mat];
+		  D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		  D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		  D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		  D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		  D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		  D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		  D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		  D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		  D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		  D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		  D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		  D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		  D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		  D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		  D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		  D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		  D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		  D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		  D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		  D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		  D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		  D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		  D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		  D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		  D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		  D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		  D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	  }
 	  if (isEvenTimestep==false)
       {
-         DN.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         DN.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         DN.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         DN.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         DN.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         DN.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         DN.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         DN.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         DN.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         DN.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         DN.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         DN.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         DN.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         DN.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         DN.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         DN.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         DN.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         DN.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         DN.f[DIR_000] = &DD[DIR_000*size_Mat];
-         DN.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         DN.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         DN.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         DN.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         DN.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         DN.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         DN.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         DN.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         DN.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         DN.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         DN.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         DN.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         DN.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         DN.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         DN.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         DN.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         DN.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         DN.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         DN.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         DN.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         DN.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         DN.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         DN.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         DN.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         DN.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         DN.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         DN.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         DN.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         DN.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         DN.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         DN.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         DN.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         DN.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         DN.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         DN.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         DN.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         DN.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         DN.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         DN.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         DN.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         DN.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         DN.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         DN.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         DN.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         DN.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         DN.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         DN.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         DN.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         DN.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         DN.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         DN.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         DN.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         DN.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         DN.f[DIR_000] = &DD[DIR_000*size_Mat];
-         DN.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         DN.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         DN.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         DN.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         DN.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         DN.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         DN.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         DN.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         DN.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         DN.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         DN.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         DN.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         DN.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         DN.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         DN.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         DN.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         DN.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         DN.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         DN.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         DN.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         DN.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         DN.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         DN.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         DN.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         DN.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         DN.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         DN.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         DN.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         DN.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         DN.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         DN.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         DN.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         DN.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         DN.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         DN.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //directions allways exchange
@@ -1106,24 +1106,24 @@ __global__ void QThinWallsPartTwo27(
 	  //( 1  1  1) ( 1  0  0) ( 0  1  0) ( 0  0  1) ( 1  1  0) ( 1  0  1) ( 0  1  1) (-1 -1  1) (-1  1 -1) ( 1 -1 -1) (-1  1  0) (-1  0  1) ( 0 -1  1)
 	  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  real q, tmp;
-      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1){ if (geom[kw  ] < GEO_FLUID){tmp = (DN.f[DIR_M00  ])[kw  ]; (DN.f[DIR_M00  ])[kw  ]=(D.f[DIR_M00  ])[kw  ]; (D.f[DIR_M00  ])[kw  ]=tmp;}}
-	  q = q_dirW[k];   if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_P00  ])[ke  ]; (DN.f[DIR_P00  ])[ke  ]=(D.f[DIR_P00  ])[ke  ]; (D.f[DIR_P00  ])[ke  ]=tmp;}}
-      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1){ if (geom[ks  ] < GEO_FLUID){tmp = (DN.f[DIR_0M0  ])[ks  ]; (DN.f[DIR_0M0  ])[ks  ]=(D.f[DIR_0M0  ])[ks  ]; (D.f[DIR_0M0  ])[ks  ]=tmp;}}
-      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_0P0  ])[kn  ]; (DN.f[DIR_0P0  ])[kn  ]=(D.f[DIR_0P0  ])[kn  ]; (D.f[DIR_0P0  ])[kn  ]=tmp;}}
-      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1){ if (geom[kb  ] < GEO_FLUID){tmp = (DN.f[DIR_00M  ])[kb  ]; (DN.f[DIR_00M  ])[kb  ]=(D.f[DIR_00M  ])[kb  ]; (D.f[DIR_00M  ])[kb  ]=tmp;}}
-      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_00P  ])[kt  ]; (DN.f[DIR_00P  ])[kt  ]=(D.f[DIR_00P  ])[kt  ]; (D.f[DIR_00P  ])[kt  ]=tmp;}}
-      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1){ if (geom[ksw ] < GEO_FLUID){tmp = (DN.f[DIR_MM0 ])[ksw ]; (DN.f[DIR_MM0 ])[ksw ]=(D.f[DIR_MM0 ])[ksw ]; (D.f[DIR_MM0 ])[ksw ]=tmp;}}
-      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_PP0 ])[kne ]; (DN.f[DIR_PP0 ])[kne ]=(D.f[DIR_PP0 ])[kne ]; (D.f[DIR_PP0 ])[kne ]=tmp;}}
-      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_MP0 ])[knw ]; (DN.f[DIR_MP0 ])[knw ]=(D.f[DIR_MP0 ])[knw ]; (D.f[DIR_MP0 ])[knw ]=tmp;}}
-      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1){ if (geom[kmp0] < GEO_FLUID){tmp = (DN.f[DIR_PM0 ])[kse ]; (DN.f[DIR_PM0 ])[kse ]=(D.f[DIR_PM0 ])[kse ]; (D.f[DIR_PM0 ])[kse ]=tmp;}}
-      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1){ if (geom[kbw ] < GEO_FLUID){tmp = (DN.f[DIR_M0M ])[kbw ]; (DN.f[DIR_M0M ])[kbw ]=(D.f[DIR_M0M ])[kbw ]; (D.f[DIR_M0M ])[kbw ]=tmp;}}
-      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_P0P ])[kte ]; (DN.f[DIR_P0P ])[kte ]=(D.f[DIR_P0P ])[kte ]; (D.f[DIR_P0P ])[kte ]=tmp;}}
-      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_M0P ])[ktw ]; (DN.f[DIR_M0P ])[ktw ]=(D.f[DIR_M0P ])[ktw ]; (D.f[DIR_M0P ])[ktw ]=tmp;}}
-      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1){ if (geom[km0p] < GEO_FLUID){tmp = (DN.f[DIR_P0M ])[kbe ]; (DN.f[DIR_P0M ])[kbe ]=(D.f[DIR_P0M ])[kbe ]; (D.f[DIR_P0M ])[kbe ]=tmp;}}
-      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1){ if (geom[kbs ] < GEO_FLUID){tmp = (DN.f[DIR_0MM ])[kbs ]; (DN.f[DIR_0MM ])[kbs ]=(D.f[DIR_0MM ])[kbs ]; (D.f[DIR_0MM ])[kbs ]=tmp;}}
-      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_0PP ])[ktn ]; (DN.f[DIR_0PP ])[ktn ]=(D.f[DIR_0PP ])[ktn ]; (D.f[DIR_0PP ])[ktn ]=tmp;}}
-      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_0MP ])[kts ]; (DN.f[DIR_0MP ])[kts ]=(D.f[DIR_0MP ])[kts ]; (D.f[DIR_0MP ])[kts ]=tmp;}}
-      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1){ if (geom[k0mp] < GEO_FLUID){tmp = (DN.f[DIR_0PM ])[kbn ]; (DN.f[DIR_0PM ])[kbn ]=(D.f[DIR_0PM ])[kbn ]; (D.f[DIR_0PM ])[kbn ]=tmp;}}
+      q = q_dirE[k];   if (q>=c0o1 && q<=c1o1){ if (geom[kw  ] < GEO_FLUID){tmp = (DN.f[DIR_M00])[kw  ]; (DN.f[DIR_M00])[kw  ]=(D.f[DIR_M00])[kw  ]; (D.f[DIR_M00])[kw  ]=tmp;}}
+	  q = q_dirW[k];   if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_P00])[ke  ]; (DN.f[DIR_P00])[ke  ]=(D.f[DIR_P00])[ke  ]; (D.f[DIR_P00])[ke  ]=tmp;}}
+      q = q_dirN[k];   if (q>=c0o1 && q<=c1o1){ if (geom[ks  ] < GEO_FLUID){tmp = (DN.f[DIR_0M0])[ks  ]; (DN.f[DIR_0M0])[ks  ]=(D.f[DIR_0M0])[ks  ]; (D.f[DIR_0M0])[ks  ]=tmp;}}
+      q = q_dirS[k];   if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_0P0])[kn  ]; (DN.f[DIR_0P0])[kn  ]=(D.f[DIR_0P0])[kn  ]; (D.f[DIR_0P0])[kn  ]=tmp;}}
+      q = q_dirT[k];   if (q>=c0o1 && q<=c1o1){ if (geom[kb  ] < GEO_FLUID){tmp = (DN.f[DIR_00M])[kb  ]; (DN.f[DIR_00M])[kb  ]=(D.f[DIR_00M])[kb  ]; (D.f[DIR_00M])[kb  ]=tmp;}}
+      q = q_dirB[k];   if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_00P])[kt  ]; (DN.f[DIR_00P])[kt  ]=(D.f[DIR_00P])[kt  ]; (D.f[DIR_00P])[kt  ]=tmp;}}
+      q = q_dirNE[k];  if (q>=c0o1 && q<=c1o1){ if (geom[ksw ] < GEO_FLUID){tmp = (DN.f[DIR_MM0])[ksw ]; (DN.f[DIR_MM0])[ksw ]=(D.f[DIR_MM0])[ksw ]; (D.f[DIR_MM0])[ksw ]=tmp;}}
+      q = q_dirSW[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_PP0])[kne ]; (DN.f[DIR_PP0])[kne ]=(D.f[DIR_PP0])[kne ]; (D.f[DIR_PP0])[kne ]=tmp;}}
+      q = q_dirSE[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_MP0])[knw ]; (DN.f[DIR_MP0])[knw ]=(D.f[DIR_MP0])[knw ]; (D.f[DIR_MP0])[knw ]=tmp;}}
+      q = q_dirNW[k];  if (q>=c0o1 && q<=c1o1){ if (geom[kmp0] < GEO_FLUID){tmp = (DN.f[DIR_PM0])[kse ]; (DN.f[DIR_PM0])[kse ]=(D.f[DIR_PM0])[kse ]; (D.f[DIR_PM0])[kse ]=tmp;}}
+      q = q_dirTE[k];  if (q>=c0o1 && q<=c1o1){ if (geom[kbw ] < GEO_FLUID){tmp = (DN.f[DIR_M0M])[kbw ]; (DN.f[DIR_M0M])[kbw ]=(D.f[DIR_M0M])[kbw ]; (D.f[DIR_M0M])[kbw ]=tmp;}}
+      q = q_dirBW[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_P0P])[kte ]; (DN.f[DIR_P0P])[kte ]=(D.f[DIR_P0P])[kte ]; (D.f[DIR_P0P])[kte ]=tmp;}}
+      q = q_dirBE[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_M0P])[ktw ]; (DN.f[DIR_M0P])[ktw ]=(D.f[DIR_M0P])[ktw ]; (D.f[DIR_M0P])[ktw ]=tmp;}}
+      q = q_dirTW[k];  if (q>=c0o1 && q<=c1o1){ if (geom[km0p] < GEO_FLUID){tmp = (DN.f[DIR_P0M])[kbe ]; (DN.f[DIR_P0M])[kbe ]=(D.f[DIR_P0M])[kbe ]; (D.f[DIR_P0M])[kbe ]=tmp;}}
+      q = q_dirTN[k];  if (q>=c0o1 && q<=c1o1){ if (geom[kbs ] < GEO_FLUID){tmp = (DN.f[DIR_0MM])[kbs ]; (DN.f[DIR_0MM])[kbs ]=(D.f[DIR_0MM])[kbs ]; (D.f[DIR_0MM])[kbs ]=tmp;}}
+      q = q_dirBS[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_0PP])[ktn ]; (DN.f[DIR_0PP])[ktn ]=(D.f[DIR_0PP])[ktn ]; (D.f[DIR_0PP])[ktn ]=tmp;}}
+      q = q_dirBN[k];  if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_0MP])[kts ]; (DN.f[DIR_0MP])[kts ]=(D.f[DIR_0MP])[kts ]; (D.f[DIR_0MP])[kts ]=tmp;}}
+      q = q_dirTS[k];  if (q>=c0o1 && q<=c1o1){ if (geom[k0mp] < GEO_FLUID){tmp = (DN.f[DIR_0PM])[kbn ]; (DN.f[DIR_0PM])[kbn ]=(D.f[DIR_0PM])[kbn ]; (D.f[DIR_0PM])[kbn ]=tmp;}}
       q = q_dirTNE[k]; if (q>=c0o1 && q<=c1o1){ if (geom[kbsw] < GEO_FLUID){tmp = (DN.f[DIR_MMM])[kbsw]; (DN.f[DIR_MMM])[kbsw]=(D.f[DIR_MMM])[kbsw]; (D.f[DIR_MMM])[kbsw]=tmp;}}
       q = q_dirBSW[k]; if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_PPP])[ktne]; (DN.f[DIR_PPP])[ktne]=(D.f[DIR_PPP])[ktne]; (D.f[DIR_PPP])[ktne]=tmp;}}
       q = q_dirBNE[k]; if (q>=c0o1 && q<=c1o1){                            {tmp = (DN.f[DIR_MMP])[ktsw]; (DN.f[DIR_MMP])[ktsw]=(D.f[DIR_MMP])[ktsw]; (D.f[DIR_MMP])[ktsw]=tmp;}}
diff --git a/src/gpu/VirtualFluids_GPU/GPU/TurbulenceIntensity.cu b/src/gpu/VirtualFluids_GPU/GPU/TurbulenceIntensity.cu
index f8cf8ab13c39d55477bf006cd27f7943dcb5b53a..da209cd468db3b72ffc058fbe1ec4d76ca7960e5 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/TurbulenceIntensity.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/TurbulenceIntensity.cu
@@ -34,18 +34,18 @@ __global__ void CalcTurbulenceIntensity(
    unsigned int* neighborX,
    unsigned int* neighborY,
    unsigned int* neighborZ,
-   unsigned int size_Mat, 
+   unsigned long long numberOfLBnodes, 
    bool isEvenTimestep)
 {
    const unsigned k = vf::gpu::getNodeIndex();
 
-   if (k >= size_Mat)
+   if (k >= numberOfLBnodes)
        return;
 
    if (!vf::gpu::isValidFluidNode(typeOfGridNode[k]))
        return;
 
-   vf::gpu::DistributionWrapper distr_wrapper(distributions, size_Mat, isEvenTimestep, k, neighborX, neighborY,
+   vf::gpu::DistributionWrapper distr_wrapper(distributions, numberOfLBnodes, isEvenTimestep, k, neighborX, neighborY,
                                               neighborZ);
    const auto &distribution = distr_wrapper.distribution;
 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/TurbulentViscosityKernels.cu b/src/gpu/VirtualFluids_GPU/GPU/TurbulentViscosityKernels.cu
index a8f02fee717caf7f67624243b873fe993b5c7927..20f6e83350ba5bde0c84b4498281e4a04e4d957f 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/TurbulentViscosityKernels.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/TurbulentViscosityKernels.cu
@@ -62,11 +62,11 @@ __global__ void calcAMD(real* vx,
                         uint* neighborZ,
                         uint* neighborWSB,
                         uint* typeOfGridNode,
-                        uint size_Mat,
+                        unsigned long long numberOfLBnodes,
                         real SGSConstant)
 {
     const uint k = vf::gpu::getNodeIndex();
-    if(k >= size_Mat) return;
+    if(k >= numberOfLBnodes) return;
     if(typeOfGridNode[k] != GEO_FLUID) return;
 
     uint kPx = neighborX[k];
diff --git a/src/gpu/VirtualFluids_GPU/GPU/VelocityBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/VelocityBCs27.cu
index 05c85e8b546aeaa964b1dbb61cbf01dd9b82ca1a..12ff3af8ea9a1f57c64d560b63404920f2d4a8ff 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/VelocityBCs27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/VelocityBCs27.cu
@@ -28,69 +28,69 @@ __global__ void QVelDeviceCompPlusSlip27(
 													unsigned int* neighborX,
 													unsigned int* neighborY,
 													unsigned int* neighborZ,
-													unsigned int size_Mat, 
+													unsigned long long numberOfLBnodes, 
 													bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -115,24 +115,24 @@ __global__ void QVelDeviceCompPlusSlip27(
 		   *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[DIR_P00   * numberOfBCnodes];
-	   q_dirW = &QQ[DIR_M00   * numberOfBCnodes];
-	   q_dirN = &QQ[DIR_0P0   * numberOfBCnodes];
-	   q_dirS = &QQ[DIR_0M0   * numberOfBCnodes];
-	   q_dirT = &QQ[DIR_00P   * numberOfBCnodes];
-	   q_dirB = &QQ[DIR_00M   * numberOfBCnodes];
-	   q_dirNE = &QQ[DIR_PP0  * numberOfBCnodes];
-	   q_dirSW = &QQ[DIR_MM0  * numberOfBCnodes];
-	   q_dirSE = &QQ[DIR_PM0  * numberOfBCnodes];
-	   q_dirNW = &QQ[DIR_MP0  * numberOfBCnodes];
-	   q_dirTE = &QQ[DIR_P0P  * numberOfBCnodes];
-	   q_dirBW = &QQ[DIR_M0M  * numberOfBCnodes];
-	   q_dirBE = &QQ[DIR_P0M  * numberOfBCnodes];
-	   q_dirTW = &QQ[DIR_M0P  * numberOfBCnodes];
-	   q_dirTN = &QQ[DIR_0PP  * numberOfBCnodes];
-	   q_dirBS = &QQ[DIR_0MM  * numberOfBCnodes];
-	   q_dirBN = &QQ[DIR_0PM  * numberOfBCnodes];
-	   q_dirTS = &QQ[DIR_0MP  * numberOfBCnodes];
+	   q_dirE = &QQ[DIR_P00 * numberOfBCnodes];
+	   q_dirW = &QQ[DIR_M00 * numberOfBCnodes];
+	   q_dirN = &QQ[DIR_0P0 * numberOfBCnodes];
+	   q_dirS = &QQ[DIR_0M0 * numberOfBCnodes];
+	   q_dirT = &QQ[DIR_00P * numberOfBCnodes];
+	   q_dirB = &QQ[DIR_00M * numberOfBCnodes];
+	   q_dirNE = &QQ[DIR_PP0 * numberOfBCnodes];
+	   q_dirSW = &QQ[DIR_MM0 * numberOfBCnodes];
+	   q_dirSE = &QQ[DIR_PM0 * numberOfBCnodes];
+	   q_dirNW = &QQ[DIR_MP0 * numberOfBCnodes];
+	   q_dirTE = &QQ[DIR_P0P * numberOfBCnodes];
+	   q_dirBW = &QQ[DIR_M0M * numberOfBCnodes];
+	   q_dirBE = &QQ[DIR_P0M * numberOfBCnodes];
+	   q_dirTW = &QQ[DIR_M0P * numberOfBCnodes];
+	   q_dirTN = &QQ[DIR_0PP * numberOfBCnodes];
+	   q_dirBS = &QQ[DIR_0MM * numberOfBCnodes];
+	   q_dirBN = &QQ[DIR_0PM * numberOfBCnodes];
+	   q_dirTS = &QQ[DIR_0MP * numberOfBCnodes];
 	   q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
 	   q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
 	   q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -225,63 +225,63 @@ __global__ void QVelDeviceCompPlusSlip27(
 	   //////////////////////////////////////////////////////////////////////////
 	   if (isEvenTimestep == false)
 	   {
-		   D.f[DIR_P00] = &DD[DIR_P00   *size_Mat];
-		   D.f[DIR_M00] = &DD[DIR_M00   *size_Mat];
-		   D.f[DIR_0P0] = &DD[DIR_0P0   *size_Mat];
-		   D.f[DIR_0M0] = &DD[DIR_0M0   *size_Mat];
-		   D.f[DIR_00P] = &DD[DIR_00P   *size_Mat];
-		   D.f[DIR_00M] = &DD[DIR_00M   *size_Mat];
-		   D.f[DIR_PP0] = &DD[DIR_PP0  *size_Mat];
-		   D.f[DIR_MM0] = &DD[DIR_MM0  *size_Mat];
-		   D.f[DIR_PM0] = &DD[DIR_PM0  *size_Mat];
-		   D.f[DIR_MP0] = &DD[DIR_MP0  *size_Mat];
-		   D.f[DIR_P0P] = &DD[DIR_P0P  *size_Mat];
-		   D.f[DIR_M0M] = &DD[DIR_M0M  *size_Mat];
-		   D.f[DIR_P0M] = &DD[DIR_P0M  *size_Mat];
-		   D.f[DIR_M0P] = &DD[DIR_M0P  *size_Mat];
-		   D.f[DIR_0PP] = &DD[DIR_0PP  *size_Mat];
-		   D.f[DIR_0MM] = &DD[DIR_0MM  *size_Mat];
-		   D.f[DIR_0PM] = &DD[DIR_0PM  *size_Mat];
-		   D.f[DIR_0MP] = &DD[DIR_0MP  *size_Mat];
-		   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		   D.f[DIR_PPP] = &DD[DIR_PPP *size_Mat];
-		   D.f[DIR_MMP] = &DD[DIR_MMP *size_Mat];
-		   D.f[DIR_PMP] = &DD[DIR_PMP *size_Mat];
-		   D.f[DIR_MPP] = &DD[DIR_MPP *size_Mat];
-		   D.f[DIR_PPM] = &DD[DIR_PPM *size_Mat];
-		   D.f[DIR_MMM] = &DD[DIR_MMM *size_Mat];
-		   D.f[DIR_PMM] = &DD[DIR_PMM *size_Mat];
-		   D.f[DIR_MPM] = &DD[DIR_MPM *size_Mat];
+		   D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		   D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		   D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		   D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		   D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		   D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		   D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		   D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		   D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		   D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		   D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		   D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		   D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		   D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		   D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		   D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		   D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		   D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		   D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		   D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		   D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		   D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		   D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		   D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		   D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		   D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		   D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	   }
 	   else
 	   {
-		   D.f[DIR_M00] = &DD[DIR_P00   *size_Mat];
-		   D.f[DIR_P00] = &DD[DIR_M00   *size_Mat];
-		   D.f[DIR_0M0] = &DD[DIR_0P0   *size_Mat];
-		   D.f[DIR_0P0] = &DD[DIR_0M0   *size_Mat];
-		   D.f[DIR_00M] = &DD[DIR_00P   *size_Mat];
-		   D.f[DIR_00P] = &DD[DIR_00M   *size_Mat];
-		   D.f[DIR_MM0] = &DD[DIR_PP0  *size_Mat];
-		   D.f[DIR_PP0] = &DD[DIR_MM0  *size_Mat];
-		   D.f[DIR_MP0] = &DD[DIR_PM0  *size_Mat];
-		   D.f[DIR_PM0] = &DD[DIR_MP0  *size_Mat];
-		   D.f[DIR_M0M] = &DD[DIR_P0P  *size_Mat];
-		   D.f[DIR_P0P] = &DD[DIR_M0M  *size_Mat];
-		   D.f[DIR_M0P] = &DD[DIR_P0M  *size_Mat];
-		   D.f[DIR_P0M] = &DD[DIR_M0P  *size_Mat];
-		   D.f[DIR_0MM] = &DD[DIR_0PP  *size_Mat];
-		   D.f[DIR_0PP] = &DD[DIR_0MM  *size_Mat];
-		   D.f[DIR_0MP] = &DD[DIR_0PM  *size_Mat];
-		   D.f[DIR_0PM] = &DD[DIR_0MP  *size_Mat];
-		   D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		   D.f[DIR_PPP] = &DD[DIR_MMM *size_Mat];
-		   D.f[DIR_MMP] = &DD[DIR_PPM *size_Mat];
-		   D.f[DIR_PMP] = &DD[DIR_MPM *size_Mat];
-		   D.f[DIR_MPP] = &DD[DIR_PMM *size_Mat];
-		   D.f[DIR_PPM] = &DD[DIR_MMP *size_Mat];
-		   D.f[DIR_MMM] = &DD[DIR_PPP *size_Mat];
-		   D.f[DIR_PMM] = &DD[DIR_MPP *size_Mat];
-		   D.f[DIR_MPM] = &DD[DIR_PMP *size_Mat];
+		   D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		   D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		   D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		   D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		   D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		   D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		   D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		   D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		   D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		   D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		   D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		   D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		   D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		   D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		   D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		   D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		   D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		   D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		   D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		   D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		   D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		   D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		   D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		   D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		   D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		   D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		   D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	   }
 	   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	   //Test
@@ -563,7 +563,7 @@ __global__ void QVeloDeviceEQ27(real* VeloX,
                                            unsigned int* neighborX,
                                            unsigned int* neighborY,
                                            unsigned int* neighborZ,
-                                           unsigned int size_Mat, 
+                                           unsigned long long numberOfLBnodes, 
                                            bool isEvenTimestep)
 {
    ////////////////////////////////////////////////////////////////////////////////
@@ -613,95 +613,95 @@ __global__ void QVeloDeviceEQ27(real* VeloX,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
 
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
             // based on BGK Plus Comp
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[ke   ];
-			real mfabb = (D.f[DIR_M00   ])[kw   ];
-			real mfbcb = (D.f[DIR_0P0   ])[kn   ];
-			real mfbab = (D.f[DIR_0M0   ])[ks   ];
-			real mfbbc = (D.f[DIR_00P   ])[kt   ];
-			real mfbba = (D.f[DIR_00M   ])[kb   ];
-			real mfccb = (D.f[DIR_PP0  ])[kne  ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw  ];
-			real mfcab = (D.f[DIR_PM0  ])[kse  ];
-			real mfacb = (D.f[DIR_MP0  ])[knw  ];
-			real mfcbc = (D.f[DIR_P0P  ])[kte  ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw  ];
-			real mfcba = (D.f[DIR_P0M  ])[kbe  ];
-			real mfabc = (D.f[DIR_M0P  ])[ktw  ];
-			real mfbcc = (D.f[DIR_0PP  ])[ktn  ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs  ];
-			real mfbca = (D.f[DIR_0PM  ])[kbn  ];
-			real mfbac = (D.f[DIR_0MP  ])[kts  ];
+			real mfcbb = (D.f[DIR_P00])[ke   ];
+			real mfabb = (D.f[DIR_M00])[kw   ];
+			real mfbcb = (D.f[DIR_0P0])[kn   ];
+			real mfbab = (D.f[DIR_0M0])[ks   ];
+			real mfbbc = (D.f[DIR_00P])[kt   ];
+			real mfbba = (D.f[DIR_00M])[kb   ];
+			real mfccb = (D.f[DIR_PP0])[kne  ];
+			real mfaab = (D.f[DIR_MM0])[ksw  ];
+			real mfcab = (D.f[DIR_PM0])[kse  ];
+			real mfacb = (D.f[DIR_MP0])[knw  ];
+			real mfcbc = (D.f[DIR_P0P])[kte  ];
+			real mfaba = (D.f[DIR_M0M])[kbw  ];
+			real mfcba = (D.f[DIR_P0M])[kbe  ];
+			real mfabc = (D.f[DIR_M0P])[ktw  ];
+			real mfbcc = (D.f[DIR_0PP])[ktn  ];
+			real mfbaa = (D.f[DIR_0MM])[kbs  ];
+			real mfbca = (D.f[DIR_0PM])[kbn  ];
+			real mfbac = (D.f[DIR_0MP])[kts  ];
 			real mfbbb = (D.f[DIR_000])[kzero];
-			real mfccc = (D.f[DIR_PPP ])[ktne ];
-			real mfaac = (D.f[DIR_MMP ])[ktsw ];
-			real mfcac = (D.f[DIR_PMP ])[ktse ];
-			real mfacc = (D.f[DIR_MPP ])[ktnw ];
-			real mfcca = (D.f[DIR_PPM ])[kbne ];
-			real mfaaa = (D.f[DIR_MMM ])[kbsw ];
-			real mfcaa = (D.f[DIR_PMM ])[kbse ];
-			real mfaca = (D.f[DIR_MPM ])[kbnw ];
+			real mfccc = (D.f[DIR_PPP])[ktne ];
+			real mfaac = (D.f[DIR_MMP])[ktsw ];
+			real mfcac = (D.f[DIR_PMP])[ktse ];
+			real mfacc = (D.f[DIR_MPP])[ktnw ];
+			real mfcca = (D.f[DIR_PPM])[kbne ];
+			real mfaaa = (D.f[DIR_MMM])[kbsw ];
+			real mfcaa = (D.f[DIR_PMM])[kbse ];
+			real mfaca = (D.f[DIR_MPM])[kbnw ];
 			////////////////////////////////////////////////////////////////////////////////////
 			real rho   = (mfccc+mfaaa + mfaca+mfcac + mfacc+mfcaa + mfaac+mfcca + 
 							 mfbac+mfbca + mfbaa+mfbcc + mfabc+mfcba + mfaba+mfcbc + mfacb+mfcab + mfaab+mfccb +
@@ -763,33 +763,33 @@ __global__ void QVeloDeviceEQ27(real* VeloX,
 			mfcaa = -rho * XXc * YYa * ZZa - c1o216;
 			mfaca = -rho * XXa * YYc * ZZa - c1o216;
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			(D.f[DIR_P00   ])[ke   ] = mfabb;//mfcbb;
-			(D.f[DIR_M00   ])[kw   ] = mfcbb;//mfabb;
-			(D.f[DIR_0P0   ])[kn   ] = mfbab;//mfbcb;
-			(D.f[DIR_0M0   ])[ks   ] = mfbcb;//mfbab;
-			(D.f[DIR_00P   ])[kt   ] = mfbba;//mfbbc;
-			(D.f[DIR_00M   ])[kb   ] = mfbbc;//mfbba;
-			(D.f[DIR_PP0  ])[kne  ] = mfaab;//mfccb;
-			(D.f[DIR_MM0  ])[ksw  ] = mfccb;//mfaab;
-			(D.f[DIR_PM0  ])[kse  ] = mfacb;//mfcab;
-			(D.f[DIR_MP0  ])[knw  ] = mfcab;//mfacb;
-			(D.f[DIR_P0P  ])[kte  ] = mfaba;//mfcbc;
-			(D.f[DIR_M0M  ])[kbw  ] = mfcbc;//mfaba;
-			(D.f[DIR_P0M  ])[kbe  ] = mfabc;//mfcba;
-			(D.f[DIR_M0P  ])[ktw  ] = mfcba;//mfabc;
-			(D.f[DIR_0PP  ])[ktn  ] = mfbaa;//mfbcc;
-			(D.f[DIR_0MM  ])[kbs  ] = mfbcc;//mfbaa;
-			(D.f[DIR_0PM  ])[kbn  ] = mfbac;//mfbca;
-			(D.f[DIR_0MP  ])[kts  ] = mfbca;//mfbac;
+			(D.f[DIR_P00])[ke   ] = mfabb;//mfcbb;
+			(D.f[DIR_M00])[kw   ] = mfcbb;//mfabb;
+			(D.f[DIR_0P0])[kn   ] = mfbab;//mfbcb;
+			(D.f[DIR_0M0])[ks   ] = mfbcb;//mfbab;
+			(D.f[DIR_00P])[kt   ] = mfbba;//mfbbc;
+			(D.f[DIR_00M])[kb   ] = mfbbc;//mfbba;
+			(D.f[DIR_PP0])[kne  ] = mfaab;//mfccb;
+			(D.f[DIR_MM0])[ksw  ] = mfccb;//mfaab;
+			(D.f[DIR_PM0])[kse  ] = mfacb;//mfcab;
+			(D.f[DIR_MP0])[knw  ] = mfcab;//mfacb;
+			(D.f[DIR_P0P])[kte  ] = mfaba;//mfcbc;
+			(D.f[DIR_M0M])[kbw  ] = mfcbc;//mfaba;
+			(D.f[DIR_P0M])[kbe  ] = mfabc;//mfcba;
+			(D.f[DIR_M0P])[ktw  ] = mfcba;//mfabc;
+			(D.f[DIR_0PP])[ktn  ] = mfbaa;//mfbcc;
+			(D.f[DIR_0MM])[kbs  ] = mfbcc;//mfbaa;
+			(D.f[DIR_0PM])[kbn  ] = mfbac;//mfbca;
+			(D.f[DIR_0MP])[kts  ] = mfbca;//mfbac;
 			(D.f[DIR_000])[kzero] = mfbbb;//mfbbb;
-			(D.f[DIR_PPP ])[ktne ] = mfaaa;//mfccc;
-			(D.f[DIR_MMP ])[ktsw ] = mfcca;//mfaac;
-			(D.f[DIR_PMP ])[ktse ] = mfaca;//mfcac;
-			(D.f[DIR_MPP ])[ktnw ] = mfcaa;//mfacc;
-			(D.f[DIR_PPM ])[kbne ] = mfaac;//mfcca;
-			(D.f[DIR_MMM ])[kbsw ] = mfccc;//mfaaa;
-			(D.f[DIR_PMM ])[kbse ] = mfacc;//mfcaa;
-			(D.f[DIR_MPM ])[kbnw ] = mfcac;//mfaca;
+			(D.f[DIR_PPP])[ktne ] = mfaaa;//mfccc;
+			(D.f[DIR_MMP])[ktsw ] = mfcca;//mfaac;
+			(D.f[DIR_PMP])[ktse ] = mfaca;//mfcac;
+			(D.f[DIR_MPP])[ktnw ] = mfcaa;//mfacc;
+			(D.f[DIR_PPM])[kbne ] = mfaac;//mfcca;
+			(D.f[DIR_MMM])[kbsw ] = mfccc;//mfaaa;
+			(D.f[DIR_PMM])[kbse ] = mfacc;//mfcaa;
+			(D.f[DIR_MPM])[kbnw ] = mfcac;//mfaca;
    }
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -844,7 +844,7 @@ __global__ void QVeloStreetDeviceEQ27(
 	uint* neighborX,
 	uint* neighborY,
 	uint* neighborZ,
-	uint  size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool  isEvenTimestep)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -894,95 +894,95 @@ __global__ void QVeloStreetDeviceEQ27(
 		Distributions27 D;
 		if (isEvenTimestep == true)
 		{
-			D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-			D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-			D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-			D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-			D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-			D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-			D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-			D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-			D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-			D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-			D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-			D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-			D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-			D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-			D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-			D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-			D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-			D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-			D.f[DIR_000] = &DD[DIR_000*size_Mat];
-			D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-			D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-			D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-			D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-			D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-			D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-			D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-			D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+			D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+			D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+			D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+			D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+			D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+			D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+			D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+			D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+			D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+			D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+			D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+			D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+			D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+			D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+			D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+			D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+			D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+			D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+			D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+			D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+			D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+			D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+			D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+			D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+			D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+			D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+			D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 		}
 		else
 		{
-			D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-			D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-			D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-			D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-			D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-			D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-			D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-			D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-			D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-			D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-			D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-			D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-			D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-			D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-			D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-			D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-			D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-			D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-			D.f[DIR_000] = &DD[DIR_000*size_Mat];
-			D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-			D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-			D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-			D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-			D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-			D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-			D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-			D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+			D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+			D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+			D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+			D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+			D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+			D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+			D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+			D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+			D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+			D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+			D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+			D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+			D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+			D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+			D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+			D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+			D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+			D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+			D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+			D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+			D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+			D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+			D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+			D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+			D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+			D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+			D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 		}
 
 		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 		// based on BGK Plus Comp
 		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		real mfcbb = (D.f[DIR_P00   ])[ke   ];
-		real mfabb = (D.f[DIR_M00   ])[kw   ];
-		real mfbcb = (D.f[DIR_0P0   ])[kn   ];
-		real mfbab = (D.f[DIR_0M0   ])[ks   ];
-		real mfbbc = (D.f[DIR_00P   ])[kt   ];
-		real mfbba = (D.f[DIR_00M   ])[kb   ];
-		real mfccb = (D.f[DIR_PP0  ])[kne  ];
-		real mfaab = (D.f[DIR_MM0  ])[ksw  ];
-		real mfcab = (D.f[DIR_PM0  ])[kse  ];
-		real mfacb = (D.f[DIR_MP0  ])[knw  ];
-		real mfcbc = (D.f[DIR_P0P  ])[kte  ];
-		real mfaba = (D.f[DIR_M0M  ])[kbw  ];
-		real mfcba = (D.f[DIR_P0M  ])[kbe  ];
-		real mfabc = (D.f[DIR_M0P  ])[ktw  ];
-		real mfbcc = (D.f[DIR_0PP  ])[ktn  ];
-		real mfbaa = (D.f[DIR_0MM  ])[kbs  ];
-		real mfbca = (D.f[DIR_0PM  ])[kbn  ];
-		real mfbac = (D.f[DIR_0MP  ])[kts  ];
+		real mfcbb = (D.f[DIR_P00])[ke   ];
+		real mfabb = (D.f[DIR_M00])[kw   ];
+		real mfbcb = (D.f[DIR_0P0])[kn   ];
+		real mfbab = (D.f[DIR_0M0])[ks   ];
+		real mfbbc = (D.f[DIR_00P])[kt   ];
+		real mfbba = (D.f[DIR_00M])[kb   ];
+		real mfccb = (D.f[DIR_PP0])[kne  ];
+		real mfaab = (D.f[DIR_MM0])[ksw  ];
+		real mfcab = (D.f[DIR_PM0])[kse  ];
+		real mfacb = (D.f[DIR_MP0])[knw  ];
+		real mfcbc = (D.f[DIR_P0P])[kte  ];
+		real mfaba = (D.f[DIR_M0M])[kbw  ];
+		real mfcba = (D.f[DIR_P0M])[kbe  ];
+		real mfabc = (D.f[DIR_M0P])[ktw  ];
+		real mfbcc = (D.f[DIR_0PP])[ktn  ];
+		real mfbaa = (D.f[DIR_0MM])[kbs  ];
+		real mfbca = (D.f[DIR_0PM])[kbn  ];
+		real mfbac = (D.f[DIR_0MP])[kts  ];
 		real mfbbb = (D.f[DIR_000])[kzero];
-		real mfccc = (D.f[DIR_PPP ])[ktne ];
-		real mfaac = (D.f[DIR_MMP ])[ktsw ];
-		real mfcac = (D.f[DIR_PMP ])[ktse ];
-		real mfacc = (D.f[DIR_MPP ])[ktnw ];
-		real mfcca = (D.f[DIR_PPM ])[kbne ];
-		real mfaaa = (D.f[DIR_MMM ])[kbsw ];
-		real mfcaa = (D.f[DIR_PMM ])[kbse ];
-		real mfaca = (D.f[DIR_MPM ])[kbnw ];
+		real mfccc = (D.f[DIR_PPP])[ktne ];
+		real mfaac = (D.f[DIR_MMP])[ktsw ];
+		real mfcac = (D.f[DIR_PMP])[ktse ];
+		real mfacc = (D.f[DIR_MPP])[ktnw ];
+		real mfcca = (D.f[DIR_PPM])[kbne ];
+		real mfaaa = (D.f[DIR_MMM])[kbsw ];
+		real mfcaa = (D.f[DIR_PMM])[kbse ];
+		real mfaca = (D.f[DIR_MPM])[kbnw ];
 		////////////////////////////////////////////////////////////////////////////////////
 		real rho = (mfccc + mfaaa + mfaca + mfcac + mfacc + mfcaa + mfaac + mfcca +
 			        mfbac + mfbca + mfbaa + mfbcc + mfabc + mfcba + mfaba + mfcbc + mfacb + mfcab + mfaab + mfccb +
@@ -1049,33 +1049,33 @@ __global__ void QVeloStreetDeviceEQ27(
 		mfcaa = -rho * XXc * YYa * ZZa - c1o216;
 		mfaca = -rho * XXa * YYc * ZZa - c1o216;
 		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		(D.f[DIR_P00   ])[ke   ] = mfabb;//mfcbb;
-		(D.f[DIR_M00   ])[kw   ] = mfcbb;//mfabb;
-		(D.f[DIR_0P0   ])[kn   ] = mfbab;//mfbcb;
-		(D.f[DIR_0M0   ])[ks   ] = mfbcb;//mfbab;
-		(D.f[DIR_00P   ])[kt   ] = mfbba;//mfbbc;
-		(D.f[DIR_00M   ])[kb   ] = mfbbc;//mfbba;
-		(D.f[DIR_PP0  ])[kne  ] = mfaab;//mfccb;
-		(D.f[DIR_MM0  ])[ksw  ] = mfccb;//mfaab;
-		(D.f[DIR_PM0  ])[kse  ] = mfacb;//mfcab;
-		(D.f[DIR_MP0  ])[knw  ] = mfcab;//mfacb;
-		(D.f[DIR_P0P  ])[kte  ] = mfaba;//mfcbc;
-		(D.f[DIR_M0M  ])[kbw  ] = mfcbc;//mfaba;
-		(D.f[DIR_P0M  ])[kbe  ] = mfabc;//mfcba;
-		(D.f[DIR_M0P  ])[ktw  ] = mfcba;//mfabc;
-		(D.f[DIR_0PP  ])[ktn  ] = mfbaa;//mfbcc;
-		(D.f[DIR_0MM  ])[kbs  ] = mfbcc;//mfbaa;
-		(D.f[DIR_0PM  ])[kbn  ] = mfbac;//mfbca;
-		(D.f[DIR_0MP  ])[kts  ] = mfbca;//mfbac;
+		(D.f[DIR_P00])[ke   ] = mfabb;//mfcbb;
+		(D.f[DIR_M00])[kw   ] = mfcbb;//mfabb;
+		(D.f[DIR_0P0])[kn   ] = mfbab;//mfbcb;
+		(D.f[DIR_0M0])[ks   ] = mfbcb;//mfbab;
+		(D.f[DIR_00P])[kt   ] = mfbba;//mfbbc;
+		(D.f[DIR_00M])[kb   ] = mfbbc;//mfbba;
+		(D.f[DIR_PP0])[kne  ] = mfaab;//mfccb;
+		(D.f[DIR_MM0])[ksw  ] = mfccb;//mfaab;
+		(D.f[DIR_PM0])[kse  ] = mfacb;//mfcab;
+		(D.f[DIR_MP0])[knw  ] = mfcab;//mfacb;
+		(D.f[DIR_P0P])[kte  ] = mfaba;//mfcbc;
+		(D.f[DIR_M0M])[kbw  ] = mfcbc;//mfaba;
+		(D.f[DIR_P0M])[kbe  ] = mfabc;//mfcba;
+		(D.f[DIR_M0P])[ktw  ] = mfcba;//mfabc;
+		(D.f[DIR_0PP])[ktn  ] = mfbaa;//mfbcc;
+		(D.f[DIR_0MM])[kbs  ] = mfbcc;//mfbaa;
+		(D.f[DIR_0PM])[kbn  ] = mfbac;//mfbca;
+		(D.f[DIR_0MP])[kts  ] = mfbca;//mfbac;
 		(D.f[DIR_000])[kzero] = mfbbb;//mfbbb;
-		(D.f[DIR_PPP ])[ktne ] = mfaaa;//mfccc;
-		(D.f[DIR_MMP ])[ktsw ] = mfcca;//mfaac;
-		(D.f[DIR_PMP ])[ktse ] = mfaca;//mfcac;
-		(D.f[DIR_MPP ])[ktnw ] = mfcaa;//mfacc;
-		(D.f[DIR_PPM ])[kbne ] = mfaac;//mfcca;
-		(D.f[DIR_MMM ])[kbsw ] = mfccc;//mfaaa;
-		(D.f[DIR_PMM ])[kbse ] = mfacc;//mfcaa;
-		(D.f[DIR_MPM ])[kbnw ] = mfcac;//mfaca;
+		(D.f[DIR_PPP])[ktne ] = mfaaa;//mfccc;
+		(D.f[DIR_MMP])[ktsw ] = mfcca;//mfaac;
+		(D.f[DIR_PMP])[ktse ] = mfaca;//mfcac;
+		(D.f[DIR_MPP])[ktnw ] = mfcaa;//mfacc;
+		(D.f[DIR_PPM])[kbne ] = mfaac;//mfcca;
+		(D.f[DIR_MMM])[kbsw ] = mfccc;//mfaaa;
+		(D.f[DIR_PMM])[kbse ] = mfacc;//mfcaa;
+		(D.f[DIR_MPM])[kbnw ] = mfcac;//mfaca;
 	}
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1131,69 +1131,69 @@ __global__ void QVelDeviceIncompHighNu27(
 													unsigned int* neighborX,
 													unsigned int* neighborY,
 													unsigned int* neighborZ,
-													unsigned int size_Mat, 
+													unsigned long long numberOfLBnodes, 
 													bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -1218,24 +1218,24 @@ __global__ void QVelDeviceIncompHighNu27(
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -1278,32 +1278,32 @@ __global__ void QVelDeviceIncompHighNu27(
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_E   = (D.f[DIR_P00   ])[ke   ];
-      f_W   = (D.f[DIR_M00   ])[kw   ];
-      f_N   = (D.f[DIR_0P0   ])[kn   ];
-      f_S   = (D.f[DIR_0M0   ])[ks   ];
-      f_T   = (D.f[DIR_00P   ])[kt   ];
-      f_B   = (D.f[DIR_00M   ])[kb   ];
-      f_NE  = (D.f[DIR_PP0  ])[kne  ];
-      f_SW  = (D.f[DIR_MM0  ])[ksw  ];
-      f_SE  = (D.f[DIR_PM0  ])[kse  ];
-      f_NW  = (D.f[DIR_MP0  ])[knw  ];
-      f_TE  = (D.f[DIR_P0P  ])[kte  ];
-      f_BW  = (D.f[DIR_M0M  ])[kbw  ];
-      f_BE  = (D.f[DIR_P0M  ])[kbe  ];
-      f_TW  = (D.f[DIR_M0P  ])[ktw  ];
-      f_TN  = (D.f[DIR_0PP  ])[ktn  ];
-      f_BS  = (D.f[DIR_0MM  ])[kbs  ];
-      f_BN  = (D.f[DIR_0PM  ])[kbn  ];
-      f_TS  = (D.f[DIR_0MP  ])[kts  ];
-      f_TNE = (D.f[DIR_PPP ])[ktne ];
-      f_TSW = (D.f[DIR_MMP ])[ktsw ];
-      f_TSE = (D.f[DIR_PMP ])[ktse ];
-      f_TNW = (D.f[DIR_MPP ])[ktnw ];
-      f_BNE = (D.f[DIR_PPM ])[kbne ];
-      f_BSW = (D.f[DIR_MMM ])[kbsw ];
-      f_BSE = (D.f[DIR_PMM ])[kbse ];
-      f_BNW = (D.f[DIR_MPM ])[kbnw ];
+      f_E   = (D.f[DIR_P00])[ke   ];
+      f_W   = (D.f[DIR_M00])[kw   ];
+      f_N   = (D.f[DIR_0P0])[kn   ];
+      f_S   = (D.f[DIR_0M0])[ks   ];
+      f_T   = (D.f[DIR_00P])[kt   ];
+      f_B   = (D.f[DIR_00M])[kb   ];
+      f_NE  = (D.f[DIR_PP0])[kne  ];
+      f_SW  = (D.f[DIR_MM0])[ksw  ];
+      f_SE  = (D.f[DIR_PM0])[kse  ];
+      f_NW  = (D.f[DIR_MP0])[knw  ];
+      f_TE  = (D.f[DIR_P0P])[kte  ];
+      f_BW  = (D.f[DIR_M0M])[kbw  ];
+      f_BE  = (D.f[DIR_P0M])[kbe  ];
+      f_TW  = (D.f[DIR_M0P])[ktw  ];
+      f_TN  = (D.f[DIR_0PP])[ktn  ];
+      f_BS  = (D.f[DIR_0MM])[kbs  ];
+      f_BN  = (D.f[DIR_0PM])[kbn  ];
+      f_TS  = (D.f[DIR_0MP])[kts  ];
+      f_TNE = (D.f[DIR_PPP])[ktne ];
+      f_TSW = (D.f[DIR_MMP])[ktsw ];
+      f_TSE = (D.f[DIR_PMP])[ktse ];
+      f_TNW = (D.f[DIR_MPP])[ktnw ];
+      f_BNE = (D.f[DIR_PPM])[kbne ];
+      f_BSW = (D.f[DIR_MMM])[kbsw ];
+      f_BSE = (D.f[DIR_PMM])[kbse ];
+      f_BNW = (D.f[DIR_MPM])[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 +
@@ -1328,63 +1328,63 @@ __global__ void QVelDeviceIncompHighNu27(
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -1629,69 +1629,69 @@ __global__ void QVelDeviceCompHighNu27(
 													unsigned int* neighborX,
 													unsigned int* neighborY,
 													unsigned int* neighborZ,
-													unsigned int size_Mat, 
+													unsigned long long numberOfLBnodes, 
 													bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -1716,24 +1716,24 @@ __global__ void QVelDeviceCompHighNu27(
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -1776,58 +1776,58 @@ __global__ void QVelDeviceCompHighNu27(
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_E   = (D.f[DIR_P00   ])[ke   ];
-      f_W   = (D.f[DIR_M00   ])[kw   ];
-      f_N   = (D.f[DIR_0P0   ])[kn   ];
-      f_S   = (D.f[DIR_0M0   ])[ks   ];
-      f_T   = (D.f[DIR_00P   ])[kt   ];
-      f_B   = (D.f[DIR_00M   ])[kb   ];
-      f_NE  = (D.f[DIR_PP0  ])[kne  ];
-      f_SW  = (D.f[DIR_MM0  ])[ksw  ];
-      f_SE  = (D.f[DIR_PM0  ])[kse  ];
-      f_NW  = (D.f[DIR_MP0  ])[knw  ];
-      f_TE  = (D.f[DIR_P0P  ])[kte  ];
-      f_BW  = (D.f[DIR_M0M  ])[kbw  ];
-      f_BE  = (D.f[DIR_P0M  ])[kbe  ];
-      f_TW  = (D.f[DIR_M0P  ])[ktw  ];
-      f_TN  = (D.f[DIR_0PP  ])[ktn  ];
-      f_BS  = (D.f[DIR_0MM  ])[kbs  ];
-      f_BN  = (D.f[DIR_0PM  ])[kbn  ];
-      f_TS  = (D.f[DIR_0MP  ])[kts  ];
-      f_TNE = (D.f[DIR_PPP ])[ktne ];
-      f_TSW = (D.f[DIR_MMP ])[ktsw ];
-      f_TSE = (D.f[DIR_PMP ])[ktse ];
-      f_TNW = (D.f[DIR_MPP ])[ktnw ];
-      f_BNE = (D.f[DIR_PPM ])[kbne ];
-      f_BSW = (D.f[DIR_MMM ])[kbsw ];
-      f_BSE = (D.f[DIR_PMM ])[kbse ];
-      f_BNW = (D.f[DIR_MPM ])[kbnw ];
-      //f_W    = (D.f[DIR_P00   ])[ke   ];
-      //f_E    = (D.f[DIR_M00   ])[kw   ];
-      //f_S    = (D.f[DIR_0P0   ])[kn   ];
-      //f_N    = (D.f[DIR_0M0   ])[ks   ];
-      //f_B    = (D.f[DIR_00P   ])[kt   ];
-      //f_T    = (D.f[DIR_00M   ])[kb   ];
-      //f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      //f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      //f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      //f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      //f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      //f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      //f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      //f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      //f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      //f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      //f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      //f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      //f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      //f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      //f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      //f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      //f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      //f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      //f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      //f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_E   = (D.f[DIR_P00])[ke   ];
+      f_W   = (D.f[DIR_M00])[kw   ];
+      f_N   = (D.f[DIR_0P0])[kn   ];
+      f_S   = (D.f[DIR_0M0])[ks   ];
+      f_T   = (D.f[DIR_00P])[kt   ];
+      f_B   = (D.f[DIR_00M])[kb   ];
+      f_NE  = (D.f[DIR_PP0])[kne  ];
+      f_SW  = (D.f[DIR_MM0])[ksw  ];
+      f_SE  = (D.f[DIR_PM0])[kse  ];
+      f_NW  = (D.f[DIR_MP0])[knw  ];
+      f_TE  = (D.f[DIR_P0P])[kte  ];
+      f_BW  = (D.f[DIR_M0M])[kbw  ];
+      f_BE  = (D.f[DIR_P0M])[kbe  ];
+      f_TW  = (D.f[DIR_M0P])[ktw  ];
+      f_TN  = (D.f[DIR_0PP])[ktn  ];
+      f_BS  = (D.f[DIR_0MM])[kbs  ];
+      f_BN  = (D.f[DIR_0PM])[kbn  ];
+      f_TS  = (D.f[DIR_0MP])[kts  ];
+      f_TNE = (D.f[DIR_PPP])[ktne ];
+      f_TSW = (D.f[DIR_MMP])[ktsw ];
+      f_TSE = (D.f[DIR_PMP])[ktse ];
+      f_TNW = (D.f[DIR_MPP])[ktnw ];
+      f_BNE = (D.f[DIR_PPM])[kbne ];
+      f_BSW = (D.f[DIR_MMM])[kbsw ];
+      f_BSE = (D.f[DIR_PMM])[kbse ];
+      f_BNW = (D.f[DIR_MPM])[kbnw ];
+      //f_W    = (D.f[DIR_P00])[ke   ];
+      //f_E    = (D.f[DIR_M00])[kw   ];
+      //f_S    = (D.f[DIR_0P0])[kn   ];
+      //f_N    = (D.f[DIR_0M0])[ks   ];
+      //f_B    = (D.f[DIR_00P])[kt   ];
+      //f_T    = (D.f[DIR_00M])[kb   ];
+      //f_SW   = (D.f[DIR_PP0])[kne  ];
+      //f_NE   = (D.f[DIR_MM0])[ksw  ];
+      //f_NW   = (D.f[DIR_PM0])[kse  ];
+      //f_SE   = (D.f[DIR_MP0])[knw  ];
+      //f_BW   = (D.f[DIR_P0P])[kte  ];
+      //f_TE   = (D.f[DIR_M0M])[kbw  ];
+      //f_TW   = (D.f[DIR_P0M])[kbe  ];
+      //f_BE   = (D.f[DIR_M0P])[ktw  ];
+      //f_BS   = (D.f[DIR_0PP])[ktn  ];
+      //f_TN   = (D.f[DIR_0MM])[kbs  ];
+      //f_TS   = (D.f[DIR_0PM])[kbn  ];
+      //f_BN   = (D.f[DIR_0MP])[kts  ];
+      //f_BSW  = (D.f[DIR_PPP])[ktne ];
+      //f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      //f_BNW  = (D.f[DIR_PMP])[ktse ];
+      //f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      //f_TSW  = (D.f[DIR_PPM])[kbne ];
+      //f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      //f_TNW  = (D.f[DIR_PMM])[kbse ];
+      //f_TSE  = (D.f[DIR_MPM])[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 +
@@ -1852,63 +1852,63 @@ __global__ void QVelDeviceCompHighNu27(
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -2205,7 +2205,7 @@ __global__ void QVelDeviceCompZeroPress27(
 														unsigned int* neighborX,
 														unsigned int* neighborY,
 														unsigned int* neighborZ,
-														unsigned int numberOfLBnodes, 
+														unsigned long long numberOfLBnodes, 
 														bool isEvenTimestep)
 {
    //////////////////////////////////////////////////////////////////////////
@@ -2285,32 +2285,32 @@ __global__ void QVelDeviceCompZeroPress27(
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - Calculate macroscopic quantities
@@ -2637,69 +2637,69 @@ __global__ void QVelDeviceCompZeroPress1h27( int inx,
 														real* coordX,
 														real* coordY,
 														real* coordZ,
-														unsigned int size_Mat, 
+														unsigned long long numberOfLBnodes, 
 														bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -2738,24 +2738,24 @@ __global__ void QVelDeviceCompZeroPress1h27( int inx,
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -2797,63 +2797,63 @@ __global__ void QVelDeviceCompZeroPress1h27( int inx,
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  real vx1, vx2, vx3, drho, feq, q, cu_sq;
@@ -3099,7 +3099,7 @@ __global__ void LB_BC_Vel_West_27( int nx,
                                               unsigned int* neighborY,
                                               unsigned int* neighborZ,
                                               real* DD, 
-                                              unsigned int size_Mat, 
+                                              unsigned long long numberOfLBnodes, 
                                               bool isEvenTimestep, 
                                               real u0x, 
                                               unsigned int grid_nx, 
@@ -3125,63 +3125,63 @@ __global__ void LB_BC_Vel_West_27( int nx,
       Distributions27 D;
       if (isEvenTimestep==true)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
 
       ////////////////////////////////////////////////////////////////////////////////
@@ -3300,33 +3300,33 @@ __global__ void LB_BC_Vel_West_27( int nx,
       real        f1_E,f1_W,f1_N,f1_S,f1_T,f1_B,f1_NE,f1_SW,f1_SE,f1_NW,f1_TE,f1_BW,f1_BE,f1_TW,f1_TN,f1_BS,f1_BN,f1_TS,f1_ZERO,
          f1_TNE,f1_TSW,f1_TSE,f1_TNW,f1_BNE,f1_BSW,f1_BSE,f1_BNW;
 
-      f1_W    = (D.f[DIR_P00   ])[k1e   ];
-      f1_E    = (D.f[DIR_M00   ])[k1w   ];
-      f1_S    = (D.f[DIR_0P0   ])[k1n   ];
-      f1_N    = (D.f[DIR_0M0   ])[k1s   ];
-      f1_B    = (D.f[DIR_00P   ])[k1t   ];
-      f1_T    = (D.f[DIR_00M   ])[k1b   ];
-      f1_SW   = (D.f[DIR_PP0  ])[k1ne  ];
-      f1_NE   = (D.f[DIR_MM0  ])[k1sw  ];
-      f1_NW   = (D.f[DIR_PM0  ])[k1se  ];
-      f1_SE   = (D.f[DIR_MP0  ])[k1nw  ];
-      f1_BW   = (D.f[DIR_P0P  ])[k1te  ];
-      f1_TE   = (D.f[DIR_M0M  ])[k1bw  ];
-      f1_TW   = (D.f[DIR_P0M  ])[k1be  ];
-      f1_BE   = (D.f[DIR_M0P  ])[k1tw  ];
-      f1_BS   = (D.f[DIR_0PP  ])[k1tn  ];
-      f1_TN   = (D.f[DIR_0MM  ])[k1bs  ];
-      f1_TS   = (D.f[DIR_0PM  ])[k1bn  ];
-      f1_BN   = (D.f[DIR_0MP  ])[k1ts  ];
+      f1_W    = (D.f[DIR_P00])[k1e   ];
+      f1_E    = (D.f[DIR_M00])[k1w   ];
+      f1_S    = (D.f[DIR_0P0])[k1n   ];
+      f1_N    = (D.f[DIR_0M0])[k1s   ];
+      f1_B    = (D.f[DIR_00P])[k1t   ];
+      f1_T    = (D.f[DIR_00M])[k1b   ];
+      f1_SW   = (D.f[DIR_PP0])[k1ne  ];
+      f1_NE   = (D.f[DIR_MM0])[k1sw  ];
+      f1_NW   = (D.f[DIR_PM0])[k1se  ];
+      f1_SE   = (D.f[DIR_MP0])[k1nw  ];
+      f1_BW   = (D.f[DIR_P0P])[k1te  ];
+      f1_TE   = (D.f[DIR_M0M])[k1bw  ];
+      f1_TW   = (D.f[DIR_P0M])[k1be  ];
+      f1_BE   = (D.f[DIR_M0P])[k1tw  ];
+      f1_BS   = (D.f[DIR_0PP])[k1tn  ];
+      f1_TN   = (D.f[DIR_0MM])[k1bs  ];
+      f1_TS   = (D.f[DIR_0PM])[k1bn  ];
+      f1_BN   = (D.f[DIR_0MP])[k1ts  ];
       f1_ZERO = (D.f[DIR_000])[k1zero];
-      f1_BSW  = (D.f[DIR_PPP ])[k1tne ];
-      f1_BNE  = (D.f[DIR_MMP ])[k1tsw ];
-      f1_BNW  = (D.f[DIR_PMP ])[k1tse ];
-      f1_BSE  = (D.f[DIR_MPP ])[k1tnw ];
-      f1_TSW  = (D.f[DIR_PPM ])[k1bne ];
-      f1_TNE  = (D.f[DIR_MMM ])[k1bsw ];
-      f1_TNW  = (D.f[DIR_PMM ])[k1bse ];
-      f1_TSE  = (D.f[DIR_MPM ])[k1bnw ];
+      f1_BSW  = (D.f[DIR_PPP])[k1tne ];
+      f1_BNE  = (D.f[DIR_MMP])[k1tsw ];
+      f1_BNW  = (D.f[DIR_PMP])[k1tse ];
+      f1_BSE  = (D.f[DIR_MPP])[k1tnw ];
+      f1_TSW  = (D.f[DIR_PPM])[k1bne ];
+      f1_TNE  = (D.f[DIR_MMM])[k1bsw ];
+      f1_TNW  = (D.f[DIR_PMM])[k1bse ];
+      f1_TSE  = (D.f[DIR_MPM])[k1bnw ];
 
       real drho1    =  f1_ZERO+f1_E+f1_W+f1_N+f1_S+f1_T+f1_B+f1_NE+f1_SW+f1_SE+f1_NW+f1_TE+f1_BW+f1_BE+f1_TW+f1_TN+f1_BS+f1_BN+f1_TS+
          f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW;
@@ -3343,32 +3343,32 @@ __global__ void LB_BC_Vel_West_27( int nx,
       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
 
       (D.f[DIR_000])[kzero] =   c8o27* (drho-cu_sq);
-      (D.f[DIR_P00   ])[ke   ] =   c2o27* (drho+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
-      (D.f[DIR_M00   ])[kw   ] =   c2o27* (drho+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
-      (D.f[DIR_0P0   ])[kn   ] =   c2o27* (drho+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
-      (D.f[DIR_0M0   ])[ks   ] =   c2o27* (drho+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
-      (D.f[DIR_00P   ])[kt   ] =   c2o27* (drho+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
-      (D.f[DIR_00M   ])[kb   ] =   c2o27* (drho+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
-      (D.f[DIR_PP0  ])[kne  ] =   c1o54* (drho+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
-      (D.f[DIR_MM0  ])[ksw  ] =   c1o54* (drho+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
-      (D.f[DIR_PM0  ])[kse  ] =   c1o54* (drho+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
-      (D.f[DIR_MP0  ])[knw  ] =   c1o54* (drho+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
-      (D.f[DIR_P0P  ])[kte  ] =   c1o54* (drho+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
-      (D.f[DIR_M0M  ])[kbw  ] =   c1o54* (drho+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
-      (D.f[DIR_P0M  ])[kbe  ] =   c1o54* (drho+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
-      (D.f[DIR_M0P  ])[ktw  ] =   c1o54* (drho+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
-      (D.f[DIR_0PP  ])[ktn  ] =   c1o54* (drho+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
-      (D.f[DIR_0MM  ])[kbs  ] =   c1o54* (drho+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
-      (D.f[DIR_0PM  ])[kbn  ] =   c1o54* (drho+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
-      (D.f[DIR_0MP  ])[kts  ] =   c1o54* (drho+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
-      (D.f[DIR_PPP ])[ktne ] =   c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
-      (D.f[DIR_MMM ])[kbsw ] =   c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
-      (D.f[DIR_PPM ])[kbne ] =   c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
-      (D.f[DIR_MMP ])[ktsw ] =   c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
-      (D.f[DIR_PMP ])[ktse ] =   c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
-      (D.f[DIR_MPM ])[kbnw ] =   c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
-      (D.f[DIR_PMM ])[kbse ] =   c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
-      (D.f[DIR_MPP ])[ktnw ] =   c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+      (D.f[DIR_P00])[ke   ] =   c2o27* (drho+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq);
+      (D.f[DIR_M00])[kw   ] =   c2o27* (drho+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq);
+      (D.f[DIR_0P0])[kn   ] =   c2o27* (drho+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq);
+      (D.f[DIR_0M0])[ks   ] =   c2o27* (drho+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq);
+      (D.f[DIR_00P])[kt   ] =   c2o27* (drho+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq);
+      (D.f[DIR_00M])[kb   ] =   c2o27* (drho+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq);
+      (D.f[DIR_PP0])[kne  ] =   c1o54* (drho+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
+      (D.f[DIR_MM0])[ksw  ] =   c1o54* (drho+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
+      (D.f[DIR_PM0])[kse  ] =   c1o54* (drho+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
+      (D.f[DIR_MP0])[knw  ] =   c1o54* (drho+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
+      (D.f[DIR_P0P])[kte  ] =   c1o54* (drho+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
+      (D.f[DIR_M0M])[kbw  ] =   c1o54* (drho+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
+      (D.f[DIR_P0M])[kbe  ] =   c1o54* (drho+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
+      (D.f[DIR_M0P])[ktw  ] =   c1o54* (drho+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
+      (D.f[DIR_0PP])[ktn  ] =   c1o54* (drho+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
+      (D.f[DIR_0MM])[kbs  ] =   c1o54* (drho+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
+      (D.f[DIR_0PM])[kbn  ] =   c1o54* (drho+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
+      (D.f[DIR_0MP])[kts  ] =   c1o54* (drho+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
+      (D.f[DIR_PPP])[ktne ] =   c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+      (D.f[DIR_MMM])[kbsw ] =   c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+      (D.f[DIR_PPM])[kbne ] =   c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+      (D.f[DIR_MMP])[ktsw ] =   c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+      (D.f[DIR_PMP])[ktse ] =   c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+      (D.f[DIR_MPM])[kbnw ] =   c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+      (D.f[DIR_PMM])[kbse ] =   c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+      (D.f[DIR_MPP])[ktnw ] =   c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
    }
    __syncthreads();
 }          
@@ -3424,7 +3424,7 @@ __global__ void QVelDevPlainBB27(
    uint* neighborX,
    uint* neighborY,
    uint* neighborZ,
-   uint numberOfLBnodes,
+   unsigned long long numberOfLBnodes,
    bool isEvenTimestep)
 {
    //////////////////////////////////////////////////////////////////////////
@@ -3500,32 +3500,32 @@ __global__ void QVelDevPlainBB27(
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - change the pointer to write the results in the correct array
@@ -3535,24 +3535,24 @@ __global__ void QVelDevPlainBB27(
       ////////////////////////////////////////////////////////////////////////////////
       //! - rewrite distributions if there is a sub-grid distance (q) in same direction
       real q;
-      q = (subgridD.q[DIR_P00  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M00  ])[kw  ]=f_E   + c4o9  * (-VeloX);
-      q = (subgridD.q[DIR_M00  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P00  ])[ke  ]=f_W   + c4o9  * ( VeloX);
-      q = (subgridD.q[DIR_0P0  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0M0  ])[ks  ]=f_N   + c4o9  * (-VeloY);
-      q = (subgridD.q[DIR_0M0  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0P0  ])[kn  ]=f_S   + c4o9  * ( VeloY);
-      q = (subgridD.q[DIR_00P  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_00M  ])[kb  ]=f_T   + c4o9  * (-VeloZ);
-      q = (subgridD.q[DIR_00M  ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_00P  ])[kt  ]=f_B   + c4o9  * ( VeloZ);
-      q = (subgridD.q[DIR_PP0 ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MM0 ])[ksw ]=f_NE  + c1o9  * (-VeloX - VeloY);
-      q = (subgridD.q[DIR_MM0 ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PP0 ])[kne ]=f_SW  + c1o9  * ( VeloX + VeloY);
-      q = (subgridD.q[DIR_PM0 ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MP0 ])[knw ]=f_SE  + c1o9  * (-VeloX + VeloY);
-      q = (subgridD.q[DIR_MP0 ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PM0 ])[kse ]=f_NW  + c1o9  * ( VeloX - VeloY);
-      q = (subgridD.q[DIR_P0P ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M0M ])[kbw ]=f_TE  + c1o9  * (-VeloX - VeloZ);
-      q = (subgridD.q[DIR_M0M ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P0P ])[kte ]=f_BW  + c1o9  * ( VeloX + VeloZ);
-      q = (subgridD.q[DIR_P0M ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M0P ])[ktw ]=f_BE  + c1o9  * (-VeloX + VeloZ);
-      q = (subgridD.q[DIR_M0P ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P0M ])[kbe ]=f_TW  + c1o9  * ( VeloX - VeloZ);
-      q = (subgridD.q[DIR_0PP ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0MM ])[kbs ]=f_TN  + c1o9  * (-VeloY - VeloZ);
-      q = (subgridD.q[DIR_0MM ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0PP ])[ktn ]=f_BS  + c1o9  * ( VeloY + VeloZ);
-      q = (subgridD.q[DIR_0PM ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0MP ])[kts ]=f_BN  + c1o9  * (-VeloY + VeloZ);
-      q = (subgridD.q[DIR_0MP ])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0PM ])[kbn ]=f_TS  + c1o9  * ( VeloY - VeloZ);
+      q = (subgridD.q[DIR_P00])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M00])[kw  ]=f_E   + c4o9  * (-VeloX);
+      q = (subgridD.q[DIR_M00])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P00])[ke  ]=f_W   + c4o9  * ( VeloX);
+      q = (subgridD.q[DIR_0P0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0M0])[ks  ]=f_N   + c4o9  * (-VeloY);
+      q = (subgridD.q[DIR_0M0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0P0])[kn  ]=f_S   + c4o9  * ( VeloY);
+      q = (subgridD.q[DIR_00P])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_00M])[kb  ]=f_T   + c4o9  * (-VeloZ);
+      q = (subgridD.q[DIR_00M])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_00P])[kt  ]=f_B   + c4o9  * ( VeloZ);
+      q = (subgridD.q[DIR_PP0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MM0])[ksw ]=f_NE  + c1o9  * (-VeloX - VeloY);
+      q = (subgridD.q[DIR_MM0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PP0])[kne ]=f_SW  + c1o9  * ( VeloX + VeloY);
+      q = (subgridD.q[DIR_PM0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MP0])[knw ]=f_SE  + c1o9  * (-VeloX + VeloY);
+      q = (subgridD.q[DIR_MP0])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PM0])[kse ]=f_NW  + c1o9  * ( VeloX - VeloY);
+      q = (subgridD.q[DIR_P0P])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M0M])[kbw ]=f_TE  + c1o9  * (-VeloX - VeloZ);
+      q = (subgridD.q[DIR_M0M])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P0P])[kte ]=f_BW  + c1o9  * ( VeloX + VeloZ);
+      q = (subgridD.q[DIR_P0M])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_M0P])[ktw ]=f_BE  + c1o9  * (-VeloX + VeloZ);
+      q = (subgridD.q[DIR_M0P])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_P0M])[kbe ]=f_TW  + c1o9  * ( VeloX - VeloZ);
+      q = (subgridD.q[DIR_0PP])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0MM])[kbs ]=f_TN  + c1o9  * (-VeloY - VeloZ);
+      q = (subgridD.q[DIR_0MM])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0PP])[ktn ]=f_BS  + c1o9  * ( VeloY + VeloZ);
+      q = (subgridD.q[DIR_0PM])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0MP])[kts ]=f_BN  + c1o9  * (-VeloY + VeloZ);
+      q = (subgridD.q[DIR_0MP])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_0PM])[kbn ]=f_TS  + c1o9  * ( VeloY - VeloZ);
       q = (subgridD.q[DIR_PPP])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MMM])[kbsw]=f_TNE + c1o36 * (-VeloX - VeloY - VeloZ);
       q = (subgridD.q[DIR_MMM])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_PPP])[ktne]=f_BSW + c1o36 * ( VeloX + VeloY + VeloZ);
       q = (subgridD.q[DIR_PPM])[k];   if (q>=c0o1 && q<=c1o1)    (dist.f[DIR_MMP])[ktsw]=f_BNE + c1o36 * (-VeloX - VeloY + VeloZ);
@@ -3615,69 +3615,69 @@ __global__ void QVelDevCouette27(real* vx,
 											unsigned int* neighborX,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
-											unsigned int size_Mat, 
+											unsigned long long numberOfLBnodes, 
 											bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -3702,24 +3702,24 @@ __global__ void QVelDevCouette27(real* vx,
 			 *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -3761,94 +3761,94 @@ __global__ void QVelDevCouette27(real* vx,
       ////////////////////////////////////////////////////////////////////////////////
      
       ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[DIR_P00   ])[ke   ];
-      real f_E    = (D.f[DIR_M00   ])[kw   ];
-      real f_S    = (D.f[DIR_0P0   ])[kn   ];
-      real f_N    = (D.f[DIR_0M0   ])[ks   ];
-      real f_B    = (D.f[DIR_00P   ])[kt   ];
-      real f_T    = (D.f[DIR_00M   ])[kb   ];
-      real f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      real f_W    = (D.f[DIR_P00])[ke   ];
+      real f_E    = (D.f[DIR_M00])[kw   ];
+      real f_S    = (D.f[DIR_0P0])[kn   ];
+      real f_N    = (D.f[DIR_0M0])[ks   ];
+      real f_B    = (D.f[DIR_00P])[kt   ];
+      real f_T    = (D.f[DIR_00M])[kb   ];
+      real f_SW   = (D.f[DIR_PP0])[kne  ];
+      real f_NE   = (D.f[DIR_MM0])[ksw  ];
+      real f_NW   = (D.f[DIR_PM0])[kse  ];
+      real f_SE   = (D.f[DIR_MP0])[knw  ];
+      real f_BW   = (D.f[DIR_P0P])[kte  ];
+      real f_TE   = (D.f[DIR_M0M])[kbw  ];
+      real f_TW   = (D.f[DIR_P0M])[kbe  ];
+      real f_BE   = (D.f[DIR_M0P])[ktw  ];
+      real f_BS   = (D.f[DIR_0PP])[ktn  ];
+      real f_TN   = (D.f[DIR_0MM])[kbs  ];
+      real f_TS   = (D.f[DIR_0PM])[kbn  ];
+      real f_BN   = (D.f[DIR_0MP])[kts  ];
+      real f_BSW  = (D.f[DIR_PPP])[ktne ];
+      real f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (D.f[DIR_PMP])[ktse ];
+      real f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (D.f[DIR_PPM])[kbne ];
+      real f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (D.f[DIR_PMM])[kbse ];
+      real f_TSE  = (D.f[DIR_MPM])[kbnw ];
 	  ////////////////////////////////////////////////////////////////////////////////
 
 	  ////////////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
 	  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  ///////               FlowDirection Y !!!!!!!!!!                                                           ///////////////////////////////////
@@ -3868,24 +3868,24 @@ __global__ void QVelDevCouette27(real* vx,
 	  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 	  //set distributions
       real q;
-      q = q_dirE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_M00  ])[kw  ]=f_E   + ms*c2o27  * VeloX;	
-      q = q_dirW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_P00  ])[ke  ]=f_W   - ms*c2o27  * VeloX;	
-      q = q_dirN[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0M0  ])[ks  ]=f_N   + ms*c2o27  * VeloY;	
-      q = q_dirS[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0P0  ])[kn  ]=f_S   - ms*c2o27  * VeloY;	
-	  q = q_dirT[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_00M  ])[kb  ]=f_T   + ms*c2o27  * VeloZ - c3o2*c2o27*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on;
-      q = q_dirB[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_00P  ])[kt  ]=f_B   - ms*c2o27  * VeloZ;
-      q = q_dirNE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_MM0 ])[ksw ]=f_NE  + ms*c1o54  * VeloX + ms*c1o54  * VeloY;
-	  q = q_dirSW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_PP0 ])[kne ]=f_SW  - ms*c1o54  * VeloX - ms*c1o54  * VeloY;
-	  q = q_dirSE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_MP0 ])[knw ]=f_SE  + ms*c1o54  * VeloX - ms*c1o54  * VeloY;
-	  q = q_dirNW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_PM0 ])[kse ]=f_NW  - ms*c1o54  * VeloX + ms*c1o54  * VeloY;
-	  q = q_dirTE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_M0M ])[kbw ]=f_TE  + ms*c1o54  * VeloX + ms*c1o54  * VeloZ - c3o2*c1o54*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on-c1o12*kxxMyyFromfcNEQ;
-	  q = q_dirBW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_P0P ])[kte ]=f_BW  - ms*c1o54  * VeloX - ms*c1o54  * VeloZ;
-	  q = q_dirBE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_M0P ])[ktw ]=f_BE  + ms*c1o54  * VeloX - ms*c1o54  * VeloZ;
-	  q = q_dirTW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_P0M ])[kbe ]=f_TW  - ms*c1o54  * VeloX + ms*c1o54  * VeloZ - c3o2*c1o54*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on-c1o12*kxxMyyFromfcNEQ;
-	  q = q_dirTN[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0MM ])[kbs ]=f_TN  + ms*c1o54  * VeloY + ms*c1o54  * VeloZ + c3o1*c1o54*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on+c1o12*kxxMyyFromfcNEQ;
-	  q = q_dirBS[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0PP ])[ktn ]=f_BS  - ms*c1o54  * VeloY - ms*c1o54  * VeloZ;
-	  q = q_dirBN[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0MP ])[kts ]=f_BN  + ms*c1o54  * VeloY - ms*c1o54  * VeloZ;
-	  q = q_dirTS[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0PM ])[kbn ]=f_TS  - ms*c1o54  * VeloY + ms*c1o54  * VeloZ + c3o1*c1o54*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on+c1o12*kxxMyyFromfcNEQ;
+      q = q_dirE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_M00])[kw  ]=f_E   + ms*c2o27  * VeloX;	
+      q = q_dirW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_P00])[ke  ]=f_W   - ms*c2o27  * VeloX;	
+      q = q_dirN[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0M0])[ks  ]=f_N   + ms*c2o27  * VeloY;	
+      q = q_dirS[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0P0])[kn  ]=f_S   - ms*c2o27  * VeloY;	
+	  q = q_dirT[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_00M])[kb  ]=f_T   + ms*c2o27  * VeloZ - c3o2*c2o27*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on;
+      q = q_dirB[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_00P])[kt  ]=f_B   - ms*c2o27  * VeloZ;
+      q = q_dirNE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_MM0])[ksw ]=f_NE  + ms*c1o54  * VeloX + ms*c1o54  * VeloY;
+	  q = q_dirSW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_PP0])[kne ]=f_SW  - ms*c1o54  * VeloX - ms*c1o54  * VeloY;
+	  q = q_dirSE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_MP0])[knw ]=f_SE  + ms*c1o54  * VeloX - ms*c1o54  * VeloY;
+	  q = q_dirNW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_PM0])[kse ]=f_NW  - ms*c1o54  * VeloX + ms*c1o54  * VeloY;
+	  q = q_dirTE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_M0M])[kbw ]=f_TE  + ms*c1o54  * VeloX + ms*c1o54  * VeloZ - c3o2*c1o54*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on-c1o12*kxxMyyFromfcNEQ;
+	  q = q_dirBW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_P0P])[kte ]=f_BW  - ms*c1o54  * VeloX - ms*c1o54  * VeloZ;
+	  q = q_dirBE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_M0P])[ktw ]=f_BE  + ms*c1o54  * VeloX - ms*c1o54  * VeloZ;
+	  q = q_dirTW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_P0M])[kbe ]=f_TW  - ms*c1o54  * VeloX + ms*c1o54  * VeloZ - c3o2*c1o54*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on-c1o12*kxxMyyFromfcNEQ;
+	  q = q_dirTN[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0MM])[kbs ]=f_TN  + ms*c1o54  * VeloY + ms*c1o54  * VeloZ + c3o1*c1o54*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on+c1o12*kxxMyyFromfcNEQ;
+	  q = q_dirBS[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0PP])[ktn ]=f_BS  - ms*c1o54  * VeloY - ms*c1o54  * VeloZ;
+	  q = q_dirBN[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0MP])[kts ]=f_BN  + ms*c1o54  * VeloY - ms*c1o54  * VeloZ;
+	  q = q_dirTS[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_0PM])[kbn ]=f_TS  - ms*c1o54  * VeloY + ms*c1o54  * VeloZ + c3o1*c1o54*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on+c1o12*kxxMyyFromfcNEQ;
       q = q_dirTNE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_MMM])[kbsw]=f_TNE + ms*c1o216 * VeloX + ms*c1o216 * VeloY + ms*c1o216 * VeloZ + c3o1*c1o216*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on;
       q = q_dirBSW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_PPP])[ktne]=f_BSW - ms*c1o216 * VeloX - ms*c1o216 * VeloY - ms*c1o216 * VeloZ;
       q = q_dirBNE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_MMP])[ktsw]=f_BNE + ms*c1o216 * VeloX + ms*c1o216 * VeloY - ms*c1o216 * VeloZ;
@@ -3894,24 +3894,24 @@ __global__ void QVelDevCouette27(real* vx,
       q = q_dirBNW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_PMP])[ktse]=f_BNW - ms*c1o216 * VeloX + ms*c1o216 * VeloY - ms*c1o216 * VeloZ;
       q = q_dirBSE[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_MPP])[ktnw]=f_BSE + ms*c1o216 * VeloX - ms*c1o216 * VeloY - ms*c1o216 * VeloZ;
       q = q_dirTNW[k];	if (q>=c0o1 && q<=c1o1)	(D.f[DIR_PMM])[kbse]=f_TNW - ms*c1o216 * VeloX + ms*c1o216 * VeloY + ms*c1o216 * VeloZ + c3o1*c1o216*((c2o1*VeloY-vx2)*(c2o1*VeloY-vx2)-vx2*vx2)*on;
-      //q = q_dirE[k];	if (q>=zero && q<=one)	(D.f[DIR_M00  ])[kw  ]=f_E   + ms*c2over27  * VeloX;	
-   //   q = q_dirW[k];	if (q>=zero && q<=one)	(D.f[DIR_P00  ])[ke  ]=f_W   - ms*c2over27  * VeloX;	
-   //   q = q_dirN[k];	if (q>=zero && q<=one)	(D.f[DIR_0M0  ])[ks  ]=f_N   + ms*c2over27  * VeloY;	
-   //   q = q_dirS[k];	if (q>=zero && q<=one)	(D.f[DIR_0P0  ])[kn  ]=f_S   - ms*c2over27  * VeloY;	
-	  //q = q_dirT[k];	if (q>=zero && q<=one)	(D.f[DIR_00M  ])[kb  ]=f_T   + ms*c2over27  * VeloZ - c1o9*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
-   //   q = q_dirB[k];	if (q>=zero && q<=one)	(D.f[DIR_00P  ])[kt  ]=f_B   - ms*c2over27  * VeloZ;
-   //   q = q_dirNE[k];	if (q>=zero && q<=one)	(D.f[DIR_MM0 ])[ksw ]=f_NE  + ms*c1over54  * VeloX + ms*c1over54  * VeloY;
-	  //q = q_dirSW[k];	if (q>=zero && q<=one)	(D.f[DIR_PP0 ])[kne ]=f_SW  - ms*c1over54  * VeloX - ms*c1over54  * VeloY;
-	  //q = q_dirSE[k];	if (q>=zero && q<=one)	(D.f[DIR_MP0 ])[knw ]=f_SE  + ms*c1over54  * VeloX - ms*c1over54  * VeloY;
-	  //q = q_dirNW[k];	if (q>=zero && q<=one)	(D.f[DIR_PM0 ])[kse ]=f_NW  - ms*c1over54  * VeloX + ms*c1over54  * VeloY;
-	  //q = q_dirTE[k];	if (q>=zero && q<=one)	(D.f[DIR_M0M ])[kbw ]=f_TE  + ms*c1over54  * VeloX + ms*c1over54  * VeloZ - c1o36*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
-	  //q = q_dirBW[k];	if (q>=zero && q<=one)	(D.f[DIR_P0P ])[kte ]=f_BW  - ms*c1over54  * VeloX - ms*c1over54  * VeloZ;
-	  //q = q_dirBE[k];	if (q>=zero && q<=one)	(D.f[DIR_M0P ])[ktw ]=f_BE  + ms*c1over54  * VeloX - ms*c1over54  * VeloZ;
-	  //q = q_dirTW[k];	if (q>=zero && q<=one)	(D.f[DIR_P0M ])[kbe ]=f_TW  - ms*c1over54  * VeloX + ms*c1over54  * VeloZ - c1o36*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
-	  //q = q_dirTN[k];	if (q>=zero && q<=one)	(D.f[DIR_0MM ])[kbs ]=f_TN  + ms*c1over54  * VeloY + ms*c1over54  * VeloZ + c1o2*c1o9*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
-	  //q = q_dirBS[k];	if (q>=zero && q<=one)	(D.f[DIR_0PP ])[ktn ]=f_BS  - ms*c1over54  * VeloY - ms*c1over54  * VeloZ;
-	  //q = q_dirBN[k];	if (q>=zero && q<=one)	(D.f[DIR_0MP ])[kts ]=f_BN  + ms*c1over54  * VeloY - ms*c1over54  * VeloZ;
-	  //q = q_dirTS[k];	if (q>=zero && q<=one)	(D.f[DIR_0PM ])[kbn ]=f_TS  - ms*c1over54  * VeloY + ms*c1over54  * VeloZ + c1o2*c1o9*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
+      //q = q_dirE[k];	if (q>=zero && q<=one)	(D.f[DIR_M00])[kw  ]=f_E   + ms*c2over27  * VeloX;	
+   //   q = q_dirW[k];	if (q>=zero && q<=one)	(D.f[DIR_P00])[ke  ]=f_W   - ms*c2over27  * VeloX;	
+   //   q = q_dirN[k];	if (q>=zero && q<=one)	(D.f[DIR_0M0])[ks  ]=f_N   + ms*c2over27  * VeloY;	
+   //   q = q_dirS[k];	if (q>=zero && q<=one)	(D.f[DIR_0P0])[kn  ]=f_S   - ms*c2over27  * VeloY;	
+	  //q = q_dirT[k];	if (q>=zero && q<=one)	(D.f[DIR_00M])[kb  ]=f_T   + ms*c2over27  * VeloZ - c1o9*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
+   //   q = q_dirB[k];	if (q>=zero && q<=one)	(D.f[DIR_00P])[kt  ]=f_B   - ms*c2over27  * VeloZ;
+   //   q = q_dirNE[k];	if (q>=zero && q<=one)	(D.f[DIR_MM0])[ksw ]=f_NE  + ms*c1over54  * VeloX + ms*c1over54  * VeloY;
+	  //q = q_dirSW[k];	if (q>=zero && q<=one)	(D.f[DIR_PP0])[kne ]=f_SW  - ms*c1over54  * VeloX - ms*c1over54  * VeloY;
+	  //q = q_dirSE[k];	if (q>=zero && q<=one)	(D.f[DIR_MP0])[knw ]=f_SE  + ms*c1over54  * VeloX - ms*c1over54  * VeloY;
+	  //q = q_dirNW[k];	if (q>=zero && q<=one)	(D.f[DIR_PM0])[kse ]=f_NW  - ms*c1over54  * VeloX + ms*c1over54  * VeloY;
+	  //q = q_dirTE[k];	if (q>=zero && q<=one)	(D.f[DIR_M0M])[kbw ]=f_TE  + ms*c1over54  * VeloX + ms*c1over54  * VeloZ - c1o36*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
+	  //q = q_dirBW[k];	if (q>=zero && q<=one)	(D.f[DIR_P0P])[kte ]=f_BW  - ms*c1over54  * VeloX - ms*c1over54  * VeloZ;
+	  //q = q_dirBE[k];	if (q>=zero && q<=one)	(D.f[DIR_M0P])[ktw ]=f_BE  + ms*c1over54  * VeloX - ms*c1over54  * VeloZ;
+	  //q = q_dirTW[k];	if (q>=zero && q<=one)	(D.f[DIR_P0M])[kbe ]=f_TW  - ms*c1over54  * VeloX + ms*c1over54  * VeloZ - c1o36*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
+	  //q = q_dirTN[k];	if (q>=zero && q<=one)	(D.f[DIR_0MM])[kbs ]=f_TN  + ms*c1over54  * VeloY + ms*c1over54  * VeloZ + c1o2*c1o9*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
+	  //q = q_dirBS[k];	if (q>=zero && q<=one)	(D.f[DIR_0PP])[ktn ]=f_BS  - ms*c1over54  * VeloY - ms*c1over54  * VeloZ;
+	  //q = q_dirBN[k];	if (q>=zero && q<=one)	(D.f[DIR_0MP])[kts ]=f_BN  + ms*c1over54  * VeloY - ms*c1over54  * VeloZ;
+	  //q = q_dirTS[k];	if (q>=zero && q<=one)	(D.f[DIR_0PM])[kbn ]=f_TS  - ms*c1over54  * VeloY + ms*c1over54  * VeloZ + c1o2*c1o9*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
    //   q = q_dirTNE[k];	if (q>=zero && q<=one)	(D.f[DIR_MMM])[kbsw]=f_TNE + ms*c1over216 * VeloX + ms*c1over216 * VeloY + ms*c1over216 * VeloZ + c1o2*c1o36*((two*VeloY-vx2)*(two*VeloY-vx2)-vx2*vx2)*on;
    //   q = q_dirBSW[k];	if (q>=zero && q<=one)	(D.f[DIR_PPP])[ktne]=f_BSW - ms*c1over216 * VeloX - ms*c1over216 * VeloY - ms*c1over216 * VeloZ;
    //   q = q_dirBNE[k];	if (q>=zero && q<=one)	(D.f[DIR_MMP])[ktsw]=f_BNE + ms*c1over216 * VeloX + ms*c1over216 * VeloY - ms*c1over216 * VeloZ;
@@ -3982,69 +3982,69 @@ __global__ void QVelDev1h27( int inx,
 										real* coordX,
 										real* coordY,
 										real* coordZ,
-										unsigned int size_Mat, 
+										unsigned long long numberOfLBnodes, 
 										bool isEvenTimestep)
 {
 	Distributions27 D;
 	if (isEvenTimestep==true)
 	{
-		D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 	} 
 	else
 	{
-		D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-		D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-		D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-		D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-		D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-		D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DD[DIR_000*size_Mat];
-		D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-		D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-		D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-		D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-		D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-		D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-		D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-		D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+		D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 	}
 	////////////////////////////////////////////////////////////////////////////////
 	const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -4079,24 +4079,24 @@ __global__ void QVelDev1h27( int inx,
 			*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[DIR_P00   * numberOfBCnodes];
-		q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-		q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-		q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-		q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-		q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-		q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-		q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-		q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-		q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-		q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-		q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-		q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-		q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-		q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-		q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-		q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-		q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+		q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+		q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+		q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+		q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+		q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+		q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+		q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+		q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+		q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+		q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+		q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+		q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+		q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+		q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+		q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+		q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+		q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+		q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
 		q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
 		q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
 		q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -4167,32 +4167,32 @@ __global__ void QVelDev1h27( int inx,
 		//real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
 		//	f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-		//f_W    = (D.f[DIR_P00   ])[ke   ];
-		//f_E    = (D.f[DIR_M00   ])[kw   ];
-		//f_S    = (D.f[DIR_0P0   ])[kn   ];
-		//f_N    = (D.f[DIR_0M0   ])[ks   ];
-		//f_B    = (D.f[DIR_00P   ])[kt   ];
-		//f_T    = (D.f[DIR_00M   ])[kb   ];
-		//f_SW   = (D.f[DIR_PP0  ])[kne  ];
-		//f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-		//f_NW   = (D.f[DIR_PM0  ])[kse  ];
-		//f_SE   = (D.f[DIR_MP0  ])[knw  ];
-		//f_BW   = (D.f[DIR_P0P  ])[kte  ];
-		//f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-		//f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-		//f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-		//f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-		//f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-		//f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-		//f_BN   = (D.f[DIR_0MP  ])[kts  ];
-		//f_BSW  = (D.f[DIR_PPP ])[ktne ];
-		//f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-		//f_BNW  = (D.f[DIR_PMP ])[ktse ];
-		//f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-		//f_TSW  = (D.f[DIR_PPM ])[kbne ];
-		//f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-		//f_TNW  = (D.f[DIR_PMM ])[kbse ];
-		//f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+		//f_W    = (D.f[DIR_P00])[ke   ];
+		//f_E    = (D.f[DIR_M00])[kw   ];
+		//f_S    = (D.f[DIR_0P0])[kn   ];
+		//f_N    = (D.f[DIR_0M0])[ks   ];
+		//f_B    = (D.f[DIR_00P])[kt   ];
+		//f_T    = (D.f[DIR_00M])[kb   ];
+		//f_SW   = (D.f[DIR_PP0])[kne  ];
+		//f_NE   = (D.f[DIR_MM0])[ksw  ];
+		//f_NW   = (D.f[DIR_PM0])[kse  ];
+		//f_SE   = (D.f[DIR_MP0])[knw  ];
+		//f_BW   = (D.f[DIR_P0P])[kte  ];
+		//f_TE   = (D.f[DIR_M0M])[kbw  ];
+		//f_TW   = (D.f[DIR_P0M])[kbe  ];
+		//f_BE   = (D.f[DIR_M0P])[ktw  ];
+		//f_BS   = (D.f[DIR_0PP])[ktn  ];
+		//f_TN   = (D.f[DIR_0MM])[kbs  ];
+		//f_TS   = (D.f[DIR_0PM])[kbn  ];
+		//f_BN   = (D.f[DIR_0MP])[kts  ];
+		//f_BSW  = (D.f[DIR_PPP])[ktne ];
+		//f_BNE  = (D.f[DIR_MMP])[ktsw ];
+		//f_BNW  = (D.f[DIR_PMP])[ktse ];
+		//f_BSE  = (D.f[DIR_MPP])[ktnw ];
+		//f_TSW  = (D.f[DIR_PPM])[kbne ];
+		//f_TNE  = (D.f[DIR_MMM])[kbsw ];
+		//f_TNW  = (D.f[DIR_PMM])[kbse ];
+		//f_TSE  = (D.f[DIR_MPM])[kbnw ];
 		////////////////////////////////////////////////////////////////////////////////
 		real /*vx1, vx2,*/ vx3, drho, feq, q, cu_sq;
 		//drho   =  f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
@@ -4217,63 +4217,63 @@ __global__ void QVelDev1h27( int inx,
 		//////////////////////////////////////////////////////////////////////////
 		if (isEvenTimestep==false)
 		{
-			D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-			D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-			D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-			D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-			D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-			D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-			D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-			D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-			D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-			D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-			D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-			D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-			D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-			D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-			D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-			D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-			D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-			D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-			D.f[DIR_000] = &DD[DIR_000*size_Mat];
-			D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-			D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-			D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-			D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-			D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-			D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-			D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-			D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+			D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+			D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+			D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+			D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+			D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+			D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+			D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+			D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+			D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+			D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+			D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+			D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+			D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+			D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+			D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+			D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+			D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+			D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+			D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+			D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+			D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+			D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+			D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+			D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+			D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+			D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+			D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
 		} 
 		else
 		{
-			D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-			D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-			D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-			D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-			D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-			D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-			D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-			D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-			D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-			D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-			D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-			D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-			D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-			D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-			D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-			D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-			D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-			D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-			D.f[DIR_000] = &DD[DIR_000*size_Mat];
-			D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-			D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-			D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-			D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-			D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-			D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-			D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-			D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+			D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+			D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+			D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+			D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+			D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+			D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+			D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+			D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+			D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+			D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+			D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+			D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+			D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+			D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+			D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+			D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+			D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+			D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+			D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+			D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+			D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+			D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+			D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+			D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+			D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+			D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+			D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
 		}
 		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 		//Test
@@ -4759,7 +4759,7 @@ __global__ void QVelDeviceComp27(
 											unsigned int* neighborX,
 											unsigned int* neighborY,
 											unsigned int* neighborZ,
-											unsigned int numberOfLBnodes,
+											unsigned long long numberOfLBnodes,
 											bool isEvenTimestep)
 {
    //////////////////////////////////////////////////////////////////////////
@@ -4837,32 +4837,32 @@ __global__ void QVelDeviceComp27(
       ////////////////////////////////////////////////////////////////////////////////
       //! - Set local distributions
       //!
-      real f_W    = (dist.f[DIR_P00   ])[ke   ];
-      real f_E    = (dist.f[DIR_M00   ])[kw   ];
-      real f_S    = (dist.f[DIR_0P0   ])[kn   ];
-      real f_N    = (dist.f[DIR_0M0   ])[ks   ];
-      real f_B    = (dist.f[DIR_00P   ])[kt   ];
-      real f_T    = (dist.f[DIR_00M   ])[kb   ];
-      real f_SW   = (dist.f[DIR_PP0  ])[kne  ];
-      real f_NE   = (dist.f[DIR_MM0  ])[ksw  ];
-      real f_NW   = (dist.f[DIR_PM0  ])[kse  ];
-      real f_SE   = (dist.f[DIR_MP0  ])[knw  ];
-      real f_BW   = (dist.f[DIR_P0P  ])[kte  ];
-      real f_TE   = (dist.f[DIR_M0M  ])[kbw  ];
-      real f_TW   = (dist.f[DIR_P0M  ])[kbe  ];
-      real f_BE   = (dist.f[DIR_M0P  ])[ktw  ];
-      real f_BS   = (dist.f[DIR_0PP  ])[ktn  ];
-      real f_TN   = (dist.f[DIR_0MM  ])[kbs  ];
-      real f_TS   = (dist.f[DIR_0PM  ])[kbn  ];
-      real f_BN   = (dist.f[DIR_0MP  ])[kts  ];
-      real f_BSW  = (dist.f[DIR_PPP ])[ktne ];
-      real f_BNE  = (dist.f[DIR_MMP ])[ktsw ];
-      real f_BNW  = (dist.f[DIR_PMP ])[ktse ];
-      real f_BSE  = (dist.f[DIR_MPP ])[ktnw ];
-      real f_TSW  = (dist.f[DIR_PPM ])[kbne ];
-      real f_TNE  = (dist.f[DIR_MMM ])[kbsw ];
-      real f_TNW  = (dist.f[DIR_PMM ])[kbse ];
-      real f_TSE  = (dist.f[DIR_MPM ])[kbnw ];
+      real f_W    = (dist.f[DIR_P00])[ke   ];
+      real f_E    = (dist.f[DIR_M00])[kw   ];
+      real f_S    = (dist.f[DIR_0P0])[kn   ];
+      real f_N    = (dist.f[DIR_0M0])[ks   ];
+      real f_B    = (dist.f[DIR_00P])[kt   ];
+      real f_T    = (dist.f[DIR_00M])[kb   ];
+      real f_SW   = (dist.f[DIR_PP0])[kne  ];
+      real f_NE   = (dist.f[DIR_MM0])[ksw  ];
+      real f_NW   = (dist.f[DIR_PM0])[kse  ];
+      real f_SE   = (dist.f[DIR_MP0])[knw  ];
+      real f_BW   = (dist.f[DIR_P0P])[kte  ];
+      real f_TE   = (dist.f[DIR_M0M])[kbw  ];
+      real f_TW   = (dist.f[DIR_P0M])[kbe  ];
+      real f_BE   = (dist.f[DIR_M0P])[ktw  ];
+      real f_BS   = (dist.f[DIR_0PP])[ktn  ];
+      real f_TN   = (dist.f[DIR_0MM])[kbs  ];
+      real f_TS   = (dist.f[DIR_0PM])[kbn  ];
+      real f_BN   = (dist.f[DIR_0MP])[kts  ];
+      real f_BSW  = (dist.f[DIR_PPP])[ktne ];
+      real f_BNE  = (dist.f[DIR_MMP])[ktsw ];
+      real f_BNW  = (dist.f[DIR_PMP])[ktse ];
+      real f_BSE  = (dist.f[DIR_MPP])[ktnw ];
+      real f_TSW  = (dist.f[DIR_PPM])[kbne ];
+      real f_TNE  = (dist.f[DIR_MMM])[kbsw ];
+      real f_TNW  = (dist.f[DIR_PMM])[kbse ];
+      real f_TSE  = (dist.f[DIR_MPM])[kbnw ];
 
       ////////////////////////////////////////////////////////////////////////////////
       //! - Calculate macroscopic quantities
@@ -5183,69 +5183,69 @@ __global__ void QVelDevice27(int inx,
                                         unsigned int* neighborX,
                                         unsigned int* neighborY,
                                         unsigned int* neighborZ,
-                                        unsigned int size_Mat, 
+                                        unsigned long long numberOfLBnodes, 
                                         bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -5270,24 +5270,24 @@ __global__ void QVelDevice27(int inx,
             *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[DIR_P00   * numberOfBCnodes];
-      q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -5358,32 +5358,32 @@ __global__ void QVelDevice27(int inx,
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[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 +
@@ -5408,63 +5408,63 @@ __global__ void QVelDevice27(int inx,
       //////////////////////////////////////////////////////////////////////////
       if (isEvenTimestep==false)
       {
-         D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+         D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
       } 
       else
       {
-         D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-         D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-         D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-         D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-         D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-         D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-         D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-         D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-         D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-         D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-         D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-         D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-         D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-         D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-         D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-         D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-         D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-         D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-         D.f[DIR_000] = &DD[DIR_000*size_Mat];
-         D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-         D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-         D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-         D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-         D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-         D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-         D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-         D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+         D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+         D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+         D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+         D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+         D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+         D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+         D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+         D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+         D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+         D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+         D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+         D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+         D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+         D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+         D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+         D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+         D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+         D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+         D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+         D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+         D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+         D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+         D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+         D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+         D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+         D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+         D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
       }
       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       //Test
@@ -5732,7 +5732,7 @@ __global__ void PropellerBC(unsigned int* neighborX,
                                        real* uz,
                                        int* k_Q, 
 									   unsigned int size_Prop,
-                                       unsigned int size_Mat,
+                                       unsigned long long numberOfLBnodes,
                                        unsigned int* bcMatD,
                                        real* DD,
                                        bool EvenOrOdd)
@@ -5754,63 +5754,63 @@ __global__ void PropellerBC(unsigned int* neighborX,
         Distributions27 D;
         if (EvenOrOdd==true)
         {
-			D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-			D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-			D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-			D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-			D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-			D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-			D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-			D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-			D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-			D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-			D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-			D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-			D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-			D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-			D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-			D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-			D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-			D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-			D.f[DIR_000] = &DD[DIR_000*size_Mat];
-			D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-			D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-			D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-			D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-			D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-			D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-			D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-			D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+			D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+			D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+			D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+			D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+			D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+			D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+			D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+			D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+			D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+			D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+			D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+			D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+			D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+			D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+			D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+			D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+			D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+			D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+			D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+			D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+			D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+			D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+			D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+			D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+			D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+			D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+			D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
         }
         else
         {
-			D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-			D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-			D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-			D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-			D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-			D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-			D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-			D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-			D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-			D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-			D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-			D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-			D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-			D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-			D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-			D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-			D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-			D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-			D.f[DIR_000] = &DD[DIR_000*size_Mat];
-			D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-			D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-			D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
-			D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-			D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-			D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-			D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-			D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
+			D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+			D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+			D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+			D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+			D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+			D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+			D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+			D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+			D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+			D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+			D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+			D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+			D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+			D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+			D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+			D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+			D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+			D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+			D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+			D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+			D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+			D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
+			D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+			D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+			D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+			D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+			D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
         }
         //////////////////////////////////////////////////////////////////////////
 		unsigned int KQK = k_Q[k];
@@ -5859,58 +5859,58 @@ __global__ void PropellerBC(unsigned int* neighborX,
 		f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW, f_ZERO;
 
 		f_ZERO= (D.f[DIR_000])[kzero];
-		f_E   = (D.f[DIR_P00   ])[ke   ];
-		f_W   = (D.f[DIR_M00   ])[kw   ];
-		f_N   = (D.f[DIR_0P0   ])[kn   ];
-		f_S   = (D.f[DIR_0M0   ])[ks   ];
-		f_T   = (D.f[DIR_00P   ])[kt   ];
-		f_B   = (D.f[DIR_00M   ])[kb   ];
-		f_NE  = (D.f[DIR_PP0  ])[kne  ];
-		f_SW  = (D.f[DIR_MM0  ])[ksw  ];
-		f_SE  = (D.f[DIR_PM0  ])[kse  ];
-		f_NW  = (D.f[DIR_MP0  ])[knw  ];
-		f_TE  = (D.f[DIR_P0P  ])[kte  ];
-		f_BW  = (D.f[DIR_M0M  ])[kbw  ];
-		f_BE  = (D.f[DIR_P0M  ])[kbe  ];
-		f_TW  = (D.f[DIR_M0P  ])[ktw  ];
-		f_TN  = (D.f[DIR_0PP  ])[ktn  ];
-		f_BS  = (D.f[DIR_0MM  ])[kbs  ];
-		f_BN  = (D.f[DIR_0PM  ])[kbn  ];
-		f_TS  = (D.f[DIR_0MP  ])[kts  ];
-		f_TNE = (D.f[DIR_PPP ])[ktne ];
-		f_BSW = (D.f[DIR_MMM ])[kbsw ];
-		f_BNE = (D.f[DIR_PPM ])[kbne ];
-		f_TSW = (D.f[DIR_MMP ])[ktsw ];
-		f_TSE = (D.f[DIR_PMP ])[ktse ];
-		f_BNW = (D.f[DIR_MPM ])[kbnw ];
-		f_BSE = (D.f[DIR_PMM ])[kbse ];
-		f_TNW = (D.f[DIR_MPP ])[ktnw ];
-		//f_W    = (D.f[DIR_P00   ])[ke   ];
-		//f_E    = (D.f[DIR_M00   ])[kw   ];
-		//f_S    = (D.f[DIR_0P0   ])[kn   ];
-		//f_N    = (D.f[DIR_0M0   ])[ks   ];
-		//f_B    = (D.f[DIR_00P   ])[kt   ];
-		//f_T    = (D.f[DIR_00M   ])[kb   ];
-		//f_SW   = (D.f[DIR_PP0  ])[kne  ];
-		//f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-		//f_NW   = (D.f[DIR_PM0  ])[kse  ];
-		//f_SE   = (D.f[DIR_MP0  ])[knw  ];
-		//f_BW   = (D.f[DIR_P0P  ])[kte  ];
-		//f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-		//f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-		//f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-		//f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-		//f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-		//f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-		//f_BN   = (D.f[DIR_0MP  ])[kts  ];
-		//f_BSW  = (D.f[DIR_PPP ])[ktne ];
-		//f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-		//f_TSW  = (D.f[DIR_PPM ])[kbne ];
-		//f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-		//f_BNW  = (D.f[DIR_PMP ])[ktse ];
-		//f_TSE  = (D.f[DIR_MPM ])[kbnw ];
-		//f_TNW  = (D.f[DIR_PMM ])[kbse ];
-		//f_BSE  = (D.f[DIR_MPP ])[ktnw ];
+		f_E   = (D.f[DIR_P00])[ke   ];
+		f_W   = (D.f[DIR_M00])[kw   ];
+		f_N   = (D.f[DIR_0P0])[kn   ];
+		f_S   = (D.f[DIR_0M0])[ks   ];
+		f_T   = (D.f[DIR_00P])[kt   ];
+		f_B   = (D.f[DIR_00M])[kb   ];
+		f_NE  = (D.f[DIR_PP0])[kne  ];
+		f_SW  = (D.f[DIR_MM0])[ksw  ];
+		f_SE  = (D.f[DIR_PM0])[kse  ];
+		f_NW  = (D.f[DIR_MP0])[knw  ];
+		f_TE  = (D.f[DIR_P0P])[kte  ];
+		f_BW  = (D.f[DIR_M0M])[kbw  ];
+		f_BE  = (D.f[DIR_P0M])[kbe  ];
+		f_TW  = (D.f[DIR_M0P])[ktw  ];
+		f_TN  = (D.f[DIR_0PP])[ktn  ];
+		f_BS  = (D.f[DIR_0MM])[kbs  ];
+		f_BN  = (D.f[DIR_0PM])[kbn  ];
+		f_TS  = (D.f[DIR_0MP])[kts  ];
+		f_TNE = (D.f[DIR_PPP])[ktne ];
+		f_BSW = (D.f[DIR_MMM])[kbsw ];
+		f_BNE = (D.f[DIR_PPM])[kbne ];
+		f_TSW = (D.f[DIR_MMP])[ktsw ];
+		f_TSE = (D.f[DIR_PMP])[ktse ];
+		f_BNW = (D.f[DIR_MPM])[kbnw ];
+		f_BSE = (D.f[DIR_PMM])[kbse ];
+		f_TNW = (D.f[DIR_MPP])[ktnw ];
+		//f_W    = (D.f[DIR_P00])[ke   ];
+		//f_E    = (D.f[DIR_M00])[kw   ];
+		//f_S    = (D.f[DIR_0P0])[kn   ];
+		//f_N    = (D.f[DIR_0M0])[ks   ];
+		//f_B    = (D.f[DIR_00P])[kt   ];
+		//f_T    = (D.f[DIR_00M])[kb   ];
+		//f_SW   = (D.f[DIR_PP0])[kne  ];
+		//f_NE   = (D.f[DIR_MM0])[ksw  ];
+		//f_NW   = (D.f[DIR_PM0])[kse  ];
+		//f_SE   = (D.f[DIR_MP0])[knw  ];
+		//f_BW   = (D.f[DIR_P0P])[kte  ];
+		//f_TE   = (D.f[DIR_M0M])[kbw  ];
+		//f_TW   = (D.f[DIR_P0M])[kbe  ];
+		//f_BE   = (D.f[DIR_M0P])[ktw  ];
+		//f_BS   = (D.f[DIR_0PP])[ktn  ];
+		//f_TN   = (D.f[DIR_0MM])[kbs  ];
+		//f_TS   = (D.f[DIR_0PM])[kbn  ];
+		//f_BN   = (D.f[DIR_0MP])[kts  ];
+		//f_BSW  = (D.f[DIR_PPP])[ktne ];
+		//f_TNE  = (D.f[DIR_MMM])[kbsw ];
+		//f_TSW  = (D.f[DIR_PPM])[kbne ];
+		//f_BNE  = (D.f[DIR_MMP])[ktsw ];
+		//f_BNW  = (D.f[DIR_PMP])[ktse ];
+		//f_TSE  = (D.f[DIR_MPM])[kbnw ];
+		//f_TNW  = (D.f[DIR_PMM])[kbse ];
+		//f_BSE  = (D.f[DIR_MPP])[ktnw ];
 		//////////////////////////////////////////////////////////////////////////////////
 		real vxo1, vxo2, vxo3, drho;
 		drho   =  /*zero;*/f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
@@ -5992,88 +5992,88 @@ __global__ void PropellerBC(unsigned int* neighborX,
          f_TNW  = f_TNW  + ((c1o1+drho) * (-  c1o216*(c3o1*(-vxo1+vxo2+vxo3)+c9o2*(-vxo1+vxo2+vxo3)*(-vxo1+vxo2+vxo3)-cusq) +   c1o216*(c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq2)));
 
 		(D.f[DIR_000])[kzero] =  f_ZERO;
-        (D.f[DIR_P00   ])[ke   ] =  f_E   ;	// f_W   ;//    	
-        (D.f[DIR_M00   ])[kw   ] =  f_W   ;	// f_E   ;//    	
-        (D.f[DIR_0P0   ])[kn   ] =  f_N   ;	// f_S   ;//    	
-        (D.f[DIR_0M0   ])[ks   ] =  f_S   ;	// f_N   ;//    	
-        (D.f[DIR_00P   ])[kt   ] =  f_T   ;	// f_B   ;//    	
-        (D.f[DIR_00M   ])[kb   ] =  f_B   ;	// f_T   ;//    	
-        (D.f[DIR_PP0  ])[kne  ] =  f_NE  ;	// f_SW  ;//    	
-        (D.f[DIR_MM0  ])[ksw  ] =  f_SW  ;	// f_NE  ;//    	
-        (D.f[DIR_PM0  ])[kse  ] =  f_SE  ;	// f_NW  ;//    	
-        (D.f[DIR_MP0  ])[knw  ] =  f_NW  ;	// f_SE  ;//    	
-        (D.f[DIR_P0P  ])[kte  ] =  f_TE  ;	// f_BW  ;//    	
-        (D.f[DIR_M0M  ])[kbw  ] =  f_BW  ;	// f_TE  ;//    	
-        (D.f[DIR_P0M  ])[kbe  ] =  f_BE  ;	// f_TW  ;//    	
-        (D.f[DIR_M0P  ])[ktw  ] =  f_TW  ;	// f_BE  ;//    	
-        (D.f[DIR_0PP  ])[ktn  ] =  f_TN  ;	// f_BS  ;//    	
-        (D.f[DIR_0MM  ])[kbs  ] =  f_BS  ;	// f_TN  ;//    	
-        (D.f[DIR_0PM  ])[kbn  ] =  f_BN  ;	// f_TS  ;//    	
-        (D.f[DIR_0MP  ])[kts  ] =  f_TS  ;	// f_BN  ;//    	
-        (D.f[DIR_PPP ])[ktne ] =  f_TNE ;	// f_BSW ;//    	
-        (D.f[DIR_MMM ])[kbsw ] =  f_BSW ;	// f_BNE ;//    	
-        (D.f[DIR_PPM ])[kbne ] =  f_BNE ;	// f_BNW ;//    	
-        (D.f[DIR_MMP ])[ktsw ] =  f_TSW ;	// f_BSE ;//    	
-        (D.f[DIR_PMP ])[ktse ] =  f_TSE ;	// f_TSW ;//    	
-        (D.f[DIR_MPM ])[kbnw ] =  f_BNW ;	// f_TNE ;//    	
-        (D.f[DIR_PMM ])[kbse ] =  f_BSE ;	// f_TNW ;//    	
-        (D.f[DIR_MPP ])[ktnw ] =  f_TNW ;	// f_TSE ;//    	
+        (D.f[DIR_P00])[ke   ] =  f_E   ;	// f_W   ;//    	
+        (D.f[DIR_M00])[kw   ] =  f_W   ;	// f_E   ;//    	
+        (D.f[DIR_0P0])[kn   ] =  f_N   ;	// f_S   ;//    	
+        (D.f[DIR_0M0])[ks   ] =  f_S   ;	// f_N   ;//    	
+        (D.f[DIR_00P])[kt   ] =  f_T   ;	// f_B   ;//    	
+        (D.f[DIR_00M])[kb   ] =  f_B   ;	// f_T   ;//    	
+        (D.f[DIR_PP0])[kne  ] =  f_NE  ;	// f_SW  ;//    	
+        (D.f[DIR_MM0])[ksw  ] =  f_SW  ;	// f_NE  ;//    	
+        (D.f[DIR_PM0])[kse  ] =  f_SE  ;	// f_NW  ;//    	
+        (D.f[DIR_MP0])[knw  ] =  f_NW  ;	// f_SE  ;//    	
+        (D.f[DIR_P0P])[kte  ] =  f_TE  ;	// f_BW  ;//    	
+        (D.f[DIR_M0M])[kbw  ] =  f_BW  ;	// f_TE  ;//    	
+        (D.f[DIR_P0M])[kbe  ] =  f_BE  ;	// f_TW  ;//    	
+        (D.f[DIR_M0P])[ktw  ] =  f_TW  ;	// f_BE  ;//    	
+        (D.f[DIR_0PP])[ktn  ] =  f_TN  ;	// f_BS  ;//    	
+        (D.f[DIR_0MM])[kbs  ] =  f_BS  ;	// f_TN  ;//    	
+        (D.f[DIR_0PM])[kbn  ] =  f_BN  ;	// f_TS  ;//    	
+        (D.f[DIR_0MP])[kts  ] =  f_TS  ;	// f_BN  ;//    	
+        (D.f[DIR_PPP])[ktne ] =  f_TNE ;	// f_BSW ;//    	
+        (D.f[DIR_MMM])[kbsw ] =  f_BSW ;	// f_BNE ;//    	
+        (D.f[DIR_PPM])[kbne ] =  f_BNE ;	// f_BNW ;//    	
+        (D.f[DIR_MMP])[ktsw ] =  f_TSW ;	// f_BSE ;//    	
+        (D.f[DIR_PMP])[ktse ] =  f_TSE ;	// f_TSW ;//    	
+        (D.f[DIR_MPM])[kbnw ] =  f_BNW ;	// f_TNE ;//    	
+        (D.f[DIR_PMM])[kbse ] =  f_BSE ;	// f_TNW ;//    	
+        (D.f[DIR_MPP])[ktnw ] =  f_TNW ;	// f_TSE ;//    	
 
 		//////////////////////////////////////////////////////////////////////////
         ////(D.f[DIR_000])[kzero] =   c8over27* (drho-cu_sq);
-        //(D.f[DIR_P00   ])[ke   ] =   three*c2over27* ( vx1        );		//six
-        //(D.f[DIR_M00   ])[kw   ] =   three*c2over27* (-vx1        );		//six
-        //(D.f[DIR_0P0   ])[kn   ] =   three*c2over27* (     vx2    );		//six
-        //(D.f[DIR_0M0   ])[ks   ] =   three*c2over27* (    -vx2    );		//six
-        //(D.f[DIR_00P   ])[kt   ] =   three*c2over27* (         vx3);		//six
-        //(D.f[DIR_00M   ])[kb   ] =   three*c2over27* (        -vx3);		//six
-        //(D.f[DIR_PP0  ])[kne  ] =   three*c1over54* ( vx1+vx2    );		//six
-        //(D.f[DIR_MM0  ])[ksw  ] =   three*c1over54* (-vx1-vx2    );		//six
-        //(D.f[DIR_PM0  ])[kse  ] =   three*c1over54* ( vx1-vx2    );		//six
-        //(D.f[DIR_MP0  ])[knw  ] =   three*c1over54* (-vx1+vx2    );		//six
-        //(D.f[DIR_P0P  ])[kte  ] =   three*c1over54* ( vx1    +vx3);		//six
-        //(D.f[DIR_M0M  ])[kbw  ] =   three*c1over54* (-vx1    -vx3);		//six
-        //(D.f[DIR_P0M  ])[kbe  ] =   three*c1over54* ( vx1    -vx3);		//six
-        //(D.f[DIR_M0P  ])[ktw  ] =   three*c1over54* (-vx1    +vx3);		//six
-        //(D.f[DIR_0PP  ])[ktn  ] =   three*c1over54* (     vx2+vx3);		//six
-        //(D.f[DIR_0MM  ])[kbs  ] =   three*c1over54* (    -vx2-vx3);		//six
-        //(D.f[DIR_0PM  ])[kbn  ] =   three*c1over54* (     vx2-vx3);		//six
-        //(D.f[DIR_0MP  ])[kts  ] =   three*c1over54* (    -vx2+vx3);		//six
-        //(D.f[DIR_PPP ])[ktne ] =   three*c1over216*( vx1+vx2+vx3);		//six
-        //(D.f[DIR_MMM ])[kbsw ] =   three*c1over216*(-vx1-vx2-vx3);		//six
-        //(D.f[DIR_PPM ])[kbne ] =   three*c1over216*( vx1+vx2-vx3);		//six
-        //(D.f[DIR_MMP ])[ktsw ] =   three*c1over216*(-vx1-vx2+vx3);		//six
-        //(D.f[DIR_PMP ])[ktse ] =   three*c1over216*( vx1-vx2+vx3);		//six
-        //(D.f[DIR_MPM ])[kbnw ] =   three*c1over216*(-vx1+vx2-vx3);		//six
-        //(D.f[DIR_PMM ])[kbse ] =   three*c1over216*( vx1-vx2-vx3);		//six
-        //(D.f[DIR_MPP ])[ktnw ] =   three*c1over216*(-vx1+vx2+vx3);		//six
+        //(D.f[DIR_P00])[ke   ] =   three*c2over27* ( vx1        );		//six
+        //(D.f[DIR_M00])[kw   ] =   three*c2over27* (-vx1        );		//six
+        //(D.f[DIR_0P0])[kn   ] =   three*c2over27* (     vx2    );		//six
+        //(D.f[DIR_0M0])[ks   ] =   three*c2over27* (    -vx2    );		//six
+        //(D.f[DIR_00P])[kt   ] =   three*c2over27* (         vx3);		//six
+        //(D.f[DIR_00M])[kb   ] =   three*c2over27* (        -vx3);		//six
+        //(D.f[DIR_PP0])[kne  ] =   three*c1over54* ( vx1+vx2    );		//six
+        //(D.f[DIR_MM0])[ksw  ] =   three*c1over54* (-vx1-vx2    );		//six
+        //(D.f[DIR_PM0])[kse  ] =   three*c1over54* ( vx1-vx2    );		//six
+        //(D.f[DIR_MP0])[knw  ] =   three*c1over54* (-vx1+vx2    );		//six
+        //(D.f[DIR_P0P])[kte  ] =   three*c1over54* ( vx1    +vx3);		//six
+        //(D.f[DIR_M0M])[kbw  ] =   three*c1over54* (-vx1    -vx3);		//six
+        //(D.f[DIR_P0M])[kbe  ] =   three*c1over54* ( vx1    -vx3);		//six
+        //(D.f[DIR_M0P])[ktw  ] =   three*c1over54* (-vx1    +vx3);		//six
+        //(D.f[DIR_0PP])[ktn  ] =   three*c1over54* (     vx2+vx3);		//six
+        //(D.f[DIR_0MM])[kbs  ] =   three*c1over54* (    -vx2-vx3);		//six
+        //(D.f[DIR_0PM])[kbn  ] =   three*c1over54* (     vx2-vx3);		//six
+        //(D.f[DIR_0MP])[kts  ] =   three*c1over54* (    -vx2+vx3);		//six
+        //(D.f[DIR_PPP])[ktne ] =   three*c1over216*( vx1+vx2+vx3);		//six
+        //(D.f[DIR_MMM])[kbsw ] =   three*c1over216*(-vx1-vx2-vx3);		//six
+        //(D.f[DIR_PPM])[kbne ] =   three*c1over216*( vx1+vx2-vx3);		//six
+        //(D.f[DIR_MMP])[ktsw ] =   three*c1over216*(-vx1-vx2+vx3);		//six
+        //(D.f[DIR_PMP])[ktse ] =   three*c1over216*( vx1-vx2+vx3);		//six
+        //(D.f[DIR_MPM])[kbnw ] =   three*c1over216*(-vx1+vx2-vx3);		//six
+        //(D.f[DIR_PMM])[kbse ] =   three*c1over216*( vx1-vx2-vx3);		//six
+        //(D.f[DIR_MPP])[ktnw ] =   three*c1over216*(-vx1+vx2+vx3);		//six
         //(D.f[DIR_000])[kzero] =   c8over27* (drho-cu_sq);
-        //(D.f[DIR_P00   ])[ke   ] =   c2over27* (drho+three*( vx1        )+c9over2*( vx1        )*( vx1        )-cu_sq);
-        //(D.f[DIR_M00   ])[kw   ] =   c2over27* (drho+three*(-vx1        )+c9over2*(-vx1        )*(-vx1        )-cu_sq);
-        //(D.f[DIR_0P0   ])[kn   ] =   c2over27* (drho+three*(    vx2     )+c9over2*(     vx2    )*(     vx2    )-cu_sq);
-        //(D.f[DIR_0M0   ])[ks   ] =   c2over27* (drho+three*(   -vx2     )+c9over2*(    -vx2    )*(    -vx2    )-cu_sq);
-        //(D.f[DIR_00P   ])[kt   ] =   c2over27* (drho+three*(         vx3)+c9over2*(         vx3)*(         vx3)-cu_sq);
-        //(D.f[DIR_00M   ])[kb   ] =   c2over27* (drho+three*(        -vx3)+c9over2*(        -vx3)*(        -vx3)-cu_sq);
-        //(D.f[DIR_PP0  ])[kne  ] =   c1over54* (drho+three*( vx1+vx2    )+c9over2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
-        //(D.f[DIR_MM0  ])[ksw  ] =   c1over54* (drho+three*(-vx1-vx2    )+c9over2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
-        //(D.f[DIR_PM0  ])[kse  ] =   c1over54* (drho+three*( vx1-vx2    )+c9over2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
-        //(D.f[DIR_MP0  ])[knw  ] =   c1over54* (drho+three*(-vx1+vx2    )+c9over2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
-        //(D.f[DIR_P0P  ])[kte  ] =   c1over54* (drho+three*( vx1    +vx3)+c9over2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
-        //(D.f[DIR_M0M  ])[kbw  ] =   c1over54* (drho+three*(-vx1    -vx3)+c9over2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
-        //(D.f[DIR_P0M  ])[kbe  ] =   c1over54* (drho+three*( vx1    -vx3)+c9over2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
-        //(D.f[DIR_M0P  ])[ktw  ] =   c1over54* (drho+three*(-vx1    +vx3)+c9over2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
-        //(D.f[DIR_0PP  ])[ktn  ] =   c1over54* (drho+three*(     vx2+vx3)+c9over2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
-        //(D.f[DIR_0MM  ])[kbs  ] =   c1over54* (drho+three*(    -vx2-vx3)+c9over2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
-        //(D.f[DIR_0PM  ])[kbn  ] =   c1over54* (drho+three*(     vx2-vx3)+c9over2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
-        //(D.f[DIR_0MP  ])[kts  ] =   c1over54* (drho+three*(    -vx2+vx3)+c9over2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
-        //(D.f[DIR_PPP ])[ktne ] =   c1over216*(drho+three*( vx1+vx2+vx3)+c9over2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
-        //(D.f[DIR_MMM ])[kbsw ] =   c1over216*(drho+three*(-vx1-vx2-vx3)+c9over2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
-        //(D.f[DIR_PPM ])[kbne ] =   c1over216*(drho+three*( vx1+vx2-vx3)+c9over2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
-        //(D.f[DIR_MMP ])[ktsw ] =   c1over216*(drho+three*(-vx1-vx2+vx3)+c9over2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
-        //(D.f[DIR_PMP ])[ktse ] =   c1over216*(drho+three*( vx1-vx2+vx3)+c9over2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
-        //(D.f[DIR_MPM ])[kbnw ] =   c1over216*(drho+three*(-vx1+vx2-vx3)+c9over2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
-        //(D.f[DIR_PMM ])[kbse ] =   c1over216*(drho+three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
-        //(D.f[DIR_MPP ])[ktnw ] =   c1over216*(drho+three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+        //(D.f[DIR_P00])[ke   ] =   c2over27* (drho+three*( vx1        )+c9over2*( vx1        )*( vx1        )-cu_sq);
+        //(D.f[DIR_M00])[kw   ] =   c2over27* (drho+three*(-vx1        )+c9over2*(-vx1        )*(-vx1        )-cu_sq);
+        //(D.f[DIR_0P0])[kn   ] =   c2over27* (drho+three*(    vx2     )+c9over2*(     vx2    )*(     vx2    )-cu_sq);
+        //(D.f[DIR_0M0])[ks   ] =   c2over27* (drho+three*(   -vx2     )+c9over2*(    -vx2    )*(    -vx2    )-cu_sq);
+        //(D.f[DIR_00P])[kt   ] =   c2over27* (drho+three*(         vx3)+c9over2*(         vx3)*(         vx3)-cu_sq);
+        //(D.f[DIR_00M])[kb   ] =   c2over27* (drho+three*(        -vx3)+c9over2*(        -vx3)*(        -vx3)-cu_sq);
+        //(D.f[DIR_PP0])[kne  ] =   c1over54* (drho+three*( vx1+vx2    )+c9over2*( vx1+vx2    )*( vx1+vx2    )-cu_sq);
+        //(D.f[DIR_MM0])[ksw  ] =   c1over54* (drho+three*(-vx1-vx2    )+c9over2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq);
+        //(D.f[DIR_PM0])[kse  ] =   c1over54* (drho+three*( vx1-vx2    )+c9over2*( vx1-vx2    )*( vx1-vx2    )-cu_sq);
+        //(D.f[DIR_MP0])[knw  ] =   c1over54* (drho+three*(-vx1+vx2    )+c9over2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq);
+        //(D.f[DIR_P0P])[kte  ] =   c1over54* (drho+three*( vx1    +vx3)+c9over2*( vx1    +vx3)*( vx1    +vx3)-cu_sq);
+        //(D.f[DIR_M0M])[kbw  ] =   c1over54* (drho+three*(-vx1    -vx3)+c9over2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq);
+        //(D.f[DIR_P0M])[kbe  ] =   c1over54* (drho+three*( vx1    -vx3)+c9over2*( vx1    -vx3)*( vx1    -vx3)-cu_sq);
+        //(D.f[DIR_M0P])[ktw  ] =   c1over54* (drho+three*(-vx1    +vx3)+c9over2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq);
+        //(D.f[DIR_0PP])[ktn  ] =   c1over54* (drho+three*(     vx2+vx3)+c9over2*(     vx2+vx3)*(     vx2+vx3)-cu_sq);
+        //(D.f[DIR_0MM])[kbs  ] =   c1over54* (drho+three*(    -vx2-vx3)+c9over2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq);
+        //(D.f[DIR_0PM])[kbn  ] =   c1over54* (drho+three*(     vx2-vx3)+c9over2*(     vx2-vx3)*(     vx2-vx3)-cu_sq);
+        //(D.f[DIR_0MP])[kts  ] =   c1over54* (drho+three*(    -vx2+vx3)+c9over2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq);
+        //(D.f[DIR_PPP])[ktne ] =   c1over216*(drho+three*( vx1+vx2+vx3)+c9over2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+        //(D.f[DIR_MMM])[kbsw ] =   c1over216*(drho+three*(-vx1-vx2-vx3)+c9over2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+        //(D.f[DIR_PPM])[kbne ] =   c1over216*(drho+three*( vx1+vx2-vx3)+c9over2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+        //(D.f[DIR_MMP])[ktsw ] =   c1over216*(drho+three*(-vx1-vx2+vx3)+c9over2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+        //(D.f[DIR_PMP])[ktse ] =   c1over216*(drho+three*( vx1-vx2+vx3)+c9over2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+        //(D.f[DIR_MPM])[kbnw ] =   c1over216*(drho+three*(-vx1+vx2-vx3)+c9over2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+        //(D.f[DIR_PMM])[kbse ] =   c1over216*(drho+three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+        //(D.f[DIR_MPP])[ktnw ] =   c1over216*(drho+three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
 		}
     }
 }
diff --git a/src/gpu/VirtualFluids_GPU/GPU/WaleCumulant27.cu b/src/gpu/VirtualFluids_GPU/GPU/WaleCumulant27.cu
index 16028e2f9f87716f43ed60f82ed513289e381b7c..cbb892296322bc164241ad18c8ab63201d34647e 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/WaleCumulant27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/WaleCumulant27.cu
@@ -23,7 +23,7 @@ __global__ void LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27(
 	real* veloZ,
 	real* DDStart,
 	real* turbulentViscosity,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int level,
 	real* forces,
 	bool EvenOrOdd)
@@ -39,7 +39,7 @@ __global__ void LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27(
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if (k<size_Mat)
+	if (k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -50,63 +50,63 @@ __global__ void LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27(
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/GPU/WallFunction.cu b/src/gpu/VirtualFluids_GPU/GPU/WallFunction.cu
index d48fa80fd14ce15f4a380ed46403654b43c805e8..d2fe5935af9b2d3ad78f492e3a9d182873d20808 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/WallFunction.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/WallFunction.cu
@@ -20,69 +20,69 @@ __global__ void WallFunction27(
 										  unsigned int* neighborX,
 										  unsigned int* neighborY,
 										  unsigned int* neighborZ,
-										  unsigned int size_Mat, 
+										  unsigned long long numberOfLBnodes, 
 										  bool isEvenTimestep)
 {
    Distributions27 D;
    if (isEvenTimestep==true)
    {
-      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+      D.f[DIR_P00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_M00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_PMP * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_MPM * numberOfLBnodes];
    } 
    else
    {
-      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+      D.f[DIR_M00] = &DD[DIR_P00 * numberOfLBnodes];
+      D.f[DIR_P00] = &DD[DIR_M00 * numberOfLBnodes];
+      D.f[DIR_0M0] = &DD[DIR_0P0 * numberOfLBnodes];
+      D.f[DIR_0P0] = &DD[DIR_0M0 * numberOfLBnodes];
+      D.f[DIR_00M] = &DD[DIR_00P * numberOfLBnodes];
+      D.f[DIR_00P] = &DD[DIR_00M * numberOfLBnodes];
+      D.f[DIR_MM0] = &DD[DIR_PP0 * numberOfLBnodes];
+      D.f[DIR_PP0] = &DD[DIR_MM0 * numberOfLBnodes];
+      D.f[DIR_MP0] = &DD[DIR_PM0 * numberOfLBnodes];
+      D.f[DIR_PM0] = &DD[DIR_MP0 * numberOfLBnodes];
+      D.f[DIR_M0M] = &DD[DIR_P0P * numberOfLBnodes];
+      D.f[DIR_P0P] = &DD[DIR_M0M * numberOfLBnodes];
+      D.f[DIR_M0P] = &DD[DIR_P0M * numberOfLBnodes];
+      D.f[DIR_P0M] = &DD[DIR_M0P * numberOfLBnodes];
+      D.f[DIR_0MM] = &DD[DIR_0PP * numberOfLBnodes];
+      D.f[DIR_0PP] = &DD[DIR_0MM * numberOfLBnodes];
+      D.f[DIR_0MP] = &DD[DIR_0PM * numberOfLBnodes];
+      D.f[DIR_0PM] = &DD[DIR_0MP * numberOfLBnodes];
+      D.f[DIR_000] = &DD[DIR_000 * numberOfLBnodes];
+      D.f[DIR_PPP] = &DD[DIR_MMM * numberOfLBnodes];
+      D.f[DIR_MMP] = &DD[DIR_PPM * numberOfLBnodes];
+      D.f[DIR_PMP] = &DD[DIR_MPM * numberOfLBnodes];
+      D.f[DIR_MPP] = &DD[DIR_PMM * numberOfLBnodes];
+      D.f[DIR_PPM] = &DD[DIR_MMP * numberOfLBnodes];
+      D.f[DIR_MMM] = &DD[DIR_PPP * numberOfLBnodes];
+      D.f[DIR_PMM] = &DD[DIR_MPP * numberOfLBnodes];
+      D.f[DIR_MPM] = &DD[DIR_PMP * numberOfLBnodes];
    }
    ////////////////////////////////////////////////////////////////////////////////
    const unsigned  x = threadIdx.x;  // Globaler x-Index 
@@ -107,24 +107,24 @@ __global__ void WallFunction27(
       //      *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[DIR_P00   * numberOfBCnodes];
-      //q_dirW   = &QQ[DIR_M00   * numberOfBCnodes];
-      //q_dirN   = &QQ[DIR_0P0   * numberOfBCnodes];
-      //q_dirS   = &QQ[DIR_0M0   * numberOfBCnodes];
-      //q_dirT   = &QQ[DIR_00P   * numberOfBCnodes];
-      //q_dirB   = &QQ[DIR_00M   * numberOfBCnodes];
-      //q_dirNE  = &QQ[DIR_PP0  * numberOfBCnodes];
-      //q_dirSW  = &QQ[DIR_MM0  * numberOfBCnodes];
-      //q_dirSE  = &QQ[DIR_PM0  * numberOfBCnodes];
-      //q_dirNW  = &QQ[DIR_MP0  * numberOfBCnodes];
-      //q_dirTE  = &QQ[DIR_P0P  * numberOfBCnodes];
-      //q_dirBW  = &QQ[DIR_M0M  * numberOfBCnodes];
-      //q_dirBE  = &QQ[DIR_P0M  * numberOfBCnodes];
-      //q_dirTW  = &QQ[DIR_M0P  * numberOfBCnodes];
-      //q_dirTN  = &QQ[DIR_0PP  * numberOfBCnodes];
-      //q_dirBS  = &QQ[DIR_0MM  * numberOfBCnodes];
-      //q_dirBN  = &QQ[DIR_0PM  * numberOfBCnodes];
-      //q_dirTS  = &QQ[DIR_0MP  * numberOfBCnodes];
+      //q_dirE   = &QQ[DIR_P00 * numberOfBCnodes];
+      //q_dirW   = &QQ[DIR_M00 * numberOfBCnodes];
+      //q_dirN   = &QQ[DIR_0P0 * numberOfBCnodes];
+      //q_dirS   = &QQ[DIR_0M0 * numberOfBCnodes];
+      //q_dirT   = &QQ[DIR_00P * numberOfBCnodes];
+      //q_dirB   = &QQ[DIR_00M * numberOfBCnodes];
+      //q_dirNE  = &QQ[DIR_PP0 * numberOfBCnodes];
+      //q_dirSW  = &QQ[DIR_MM0 * numberOfBCnodes];
+      //q_dirSE  = &QQ[DIR_PM0 * numberOfBCnodes];
+      //q_dirNW  = &QQ[DIR_MP0 * numberOfBCnodes];
+      //q_dirTE  = &QQ[DIR_P0P * numberOfBCnodes];
+      //q_dirBW  = &QQ[DIR_M0M * numberOfBCnodes];
+      //q_dirBE  = &QQ[DIR_P0M * numberOfBCnodes];
+      //q_dirTW  = &QQ[DIR_M0P * numberOfBCnodes];
+      //q_dirTN  = &QQ[DIR_0PP * numberOfBCnodes];
+      //q_dirBS  = &QQ[DIR_0MM * numberOfBCnodes];
+      //q_dirBN  = &QQ[DIR_0PM * numberOfBCnodes];
+      //q_dirTS  = &QQ[DIR_0MP * numberOfBCnodes];
       //q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes];
       //q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes];
       //q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes];
@@ -167,32 +167,32 @@ __global__ void WallFunction27(
       real f_E,  f_W,  f_N,  f_S,  f_T,  f_B,   f_NE,  f_SW,  f_SE,  f_NW,  f_TE,  f_BW,  f_BE,
          f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW;
 
-      f_W    = (D.f[DIR_P00   ])[ke   ];
-      f_E    = (D.f[DIR_M00   ])[kw   ];
-      f_S    = (D.f[DIR_0P0   ])[kn   ];
-      f_N    = (D.f[DIR_0M0   ])[ks   ];
-      f_B    = (D.f[DIR_00P   ])[kt   ];
-      f_T    = (D.f[DIR_00M   ])[kb   ];
-      f_SW   = (D.f[DIR_PP0  ])[kne  ];
-      f_NE   = (D.f[DIR_MM0  ])[ksw  ];
-      f_NW   = (D.f[DIR_PM0  ])[kse  ];
-      f_SE   = (D.f[DIR_MP0  ])[knw  ];
-      f_BW   = (D.f[DIR_P0P  ])[kte  ];
-      f_TE   = (D.f[DIR_M0M  ])[kbw  ];
-      f_TW   = (D.f[DIR_P0M  ])[kbe  ];
-      f_BE   = (D.f[DIR_M0P  ])[ktw  ];
-      f_BS   = (D.f[DIR_0PP  ])[ktn  ];
-      f_TN   = (D.f[DIR_0MM  ])[kbs  ];
-      f_TS   = (D.f[DIR_0PM  ])[kbn  ];
-      f_BN   = (D.f[DIR_0MP  ])[kts  ];
-      f_BSW  = (D.f[DIR_PPP ])[ktne ];
-      f_BNE  = (D.f[DIR_MMP ])[ktsw ];
-      f_BNW  = (D.f[DIR_PMP ])[ktse ];
-      f_BSE  = (D.f[DIR_MPP ])[ktnw ];
-      f_TSW  = (D.f[DIR_PPM ])[kbne ];
-      f_TNE  = (D.f[DIR_MMM ])[kbsw ];
-      f_TNW  = (D.f[DIR_PMM ])[kbse ];
-      f_TSE  = (D.f[DIR_MPM ])[kbnw ];
+      f_W    = (D.f[DIR_P00])[ke   ];
+      f_E    = (D.f[DIR_M00])[kw   ];
+      f_S    = (D.f[DIR_0P0])[kn   ];
+      f_N    = (D.f[DIR_0M0])[ks   ];
+      f_B    = (D.f[DIR_00P])[kt   ];
+      f_T    = (D.f[DIR_00M])[kb   ];
+      f_SW   = (D.f[DIR_PP0])[kne  ];
+      f_NE   = (D.f[DIR_MM0])[ksw  ];
+      f_NW   = (D.f[DIR_PM0])[kse  ];
+      f_SE   = (D.f[DIR_MP0])[knw  ];
+      f_BW   = (D.f[DIR_P0P])[kte  ];
+      f_TE   = (D.f[DIR_M0M])[kbw  ];
+      f_TW   = (D.f[DIR_P0M])[kbe  ];
+      f_BE   = (D.f[DIR_M0P])[ktw  ];
+      f_BS   = (D.f[DIR_0PP])[ktn  ];
+      f_TN   = (D.f[DIR_0MM])[kbs  ];
+      f_TS   = (D.f[DIR_0PM])[kbn  ];
+      f_BN   = (D.f[DIR_0MP])[kts  ];
+      f_BSW  = (D.f[DIR_PPP])[ktne ];
+      f_BNE  = (D.f[DIR_MMP])[ktsw ];
+      f_BNW  = (D.f[DIR_PMP])[ktse ];
+      f_BSE  = (D.f[DIR_MPP])[ktnw ];
+      f_TSW  = (D.f[DIR_PPM])[kbne ];
+      f_TNE  = (D.f[DIR_MMM])[kbsw ];
+      f_TNW  = (D.f[DIR_PMM])[kbse ];
+      f_TSE  = (D.f[DIR_MPM])[kbnw ];
       ////////////////////////////////////////////////////////////////////////////////
       // real vx2, vx3, feq, q;
       real vx1, drho;
@@ -234,63 +234,63 @@ __global__ void WallFunction27(
    //   //////////////////////////////////////////////////////////////////////////
    //   if (isEvenTimestep==false)
    //   {
-   //      D.f[DIR_P00   ] = &DD[DIR_P00   *size_Mat];
-   //      D.f[DIR_M00   ] = &DD[DIR_M00   *size_Mat];
-   //      D.f[DIR_0P0   ] = &DD[DIR_0P0   *size_Mat];
-   //      D.f[DIR_0M0   ] = &DD[DIR_0M0   *size_Mat];
-   //      D.f[DIR_00P   ] = &DD[DIR_00P   *size_Mat];
-   //      D.f[DIR_00M   ] = &DD[DIR_00M   *size_Mat];
-   //      D.f[DIR_PP0  ] = &DD[DIR_PP0  *size_Mat];
-   //      D.f[DIR_MM0  ] = &DD[DIR_MM0  *size_Mat];
-   //      D.f[DIR_PM0  ] = &DD[DIR_PM0  *size_Mat];
-   //      D.f[DIR_MP0  ] = &DD[DIR_MP0  *size_Mat];
-   //      D.f[DIR_P0P  ] = &DD[DIR_P0P  *size_Mat];
-   //      D.f[DIR_M0M  ] = &DD[DIR_M0M  *size_Mat];
-   //      D.f[DIR_P0M  ] = &DD[DIR_P0M  *size_Mat];
-   //      D.f[DIR_M0P  ] = &DD[DIR_M0P  *size_Mat];
-   //      D.f[DIR_0PP  ] = &DD[DIR_0PP  *size_Mat];
-   //      D.f[DIR_0MM  ] = &DD[DIR_0MM  *size_Mat];
-   //      D.f[DIR_0PM  ] = &DD[DIR_0PM  *size_Mat];
-   //      D.f[DIR_0MP  ] = &DD[DIR_0MP  *size_Mat];
-   //      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //      D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat];
-   //      D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat];
-   //      D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat];
-   //      D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat];
-   //      D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat];
-   //      D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat];
-   //      D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat];
-   //      D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat];
+   //      D.f[DIR_P00] = &DD[DIR_P00 * size_Mat];
+   //      D.f[DIR_M00] = &DD[DIR_M00 * size_Mat];
+   //      D.f[DIR_0P0] = &DD[DIR_0P0 * size_Mat];
+   //      D.f[DIR_0M0] = &DD[DIR_0M0 * size_Mat];
+   //      D.f[DIR_00P] = &DD[DIR_00P * size_Mat];
+   //      D.f[DIR_00M] = &DD[DIR_00M * size_Mat];
+   //      D.f[DIR_PP0] = &DD[DIR_PP0 * size_Mat];
+   //      D.f[DIR_MM0] = &DD[DIR_MM0 * size_Mat];
+   //      D.f[DIR_PM0] = &DD[DIR_PM0 * size_Mat];
+   //      D.f[DIR_MP0] = &DD[DIR_MP0 * size_Mat];
+   //      D.f[DIR_P0P] = &DD[DIR_P0P * size_Mat];
+   //      D.f[DIR_M0M] = &DD[DIR_M0M * size_Mat];
+   //      D.f[DIR_P0M] = &DD[DIR_P0M * size_Mat];
+   //      D.f[DIR_M0P] = &DD[DIR_M0P * size_Mat];
+   //      D.f[DIR_0PP] = &DD[DIR_0PP * size_Mat];
+   //      D.f[DIR_0MM] = &DD[DIR_0MM * size_Mat];
+   //      D.f[DIR_0PM] = &DD[DIR_0PM * size_Mat];
+   //      D.f[DIR_0MP] = &DD[DIR_0MP * size_Mat];
+   //      D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //      D.f[DIR_PPP] = &DD[DIR_PPP * size_Mat];
+   //      D.f[DIR_MMP] = &DD[DIR_MMP * size_Mat];
+   //      D.f[DIR_PMP] = &DD[DIR_PMP * size_Mat];
+   //      D.f[DIR_MPP] = &DD[DIR_MPP * size_Mat];
+   //      D.f[DIR_PPM] = &DD[DIR_PPM * size_Mat];
+   //      D.f[DIR_MMM] = &DD[DIR_MMM * size_Mat];
+   //      D.f[DIR_PMM] = &DD[DIR_PMM * size_Mat];
+   //      D.f[DIR_MPM] = &DD[DIR_MPM * size_Mat];
    //   } 
    //   else
    //   {
-   //      D.f[DIR_M00   ] = &DD[DIR_P00   *size_Mat];
-   //      D.f[DIR_P00   ] = &DD[DIR_M00   *size_Mat];
-   //      D.f[DIR_0M0   ] = &DD[DIR_0P0   *size_Mat];
-   //      D.f[DIR_0P0   ] = &DD[DIR_0M0   *size_Mat];
-   //      D.f[DIR_00M   ] = &DD[DIR_00P   *size_Mat];
-   //      D.f[DIR_00P   ] = &DD[DIR_00M   *size_Mat];
-   //      D.f[DIR_MM0  ] = &DD[DIR_PP0  *size_Mat];
-   //      D.f[DIR_PP0  ] = &DD[DIR_MM0  *size_Mat];
-   //      D.f[DIR_MP0  ] = &DD[DIR_PM0  *size_Mat];
-   //      D.f[DIR_PM0  ] = &DD[DIR_MP0  *size_Mat];
-   //      D.f[DIR_M0M  ] = &DD[DIR_P0P  *size_Mat];
-   //      D.f[DIR_P0P  ] = &DD[DIR_M0M  *size_Mat];
-   //      D.f[DIR_M0P  ] = &DD[DIR_P0M  *size_Mat];
-   //      D.f[DIR_P0M  ] = &DD[DIR_M0P  *size_Mat];
-   //      D.f[DIR_0MM  ] = &DD[DIR_0PP  *size_Mat];
-   //      D.f[DIR_0PP  ] = &DD[DIR_0MM  *size_Mat];
-   //      D.f[DIR_0MP  ] = &DD[DIR_0PM  *size_Mat];
-   //      D.f[DIR_0PM  ] = &DD[DIR_0MP  *size_Mat];
-   //      D.f[DIR_000] = &DD[DIR_000*size_Mat];
-   //      D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat];
-   //      D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat];
-   //      D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat];
-   //      D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat];
-   //      D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat];
-   //      D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat];
-   //      D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat];
-   //      D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat];
+   //      D.f[DIR_M00] = &DD[DIR_P00 * size_Mat];
+   //      D.f[DIR_P00] = &DD[DIR_M00 * size_Mat];
+   //      D.f[DIR_0M0] = &DD[DIR_0P0 * size_Mat];
+   //      D.f[DIR_0P0] = &DD[DIR_0M0 * size_Mat];
+   //      D.f[DIR_00M] = &DD[DIR_00P * size_Mat];
+   //      D.f[DIR_00P] = &DD[DIR_00M * size_Mat];
+   //      D.f[DIR_MM0] = &DD[DIR_PP0 * size_Mat];
+   //      D.f[DIR_PP0] = &DD[DIR_MM0 * size_Mat];
+   //      D.f[DIR_MP0] = &DD[DIR_PM0 * size_Mat];
+   //      D.f[DIR_PM0] = &DD[DIR_MP0 * size_Mat];
+   //      D.f[DIR_M0M] = &DD[DIR_P0P * size_Mat];
+   //      D.f[DIR_P0P] = &DD[DIR_M0M * size_Mat];
+   //      D.f[DIR_M0P] = &DD[DIR_P0M * size_Mat];
+   //      D.f[DIR_P0M] = &DD[DIR_M0P * size_Mat];
+   //      D.f[DIR_0MM] = &DD[DIR_0PP * size_Mat];
+   //      D.f[DIR_0PP] = &DD[DIR_0MM * size_Mat];
+   //      D.f[DIR_0MP] = &DD[DIR_0PM * size_Mat];
+   //      D.f[DIR_0PM] = &DD[DIR_0MP * size_Mat];
+   //      D.f[DIR_000] = &DD[DIR_000 * size_Mat];
+   //      D.f[DIR_PPP] = &DD[DIR_MMM * size_Mat];
+   //      D.f[DIR_MMP] = &DD[DIR_PPM * size_Mat];
+   //      D.f[DIR_PMP] = &DD[DIR_MPM * size_Mat];
+   //      D.f[DIR_MPP] = &DD[DIR_PMM * size_Mat];
+   //      D.f[DIR_PPM] = &DD[DIR_MMP * size_Mat];
+   //      D.f[DIR_MMM] = &DD[DIR_PPP * size_Mat];
+   //      D.f[DIR_PMM] = &DD[DIR_MPP * size_Mat];
+   //      D.f[DIR_MPM] = &DD[DIR_PMP * size_Mat];
    //   }
    //   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //   //Test
diff --git a/src/gpu/VirtualFluids_GPU/Init/InitLattice.cpp b/src/gpu/VirtualFluids_GPU/Init/InitLattice.cpp
index 2c85de9e3ec57d50a66fde2c49d3e703676fbf04..508e4498c36d352761c3ecaf24abaa52a5f84bbe 100644
--- a/src/gpu/VirtualFluids_GPU/Init/InitLattice.cpp
+++ b/src/gpu/VirtualFluids_GPU/Init/InitLattice.cpp
@@ -45,26 +45,44 @@ void initLattice(SPtr<Parameter> para, SPtr<PreProcessor> preProcessor, SPtr<Cud
         preProcessor->init(para, lev);
 
         CalcMacCompSP27(
-            para->getParD(lev)->velocityX, para->getParD(lev)->velocityY, para->getParD(lev)->velocityZ, para->getParD(lev)->rho,
-            para->getParD(lev)->pressure, para->getParD(lev)->typeOfGridNode, para->getParD(lev)->neighborX,
-            para->getParD(lev)->neighborY, para->getParD(lev)->neighborZ, para->getParD(lev)->numberOfNodes,
-            para->getParD(lev)->numberofthreads, para->getParD(lev)->distributions.f[0], para->getParD(lev)->isEvenTimestep);
+            para->getParD(lev)->velocityX, 
+            para->getParD(lev)->velocityY, 
+            para->getParD(lev)->velocityZ, 
+            para->getParD(lev)->rho,
+            para->getParD(lev)->pressure, 
+            para->getParD(lev)->typeOfGridNode, 
+            para->getParD(lev)->neighborX,
+            para->getParD(lev)->neighborY, 
+            para->getParD(lev)->neighborZ, 
+            para->getParD(lev)->numberOfNodes,
+            para->getParD(lev)->numberofthreads, 
+            para->getParD(lev)->distributions.f[0], 
+            para->getParD(lev)->isEvenTimestep);
 
         if (para->getCalcMedian()) {
             constexpr uint tdiff = 1;
-            CalcMacMedSP27(para->getParD(lev)->vx_SP_Med, para->getParD(lev)->vy_SP_Med, para->getParD(lev)->vz_SP_Med,
-                           para->getParD(lev)->rho_SP_Med, para->getParD(lev)->press_SP_Med, para->getParD(lev)->typeOfGridNode,
-                           para->getParD(lev)->neighborX, para->getParD(lev)->neighborY,
-                           para->getParD(lev)->neighborZ, tdiff, para->getParD(lev)->numberOfNodes,
-                           para->getParD(lev)->numberofthreads, para->getParD(lev)->isEvenTimestep);
+            CalcMacMedSP27(
+                para->getParD(lev)->vx_SP_Med, 
+                para->getParD(lev)->vy_SP_Med, 
+                para->getParD(lev)->vz_SP_Med,
+                para->getParD(lev)->rho_SP_Med, 
+                para->getParD(lev)->press_SP_Med, 
+                para->getParD(lev)->typeOfGridNode,
+                para->getParD(lev)->neighborX, 
+                para->getParD(lev)->neighborY,
+                para->getParD(lev)->neighborZ, 
+                tdiff, 
+                para->getParD(lev)->numberOfNodes,
+                para->getParD(lev)->numberofthreads, 
+                para->getParD(lev)->isEvenTimestep);
         }
         // advection - diffusion
         if (para->getDiffOn()) {
 
             cudaMemoryManager->cudaAllocConcentration(lev);
 
-            for (unsigned int i = 0; i < para->getParH(lev)->numberOfNodes; i++) {
-                para->getParH(lev)->Conc[i] = para->getTemperatureInit();
+            for (size_t index = 0; index < para->getParH(lev)->numberOfNodes; index++) {
+                para->getParH(lev)->Conc[index] = para->getTemperatureInit();
             }
             initTemperatur(para.get(), cudaMemoryManager.get(), lev);
         }
diff --git a/src/gpu/VirtualFluids_GPU/Init/PositionReader.cpp b/src/gpu/VirtualFluids_GPU/Init/PositionReader.cpp
index 04052b38cbfb59bfe620354b62da70402d74bdbd..6eaa0b17653aaf5257c00e674c87e2844c26cf5d 100644
--- a/src/gpu/VirtualFluids_GPU/Init/PositionReader.cpp
+++ b/src/gpu/VirtualFluids_GPU/Init/PositionReader.cpp
@@ -170,7 +170,7 @@ void PositionReader::definePropellerQs(Parameter* para)
 	//////////////////////////////////////////////////////////////////
 	for(uint u=0; u<para->getParH(para->getFine())->propellerBC.numberOfBCnodes; u++)
 	{
-		for (int dir = DIR_P00; dir<=DIR_MMM; dir++)
+		for (size_t dir = DIR_P00; dir<=DIR_MMM; dir++)
 		{
 			if ((dir==DIR_P00)  || 
 				(dir==DIR_PP0) || (dir==DIR_PM0) || (dir==DIR_P0P) || (dir==DIR_P0M) ||
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27.cu
index 51b9e4537fa0857e9302aa638ae7729fa9adcdbe..d4d6307f688da4c8fa37c54fb4958681d5ec4941 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27.cu
@@ -2,6 +2,7 @@
 
 #include "ADComp27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<ADComp27> ADComp27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,34 +11,19 @@ std::shared_ptr<ADComp27> ADComp27::getNewInstance(std::shared_ptr<Parameter> pa
 
 void ADComp27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_KERNEL_AD_COMP_27 << < grid, threads >> >(	para->getParD(level)->diffusivity,
-												para->getParD(level)->typeOfGridNode,
-												para->getParD(level)->neighborX,
-												para->getParD(level)->neighborY,
-												para->getParD(level)->neighborZ,
-												para->getParD(level)->distributions.f[0],
-												para->getParD(level)->distributionsAD27.f[0],
-												para->getParD(level)->numberOfNodes,
-												para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_ThS27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_KERNEL_AD_COMP_27<<< grid.grid, grid.threads >>>(
+        para->getParD(level)->diffusivity,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->distributionsAD27.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_KERNEL_AD_COMP_27 execution failed");
 }
 
 ADComp27::ADComp27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27_Device.cu
index b4c1236300bbb49fe2df1b3f458f506e989e142b..40adfff91713b7d6db1e861be9282d1f38516c22 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod27/ADComp27/ADComp27_Device.cu
@@ -38,125 +38,125 @@ __global__ void LB_KERNEL_AD_COMP_27(real diffusivity,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			Distributions27 D27;
 			if (EvenOrOdd == true)
 			{
-				D27.f[DIR_P00] = &DD27[DIR_P00   *size_Mat];
-				D27.f[DIR_M00] = &DD27[DIR_M00   *size_Mat];
-				D27.f[DIR_0P0] = &DD27[DIR_0P0   *size_Mat];
-				D27.f[DIR_0M0] = &DD27[DIR_0M0   *size_Mat];
-				D27.f[DIR_00P] = &DD27[DIR_00P   *size_Mat];
-				D27.f[DIR_00M] = &DD27[DIR_00M   *size_Mat];
-				D27.f[DIR_PP0] = &DD27[DIR_PP0  *size_Mat];
-				D27.f[DIR_MM0] = &DD27[DIR_MM0  *size_Mat];
-				D27.f[DIR_PM0] = &DD27[DIR_PM0  *size_Mat];
-				D27.f[DIR_MP0] = &DD27[DIR_MP0  *size_Mat];
-				D27.f[DIR_P0P] = &DD27[DIR_P0P  *size_Mat];
-				D27.f[DIR_M0M] = &DD27[DIR_M0M  *size_Mat];
-				D27.f[DIR_P0M] = &DD27[DIR_P0M  *size_Mat];
-				D27.f[DIR_M0P] = &DD27[DIR_M0P  *size_Mat];
-				D27.f[DIR_0PP] = &DD27[DIR_0PP  *size_Mat];
-				D27.f[DIR_0MM] = &DD27[DIR_0MM  *size_Mat];
-				D27.f[DIR_0PM] = &DD27[DIR_0PM  *size_Mat];
-				D27.f[DIR_0MP] = &DD27[DIR_0MP  *size_Mat];
-				D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-				D27.f[DIR_PPP] = &DD27[DIR_PPP *size_Mat];
-				D27.f[DIR_MMP] = &DD27[DIR_MMP *size_Mat];
-				D27.f[DIR_PMP] = &DD27[DIR_PMP *size_Mat];
-				D27.f[DIR_MPP] = &DD27[DIR_MPP *size_Mat];
-				D27.f[DIR_PPM] = &DD27[DIR_PPM *size_Mat];
-				D27.f[DIR_MMM] = &DD27[DIR_MMM *size_Mat];
-				D27.f[DIR_PMM] = &DD27[DIR_PMM *size_Mat];
-				D27.f[DIR_MPM] = &DD27[DIR_MPM *size_Mat];
+				D27.f[DIR_P00] = &DD27[DIR_P00 * size_Mat];
+				D27.f[DIR_M00] = &DD27[DIR_M00 * size_Mat];
+				D27.f[DIR_0P0] = &DD27[DIR_0P0 * size_Mat];
+				D27.f[DIR_0M0] = &DD27[DIR_0M0 * size_Mat];
+				D27.f[DIR_00P] = &DD27[DIR_00P * size_Mat];
+				D27.f[DIR_00M] = &DD27[DIR_00M * size_Mat];
+				D27.f[DIR_PP0] = &DD27[DIR_PP0 * size_Mat];
+				D27.f[DIR_MM0] = &DD27[DIR_MM0 * size_Mat];
+				D27.f[DIR_PM0] = &DD27[DIR_PM0 * size_Mat];
+				D27.f[DIR_MP0] = &DD27[DIR_MP0 * size_Mat];
+				D27.f[DIR_P0P] = &DD27[DIR_P0P * size_Mat];
+				D27.f[DIR_M0M] = &DD27[DIR_M0M * size_Mat];
+				D27.f[DIR_P0M] = &DD27[DIR_P0M * size_Mat];
+				D27.f[DIR_M0P] = &DD27[DIR_M0P * size_Mat];
+				D27.f[DIR_0PP] = &DD27[DIR_0PP * size_Mat];
+				D27.f[DIR_0MM] = &DD27[DIR_0MM * size_Mat];
+				D27.f[DIR_0PM] = &DD27[DIR_0PM * size_Mat];
+				D27.f[DIR_0MP] = &DD27[DIR_0MP * size_Mat];
+				D27.f[DIR_000] = &DD27[DIR_000 * size_Mat];
+				D27.f[DIR_PPP] = &DD27[DIR_PPP * size_Mat];
+				D27.f[DIR_MMP] = &DD27[DIR_MMP * size_Mat];
+				D27.f[DIR_PMP] = &DD27[DIR_PMP * size_Mat];
+				D27.f[DIR_MPP] = &DD27[DIR_MPP * size_Mat];
+				D27.f[DIR_PPM] = &DD27[DIR_PPM * size_Mat];
+				D27.f[DIR_MMM] = &DD27[DIR_MMM * size_Mat];
+				D27.f[DIR_PMM] = &DD27[DIR_PMM * size_Mat];
+				D27.f[DIR_MPM] = &DD27[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D27.f[DIR_M00] = &DD27[DIR_P00   *size_Mat];
-				D27.f[DIR_P00] = &DD27[DIR_M00   *size_Mat];
-				D27.f[DIR_0M0] = &DD27[DIR_0P0   *size_Mat];
-				D27.f[DIR_0P0] = &DD27[DIR_0M0   *size_Mat];
-				D27.f[DIR_00M] = &DD27[DIR_00P   *size_Mat];
-				D27.f[DIR_00P] = &DD27[DIR_00M   *size_Mat];
-				D27.f[DIR_MM0] = &DD27[DIR_PP0  *size_Mat];
-				D27.f[DIR_PP0] = &DD27[DIR_MM0  *size_Mat];
-				D27.f[DIR_MP0] = &DD27[DIR_PM0  *size_Mat];
-				D27.f[DIR_PM0] = &DD27[DIR_MP0  *size_Mat];
-				D27.f[DIR_M0M] = &DD27[DIR_P0P  *size_Mat];
-				D27.f[DIR_P0P] = &DD27[DIR_M0M  *size_Mat];
-				D27.f[DIR_M0P] = &DD27[DIR_P0M  *size_Mat];
-				D27.f[DIR_P0M] = &DD27[DIR_M0P  *size_Mat];
-				D27.f[DIR_0MM] = &DD27[DIR_0PP  *size_Mat];
-				D27.f[DIR_0PP] = &DD27[DIR_0MM  *size_Mat];
-				D27.f[DIR_0MP] = &DD27[DIR_0PM  *size_Mat];
-				D27.f[DIR_0PM] = &DD27[DIR_0MP  *size_Mat];
-				D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-				D27.f[DIR_MMM] = &DD27[DIR_PPP *size_Mat];
-				D27.f[DIR_PPM] = &DD27[DIR_MMP *size_Mat];
-				D27.f[DIR_MPM] = &DD27[DIR_PMP *size_Mat];
-				D27.f[DIR_PMM] = &DD27[DIR_MPP *size_Mat];
-				D27.f[DIR_MMP] = &DD27[DIR_PPM *size_Mat];
-				D27.f[DIR_PPP] = &DD27[DIR_MMM *size_Mat];
-				D27.f[DIR_MPP] = &DD27[DIR_PMM *size_Mat];
-				D27.f[DIR_PMP] = &DD27[DIR_MPM *size_Mat];
+				D27.f[DIR_M00] = &DD27[DIR_P00 * size_Mat];
+				D27.f[DIR_P00] = &DD27[DIR_M00 * size_Mat];
+				D27.f[DIR_0M0] = &DD27[DIR_0P0 * size_Mat];
+				D27.f[DIR_0P0] = &DD27[DIR_0M0 * size_Mat];
+				D27.f[DIR_00M] = &DD27[DIR_00P * size_Mat];
+				D27.f[DIR_00P] = &DD27[DIR_00M * size_Mat];
+				D27.f[DIR_MM0] = &DD27[DIR_PP0 * size_Mat];
+				D27.f[DIR_PP0] = &DD27[DIR_MM0 * size_Mat];
+				D27.f[DIR_MP0] = &DD27[DIR_PM0 * size_Mat];
+				D27.f[DIR_PM0] = &DD27[DIR_MP0 * size_Mat];
+				D27.f[DIR_M0M] = &DD27[DIR_P0P * size_Mat];
+				D27.f[DIR_P0P] = &DD27[DIR_M0M * size_Mat];
+				D27.f[DIR_M0P] = &DD27[DIR_P0M * size_Mat];
+				D27.f[DIR_P0M] = &DD27[DIR_M0P * size_Mat];
+				D27.f[DIR_0MM] = &DD27[DIR_0PP * size_Mat];
+				D27.f[DIR_0PP] = &DD27[DIR_0MM * size_Mat];
+				D27.f[DIR_0MP] = &DD27[DIR_0PM * size_Mat];
+				D27.f[DIR_0PM] = &DD27[DIR_0MP * size_Mat];
+				D27.f[DIR_000] = &DD27[DIR_000 * size_Mat];
+				D27.f[DIR_MMM] = &DD27[DIR_PPP * size_Mat];
+				D27.f[DIR_PPM] = &DD27[DIR_MMP * size_Mat];
+				D27.f[DIR_MPM] = &DD27[DIR_PMP * size_Mat];
+				D27.f[DIR_PMM] = &DD27[DIR_MPP * size_Mat];
+				D27.f[DIR_MMP] = &DD27[DIR_PPM * size_Mat];
+				D27.f[DIR_PPP] = &DD27[DIR_MMM * size_Mat];
+				D27.f[DIR_MPP] = &DD27[DIR_PMM * size_Mat];
+				D27.f[DIR_PMP] = &DD27[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7.cu
index ab9b0c444513455e0498d79614575e87c2afb6a0..3ee06a1e9ea77c8443d94f44ea54d11ffe7304ac 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7.cu
@@ -2,6 +2,7 @@
 
 #include "ADComp7_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<ADComp7> ADComp7::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,34 +11,19 @@ std::shared_ptr<ADComp7> ADComp7::getNewInstance(std::shared_ptr<Parameter> para
 
 void ADComp7::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_AD_Comp_7 << < grid, threads >> >(	para->getParD(level)->diffusivity,
-											para->getParD(level)->typeOfGridNode,
-											para->getParD(level)->neighborX,
-											para->getParD(level)->neighborY,
-											para->getParD(level)->neighborZ,
-											para->getParD(level)->distributions.f[0], 
-											para->getParD(level)->distributionsAD7.f[0], 
-											para->getParD(level)->numberOfNodes,
-											para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_ThS7 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_AD_Comp_7<<< grid.grid, grid.threads >>>(
+        para->getParD(level)->diffusivity,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0], 
+        para->getParD(level)->distributionsAD7.f[0], 
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_AD_Comp_7 execution failed");
 }
 
 ADComp7::ADComp7(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7_Device.cu
index 52ab9ba6e968ec2293f0a1c4959323c43f328206..ddaed84703640cd9c7d12d142ccc1bf8f9ea7efc 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Compressible/Mod7/ADComp7/ADComp7_Device.cu
@@ -39,63 +39,63 @@ __global__ void LB_Kernel_AD_Comp_7(real diffusivity,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			Distributions7 D7;
@@ -157,33 +157,33 @@ __global__ void LB_Kernel_AD_Comp_7(real diffusivity,
 			real fTNE = (D.f[DIR_MMM])[kbsw];
 			real fTNW = (D.f[DIR_PMM])[kbs];//kbse
 			real fTSE = (D.f[DIR_MPM])[kbw];//kbnw
-										   //real fE    =  (D.f[DIR_P00   ])[k  ];//ke
-										   //real fW    =  (D.f[DIR_M00   ])[kw ];
-										   //real fN    =  (D.f[DIR_0P0   ])[k  ];//kn
-										   //real fS    =  (D.f[DIR_0M0   ])[ks ];
-										   //real fT    =  (D.f[DIR_00P   ])[k  ];//kt
-										   //real fB    =  (D.f[DIR_00M   ])[kb ];
-										   //real fNE   =  (D.f[DIR_PP0  ])[k  ];//kne
-										   //real fSW   =  (D.f[DIR_MM0  ])[ksw];
-										   //real fSE   =  (D.f[DIR_PM0  ])[ks ];//kse
-										   //real fNW   =  (D.f[DIR_MP0  ])[kw ];//knw
-										   //real fTE   =  (D.f[DIR_P0P  ])[k  ];//kte
-										   //real fBW   =  (D.f[DIR_M0M  ])[kbw];
-										   //real fBE   =  (D.f[DIR_P0M  ])[kb ];//kbe
-										   //real fTW   =  (D.f[DIR_M0P  ])[kw ];//ktw
-										   //real fTN   =  (D.f[DIR_0PP  ])[k  ];//ktn
-										   //real fBS   =  (D.f[DIR_0MM  ])[kbs];
-										   //real fBN   =  (D.f[DIR_0PM  ])[kb ];//kbn
-										   //real fTS   =  (D.f[DIR_0MP  ])[ks ];//kts
+										   //real fE    =  (D.f[DIR_P00])[k  ];//ke
+										   //real fW    =  (D.f[DIR_M00])[kw ];
+										   //real fN    =  (D.f[DIR_0P0])[k  ];//kn
+										   //real fS    =  (D.f[DIR_0M0])[ks ];
+										   //real fT    =  (D.f[DIR_00P])[k  ];//kt
+										   //real fB    =  (D.f[DIR_00M])[kb ];
+										   //real fNE   =  (D.f[DIR_PP0])[k  ];//kne
+										   //real fSW   =  (D.f[DIR_MM0])[ksw];
+										   //real fSE   =  (D.f[DIR_PM0])[ks ];//kse
+										   //real fNW   =  (D.f[DIR_MP0])[kw ];//knw
+										   //real fTE   =  (D.f[DIR_P0P])[k  ];//kte
+										   //real fBW   =  (D.f[DIR_M0M])[kbw];
+										   //real fBE   =  (D.f[DIR_P0M])[kb ];//kbe
+										   //real fTW   =  (D.f[DIR_M0P])[kw ];//ktw
+										   //real fTN   =  (D.f[DIR_0PP])[k  ];//ktn
+										   //real fBS   =  (D.f[DIR_0MM])[kbs];
+										   //real fBN   =  (D.f[DIR_0PM])[kb ];//kbn
+										   //real fTS   =  (D.f[DIR_0MP])[ks ];//kts
 										   //real fZERO =  (D.f[DIR_000])[k  ];//kzero
-										   //real fTNE   = (D.f[DIR_PPP ])[k  ];//ktne
-										   //real fTSW   = (D.f[DIR_MMP ])[ksw];//ktsw
-										   //real fTSE   = (D.f[DIR_PMP ])[ks ];//ktse
-										   //real fTNW   = (D.f[DIR_MPP ])[kw ];//ktnw
-										   //real fBNE   = (D.f[DIR_PPM ])[kb ];//kbne
-										   //real fBSW   = (D.f[DIR_MMM ])[kbsw];
-										   //real fBSE   = (D.f[DIR_PMM ])[kbs];//kbse
-										   //real fBNW   = (D.f[DIR_MPM ])[kbw];//kbnw
+										   //real fTNE   = (D.f[DIR_PPP])[k  ];//ktne
+										   //real fTSW   = (D.f[DIR_MMP])[ksw];//ktsw
+										   //real fTSE   = (D.f[DIR_PMP])[ks ];//ktse
+										   //real fTNW   = (D.f[DIR_MPP])[kw ];//ktnw
+										   //real fBNE   = (D.f[DIR_PPM])[kb ];//kbne
+										   //real fBSW   = (D.f[DIR_MMM])[kbsw];
+										   //real fBSE   = (D.f[DIR_PMM])[kbs];//kbse
+										   //real fBNW   = (D.f[DIR_MPM])[kbw];//kbnw
 										   ////////////////////////////////////////////////////////////////////////////////
 			real f7ZERO = (D7.f[0])[k];
 			real f7E = (D7.f[1])[k];
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27.cu
index 4ad8a4678ae2e4025a90f639ae366311a247e4b3..f2a9feaa998b628fb782844d1a7d946317e5af5f 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27.cu
@@ -2,6 +2,7 @@
 
 #include "ADIncomp27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<ADIncomp27> ADIncomp27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,34 +11,19 @@ std::shared_ptr<ADIncomp27> ADIncomp27::getNewInstance(std::shared_ptr<Parameter
 
 void ADIncomp27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_AD_Incomp_27 << < grid, threads >> >(	para->getParD(level)->diffusivity, 
-													para->getParD(level)->typeOfGridNode,
-													para->getParD(level)->neighborX, 
-													para->getParD(level)->neighborY, 
-													para->getParD(level)->neighborZ,
-													para->getParD(level)->distributions.f[0], 
-													para->getParD(level)->distributionsAD27.f[0], 
-													para->getParD(level)->numberOfNodes,
-													para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_AD_Incomp_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_AD_Incomp_27<<< grid.grid, grid.threads >>>(
+        para->getParD(level)->diffusivity, 
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX, 
+        para->getParD(level)->neighborY, 
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0], 
+        para->getParD(level)->distributionsAD27.f[0], 
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_AD_Incomp_27 execution failed");
 }
 
 ADIncomp27::ADIncomp27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27_Device.cu
index e686825ed100417110b02360876dec076553d7de..f9fdcee0f34106b05da0edc16e3fdd89f859752e 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27_Device.cu
@@ -13,7 +13,7 @@ __global__ void LB_Kernel_AD_Incomp_27(real diffusivity,
 	unsigned int* neighborZ,
 	real* DDStart,
 	real* DD27,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -27,7 +27,7 @@ __global__ void LB_Kernel_AD_Incomp_27(real diffusivity,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if (k<size_Mat)
+	if (k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -38,125 +38,125 @@ __global__ void LB_Kernel_AD_Incomp_27(real diffusivity,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			Distributions27 D27;
 			if (EvenOrOdd == true)
 			{
-				D27.f[DIR_P00] = &DD27[DIR_P00   *size_Mat];
-				D27.f[DIR_M00] = &DD27[DIR_M00   *size_Mat];
-				D27.f[DIR_0P0] = &DD27[DIR_0P0   *size_Mat];
-				D27.f[DIR_0M0] = &DD27[DIR_0M0   *size_Mat];
-				D27.f[DIR_00P] = &DD27[DIR_00P   *size_Mat];
-				D27.f[DIR_00M] = &DD27[DIR_00M   *size_Mat];
-				D27.f[DIR_PP0] = &DD27[DIR_PP0  *size_Mat];
-				D27.f[DIR_MM0] = &DD27[DIR_MM0  *size_Mat];
-				D27.f[DIR_PM0] = &DD27[DIR_PM0  *size_Mat];
-				D27.f[DIR_MP0] = &DD27[DIR_MP0  *size_Mat];
-				D27.f[DIR_P0P] = &DD27[DIR_P0P  *size_Mat];
-				D27.f[DIR_M0M] = &DD27[DIR_M0M  *size_Mat];
-				D27.f[DIR_P0M] = &DD27[DIR_P0M  *size_Mat];
-				D27.f[DIR_M0P] = &DD27[DIR_M0P  *size_Mat];
-				D27.f[DIR_0PP] = &DD27[DIR_0PP  *size_Mat];
-				D27.f[DIR_0MM] = &DD27[DIR_0MM  *size_Mat];
-				D27.f[DIR_0PM] = &DD27[DIR_0PM  *size_Mat];
-				D27.f[DIR_0MP] = &DD27[DIR_0MP  *size_Mat];
-				D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-				D27.f[DIR_PPP] = &DD27[DIR_PPP *size_Mat];
-				D27.f[DIR_MMP] = &DD27[DIR_MMP *size_Mat];
-				D27.f[DIR_PMP] = &DD27[DIR_PMP *size_Mat];
-				D27.f[DIR_MPP] = &DD27[DIR_MPP *size_Mat];
-				D27.f[DIR_PPM] = &DD27[DIR_PPM *size_Mat];
-				D27.f[DIR_MMM] = &DD27[DIR_MMM *size_Mat];
-				D27.f[DIR_PMM] = &DD27[DIR_PMM *size_Mat];
-				D27.f[DIR_MPM] = &DD27[DIR_MPM *size_Mat];
+				D27.f[DIR_P00] = &DD27[DIR_P00 * numberOfLBnodes];
+				D27.f[DIR_M00] = &DD27[DIR_M00 * numberOfLBnodes];
+				D27.f[DIR_0P0] = &DD27[DIR_0P0 * numberOfLBnodes];
+				D27.f[DIR_0M0] = &DD27[DIR_0M0 * numberOfLBnodes];
+				D27.f[DIR_00P] = &DD27[DIR_00P * numberOfLBnodes];
+				D27.f[DIR_00M] = &DD27[DIR_00M * numberOfLBnodes];
+				D27.f[DIR_PP0] = &DD27[DIR_PP0 * numberOfLBnodes];
+				D27.f[DIR_MM0] = &DD27[DIR_MM0 * numberOfLBnodes];
+				D27.f[DIR_PM0] = &DD27[DIR_PM0 * numberOfLBnodes];
+				D27.f[DIR_MP0] = &DD27[DIR_MP0 * numberOfLBnodes];
+				D27.f[DIR_P0P] = &DD27[DIR_P0P * numberOfLBnodes];
+				D27.f[DIR_M0M] = &DD27[DIR_M0M * numberOfLBnodes];
+				D27.f[DIR_P0M] = &DD27[DIR_P0M * numberOfLBnodes];
+				D27.f[DIR_M0P] = &DD27[DIR_M0P * numberOfLBnodes];
+				D27.f[DIR_0PP] = &DD27[DIR_0PP * numberOfLBnodes];
+				D27.f[DIR_0MM] = &DD27[DIR_0MM * numberOfLBnodes];
+				D27.f[DIR_0PM] = &DD27[DIR_0PM * numberOfLBnodes];
+				D27.f[DIR_0MP] = &DD27[DIR_0MP * numberOfLBnodes];
+				D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+				D27.f[DIR_PPP] = &DD27[DIR_PPP * numberOfLBnodes];
+				D27.f[DIR_MMP] = &DD27[DIR_MMP * numberOfLBnodes];
+				D27.f[DIR_PMP] = &DD27[DIR_PMP * numberOfLBnodes];
+				D27.f[DIR_MPP] = &DD27[DIR_MPP * numberOfLBnodes];
+				D27.f[DIR_PPM] = &DD27[DIR_PPM * numberOfLBnodes];
+				D27.f[DIR_MMM] = &DD27[DIR_MMM * numberOfLBnodes];
+				D27.f[DIR_PMM] = &DD27[DIR_PMM * numberOfLBnodes];
+				D27.f[DIR_MPM] = &DD27[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D27.f[DIR_M00] = &DD27[DIR_P00   *size_Mat];
-				D27.f[DIR_P00] = &DD27[DIR_M00   *size_Mat];
-				D27.f[DIR_0M0] = &DD27[DIR_0P0   *size_Mat];
-				D27.f[DIR_0P0] = &DD27[DIR_0M0   *size_Mat];
-				D27.f[DIR_00M] = &DD27[DIR_00P   *size_Mat];
-				D27.f[DIR_00P] = &DD27[DIR_00M   *size_Mat];
-				D27.f[DIR_MM0] = &DD27[DIR_PP0  *size_Mat];
-				D27.f[DIR_PP0] = &DD27[DIR_MM0  *size_Mat];
-				D27.f[DIR_MP0] = &DD27[DIR_PM0  *size_Mat];
-				D27.f[DIR_PM0] = &DD27[DIR_MP0  *size_Mat];
-				D27.f[DIR_M0M] = &DD27[DIR_P0P  *size_Mat];
-				D27.f[DIR_P0P] = &DD27[DIR_M0M  *size_Mat];
-				D27.f[DIR_M0P] = &DD27[DIR_P0M  *size_Mat];
-				D27.f[DIR_P0M] = &DD27[DIR_M0P  *size_Mat];
-				D27.f[DIR_0MM] = &DD27[DIR_0PP  *size_Mat];
-				D27.f[DIR_0PP] = &DD27[DIR_0MM  *size_Mat];
-				D27.f[DIR_0MP] = &DD27[DIR_0PM  *size_Mat];
-				D27.f[DIR_0PM] = &DD27[DIR_0MP  *size_Mat];
-				D27.f[DIR_000] = &DD27[DIR_000*size_Mat];
-				D27.f[DIR_MMM] = &DD27[DIR_PPP *size_Mat];
-				D27.f[DIR_PPM] = &DD27[DIR_MMP *size_Mat];
-				D27.f[DIR_MPM] = &DD27[DIR_PMP *size_Mat];
-				D27.f[DIR_PMM] = &DD27[DIR_MPP *size_Mat];
-				D27.f[DIR_MMP] = &DD27[DIR_PPM *size_Mat];
-				D27.f[DIR_PPP] = &DD27[DIR_MMM *size_Mat];
-				D27.f[DIR_MPP] = &DD27[DIR_PMM *size_Mat];
-				D27.f[DIR_PMP] = &DD27[DIR_MPM *size_Mat];
+				D27.f[DIR_M00] = &DD27[DIR_P00 * numberOfLBnodes];
+				D27.f[DIR_P00] = &DD27[DIR_M00 * numberOfLBnodes];
+				D27.f[DIR_0M0] = &DD27[DIR_0P0 * numberOfLBnodes];
+				D27.f[DIR_0P0] = &DD27[DIR_0M0 * numberOfLBnodes];
+				D27.f[DIR_00M] = &DD27[DIR_00P * numberOfLBnodes];
+				D27.f[DIR_00P] = &DD27[DIR_00M * numberOfLBnodes];
+				D27.f[DIR_MM0] = &DD27[DIR_PP0 * numberOfLBnodes];
+				D27.f[DIR_PP0] = &DD27[DIR_MM0 * numberOfLBnodes];
+				D27.f[DIR_MP0] = &DD27[DIR_PM0 * numberOfLBnodes];
+				D27.f[DIR_PM0] = &DD27[DIR_MP0 * numberOfLBnodes];
+				D27.f[DIR_M0M] = &DD27[DIR_P0P * numberOfLBnodes];
+				D27.f[DIR_P0P] = &DD27[DIR_M0M * numberOfLBnodes];
+				D27.f[DIR_M0P] = &DD27[DIR_P0M * numberOfLBnodes];
+				D27.f[DIR_P0M] = &DD27[DIR_M0P * numberOfLBnodes];
+				D27.f[DIR_0MM] = &DD27[DIR_0PP * numberOfLBnodes];
+				D27.f[DIR_0PP] = &DD27[DIR_0MM * numberOfLBnodes];
+				D27.f[DIR_0MP] = &DD27[DIR_0PM * numberOfLBnodes];
+				D27.f[DIR_0PM] = &DD27[DIR_0MP * numberOfLBnodes];
+				D27.f[DIR_000] = &DD27[DIR_000 * numberOfLBnodes];
+				D27.f[DIR_MMM] = &DD27[DIR_PPP * numberOfLBnodes];
+				D27.f[DIR_PPM] = &DD27[DIR_MMP * numberOfLBnodes];
+				D27.f[DIR_MPM] = &DD27[DIR_PMP * numberOfLBnodes];
+				D27.f[DIR_PMM] = &DD27[DIR_MPP * numberOfLBnodes];
+				D27.f[DIR_MMP] = &DD27[DIR_PPM * numberOfLBnodes];
+				D27.f[DIR_PPP] = &DD27[DIR_MMM * numberOfLBnodes];
+				D27.f[DIR_MPP] = &DD27[DIR_PMM * numberOfLBnodes];
+				D27.f[DIR_PMP] = &DD27[DIR_MPM * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -197,33 +197,33 @@ __global__ void LB_Kernel_AD_Incomp_27(real diffusivity,
 			real fTNW = (D.f[DIR_PMM])[kbs];//kbse
 			real fTSE = (D.f[DIR_MPM])[kbw];//kbnw
 										   ////////////////////////////////////////////////////////////////////////////////
-										   //real f27E    =  (D27.f[DIR_P00   ])[k  ];//ke
-										   //real f27W    =  (D27.f[DIR_M00   ])[kw ];
-										   //real f27N    =  (D27.f[DIR_0P0   ])[k  ];//kn
-										   //real f27S    =  (D27.f[DIR_0M0   ])[ks ];
-										   //real f27T    =  (D27.f[DIR_00P   ])[k  ];//kt
-										   //real f27B    =  (D27.f[DIR_00M   ])[kb ];
-										   //real f27NE   =  (D27.f[DIR_PP0  ])[k  ];//kne
-										   //real f27SW   =  (D27.f[DIR_MM0  ])[ksw];
-										   //real f27SE   =  (D27.f[DIR_PM0  ])[ks ];//kse
-										   //real f27NW   =  (D27.f[DIR_MP0  ])[kw ];//knw
-										   //real f27TE   =  (D27.f[DIR_P0P  ])[k  ];//kte
-										   //real f27BW   =  (D27.f[DIR_M0M  ])[kbw];
-										   //real f27BE   =  (D27.f[DIR_P0M  ])[kb ];//kbe
-										   //real f27TW   =  (D27.f[DIR_M0P  ])[kw ];//ktw
-										   //real f27TN   =  (D27.f[DIR_0PP  ])[k  ];//ktn
-										   //real f27BS   =  (D27.f[DIR_0MM  ])[kbs];
-										   //real f27BN   =  (D27.f[DIR_0PM  ])[kb ];//kbn
-										   //real f27TS   =  (D27.f[DIR_0MP  ])[ks ];//kts
+										   //real f27E    =  (D27.f[DIR_P00])[k  ];//ke
+										   //real f27W    =  (D27.f[DIR_M00])[kw ];
+										   //real f27N    =  (D27.f[DIR_0P0])[k  ];//kn
+										   //real f27S    =  (D27.f[DIR_0M0])[ks ];
+										   //real f27T    =  (D27.f[DIR_00P])[k  ];//kt
+										   //real f27B    =  (D27.f[DIR_00M])[kb ];
+										   //real f27NE   =  (D27.f[DIR_PP0])[k  ];//kne
+										   //real f27SW   =  (D27.f[DIR_MM0])[ksw];
+										   //real f27SE   =  (D27.f[DIR_PM0])[ks ];//kse
+										   //real f27NW   =  (D27.f[DIR_MP0])[kw ];//knw
+										   //real f27TE   =  (D27.f[DIR_P0P])[k  ];//kte
+										   //real f27BW   =  (D27.f[DIR_M0M])[kbw];
+										   //real f27BE   =  (D27.f[DIR_P0M])[kb ];//kbe
+										   //real f27TW   =  (D27.f[DIR_M0P])[kw ];//ktw
+										   //real f27TN   =  (D27.f[DIR_0PP])[k  ];//ktn
+										   //real f27BS   =  (D27.f[DIR_0MM])[kbs];
+										   //real f27BN   =  (D27.f[DIR_0PM])[kb ];//kbn
+										   //real f27TS   =  (D27.f[DIR_0MP])[ks ];//kts
 										   //real f27ZERO =  (D27.f[DIR_000])[k  ];//kzero
-										   //real f27TNE  =  (D27.f[DIR_PPP ])[k  ];//ktne
-										   //real f27TSW  =  (D27.f[DIR_MMP ])[ksw];//ktsw
-										   //real f27TSE  =  (D27.f[DIR_PMP ])[ks ];//ktse
-										   //real f27TNW  =  (D27.f[DIR_MPP ])[kw ];//ktnw
-										   //real f27BNE  =  (D27.f[DIR_PPM ])[kb ];//kbne
-										   //real f27BSW  =  (D27.f[DIR_MMM ])[kbsw];
-										   //real f27BSE  =  (D27.f[DIR_PMM ])[kbs];//kbse
-										   //real f27BNW  =  (D27.f[DIR_MPM ])[kbw];//kbnw
+										   //real f27TNE  =  (D27.f[DIR_PPP])[k  ];//ktne
+										   //real f27TSW  =  (D27.f[DIR_MMP])[ksw];//ktsw
+										   //real f27TSE  =  (D27.f[DIR_PMP])[ks ];//ktse
+										   //real f27TNW  =  (D27.f[DIR_MPP])[kw ];//ktnw
+										   //real f27BNE  =  (D27.f[DIR_PPM])[kb ];//kbne
+										   //real f27BSW  =  (D27.f[DIR_MMM])[kbsw];
+										   //real f27BSE  =  (D27.f[DIR_PMM])[kbs];//kbse
+										   //real f27BNW  =  (D27.f[DIR_MPM])[kbw];//kbnw
 										   ////////////////////////////////////////////////////////////////////////////////
 										   //real vx1     =  ((fTNE-fBSW)+(fBNE-fTSW)+(fTSE-fBNW)+(fBSE-fTNW) +(fNE-fSW)+(fSE-fNW)+(fTE-fBW)+(fBE-fTW)+(fE-fW));
 										   //real vx2     =  ((fTNE-fBSW)+(fBNE-fTSW)+(fBNW-fTSE)+(fTNW-fBSE) +(fNE-fSW)+(fNW-fSE)+(fTN-fBS)+(fBN-fTS)+(fN-fS));
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27_Device.cuh
index a6d94de4fadb9a93a9e5fed63d87731b12ec2a07..3abee563f676910f422bba0930060c2a0b0c0e21 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod27/ADIncomp27/ADIncomp27_Device.cuh
@@ -11,7 +11,7 @@ __global__ void LB_Kernel_AD_Incomp_27(real diffusivity,
 	unsigned int* neighborZ,
 	real* DDStart,
 	real* DD27,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool EvenOrOdd);
 
 #endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7.cu
index 27da776eb7612307fa4f9af2886594fc0c75d90b..d0c6a6a24ab4d0ebebee9324bdafa1f9e3db51b9 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7.cu
@@ -2,6 +2,7 @@
 
 #include "ADIncomp7_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<ADIncomp7> ADIncomp7::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,34 +11,19 @@ std::shared_ptr<ADIncomp7> ADIncomp7::getNewInstance(std::shared_ptr<Parameter>
 
 void ADIncomp7::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_AD_Incomp_7 << < grid, threads >> >(	para->getParD(level)->diffusivity, 
-													para->getParD(level)->typeOfGridNode,
-													para->getParD(level)->neighborX, 
-													para->getParD(level)->neighborY, 
-													para->getParD(level)->neighborZ,
-													para->getParD(level)->distributions.f[0],
-													para->getParD(level)->distributionsAD7.f[0], 
-													para->getParD(level)->numberOfNodes,
-													para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_AD_Incomp_7 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_AD_Incomp_7<<< grid.grid, grid.threads >>>(
+        para->getParD(level)->diffusivity, 
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX, 
+        para->getParD(level)->neighborY, 
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->distributionsAD7.f[0], 
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_AD_Incomp_7 execution failed");
 }
 
 ADIncomp7::ADIncomp7(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7_Device.cu
index d49b0b48d20d976076a52f804d485b68da55348e..e0bcc4e515b1b2ccf71f1050e2d572b60a40d94b 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7_Device.cu
@@ -13,7 +13,7 @@ __global__ void LB_Kernel_AD_Incomp_7(real diffusivity,
 	unsigned int* neighborZ,
 	real* DDStart,
 	real* DD7,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool EvenOrOdd)
 {
 	////////////////////////////////////////////////////////////////////////////////
@@ -27,7 +27,7 @@ __global__ void LB_Kernel_AD_Incomp_7(real diffusivity,
 	const unsigned k = nx*(ny*z + y) + x;
 	//////////////////////////////////////////////////////////////////////////
 
-	if (k<size_Mat)
+	if (k<numberOfLBnodes)
 	{
 		////////////////////////////////////////////////////////////////////////////////
 		unsigned int BC;
@@ -38,85 +38,85 @@ __global__ void LB_Kernel_AD_Incomp_7(real diffusivity,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+				D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+				D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+				D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 			}
 
 			Distributions7 D7;
 			if (EvenOrOdd == true)
 			{
-				D7.f[0] = &DD7[0 * size_Mat];
-				D7.f[1] = &DD7[1 * size_Mat];
-				D7.f[2] = &DD7[2 * size_Mat];
-				D7.f[3] = &DD7[3 * size_Mat];
-				D7.f[4] = &DD7[4 * size_Mat];
-				D7.f[5] = &DD7[5 * size_Mat];
-				D7.f[6] = &DD7[6 * size_Mat];
+				D7.f[0] = &DD7[0 * numberOfLBnodes];
+				D7.f[1] = &DD7[1 * numberOfLBnodes];
+				D7.f[2] = &DD7[2 * numberOfLBnodes];
+				D7.f[3] = &DD7[3 * numberOfLBnodes];
+				D7.f[4] = &DD7[4 * numberOfLBnodes];
+				D7.f[5] = &DD7[5 * numberOfLBnodes];
+				D7.f[6] = &DD7[6 * numberOfLBnodes];
 			}
 			else
 			{
-				D7.f[0] = &DD7[0 * size_Mat];
-				D7.f[2] = &DD7[1 * size_Mat];
-				D7.f[1] = &DD7[2 * size_Mat];
-				D7.f[4] = &DD7[3 * size_Mat];
-				D7.f[3] = &DD7[4 * size_Mat];
-				D7.f[6] = &DD7[5 * size_Mat];
-				D7.f[5] = &DD7[6 * size_Mat];
+				D7.f[0] = &DD7[0 * numberOfLBnodes];
+				D7.f[2] = &DD7[1 * numberOfLBnodes];
+				D7.f[1] = &DD7[2 * numberOfLBnodes];
+				D7.f[4] = &DD7[3 * numberOfLBnodes];
+				D7.f[3] = &DD7[4 * numberOfLBnodes];
+				D7.f[6] = &DD7[5 * numberOfLBnodes];
+				D7.f[5] = &DD7[6 * numberOfLBnodes];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -156,33 +156,33 @@ __global__ void LB_Kernel_AD_Incomp_7(real diffusivity,
 			real fTNE = (D.f[DIR_MMM])[kbsw];
 			real fTNW = (D.f[DIR_PMM])[kbs];//kbse
 			real fTSE = (D.f[DIR_MPM])[kbw];//kbnw
-										   //real fE    =  (D.f[DIR_P00   ])[k  ];//ke
-										   //real fW    =  (D.f[DIR_M00   ])[kw ];
-										   //real fN    =  (D.f[DIR_0P0   ])[k  ];//kn
-										   //real fS    =  (D.f[DIR_0M0   ])[ks ];
-										   //real fT    =  (D.f[DIR_00P   ])[k  ];//kt
-										   //real fB    =  (D.f[DIR_00M   ])[kb ];
-										   //real fNE   =  (D.f[DIR_PP0  ])[k  ];//kne
-										   //real fSW   =  (D.f[DIR_MM0  ])[ksw];
-										   //real fSE   =  (D.f[DIR_PM0  ])[ks ];//kse
-										   //real fNW   =  (D.f[DIR_MP0  ])[kw ];//knw
-										   //real fTE   =  (D.f[DIR_P0P  ])[k  ];//kte
-										   //real fBW   =  (D.f[DIR_M0M  ])[kbw];
-										   //real fBE   =  (D.f[DIR_P0M  ])[kb ];//kbe
-										   //real fTW   =  (D.f[DIR_M0P  ])[kw ];//ktw
-										   //real fTN   =  (D.f[DIR_0PP  ])[k  ];//ktn
-										   //real fBS   =  (D.f[DIR_0MM  ])[kbs];
-										   //real fBN   =  (D.f[DIR_0PM  ])[kb ];//kbn
-										   //real fTS   =  (D.f[DIR_0MP  ])[ks ];//kts
+										   //real fE    =  (D.f[DIR_P00])[k  ];//ke
+										   //real fW    =  (D.f[DIR_M00])[kw ];
+										   //real fN    =  (D.f[DIR_0P0])[k  ];//kn
+										   //real fS    =  (D.f[DIR_0M0])[ks ];
+										   //real fT    =  (D.f[DIR_00P])[k  ];//kt
+										   //real fB    =  (D.f[DIR_00M])[kb ];
+										   //real fNE   =  (D.f[DIR_PP0])[k  ];//kne
+										   //real fSW   =  (D.f[DIR_MM0])[ksw];
+										   //real fSE   =  (D.f[DIR_PM0])[ks ];//kse
+										   //real fNW   =  (D.f[DIR_MP0])[kw ];//knw
+										   //real fTE   =  (D.f[DIR_P0P])[k  ];//kte
+										   //real fBW   =  (D.f[DIR_M0M])[kbw];
+										   //real fBE   =  (D.f[DIR_P0M])[kb ];//kbe
+										   //real fTW   =  (D.f[DIR_M0P])[kw ];//ktw
+										   //real fTN   =  (D.f[DIR_0PP])[k  ];//ktn
+										   //real fBS   =  (D.f[DIR_0MM])[kbs];
+										   //real fBN   =  (D.f[DIR_0PM])[kb ];//kbn
+										   //real fTS   =  (D.f[DIR_0MP])[ks ];//kts
 										   //real fZERO =  (D.f[DIR_000])[k  ];//kzero
-										   //real fTNE   = (D.f[DIR_PPP ])[k  ];//ktne
-										   //real fTSW   = (D.f[DIR_MMP ])[ksw];//ktsw
-										   //real fTSE   = (D.f[DIR_PMP ])[ks ];//ktse
-										   //real fTNW   = (D.f[DIR_MPP ])[kw ];//ktnw
-										   //real fBNE   = (D.f[DIR_PPM ])[kb ];//kbne
-										   //real fBSW   = (D.f[DIR_MMM ])[kbsw];
-										   //real fBSE   = (D.f[DIR_PMM ])[kbs];//kbse
-										   //real fBNW   = (D.f[DIR_MPM ])[kbw];//kbnw
+										   //real fTNE   = (D.f[DIR_PPP])[k  ];//ktne
+										   //real fTSW   = (D.f[DIR_MMP])[ksw];//ktsw
+										   //real fTSE   = (D.f[DIR_PMP])[ks ];//ktse
+										   //real fTNW   = (D.f[DIR_MPP])[kw ];//ktnw
+										   //real fBNE   = (D.f[DIR_PPM])[kb ];//kbne
+										   //real fBSW   = (D.f[DIR_MMM])[kbsw];
+										   //real fBSE   = (D.f[DIR_PMM])[kbs];//kbse
+										   //real fBNW   = (D.f[DIR_MPM])[kbw];//kbnw
 										   ////////////////////////////////////////////////////////////////////////////////
 			real f7ZERO = (D7.f[0])[k];
 			real f7E = (D7.f[1])[k];
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7_Device.cuh
index 25a17ddbd7038635a2beb2c39212822cbf762034..845ecda946a4e45678082b72b5c74dc96e5810c5 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/AdvectionDiffusion/Incompressible/Mod7/ADIncomp7/ADIncomp7_Device.cuh
@@ -11,7 +11,7 @@ __global__ void LB_Kernel_AD_Incomp_7(real diffusivity,
 	unsigned int* neighborZ,
 	real* DDStart,
 	real* DD7,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	bool EvenOrOdd);
 
 #endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.cu
index d2f9f60890379d07ecc3d04f4a54d59a0754907a..8c99f3b030984aef6215d5479be4b321145ee54f 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "BGKCompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<BGKCompSP27> BGKCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<BGKCompSP27> BGKCompSP27::getNewInstance(std::shared_ptr<Paramet
 
 void BGKCompSP27::run()
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_BGK_Comp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-														para->getParD(level)->typeOfGridNode,
-														para->getParD(level)->neighborX,
-														para->getParD(level)->neighborY,
-														para->getParD(level)->neighborZ,
-														para->getParD(level)->distributions.f[0],
-														para->getParD(level)->numberOfNodes,
-														para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_BGK_Comp_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_BGK_Comp_SP_27<<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_BGK_Comp_SP_27 execution failed");
 }
 
 BGKCompSP27::BGKCompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cu
index 09196d13e94a2404ba280e8a8e9394f0a79e8211..3bdb65c455bd67d66e8b35961f2fa7e1de45f763 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27_Device.cu
@@ -38,63 +38,63 @@ __global__ void LB_Kernel_BGK_Comp_SP_27(	real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.cu
index beebda2437ca4e7385ab812b9106edabe213227e..a4b136d1c21b1e4c68432eef5e21ff8c968bdfec 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "BGKPlusCompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<BGKPlusCompSP27> BGKPlusCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<BGKPlusCompSP27> BGKPlusCompSP27::getNewInstance(std::shared_ptr
 
 void BGKPlusCompSP27::run()
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_BGK_Plus_Comp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-															para->getParD(level)->typeOfGridNode,
-															para->getParD(level)->neighborX,
-															para->getParD(level)->neighborY,
-															para->getParD(level)->neighborZ,
-															para->getParD(level)->distributions.f[0],
-															size_Mat,
-															para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_BGK_Plus_Comp_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_BGK_Plus_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_BGK_Plus_Comp_SP_27 execution failed");
 }
 
 BGKPlusCompSP27::BGKPlusCompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cu
index 325f65ece9baddf88adc91baa753bdfc4bd0eced..1f44fee9ea8b20241f87bea6310c96db2b82d1c4 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27_Device.cu
@@ -38,63 +38,63 @@ __global__ void LB_Kernel_BGK_Plus_Comp_SP_27(
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -127,33 +127,33 @@ __global__ void LB_Kernel_BGK_Plus_Comp_SP_27(
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 											//slow
 											//real oMdrho = one - ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.cu
index 3d7f6fb9a8980454ebc83c51c7dd8865688fa166..2431809170561c838e1e9905466ba1abfdbbe27b 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.cu
@@ -31,15 +31,16 @@ BGKUnified::BGKUnified(std::shared_ptr<Parameter> para, int level)
 
 void BGKUnified::run()
 {
-    GPUKernelParameter kernelParameter{ para->getParD(level)->omega,
-                                                 para->getParD(level)->typeOfGridNode,
-                                                 para->getParD(level)->neighborX,
-                                                 para->getParD(level)->neighborY,
-                                                 para->getParD(level)->neighborZ,
-                                                 para->getParD(level)->distributions.f[0],
-                                                 (int)para->getParD(level)->numberOfNodes,
-                                                 nullptr, /* forces not used in bgk kernel */
-                                                 para->getParD(level)->isEvenTimestep };
+    GPUKernelParameter kernelParameter{
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        (int)para->getParD(level)->numberOfNodes,
+        nullptr, /* forces not used in bgk kernel */
+        para->getParD(level)->isEvenTimestep };
 
     auto lambda = [] __device__(lbm::KernelParameter parameter) {
         return lbm::bgk(parameter);
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.cu
index eca3a9953024e44fd91e7f9f98956e4329574d09..dcfda06db462fd83120751a32a40365445d659ba 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "CascadeCompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CascadeCompSP27> CascadeCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<CascadeCompSP27> CascadeCompSP27::getNewInstance(std::shared_ptr
 
 void CascadeCompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_Cascade_Comp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-															para->getParD(level)->typeOfGridNode,
-															para->getParD(level)->neighborX,
-															para->getParD(level)->neighborY,
-															para->getParD(level)->neighborZ,
-															para->getParD(level)->distributions.f[0],
-															para->getParD(level)->numberOfNodes,
-															para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_Cascade_Comp_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_Cascade_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_Cascade_Comp_SP_27 execution failed");
 }
 
 CascadeCompSP27::CascadeCompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cu
index 3f69fa47288343fbdd91e77dbb7f154501349098..af0a7c118191243c80c420856a70711a1fc17d2b 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27_Device.cu
@@ -37,63 +37,63 @@ __global__ void LB_Kernel_Cascade_Comp_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -126,33 +126,33 @@ __global__ void LB_Kernel_Cascade_Comp_SP_27(real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];//[ke   ];
-			real mfabb = (D.f[DIR_M00   ])[kw ];//[kw   ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];//[kn   ];
-			real mfbab = (D.f[DIR_0M0   ])[ks ];//[ks   ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];//[kt   ];
-			real mfbba = (D.f[DIR_00M   ])[kb ];//[kb   ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];//[kne  ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw];//[ksw  ];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];//[kse  ];
-			real mfacb = (D.f[DIR_MP0  ])[kw ];//[knw  ];
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];//[kte  ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw];//[kbw  ];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];//[kbe  ];
-			real mfabc = (D.f[DIR_M0P  ])[kw ];//[ktw  ];
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];//[ktn  ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];//[kbs  ];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];//[kbn  ];
-			real mfbac = (D.f[DIR_0MP  ])[ks ];//[kts  ];
+			real mfcbb = (D.f[DIR_P00])[k  ];//[ke   ];
+			real mfabb = (D.f[DIR_M00])[kw ];//[kw   ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];//[kn   ];
+			real mfbab = (D.f[DIR_0M0])[ks ];//[ks   ];
+			real mfbbc = (D.f[DIR_00P])[k  ];//[kt   ];
+			real mfbba = (D.f[DIR_00M])[kb ];//[kb   ];
+			real mfccb = (D.f[DIR_PP0])[k  ];//[kne  ];
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];
+			real mfcab = (D.f[DIR_PM0])[ks ];//[kse  ];
+			real mfacb = (D.f[DIR_MP0])[kw ];//[knw  ];
+			real mfcbc = (D.f[DIR_P0P])[k  ];//[kte  ];
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];
+			real mfcba = (D.f[DIR_P0M])[kb ];//[kbe  ];
+			real mfabc = (D.f[DIR_M0P])[kw ];//[ktw  ];
+			real mfbcc = (D.f[DIR_0PP])[k  ];//[ktn  ];
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];
+			real mfbca = (D.f[DIR_0PM])[kb ];//[kbn  ];
+			real mfbac = (D.f[DIR_0MP])[ks ];//[kts  ];
 			real mfbbb = (D.f[DIR_000])[k  ];//[kzero];
-			real mfccc = (D.f[DIR_PPP ])[k  ];//[ktne ];
-			real mfaac = (D.f[DIR_MMP ])[ksw];//[ktsw ];
-			real mfcac = (D.f[DIR_PMP ])[ks ];//[ktse ];
-			real mfacc = (D.f[DIR_MPP ])[kw ];//[ktnw ];
-			real mfcca = (D.f[DIR_PPM ])[kb ];//[kbne ];
-			real mfaaa = (D.f[DIR_MMM ])[kbsw];//[kbsw ]
-			real mfcaa = (D.f[DIR_PMM ])[kbs];//[kbse ];
-			real mfaca = (D.f[DIR_MPM ])[kbw];//[kbnw ];
+			real mfccc = (D.f[DIR_PPP])[k  ];//[ktne ];
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];
+			real mfcac = (D.f[DIR_PMP])[ks ];//[ktse ];
+			real mfacc = (D.f[DIR_MPP])[kw ];//[ktnw ];
+			real mfcca = (D.f[DIR_PPM])[kb ];//[kbne ];
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ]
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];
 			////////////////////////////////////////////////////////////////////////////////////
 			real rho = (mfccc+mfaaa + mfaca+mfcac + mfacc+mfcaa + mfaac+mfcca + 
 						   mfbac+mfbca + mfbaa+mfbcc + mfabc+mfcba + mfaba+mfcbc + mfacb+mfcab + mfaab+mfccb +
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.cu
index 3f45c7ea71c385f948eac2e052a8d970010c413d..7817c398285dda131401bd14c3ccdd8c119c5680 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "CumulantCompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CumulantCompSP27> CumulantCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<CumulantCompSP27> CumulantCompSP27::getNewInstance(std::shared_p
 
 void CumulantCompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_Cum_Comp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-														para->getParD(level)->typeOfGridNode,
-														para->getParD(level)->neighborX,
-														para->getParD(level)->neighborY,
-														para->getParD(level)->neighborZ,
-														para->getParD(level)->distributions.f[0],
-														para->getParD(level)->numberOfNodes,
-														para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_Kum_Comp_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_Cum_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_Cum_Comp_SP_27 execution failed");
 }
 
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cu
index ad2ffdf4170d98125e6758c0e2f548122093cea6..1dfab5846795e61509cdba28478fe6ce623983b5 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27_Device.cu
@@ -37,63 +37,63 @@ __global__ void LB_Kernel_Cum_Comp_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.cu
index 9a84df86e41b3fdff75c2ebf580813afc5ee3feb..1518dcc209de1edf8a88dae72c1f10c3d4666610 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.cu
@@ -1,8 +1,8 @@
 #include "CumulantAll4CompSP27.h"
 
 #include "CumulantAll4CompSP27_Device.cuh"
-
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CumulantAll4CompSP27> CumulantAll4CompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -11,36 +11,21 @@ std::shared_ptr<CumulantAll4CompSP27> CumulantAll4CompSP27::getNewInstance(std::
 
 void CumulantAll4CompSP27::run()
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_Cumulant_D3Q27All4 << < grid, threads >> >(	para->getParD(level)->omega,
-															para->getParD(level)->typeOfGridNode,
-															para->getParD(level)->neighborX,
-															para->getParD(level)->neighborY,
-															para->getParD(level)->neighborZ,
-															para->getParD(level)->distributions.f[0],
-															size_Mat,
-															level,
-															para->getForcesDev(),
-                                                            para->getQuadricLimitersDev(),
-															para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_Cumulant_D3Q27All4 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_Cumulant_D3Q27All4 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        level,
+        para->getForcesDev(),
+        para->getQuadricLimitersDev(),
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_Cumulant_D3Q27All4 execution failed");
 }
 
 CumulantAll4CompSP27::CumulantAll4CompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cu
index 681dbff2ba37a1e0de56341b39cc2dec791f656b..3593b41c4c62c8a8b19719e22e9d65d6b5fd987d 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27_Device.cu
@@ -42,63 +42,63 @@ __global__ void LB_Kernel_Cumulant_D3Q27All4(	real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -160,33 +160,33 @@ __global__ void LB_Kernel_Cumulant_D3Q27All4(	real omega,
 			//unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
 				(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.cu
index 1b6ba1a2278b68f085a4b7df699b7ca230811f39..5a480e5d9c97126e491655b4bbe2aeefef3e7161 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.cu
@@ -12,7 +12,7 @@ std::shared_ptr<CumulantK15Comp> CumulantK15Comp::getNewInstance(std::shared_ptr
 void CumulantK15Comp::run()
 {
 	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
+	int size_Mat = (int)para->getParD(level)->numberOfNodes;
 
 	int Grid = (size_Mat / numberOfThreads) + 1;
 	int Grid1, Grid2;
@@ -29,16 +29,17 @@ void CumulantK15Comp::run()
 	dim3 grid(Grid1, Grid2, 1);
 	dim3 threads(numberOfThreads, 1, 1);
 
-	LB_Kernel_CumulantK15Comp <<< grid, threads >>>(para->getParD(level)->omega,
-													para->getParD(level)->typeOfGridNode,
-													para->getParD(level)->neighborX,
-													para->getParD(level)->neighborY,
-													para->getParD(level)->neighborZ,
-													para->getParD(level)->distributions.f[0],
-													size_Mat,
-													level,
-													para->getForcesDev(),
-													para->getParD(level)->isEvenTimestep);
+	LB_Kernel_CumulantK15Comp <<< grid, threads >>>(
+		para->getParD(level)->omega,
+		para->getParD(level)->typeOfGridNode,
+		para->getParD(level)->neighborX,
+		para->getParD(level)->neighborY,
+		para->getParD(level)->neighborZ,
+		para->getParD(level)->distributions.f[0],
+		para->getParD(level)->numberOfNodes,
+		level,
+		para->getForcesDev(),
+		para->getParD(level)->isEvenTimestep);
 	getLastCudaError("LB_Kernel_CumulantK15Comp execution failed");
 }
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu
index 93d57d6c9871d66537f25b9188467d46e3b3d05c..f7fb1f0a6441cfc6f38ad9684fd5bc8dd1be7135 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu
@@ -39,63 +39,63 @@ __global__ void LB_Kernel_CumulantK15Comp(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -156,33 +156,33 @@ __global__ void LB_Kernel_CumulantK15Comp(real omega,
 			//unsigned int ktne = k;
 			//unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
 				(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.cu
index 188984d001f89d72c967dd6390ca10ae5d2eab32..51876f30b8c8e37d8cb3355edde5dcf2b04675d0 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.cu
@@ -2,6 +2,7 @@
 
 #include "CumulantK15BulkComp_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CumulantK15BulkComp> CumulantK15BulkComp::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,35 +11,20 @@ std::shared_ptr<CumulantK15BulkComp> CumulantK15BulkComp::getNewInstance(std::sh
 
 void CumulantK15BulkComp::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_CumulantK15BulkComp <<< grid, threads >>>(para->getParD(level)->omega,
-														para->getParD(level)->typeOfGridNode,
-														para->getParD(level)->neighborX,
-														para->getParD(level)->neighborY,
-														para->getParD(level)->neighborZ,
-														para->getParD(level)->distributions.f[0],
-														para->getParD(level)->numberOfNodes,
-														level,
-														para->getForcesDev(),
-														para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_CumulantK15BulkComp execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_CumulantK15BulkComp <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        level,
+        para->getForcesDev(),
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_CumulantK15BulkComp execution failed");
 }
 
 CumulantK15BulkComp::CumulantK15BulkComp(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cu
index d2a2f61df902cfd7c5ef52b09f8e7738a108615e..085775d324bf65d783afdd745c06429d697c3788 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp_Device.cu
@@ -39,63 +39,63 @@ __global__ void LB_Kernel_CumulantK15BulkComp(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -156,33 +156,33 @@ __global__ void LB_Kernel_CumulantK15BulkComp(real omega,
 			//unsigned int ktne = k;
 			//unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
 				(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.cu
index d28c077031ff9125d1cbc1187def1d1d8fe4d6e8..613464125bafc572fe7951b8c372e3455ea5b21d 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.cu
@@ -2,6 +2,7 @@
 
 #include "CumulantK15SpongeComp_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CumulantK15SpongeComp> CumulantK15SpongeComp::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,36 +11,21 @@ std::shared_ptr<CumulantK15SpongeComp> CumulantK15SpongeComp::getNewInstance(std
 
 void CumulantK15SpongeComp::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_CumulantK15SpongeComp <<< grid, threads >>>(	para->getParD(level)->omega,
-															para->getParD(level)->typeOfGridNode,
-															para->getParD(level)->neighborX,
-															para->getParD(level)->neighborY,
-															para->getParD(level)->neighborZ,
-															para->getParD(level)->coordinateX,
-															para->getParD(level)->coordinateY,
-															para->getParD(level)->coordinateZ,
-															para->getParD(level)->distributions.f[0],
-															para->getParD(level)->numberOfNodes,
-															para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_CumulantK15SpongeComp execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_CumulantK15SpongeComp <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->coordinateX,
+        para->getParD(level)->coordinateY,
+        para->getParD(level)->coordinateZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_CumulantK15SpongeComp execution failed");
 }
 
 CumulantK15SpongeComp::CumulantK15SpongeComp(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cu
index c2144d324aa3378e8fc9fc5b511bbed385b48a84..13788e65e70eb30803111a39a70d39682648a006 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp_Device.cu
@@ -40,63 +40,63 @@ __global__ void LB_Kernel_CumulantK15SpongeComp(real omegaIn,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu
index 0b72b46cf25f331172be4abb8dded6d8e5e2b9c5..24b0bbc6f43a63093da6b6dcb3ce401b8a614f75 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu
@@ -30,15 +30,16 @@ CumulantK15Unified::CumulantK15Unified(std::shared_ptr<Parameter> para, int leve
 
 void CumulantK15Unified::run()
 {
-    GPUKernelParameter kernelParameter{ para->getParD(level)->omega,
-                                                 para->getParD(level)->typeOfGridNode,
-                                                 para->getParD(level)->neighborX,
-                                                 para->getParD(level)->neighborY,
-                                                 para->getParD(level)->neighborZ,
-                                                 para->getParD(level)->distributions.f[0],
-                                                 (int)para->getParD(level)->numberOfNodes,
-                                                 para->getParD(level)->forcing,
-                                                 para->getParD(level)->isEvenTimestep };
+    GPUKernelParameter kernelParameter{
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        (int)para->getParD(level)->numberOfNodes,
+        para->getParD(level)->forcing,
+        para->getParD(level)->isEvenTimestep };
 
     auto lambda = [] __device__(lbm::KernelParameter parameter) {
         return lbm::cumulantChimera(parameter, lbm::setRelaxationRatesK15);
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu
index 70b0c4352afee850a4e17243979268bd126b7b4a..ea3442fecca63fdcb45878d742a547ce492ab5c8 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu
@@ -6,132 +6,132 @@
 
 #include <cuda.h>
 
-template<TurbulenceModel turbulenceModel> 
+template<TurbulenceModel turbulenceModel>
 std::shared_ptr< CumulantK17<turbulenceModel> > CumulantK17<turbulenceModel>::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<CumulantK17<turbulenceModel> >(new CumulantK17<turbulenceModel>(para,level));
+    return std::shared_ptr<CumulantK17<turbulenceModel> >(new CumulantK17<turbulenceModel>(para,level));
 }
 
 template<TurbulenceModel turbulenceModel>
 void CumulantK17<turbulenceModel>::run()
 {
-	LB_Kernel_CumulantK17 < turbulenceModel, false, false  > <<< cudaGrid.grid, cudaGrid.threads >>>(   para->getParD(level)->omega,										
-																										para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,	
-																										para->getParD(level)->distributions.f[0],	
-																										para->getParD(level)->rho,		
-																										para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,	
-																										para->getParD(level)->turbViscosity,
-																										para->getSGSConstant(),
-																										(unsigned long)para->getParD(level)->numberOfNodes,	
-																										level,			
-																										para->getForcesDev(),				
-																										para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
-																										para->getQuadricLimitersDev(),			
-																										para->getParD(level)->isEvenTimestep,
-																										para->getParD(level)->taggedFluidNodeIndices[CollisionTemplate::Default],
-																										para->getParD(level)->numberOfTaggedFluidNodes[CollisionTemplate::Default]);
+    LB_Kernel_CumulantK17 < turbulenceModel, false, false  > <<< cudaGrid.grid, cudaGrid.threads >>>(   para->getParD(level)->omega,
+                                                                                                        para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
+                                                                                                        para->getParD(level)->distributions.f[0],
+                                                                                                        para->getParD(level)->rho,
+                                                                                                        para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,
+                                                                                                        para->getParD(level)->turbViscosity,
+                                                                                                        para->getSGSConstant(),
+                                                                                                        para->getParD(level)->numberOfNodes,
+                                                                                                        level,
+                                                                                                        para->getForcesDev(),
+                                                                                                        para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
+                                                                                                        para->getQuadricLimitersDev(),
+                                                                                                        para->getParD(level)->isEvenTimestep,
+                                                                                                        para->getParD(level)->taggedFluidNodeIndices[CollisionTemplate::Default],
+                                                                                                        para->getParD(level)->numberOfTaggedFluidNodes[CollisionTemplate::Default]);
 
-	getLastCudaError("LB_Kernel_CumulantK17 execution failed");
+    getLastCudaError("LB_Kernel_CumulantK17 execution failed");
 }
 
 template<TurbulenceModel turbulenceModel>
 void CumulantK17<turbulenceModel>::runOnIndices( const unsigned int *indices, unsigned int size_indices, CollisionTemplate collisionTemplate, CudaStreamIndex streamIndex )
 {
-	cudaStream_t stream = para->getStreamManager()->getStream(streamIndex);
-	
-	switch (collisionTemplate)
-	{
-		case CollisionTemplate::Default:
-			LB_Kernel_CumulantK17 < turbulenceModel, false, false  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>(para->getParD(level)->omega,								
-																														para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,	
-																														para->getParD(level)->distributions.f[0],	
-																														para->getParD(level)->rho,		
-																														para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,	
-																														para->getParD(level)->turbViscosity,
-																														para->getSGSConstant(),
-																														(unsigned long)para->getParD(level)->numberOfNodes,	
-																														level,			
-																														para->getForcesDev(),				
-																														para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
-																														para->getQuadricLimitersDev(),			
-																														para->getParD(level)->isEvenTimestep,
-																														indices,
-																														size_indices);
-			break;
-		
-		case CollisionTemplate::WriteMacroVars:
-			LB_Kernel_CumulantK17 < turbulenceModel, true, false  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega,										
-																														para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,	
-																														para->getParD(level)->distributions.f[0],	
-																														para->getParD(level)->rho,		
-																														para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,	
-																														para->getParD(level)->turbViscosity,
-																														para->getSGSConstant(),
-																														(unsigned long)para->getParD(level)->numberOfNodes,	
-																														level,			
-																														para->getForcesDev(),				
-																														para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
-																														para->getQuadricLimitersDev(),			
-																														para->getParD(level)->isEvenTimestep,
-																														indices,
-																														size_indices);
-			break;
-		
-		case CollisionTemplate::SubDomainBorder:
-		case CollisionTemplate::AllFeatures:
-			LB_Kernel_CumulantK17 < turbulenceModel, true, true  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>(  para->getParD(level)->omega,
-																														para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,	
-																														para->getParD(level)->distributions.f[0],	
-																														para->getParD(level)->rho,		
-																														para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,	
-																														para->getParD(level)->turbViscosity,
-																														para->getSGSConstant(),
-																														(unsigned long)para->getParD(level)->numberOfNodes,	
-																														level,			
-																														para->getForcesDev(),				
-																														para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
-																														para->getQuadricLimitersDev(),			
-																														para->getParD(level)->isEvenTimestep,
-																														indices,
-																														size_indices);
-			break;	case CollisionTemplate::ApplyBodyForce:
-			LB_Kernel_CumulantK17 < turbulenceModel, false, true  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega,									
-																														para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,	
-																														para->getParD(level)->distributions.f[0],	
-																														para->getParD(level)->rho,		
-																														para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,	
-																														para->getParD(level)->turbViscosity,
-																														para->getSGSConstant(),
-																														(unsigned long)para->getParD(level)->numberOfNodes,	
-																														level,			
-																														para->getForcesDev(),				
-																														para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
-																														para->getQuadricLimitersDev(),			
-																														para->getParD(level)->isEvenTimestep,
-																														indices,
-																														size_indices);
-			break;	default:
-			throw std::runtime_error("Invalid CollisionTemplate in CumulantK17::runOnIndices()");
-			break;
-	}
+    cudaStream_t stream = para->getStreamManager()->getStream(streamIndex);
+
+    switch (collisionTemplate)
+    {
+        case CollisionTemplate::Default:
+            LB_Kernel_CumulantK17 < turbulenceModel, false, false  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>(para->getParD(level)->omega,
+                                                                                                                        para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
+                                                                                                                        para->getParD(level)->distributions.f[0],
+                                                                                                                        para->getParD(level)->rho,
+                                                                                                                        para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,
+                                                                                                                        para->getParD(level)->turbViscosity,
+                                                                                                                        para->getSGSConstant(),
+                                                                                                                        para->getParD(level)->numberOfNodes,
+                                                                                                                        level,
+                                                                                                                        para->getForcesDev(),
+                                                                                                                        para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
+                                                                                                                        para->getQuadricLimitersDev(),
+                                                                                                                        para->getParD(level)->isEvenTimestep,
+                                                                                                                        indices,
+                                                                                                                        size_indices);
+            break;
+
+        case CollisionTemplate::WriteMacroVars:
+            LB_Kernel_CumulantK17 < turbulenceModel, true, false  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega,
+                                                                                                                        para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
+                                                                                                                        para->getParD(level)->distributions.f[0],
+                                                                                                                        para->getParD(level)->rho,
+                                                                                                                        para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,
+                                                                                                                        para->getParD(level)->turbViscosity,
+                                                                                                                        para->getSGSConstant(),
+                                                                                                                        para->getParD(level)->numberOfNodes,
+                                                                                                                        level,
+                                                                                                                        para->getForcesDev(),
+                                                                                                                        para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
+                                                                                                                        para->getQuadricLimitersDev(),
+                                                                                                                        para->getParD(level)->isEvenTimestep,
+                                                                                                                        indices,
+                                                                                                                        size_indices);
+            break;
 
-	getLastCudaError("LB_Kernel_CumulantK17 execution failed");
+        case CollisionTemplate::SubDomainBorder:
+        case CollisionTemplate::AllFeatures:
+            LB_Kernel_CumulantK17 < turbulenceModel, true, true  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>(  para->getParD(level)->omega,
+                                                                                                                        para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
+                                                                                                                        para->getParD(level)->distributions.f[0],
+                                                                                                                        para->getParD(level)->rho,
+                                                                                                                        para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,
+                                                                                                                        para->getParD(level)->turbViscosity,
+                                                                                                                        para->getSGSConstant(),
+                                                                                                                        para->getParD(level)->numberOfNodes,
+                                                                                                                        level,
+                                                                                                                        para->getForcesDev(),
+                                                                                                                        para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
+                                                                                                                        para->getQuadricLimitersDev(),
+                                                                                                                        para->getParD(level)->isEvenTimestep,
+                                                                                                                        indices,
+                                                                                                                        size_indices);
+            break;	case CollisionTemplate::ApplyBodyForce:
+            LB_Kernel_CumulantK17 < turbulenceModel, false, true  > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega,
+                                                                                                                        para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ,
+                                                                                                                        para->getParD(level)->distributions.f[0],
+                                                                                                                        para->getParD(level)->rho,
+                                                                                                                        para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,
+                                                                                                                        para->getParD(level)->turbViscosity,
+                                                                                                                        para->getSGSConstant(),
+                                                                                                                        para->getParD(level)->numberOfNodes,
+                                                                                                                        level,
+                                                                                                                        para->getForcesDev(),
+                                                                                                                        para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP,
+                                                                                                                        para->getQuadricLimitersDev(),
+                                                                                                                        para->getParD(level)->isEvenTimestep,
+                                                                                                                        indices,
+                                                                                                                        size_indices);
+            break;	default:
+            throw std::runtime_error("Invalid CollisionTemplate in CumulantK17::runOnIndices()");
+            break;
+    }
+
+    getLastCudaError("LB_Kernel_CumulantK17 execution failed");
 }
 
 template<TurbulenceModel turbulenceModel>
 CumulantK17<turbulenceModel>::CumulantK17(std::shared_ptr<Parameter> para, int level)
 {
-	this->para = para;
-	this->level = level;
+    this->para = para;
+    this->level = level;
+
+    myPreProcessorTypes.push_back(InitCompSP27);
 
-	myPreProcessorTypes.push_back(InitCompSP27);
+    myKernelGroup = BasicKernel;
 
-	myKernelGroup = BasicKernel;
+    this->cudaGrid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+    this->kernelUsesFluidNodeIndices = true;
 
-	this->cudaGrid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
-	this->kernelUsesFluidNodeIndices = true;
-	
-	VF_LOG_INFO("Using turbulence model: {}", turbulenceModel);
+    VF_LOG_INFO("Using turbulence model: {}", turbulenceModel);
 }
 
 template class CumulantK17<TurbulenceModel::AMD>;
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu
index 34a444230019a1c6cfacb18e12fd73607fb2e09a..77d9a5ee439931cf5ebf9665d472785026d6f6bf 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu
@@ -1,28 +1,28 @@
 
-// ____          ____    __    ______     __________   __      __       __        __         
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
-//      \    \  |    |   ________________________________________________________________    
-//       \    \ |    |  |  ______________________________________________________________|   
-//        \    \|    |  |  |         __          __     __     __     ______      _______    
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
 //           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
 //
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can 
+//  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 
+//  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 
+//
+//  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/>.
 //
@@ -32,17 +32,17 @@
 //! \brief Kernel for CumulantK17 including different turbulence models and options for local body forces and writing macroscopic variables
 //!
 //! CumulantK17 kernel using chimera transformations and quartic limiters as present in Geier et al. (2017). Additional options are three different
-//! eddy-viscosity turbulence models (Smagorinsky, AMD, QR) that can be set via the template parameter turbulenceModel (with default 
-//! TurbulenceModel::None). 
+//! eddy-viscosity turbulence models (Smagorinsky, AMD, QR) that can be set via the template parameter turbulenceModel (with default
+//! TurbulenceModel::None).
 //! The kernel is executed separately for each subset of fluid node indices with a different tag CollisionTemplate. For each subset, only the locally
-//! required options are switched on ( \param writeMacroscopicVariables and/or \param applyBodyForce) in order to minimize memory accesses. The default 
-//! refers to the plain cumlant kernel (CollisionTemplate::Default). 
-//! Nodes are added to subsets (taggedFluidNodes) in Simulation::init using a corresponding tag with different values of CollisionTemplate. These subsets 
+//! required options are switched on ( \param writeMacroscopicVariables and/or \param applyBodyForce) in order to minimize memory accesses. The default
+//! refers to the plain cumlant kernel (CollisionTemplate::Default).
+//! Nodes are added to subsets (taggedFluidNodes) in Simulation::init using a corresponding tag with different values of CollisionTemplate. These subsets
 //! are provided by the utilized PostCollisionInteractiors depending on they specifc requirements (e.g. writeMacroscopicVariables for probes).
 
 //=======================================================================================
 /* Device code */
-#include "LBM/LB.h" 
+#include "LBM/LB.h"
 #include "lbm/constants/D3Q27.h"
 #include <lbm/constants/NumericConstants.h>
 #include "Kernel/Utilities/DistributionHelper.cuh"
@@ -57,25 +57,25 @@ using namespace vf::lbm::dir;
 ////////////////////////////////////////////////////////////////////////////////
 template<TurbulenceModel turbulenceModel, bool writeMacroscopicVariables, bool applyBodyForce>
 __global__ void LB_Kernel_CumulantK17(
-	real omega_in,
-	uint* neighborX,
-	uint* neighborY,
-	uint* neighborZ,
-	real* distributions,
+    real omega_in,
+    uint* neighborX,
+    uint* neighborY,
+    uint* neighborZ,
+    real* distributions,
     real* rho,
     real* vx,
     real* vy,
     real* vz,
     real* turbulentViscosity,
     real SGSconstant,
-	unsigned long numberOfLBnodes,
-	int level,
-	real* forces,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
     real* bodyForceX,
     real* bodyForceY,
     real* bodyForceZ,
-	real* quadricLimiters,
-	bool isEvenTimestep,
+    real* quadricLimiters,
+    bool isEvenTimestep,
     const uint *fluidNodeIndices,
     uint numberOfFluidNodes)
 {
@@ -91,10 +91,10 @@ __global__ void LB_Kernel_CumulantK17(
     //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
     //!
     const unsigned kThread = vf::gpu::getNodeIndex();
-    
+
     //////////////////////////////////////////////////////////////////////////
     // run for all indices in size_Mat and fluid nodes
-    if (kThread >= numberOfFluidNodes) 
+    if (kThread >= numberOfFluidNodes)
         return;
     ////////////////////////////////////////////////////////////////////////////////
     //! - Get the node index from the array containing all indices of fluid nodes
@@ -202,7 +202,7 @@ __global__ void LB_Kernel_CumulantK17(
     real vvz = ((((f_PPP - f_MMM) + (f_PMP - f_MPM)) + ((f_MPP - f_PMM) + (f_MMP - f_PPM))) +
                 (((f_0MP - f_0PM) + (f_0PP - f_0MM)) + ((f_M0P - f_P0M) + (f_P0P - f_M0M))) + (f_00P - f_00M)) *
             oneOverRho;
-    
+
     ////////////////////////////////////////////////////////////////////////////////////
     //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref
     //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015),
@@ -212,13 +212,13 @@ __global__ void LB_Kernel_CumulantK17(
     for (size_t i = 1; i <= level; i++) {
         factor *= c2o1;
     }
-    
+
     real fx = forces[0];
     real fy = forces[1];
     real fz = forces[2];
 
     if( applyBodyForce ){
-        fx += bodyForceX[k_000]; 
+        fx += bodyForceX[k_000];
         fy += bodyForceY[k_000];
         fz += bodyForceZ[k_000];
 
@@ -232,7 +232,7 @@ __global__ void LB_Kernel_CumulantK17(
         vvx += acc_x;
         vvy += acc_y;
         vvz += acc_z;
-        
+
         // Reset body force. To be used when not using round-off correction.
         bodyForceX[k_000] = 0.0f;
         bodyForceY[k_000] = 0.0f;
@@ -243,9 +243,9 @@ __global__ void LB_Kernel_CumulantK17(
         //!
         //!> Similar to Kahan summation algorithm (https://en.wikipedia.org/wiki/Kahan_summation_algorithm)
         //!> Essentially computes the round-off error of the applied force and adds it in the next time step as a compensation.
-        //!> Seems to be necesseary at very high Re boundary layers, where the forcing and velocity can  
+        //!> Seems to be necesseary at very high Re boundary layers, where the forcing and velocity can
         //!> differ by several orders of magnitude.
-        //!> \note 16/05/2022: Testing, still ongoing! 
+        //!> \note 16/05/2022: Testing, still ongoing!
         //!
         // bodyForceX[k_000] = (acc_x-(vvx-vx))*factor*c2o1;
         // bodyForceY[k_000] = (acc_y-(vvy-vy))*factor*c2o1;
@@ -256,7 +256,7 @@ __global__ void LB_Kernel_CumulantK17(
         vvy += fy * c1o2 / factor;
         vvz += fz * c1o2 / factor;
     }
-    
+
 
     ////////////////////////////////////////////////////////////////////////////////////
     // calculate the square of velocities for this lattice node
@@ -607,7 +607,7 @@ __global__ void LB_Kernel_CumulantK17(
     m_001 = -m_001;
 
     //Write to array here to distribute read/write
-    if(writeMacroscopicVariables)
+    if(writeMacroscopicVariables || turbulenceModel==TurbulenceModel::AMD)
     {
         rho[k_000] = drho;
         vx[k_000] = vvx;
@@ -664,63 +664,63 @@ __global__ void LB_Kernel_CumulantK17(
     //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017),
     //! DOI:10.3390/computation5020019 ]</b></a>
     //!
-    (dist.f[DIR_P00])[k_000]    = f_M00;
-    (dist.f[DIR_M00])[k_M00]    = f_P00;
-    (dist.f[DIR_0P0])[k_000]    = f_0M0;
-    (dist.f[DIR_0M0])[k_0M0]    = f_0P0;
-    (dist.f[DIR_00P])[k_000]    = f_00M;
-    (dist.f[DIR_00M])[k_00M]    = f_00P;
-    (dist.f[DIR_PP0])[k_000]   = f_MM0;
-    (dist.f[DIR_MM0])[k_MM0]   = f_PP0;
-    (dist.f[DIR_PM0])[k_0M0]   = f_MP0;
-    (dist.f[DIR_MP0])[k_M00]   = f_PM0;
-    (dist.f[DIR_P0P])[k_000]   = f_M0M;
-    (dist.f[DIR_M0M])[k_M0M]   = f_P0P;
-    (dist.f[DIR_P0M])[k_00M]   = f_M0P;
-    (dist.f[DIR_M0P])[k_M00]   = f_P0M;
-    (dist.f[DIR_0PP])[k_000]   = f_0MM;
-    (dist.f[DIR_0MM])[k_0MM]   = f_0PP;
-    (dist.f[DIR_0PM])[k_00M]   = f_0MP;
-    (dist.f[DIR_0MP])[k_0M0]   = f_0PM;
+    (dist.f[DIR_P00])[k_000] = f_M00;
+    (dist.f[DIR_M00])[k_M00] = f_P00;
+    (dist.f[DIR_0P0])[k_000] = f_0M0;
+    (dist.f[DIR_0M0])[k_0M0] = f_0P0;
+    (dist.f[DIR_00P])[k_000] = f_00M;
+    (dist.f[DIR_00M])[k_00M] = f_00P;
+    (dist.f[DIR_PP0])[k_000] = f_MM0;
+    (dist.f[DIR_MM0])[k_MM0] = f_PP0;
+    (dist.f[DIR_PM0])[k_0M0] = f_MP0;
+    (dist.f[DIR_MP0])[k_M00] = f_PM0;
+    (dist.f[DIR_P0P])[k_000] = f_M0M;
+    (dist.f[DIR_M0M])[k_M0M] = f_P0P;
+    (dist.f[DIR_P0M])[k_00M] = f_M0P;
+    (dist.f[DIR_M0P])[k_M00] = f_P0M;
+    (dist.f[DIR_0PP])[k_000] = f_0MM;
+    (dist.f[DIR_0MM])[k_0MM] = f_0PP;
+    (dist.f[DIR_0PM])[k_00M] = f_0MP;
+    (dist.f[DIR_0MP])[k_0M0] = f_0PM;
     (dist.f[DIR_000])[k_000] = f_000;
-    (dist.f[DIR_PPP])[k_000]  = f_MMM;
-    (dist.f[DIR_PMP])[k_0M0]  = f_MPM;
-    (dist.f[DIR_PPM])[k_00M]  = f_MMP;
-    (dist.f[DIR_PMM])[k_0MM]  = f_MPP;
-    (dist.f[DIR_MPP])[k_M00]  = f_PMM;
-    (dist.f[DIR_MMP])[k_MM0]  = f_PPM;
-    (dist.f[DIR_MPM])[k_M0M]  = f_PMP;
-    (dist.f[DIR_MMM])[k_MMM]  = f_PPP;
+    (dist.f[DIR_PPP])[k_000] = f_MMM;
+    (dist.f[DIR_PMP])[k_0M0] = f_MPM;
+    (dist.f[DIR_PPM])[k_00M] = f_MMP;
+    (dist.f[DIR_PMM])[k_0MM] = f_MPP;
+    (dist.f[DIR_MPP])[k_M00] = f_PMM;
+    (dist.f[DIR_MMP])[k_MM0] = f_PPM;
+    (dist.f[DIR_MPM])[k_M0M] = f_PMP;
+    (dist.f[DIR_MMM])[k_MMM] = f_PPP;
 }
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
 
-template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
\ No newline at end of file
+template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long long numberOfLBnodes, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes);
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh
index b8cc9543e9b531c5aa90cb2961416a6cbc52377d..da576618d1b08b55629c3c65fc115ceb822c8f7e 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh
@@ -5,25 +5,25 @@
 #include <curand.h>
 
 template< TurbulenceModel turbulenceModel, bool writeMacroscopicVariables, bool applyBodyForce > __global__ void LB_Kernel_CumulantK17(
-	real omega_in,
-	uint* neighborX,
-	uint* neighborY,
-	uint* neighborZ,
-	real* distributions,
-	real* rho,
-	real* vx,
+    real omega_in,
+    uint* neighborX,
+    uint* neighborY,
+    uint* neighborZ,
+    real* distributions,
+    real* rho,
+    real* vx,
     real* vy,
     real* vz,
-	real* turbulentViscosity,
-	real SGSconstant,
-	unsigned long numberOfLBnodes,
-	int level,
-	real* forces,
-	real* bodyForceX,
-	real* bodyForceY,
-	real* bodyForceZ,
-	real* quadricLimiters,
-	bool isEvenTimestep,
-	const uint *fluidNodeIndices,
+    real* turbulentViscosity,
+    real SGSconstant,
+    unsigned long long numberOfLBnodes,
+    int level,
+    real* forces,
+    real* bodyForceX,
+    real* bodyForceY,
+    real* bodyForceZ,
+    real* quadricLimiters,
+    bool isEvenTimestep,
+    const uint *fluidNodeIndices,
     uint numberOfFluidNodes);
 #endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.cu
index 72d13282fc604dddcfa84682425a7a1829855ea0..b9e25494490507bde5a6aa7d6dd588ac1a1f6c87 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.cu
@@ -17,17 +17,18 @@ void CumulantK17BulkComp::run()
 	dim3 grid(Grid, 1, 1);
 	dim3 threads(numberOfThreads, 1, 1);
 
-	LB_Kernel_CumulantK17BulkComp << < grid, threads >> >(	para->getParD(level)->omega,
-																	para->getParD(level)->typeOfGridNode,
-																	para->getParD(level)->neighborX,
-																	para->getParD(level)->neighborY,
-																	para->getParD(level)->neighborZ,
-																	para->getParD(level)->distributions.f[0],
-																	para->getParD(level)->numberOfNodes,
-																	level,
-																	para->getForcesDev(),
-                                                                    para->getQuadricLimitersDev(),
-																	para->getParD(level)->isEvenTimestep);
+	LB_Kernel_CumulantK17BulkComp << < grid, threads >> >(
+		para->getParD(level)->omega,
+		para->getParD(level)->typeOfGridNode,
+		para->getParD(level)->neighborX,
+		para->getParD(level)->neighborY,
+		para->getParD(level)->neighborZ,
+		para->getParD(level)->distributions.f[0],
+		para->getParD(level)->numberOfNodes,
+		level,
+		para->getForcesDev(),
+		para->getQuadricLimitersDev(),
+		para->getParD(level)->isEvenTimestep);
 	getLastCudaError("LB_Kernel_CumulantK17BulkComp execution failed");
 }
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cu
index cec04116ae4b411b1b3816ff4a8cab606c92491e..b33a3c251b5fb0cde8b1da0fcce097f955353d69 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp_Device.cu
@@ -40,63 +40,63 @@ __global__ void LB_Kernel_CumulantK17BulkComp(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -129,33 +129,33 @@ __global__ void LB_Kernel_CumulantK17BulkComp(real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
 				(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu
index 6ef6b40d3b7079579f54ca68734deb274d0c1c3a..295804887f9c451120d463c7fcdd968bd2f24d12 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu
@@ -31,15 +31,16 @@ CumulantK17Unified::CumulantK17Unified(std::shared_ptr<Parameter> para, int leve
 
 void CumulantK17Unified::run()
 {
-    GPUKernelParameter kernelParameter{ para->getParD(level)->omega,
-                                                 para->getParD(level)->typeOfGridNode,
-                                                 para->getParD(level)->neighborX,
-                                                 para->getParD(level)->neighborY,
-                                                 para->getParD(level)->neighborZ,
-                                                 para->getParD(level)->distributions.f[0],
-                                                 (int)para->getParD(level)->numberOfNodes,
-                                                 para->getParD(level)->forcing,
-                                                 para->getParD(level)->isEvenTimestep };
+    GPUKernelParameter kernelParameter{
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        (int)para->getParD(level)->numberOfNodes,
+        para->getParD(level)->forcing,
+        para->getParD(level)->isEvenTimestep };
 
     auto lambda = [] __device__(lbm::KernelParameter parameter) {
         return lbm::cumulantChimera(parameter, lbm::setRelaxationRatesK17);
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.cu
index 54af306039585f3beb39b05f2f2e0a96ae784e12..2e0af0bdb85d3f008768f9f430e8b4e5d9719b0f 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.cu
@@ -1,8 +1,8 @@
 #include "CumulantK18Comp.h"
 
 #include "CumulantK18Comp_Device.cuh"
-
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CumulantK18Comp> CumulantK18Comp::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -11,37 +11,22 @@ std::shared_ptr<CumulantK18Comp> CumulantK18Comp::getNewInstance(std::shared_ptr
 
 void CumulantK18Comp::run()
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_CumulantK18Comp << < grid, threads >> >(	para->getParD(level)->omega,
-														para->getParD(level)->typeOfGridNode,
-														para->getParD(level)->neighborX,
-														para->getParD(level)->neighborY,
-														para->getParD(level)->neighborZ,
-														para->getParD(level)->distributions.f[0],
-														para->getParD(level)->g6.g[0],
-														para->getParD(level)->numberOfNodes,
-														level,
-														para->getForcesDev(),
-                                                        para->getQuadricLimitersDev(),
-														para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_CumulantK18Comp execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_CumulantK18Comp <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->g6.g[0],
+        para->getParD(level)->numberOfNodes,
+        level,
+        para->getForcesDev(),
+        para->getQuadricLimitersDev(),
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_CumulantK18Comp execution failed");
 }
 
 CumulantK18Comp::CumulantK18Comp(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cu
index bb42d113e47ce28f153ac295f2d9a934dd1b213a..0e4ae5caebb9bd4b1c889a78bfadb62487742c98 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp_Device.cu
@@ -42,83 +42,83 @@ __global__ void LB_Kernel_CumulantK18Comp(
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			Distributions6 G;
 			if (EvenOrOdd == true)
 			{
-				G.g[DIR_P00] = &G6[DIR_P00   *size_Mat];
-				G.g[DIR_M00] = &G6[DIR_M00   *size_Mat];
-				G.g[DIR_0P0] = &G6[DIR_0P0   *size_Mat];
-				G.g[DIR_0M0] = &G6[DIR_0M0   *size_Mat];
-				G.g[DIR_00P] = &G6[DIR_00P   *size_Mat];
-				G.g[DIR_00M] = &G6[DIR_00M   *size_Mat];
+				G.g[DIR_P00] = &G6[DIR_P00 * size_Mat];
+				G.g[DIR_M00] = &G6[DIR_M00 * size_Mat];
+				G.g[DIR_0P0] = &G6[DIR_0P0 * size_Mat];
+				G.g[DIR_0M0] = &G6[DIR_0M0 * size_Mat];
+				G.g[DIR_00P] = &G6[DIR_00P * size_Mat];
+				G.g[DIR_00M] = &G6[DIR_00M * size_Mat];
 			}
 			else
 			{
-				G.g[DIR_M00] = &G6[DIR_P00   *size_Mat];
-				G.g[DIR_P00] = &G6[DIR_M00   *size_Mat];
-				G.g[DIR_0M0] = &G6[DIR_0P0   *size_Mat];
-				G.g[DIR_0P0] = &G6[DIR_0M0   *size_Mat];
-				G.g[DIR_00M] = &G6[DIR_00P   *size_Mat];
-				G.g[DIR_00P] = &G6[DIR_00M   *size_Mat];
+				G.g[DIR_M00] = &G6[DIR_P00 * size_Mat];
+				G.g[DIR_P00] = &G6[DIR_M00 * size_Mat];
+				G.g[DIR_0M0] = &G6[DIR_0P0 * size_Mat];
+				G.g[DIR_0P0] = &G6[DIR_0M0 * size_Mat];
+				G.g[DIR_00M] = &G6[DIR_00P * size_Mat];
+				G.g[DIR_00P] = &G6[DIR_00M * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.cu
index 0c1778dc39496c6564dedcbe1f6e818bee147191..d0d81eaac711d4d80284b66a1040e0e8404f5d4d 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.cu
@@ -1,8 +1,8 @@
 #include "CumulantK20Comp.h"
 
 #include "CumulantK20Comp_Device.cuh"
-
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CumulantK20Comp> CumulantK20Comp::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -11,37 +11,22 @@ std::shared_ptr<CumulantK20Comp> CumulantK20Comp::getNewInstance(std::shared_ptr
 
 void CumulantK20Comp::run()
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_CumulantK20Comp << < grid, threads >> >(	para->getParD(level)->omega,
-																para->getParD(level)->typeOfGridNode,
-																para->getParD(level)->neighborX,
-																para->getParD(level)->neighborY,
-																para->getParD(level)->neighborZ,
-																para->getParD(level)->distributions.f[0],
-																para->getParD(level)->g6.g[0],
-																para->getParD(level)->numberOfNodes,
-																level,
-																para->getForcesDev(),
-                                                                para->getQuadricLimitersDev(),
-																para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_CumulantK20Comp execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_CumulantK20Comp <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->g6.g[0],
+        para->getParD(level)->numberOfNodes,
+        level,
+        para->getForcesDev(),
+        para->getQuadricLimitersDev(),
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_CumulantK20Comp execution failed");
 }
 
 CumulantK20Comp::CumulantK20Comp(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cu
index c805fc293aeb8b182bb0e01df82b584da69d0175..2dbe0bb62412f9363fdd0e714f5da296f81ae5b3 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp_Device.cu
@@ -42,83 +42,83 @@ __global__ void LB_Kernel_CumulantK20Comp(
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			Distributions6 G;
 			if (EvenOrOdd == true)
 			{
-				G.g[DIR_P00] = &G6[DIR_P00   *size_Mat];
-				G.g[DIR_M00] = &G6[DIR_M00   *size_Mat];
-				G.g[DIR_0P0] = &G6[DIR_0P0   *size_Mat];
-				G.g[DIR_0M0] = &G6[DIR_0M0   *size_Mat];
-				G.g[DIR_00P] = &G6[DIR_00P   *size_Mat];
-				G.g[DIR_00M] = &G6[DIR_00M   *size_Mat];
+				G.g[DIR_P00] = &G6[DIR_P00 * size_Mat];
+				G.g[DIR_M00] = &G6[DIR_M00 * size_Mat];
+				G.g[DIR_0P0] = &G6[DIR_0P0 * size_Mat];
+				G.g[DIR_0M0] = &G6[DIR_0M0 * size_Mat];
+				G.g[DIR_00P] = &G6[DIR_00P * size_Mat];
+				G.g[DIR_00M] = &G6[DIR_00M * size_Mat];
 			}
 			else
 			{
-				G.g[DIR_M00] = &G6[DIR_P00   *size_Mat];
-				G.g[DIR_P00] = &G6[DIR_M00   *size_Mat];
-				G.g[DIR_0M0] = &G6[DIR_0P0   *size_Mat];
-				G.g[DIR_0P0] = &G6[DIR_0M0   *size_Mat];
-				G.g[DIR_00M] = &G6[DIR_00P   *size_Mat];
-				G.g[DIR_00P] = &G6[DIR_00M   *size_Mat];
+				G.g[DIR_M00] = &G6[DIR_P00 * size_Mat];
+				G.g[DIR_P00] = &G6[DIR_M00 * size_Mat];
+				G.g[DIR_0M0] = &G6[DIR_0P0 * size_Mat];
+				G.g[DIR_0P0] = &G6[DIR_0M0 * size_Mat];
+				G.g[DIR_00M] = &G6[DIR_00P * size_Mat];
+				G.g[DIR_00P] = &G6[DIR_00M * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.cu
index be94791572f739fb2eef7c049702caeedb6641fc..b576333f50304f5628e073d2eee16cf5b82c9d34 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "MRTCompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<MRTCompSP27> MRTCompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<MRTCompSP27> MRTCompSP27::getNewInstance(std::shared_ptr<Paramet
 
 void MRTCompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_MRT_Comp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-														para->getParD(level)->typeOfGridNode,
-														para->getParD(level)->neighborX,
-														para->getParD(level)->neighborY,
-														para->getParD(level)->neighborZ,
-														para->getParD(level)->distributions.f[0],
-														para->getParD(level)->numberOfNodes,
-														para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_MRT_Comp_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_MRT_Comp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_MRT_Comp_SP_27 execution failed");
 }
 
 MRTCompSP27::MRTCompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cu
index a9aefa2d62a962766470c93a62adeefa4f19570e..c3eb51a114e5c4a3be7605765d0889a7bae25cf0 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27_Device.cu
@@ -37,63 +37,63 @@ __global__ void LB_Kernel_MRT_Comp_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -126,33 +126,33 @@ __global__ void LB_Kernel_MRT_Comp_SP_27(real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 			real rho = (mfccc + mfaaa + mfaca + mfcac + mfacc + mfcaa + mfaac + mfcca +
 				mfbac + mfbca + mfbaa + mfbcc + mfabc + mfcba + mfaba + mfcbc + mfacb + mfcab + mfaab + mfccb +
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.cu
index 81655fac9cfd0b562ba60a5ee289fb64da5c1fba..3fb9be28654f83a7a98bb7d6b3a8a46e9170e7a8 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "BGKIncompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<BGKIncompSP27> BGKIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<BGKIncompSP27> BGKIncompSP27::getNewInstance(std::shared_ptr<Par
 
 void BGKIncompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_BGK_Incomp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-													para->getParD(level)->typeOfGridNode,
-													para->getParD(level)->neighborX,
-													para->getParD(level)->neighborY,
-													para->getParD(level)->neighborZ,
-													para->getParD(level)->distributions.f[0],
-													para->getParD(level)->numberOfNodes,
-													para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_BGK_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_BGK_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_BGK_Incomp_SP_27 execution failed");
 }
 
 BGKIncompSP27::BGKIncompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cu
index 9a94006b8a1be745fc2bcfdd80e454152347139d..233595656720f5c84cf5be9e555565af0e9c95d0 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGK/BGKIncompSP27_Device.cu
@@ -37,63 +37,63 @@ __global__ void LB_Kernel_BGK_Incomp_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.cu
index 86b513f1252f2787abee637819e64606d111c4fa..f274f576a14fc193bcabd44d2c9078a2c98055bc 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "BGKPlusIncompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<BGKPlusIncompSP27> BGKPlusIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<BGKPlusIncompSP27> BGKPlusIncompSP27::getNewInstance(std::shared
 
 void BGKPlusIncompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_BGK_Plus_Incomp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-														para->getParD(level)->typeOfGridNode,
-														para->getParD(level)->neighborX,
-														para->getParD(level)->neighborY,
-														para->getParD(level)->neighborZ,
-														para->getParD(level)->distributions.f[0],
-														para->getParD(level)->numberOfNodes,
-														para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_BGK_Plus_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_BGK_Plus_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_BGK_Plus_Incomp_SP_27 execution failed");
 }
 
 BGKPlusIncompSP27::BGKPlusIncompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cu
index 9355e42aa5b05190f063f5247d8d6c0dea787a02..b49b76c6224be4b3543c01647a6553e6fc64b74e 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/BGKPlus/BGKPlusIncompSP27_Device.cu
@@ -37,63 +37,63 @@ __global__ void LB_Kernel_BGK_Plus_Incomp_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -126,33 +126,33 @@ __global__ void LB_Kernel_BGK_Plus_Incomp_SP_27(real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 											//slow
 											//real oMdrho = one - ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.cu
index 05f374096c9c5da2460b32cf5ae8cb59cfa78382..3a6760b619d2ca1a7eb19771478eb9e5989ead0c 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "CascadeIncompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CascadeIncompSP27> CascadeIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<CascadeIncompSP27> CascadeIncompSP27::getNewInstance(std::shared
 
 void CascadeIncompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_Cascade_Incomp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-														para->getParD(level)->typeOfGridNode,
-														para->getParD(level)->neighborX,
-														para->getParD(level)->neighborY,
-														para->getParD(level)->neighborZ,
-														para->getParD(level)->distributions.f[0],
-														para->getParD(level)->numberOfNodes,
-														para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_Cascade_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_Cascade_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_Cascade_Incomp_SP_27 execution failed");
 }
 
 CascadeIncompSP27::CascadeIncompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cu
index 92cc749b135739d5f38c9916c4ee0da7497e5f2d..8e607cabb4cc40bbb22c5ad3ec6db2c63154add6 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cascade/CascadeIncompSP27_Device.cu
@@ -37,63 +37,63 @@ __global__ void LB_Kernel_Cascade_Incomp_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -126,33 +126,33 @@ __global__ void LB_Kernel_Cascade_Incomp_SP_27(real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 											//slow
 											//real oMdrho = one - ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.cu
index 62768ef9948b6c259c5ad4005237081f4d255e73..44beb8507d5664f01283130dd3087a788e4491ed 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "Cumulant1hIncompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<Cumulant1hIncompSP27> Cumulant1hIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,38 +11,23 @@ std::shared_ptr<Cumulant1hIncompSP27> Cumulant1hIncompSP27::getNewInstance(std::
 
 void Cumulant1hIncompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_Cum_1h_Incomp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-													para->getParD(level)->deltaPhi,
-													para->getAngularVelocity(),
-													para->getParD(level)->typeOfGridNode,
-													para->getParD(level)->neighborX,
-													para->getParD(level)->neighborY,
-													para->getParD(level)->neighborZ,
-													para->getParD(level)->coordinateX,
-													para->getParD(level)->coordinateY,
-													para->getParD(level)->coordinateZ,
-													para->getParD(level)->distributions.f[0],
-													para->getParD(level)->numberOfNodes,
-													para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_Cum_1h_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_Cum_1h_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->deltaPhi,
+        para->getAngularVelocity(),
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->coordinateX,
+        para->getParD(level)->coordinateY,
+        para->getParD(level)->coordinateZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_Cum_1h_Incomp_SP_27 execution failed");
 }
 
 Cumulant1hIncompSP27::Cumulant1hIncompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cu
index 0243046082ce1853011c6632d5a2f80364ebe0db..5130017acc642c92b064a500e79ff685ec2f6d97 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/Cumulant1hSP27/Cumulant1hIncompSP27_Device.cu
@@ -42,63 +42,63 @@ __global__ void LB_Kernel_Cum_1h_Incomp_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -159,33 +159,33 @@ __global__ void LB_Kernel_Cum_1h_Incomp_SP_27(real omega,
 			//unsigned int ktne = k;
 			//unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 											//Ship
 			real coord0X = 281.125f;//7.5f;
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.cu
index 6551e1bde300e3a4d2a4f50cefdfff258edfacee..3a740bef6d7fbaa2883b3d36930d49bf9bf0bb3e 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "CumulantIsoIncompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CumulantIsoIncompSP27> CumulantIsoIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,36 +11,21 @@ std::shared_ptr<CumulantIsoIncompSP27> CumulantIsoIncompSP27::getNewInstance(std
 
 void CumulantIsoIncompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_Cum_IsoTest_Incomp_SP_27 << < grid, threads >> >(para->getParD(level)->omega,
-		para->getParD(level)->typeOfGridNode,
-		para->getParD(level)->neighborX,
-		para->getParD(level)->neighborY,
-		para->getParD(level)->neighborZ,
-		para->getParD(level)->distributions.f[0],
-		para->getParD(level)->dxxUx,
-		para->getParD(level)->dyyUy,
-		para->getParD(level)->dzzUz,
-		para->getParD(level)->numberOfNodes,
-		para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_Kum_IsoTest_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_Cum_IsoTest_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->dxxUx,
+        para->getParD(level)->dyyUy,
+        para->getParD(level)->dzzUz,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_Cum_IsoTest_Incomp_SP_27 execution failed");
 }
 
 CumulantIsoIncompSP27::CumulantIsoIncompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cu
index 64d697f2b0953cee75f4397e399a0e6128e486a2..1f0ef2ec84c8d4b9b4be57548bde396c3316a80d 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantIsoSP27/CumulantIsoIncompSP27_Device.cu
@@ -40,63 +40,63 @@ __global__ void LB_Kernel_Cum_IsoTest_Incomp_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -129,33 +129,33 @@ __global__ void LB_Kernel_Cum_IsoTest_Incomp_SP_27(real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 											//slow
 											//real oMdrho = one - ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.cu
index 40cde56b007f70f98db13d5962f3e746b97637ef..7ae17b97170b4d8474acd6777f7c27411a962681 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp.cu
@@ -2,6 +2,7 @@
 
 #include "CumulantK15Incomp_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<CumulantK15Incomp> CumulantK15Incomp::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<CumulantK15Incomp> CumulantK15Incomp::getNewInstance(std::shared
 
 void CumulantK15Incomp::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_CumulantK15Incomp <<< grid, threads >>>(	para->getParD(level)->omega,
-														para->getParD(level)->typeOfGridNode,
-														para->getParD(level)->neighborX,
-														para->getParD(level)->neighborY,
-														para->getParD(level)->neighborZ,
-														para->getParD(level)->distributions.f[0],
-														para->getParD(level)->numberOfNodes,
-														para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_CumulantK15Incomp execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_CumulantK15Incomp <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_CumulantK15Incomp execution failed");
 }
 
 CumulantK15Incomp::CumulantK15Incomp(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cu
index fc108ef1ef109a40735e250bd9a0f21491e4f977..01b60b3bf8067a81f99b912c4c0c700963f5448c 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/CumulantK15/CumulantK15Incomp_Device.cu
@@ -37,63 +37,63 @@ __global__ void LB_Kernel_CumulantK15Incomp(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -154,33 +154,33 @@ __global__ void LB_Kernel_CumulantK15Incomp(real omega,
 			//unsigned int ktne = k;
 			//unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 											//slow
 											//real oMdrho = one - ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.cu
index c4311309e4653f2862e303dacb3e2d07646a5061..7645703e0d40176b136762d6b48633f4a9c0d950 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "MRTIncompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<MRTIncompSP27> MRTIncompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
@@ -10,33 +11,18 @@ std::shared_ptr<MRTIncompSP27> MRTIncompSP27::getNewInstance(std::shared_ptr<Par
 
 void MRTIncompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Kernel_MRT_Incomp_SP_27 << < grid, threads >> >(	para->getParD(level)->omega,
-													para->getParD(level)->typeOfGridNode,
-													para->getParD(level)->neighborX,
-													para->getParD(level)->neighborY,
-													para->getParD(level)->neighborZ,
-													para->getParD(level)->distributions.f[0],
-													para->getParD(level)->numberOfNodes,
-													para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LB_Kernel_MRT_SP_27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Kernel_MRT_Incomp_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->omega,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Kernel_MRT_Incomp_SP_27 execution failed");
 }
 
 MRTIncompSP27::MRTIncompSP27(std::shared_ptr<Parameter> para, int level)
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cu
index f6a283c2f9ba3c15729061ebeabcf34edd0abe97..a6663cc3c72696fda2ce9819203cd19195088730 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Incompressible/MRT/MRTIncompSP27_Device.cu
@@ -37,63 +37,63 @@ __global__ void LB_Kernel_MRT_Incomp_SP_27(real omega,
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -126,33 +126,33 @@ __global__ void LB_Kernel_MRT_Incomp_SP_27(real omega,
 			//unsigned int ktne = k;
 			unsigned int kbsw = neighborZ[ksw];
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00   ])[k  ];//ke
-			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0   ])[k  ];//kn
-			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P   ])[k  ];//kt
-			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0  ])[k  ];//kne
-			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0  ])[ks ];//kse
-			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0  ])[kw ];//knw
-			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P  ])[k  ];//kte
-			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M  ])[kb ];//kbe
-			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P  ])[kw ];//ktw
-			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP  ])[k  ];//ktn
-			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM  ])[kb ];//kbn
-			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP  ])[ks ];//kts
+			real mfcbb = (D.f[DIR_P00])[k];//[ke   ];// +  c2over27 ;(D.f[DIR_P00])[k  ];//ke
+			real mfabb = (D.f[DIR_M00])[kw];//[kw   ];// +  c2over27 ;(D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k];//[kn   ];// +  c2over27 ;(D.f[DIR_0P0])[k  ];//kn
+			real mfbab = (D.f[DIR_0M0])[ks];//[ks   ];// +  c2over27 ;(D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k];//[kt   ];// +  c2over27 ;(D.f[DIR_00P])[k  ];//kt
+			real mfbba = (D.f[DIR_00M])[kb];//[kb   ];// +  c2over27 ;(D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k];//[kne  ];// +  c1over54 ;(D.f[DIR_PP0])[k  ];//kne
+			real mfaab = (D.f[DIR_MM0])[ksw];//[ksw  ];// +  c1over54 ;(D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks];//[kse  ];// +  c1over54 ;(D.f[DIR_PM0])[ks ];//kse
+			real mfacb = (D.f[DIR_MP0])[kw];//[knw  ];// +  c1over54 ;(D.f[DIR_MP0])[kw ];//knw
+			real mfcbc = (D.f[DIR_P0P])[k];//[kte  ];// +  c1over54 ;(D.f[DIR_P0P])[k  ];//kte
+			real mfaba = (D.f[DIR_M0M])[kbw];//[kbw  ];// +  c1over54 ;(D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb];//[kbe  ];// +  c1over54 ;(D.f[DIR_P0M])[kb ];//kbe
+			real mfabc = (D.f[DIR_M0P])[kw];//[ktw  ];// +  c1over54 ;(D.f[DIR_M0P])[kw ];//ktw
+			real mfbcc = (D.f[DIR_0PP])[k];//[ktn  ];// +  c1over54 ;(D.f[DIR_0PP])[k  ];//ktn
+			real mfbaa = (D.f[DIR_0MM])[kbs];//[kbs  ];// +  c1over54 ;(D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb];//[kbn  ];// +  c1over54 ;(D.f[DIR_0PM])[kb ];//kbn
+			real mfbac = (D.f[DIR_0MP])[ks];//[kts  ];// +  c1over54 ;(D.f[DIR_0MP])[ks ];//kts
 			real mfbbb = (D.f[DIR_000])[k];//[kzero];// +  c8over27 ;(D.f[DIR_000])[k  ];//kzero
-			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP ])[k  ];//ktne
-			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP ])[ksw];//ktsw
-			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP ])[ks ];//ktse
-			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP ])[kw ];//ktnw
-			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM ])[kb ];//kbne
-			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM ])[kbsw];
-			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM ])[kbs];//kbse
-			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM ])[kbw];//kbnw
+			real mfccc = (D.f[DIR_PPP])[k];//[ktne ];// +  c1over216;(D.f[DIR_PPP])[k  ];//ktne
+			real mfaac = (D.f[DIR_MMP])[ksw];//[ktsw ];// +  c1over216;(D.f[DIR_MMP])[ksw];//ktsw
+			real mfcac = (D.f[DIR_PMP])[ks];//[ktse ];// +  c1over216;(D.f[DIR_PMP])[ks ];//ktse
+			real mfacc = (D.f[DIR_MPP])[kw];//[ktnw ];// +  c1over216;(D.f[DIR_MPP])[kw ];//ktnw
+			real mfcca = (D.f[DIR_PPM])[kb];//[kbne ];// +  c1over216;(D.f[DIR_PPM])[kb ];//kbne
+			real mfaaa = (D.f[DIR_MMM])[kbsw];//[kbsw ];// +  c1over216;(D.f[DIR_MMM])[kbsw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];//[kbse ];// +  c1over216;(D.f[DIR_PMM])[kbs];//kbse
+			real mfaca = (D.f[DIR_MPM])[kbw];//[kbnw ];// +  c1over216;(D.f[DIR_MPM])[kbw];//kbnw
 											////////////////////////////////////////////////////////////////////////////////////
 											//slow
 											//real oMdrho = one - ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27.cu
index 77527d5bedab08fdcacb3a103727ae25274b2aa4..43724f9165e2bb8dca1705ae0053612df92413ec 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27.cu
@@ -11,7 +11,7 @@ std::shared_ptr<PMCumulantOneCompSP27> PMCumulantOneCompSP27::getNewInstance(std
 
 void PMCumulantOneCompSP27::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
+	int size_Mat = (int)para->getParD(level)->numberOfNodes;
 	int numberOfThreads = para->getParD(level)->numberofthreads;
 
 	int Grid = (size_Mat / numberOfThreads) + 1;
@@ -30,7 +30,8 @@ void PMCumulantOneCompSP27::run()
 	dim3 threads(numberOfThreads, 1, 1);
 
 	for (int i = 0; i < pm.size(); i++) {
-		LB_Kernel_PM_Cum_One_Comp_SP_27 << < grid, threads >> >(para->getParD(level)->omega,
+		LB_Kernel_PM_Cum_One_Comp_SP_27 <<< grid, threads >>>(
+			para->getParD(level)->omega,
 			para->getParD(level)->neighborX,
 			para->getParD(level)->neighborY,
 			para->getParD(level)->neighborZ,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27_Device.cu
index 89975d1663fb236295c22b81af4b0544ffc489bb..4f5f61f9d7a61fee8fd3438de5c588c861d8604c 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27_Device.cu
@@ -11,7 +11,7 @@ __global__ void LB_Kernel_PM_Cum_One_Comp_SP_27(real omega,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
 	real* DDStart,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int level,
 	real* forces,
 	real porosity,
@@ -24,63 +24,63 @@ __global__ void LB_Kernel_PM_Cum_One_Comp_SP_27(real omega,
 	Distributions27 D;
 	if (EvenOrOdd == true)
 	{
-		D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-		D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-		D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-		D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-		D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-		D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-		D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-		D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-		D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-		D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-		D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-		D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-		D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-		D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-		D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-		D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-		D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-		D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-		D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-		D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-		D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-		D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-		D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-		D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-		D.f[DIR_PMM] = &DDStart[DIR_PMM *size_Mat];
-		D.f[DIR_MPM] = &DDStart[DIR_MPM *size_Mat];
+		D.f[DIR_P00] = &DDStart[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_M00] = &DDStart[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00P] = &DDStart[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00M] = &DDStart[DIR_00M * numberOfLBnodes];
+		D.f[DIR_PP0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_MM0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_P0P] = &DDStart[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_M0M] = &DDStart[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DDStart[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DDStart[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0PP] = &DDStart[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0MM] = &DDStart[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DDStart[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DDStart[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+		D.f[DIR_PPP] = &DDStart[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DDStart[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_PMP] = &DDStart[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_MPP] = &DDStart[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DDStart[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_MMM] = &DDStart[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_PMM] = &DDStart[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_MPM] = &DDStart[DIR_MPM * numberOfLBnodes];
 	}
 	else
 	{
-		D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-		D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-		D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-		D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-		D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-		D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-		D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-		D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-		D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-		D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-		D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-		D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-		D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-		D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-		D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-		D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-		D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-		D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-		D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-		D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-		D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-		D.f[DIR_MPM] = &DDStart[DIR_PMP *size_Mat];
-		D.f[DIR_PMM] = &DDStart[DIR_MPP *size_Mat];
-		D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-		D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-		D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-		D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+		D.f[DIR_M00] = &DDStart[DIR_P00 * numberOfLBnodes];
+		D.f[DIR_P00] = &DDStart[DIR_M00 * numberOfLBnodes];
+		D.f[DIR_0M0] = &DDStart[DIR_0P0 * numberOfLBnodes];
+		D.f[DIR_0P0] = &DDStart[DIR_0M0 * numberOfLBnodes];
+		D.f[DIR_00M] = &DDStart[DIR_00P * numberOfLBnodes];
+		D.f[DIR_00P] = &DDStart[DIR_00M * numberOfLBnodes];
+		D.f[DIR_MM0] = &DDStart[DIR_PP0 * numberOfLBnodes];
+		D.f[DIR_PP0] = &DDStart[DIR_MM0 * numberOfLBnodes];
+		D.f[DIR_MP0] = &DDStart[DIR_PM0 * numberOfLBnodes];
+		D.f[DIR_PM0] = &DDStart[DIR_MP0 * numberOfLBnodes];
+		D.f[DIR_M0M] = &DDStart[DIR_P0P * numberOfLBnodes];
+		D.f[DIR_P0P] = &DDStart[DIR_M0M * numberOfLBnodes];
+		D.f[DIR_M0P] = &DDStart[DIR_P0M * numberOfLBnodes];
+		D.f[DIR_P0M] = &DDStart[DIR_M0P * numberOfLBnodes];
+		D.f[DIR_0MM] = &DDStart[DIR_0PP * numberOfLBnodes];
+		D.f[DIR_0PP] = &DDStart[DIR_0MM * numberOfLBnodes];
+		D.f[DIR_0MP] = &DDStart[DIR_0PM * numberOfLBnodes];
+		D.f[DIR_0PM] = &DDStart[DIR_0MP * numberOfLBnodes];
+		D.f[DIR_000] = &DDStart[DIR_000 * numberOfLBnodes];
+		D.f[DIR_MMM] = &DDStart[DIR_PPP * numberOfLBnodes];
+		D.f[DIR_PPM] = &DDStart[DIR_MMP * numberOfLBnodes];
+		D.f[DIR_MPM] = &DDStart[DIR_PMP * numberOfLBnodes];
+		D.f[DIR_PMM] = &DDStart[DIR_MPP * numberOfLBnodes];
+		D.f[DIR_MMP] = &DDStart[DIR_PPM * numberOfLBnodes];
+		D.f[DIR_PPP] = &DDStart[DIR_MMM * numberOfLBnodes];
+		D.f[DIR_MPP] = &DDStart[DIR_PMM * numberOfLBnodes];
+		D.f[DIR_PMP] = &DDStart[DIR_MPM * numberOfLBnodes];
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27_Device.cuh
index 6533c604f32a478cdc6a097e4dd7d0b56e48150d..f2cf530b5d331c71d4a13bd5882a3657a3bbddea 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/PorousMediaKernels/FluidFlow/Compressible/CumulantOne/PMCumulantOneCompSP27_Device.cuh
@@ -9,7 +9,7 @@ __global__ void LB_Kernel_PM_Cum_One_Comp_SP_27(real omega,
 	unsigned int* neighborY,
 	unsigned int* neighborZ,
 	real* DDStart,
-	int size_Mat,
+	unsigned long long numberOfLBnodes,
 	int level,
 	real* forces,
 	real porosity,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15/WaleCumulantK15Comp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15/WaleCumulantK15Comp.cu
index cfcb70cd2bd6f3cc8ec4349650c44b7d3b0619fc..2b8a7d61e8966e2ed00022986311ae68ac0ca6d6 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15/WaleCumulantK15Comp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15/WaleCumulantK15Comp.cu
@@ -10,7 +10,7 @@ std::shared_ptr<WaleCumulantK15Comp> WaleCumulantK15Comp::getNewInstance(std::sh
 
 void WaleCumulantK15Comp::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
+	int size_Mat = (int)para->getParD(level)->numberOfNodes;
 	int numberOfThreads = para->getParD(level)->numberofthreads;
 
 	int Grid = (size_Mat / numberOfThreads) + 1;
@@ -28,22 +28,23 @@ void WaleCumulantK15Comp::run()
 	dim3 grid(Grid1, Grid2, 1);
 	dim3 threads(numberOfThreads, 1, 1);
 
-	LB_Kernel_WaleCumulantK15Comp << < grid, threads >> >(	para->getParD(level)->omega,
-																para->getParD(level)->typeOfGridNode,
-																para->getParD(level)->neighborX,
-																para->getParD(level)->neighborY,
-																para->getParD(level)->neighborZ,
-																para->getParD(level)->neighborInverse,
-																para->getParD(level)->velocityX,
-																para->getParD(level)->velocityY,
-																para->getParD(level)->velocityZ,
-																para->getParD(level)->distributions.f[0],
-																para->getParD(level)->turbViscosity,
-																para->getParD(level)->numberOfNodes,
-																level,
-																para->getTimestepOfCoarseLevel(),
-																para->getForcesDev(),
-																para->getParD(level)->isEvenTimestep);
+	LB_Kernel_WaleCumulantK15Comp <<< grid, threads >>>(
+		para->getParD(level)->omega,
+		para->getParD(level)->typeOfGridNode,
+		para->getParD(level)->neighborX,
+		para->getParD(level)->neighborY,
+		para->getParD(level)->neighborZ,
+		para->getParD(level)->neighborInverse,
+		para->getParD(level)->velocityX,
+		para->getParD(level)->velocityY,
+		para->getParD(level)->velocityZ,
+		para->getParD(level)->distributions.f[0],
+		para->getParD(level)->turbViscosity,
+		para->getParD(level)->numberOfNodes,
+		level,
+		para->getTimestepOfCoarseLevel(),
+		para->getForcesDev(),
+		para->getParD(level)->isEvenTimestep);
 	getLastCudaError("LB_Kernel_WaleCumulantK15Comp execution failed");
 }
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15/WaleCumulantK15Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15/WaleCumulantK15Comp_Device.cu
index 3da25060e6c82ea685a1659fecc8cf66eeaf44c4..a7018d1246c0832753df144ffbf2625b55f5508e 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15/WaleCumulantK15Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15/WaleCumulantK15Comp_Device.cu
@@ -46,63 +46,63 @@ __global__ void LB_Kernel_WaleCumulantK15Comp(
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -136,33 +136,33 @@ __global__ void LB_Kernel_WaleCumulantK15Comp(
 			unsigned int kbsw = neighborZ[ksw];
 
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];
-			real mfabb = (D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];
-			real mfbab = (D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];
-			real mfbba = (D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];
-			real mfacb = (D.f[DIR_MP0  ])[kw ];
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];
-			real mfabc = (D.f[DIR_M0P  ])[kw ];
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];
-			real mfbac = (D.f[DIR_0MP  ])[ks ];
+			real mfcbb = (D.f[DIR_P00])[k  ];
+			real mfabb = (D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];
+			real mfbab = (D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];
+			real mfbba = (D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];
+			real mfaab = (D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];
+			real mfacb = (D.f[DIR_MP0])[kw ];
+			real mfcbc = (D.f[DIR_P0P])[k  ];
+			real mfaba = (D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];
+			real mfabc = (D.f[DIR_M0P])[kw ];
+			real mfbcc = (D.f[DIR_0PP])[k  ];
+			real mfbaa = (D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];
+			real mfbac = (D.f[DIR_0MP])[ks ];
 			real mfbbb = (D.f[DIR_000])[k  ];
-			real mfccc = (D.f[DIR_PPP ])[k  ];
-			real mfaac = (D.f[DIR_MMP ])[ksw];
-			real mfcac = (D.f[DIR_PMP ])[ks ];
-			real mfacc = (D.f[DIR_MPP ])[kw ];
-			real mfcca = (D.f[DIR_PPM ])[kb ];
+			real mfccc = (D.f[DIR_PPP])[k  ];
+			real mfaac = (D.f[DIR_MMP])[ksw];
+			real mfcac = (D.f[DIR_PMP])[ks ];
+			real mfacc = (D.f[DIR_MPP])[kw ];
+			real mfcca = (D.f[DIR_PPM])[kb ];
 			real mfaaa = (D.f[DIR_MMM])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];
-			real mfaca = (D.f[DIR_MPM ])[kbw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];
+			real mfaca = (D.f[DIR_MPM])[kbw];
 			////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
 							(((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) +
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15BySoniMalav/WaleBySoniMalavCumulantK15Comp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15BySoniMalav/WaleBySoniMalavCumulantK15Comp.cu
index 15b808279a4c9dc771531f118cb369b7c5380a84..49ee20b44f37b01cd9bc837024a47c1428c00a18 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15BySoniMalav/WaleBySoniMalavCumulantK15Comp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15BySoniMalav/WaleBySoniMalavCumulantK15Comp.cu
@@ -10,7 +10,7 @@ std::shared_ptr<WaleBySoniMalavCumulantK15Comp> WaleBySoniMalavCumulantK15Comp::
 
 void WaleBySoniMalavCumulantK15Comp::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
+	int size_Mat = (int)para->getParD(level)->numberOfNodes;
 	int numberOfThreads = para->getParD(level)->numberofthreads;
 
 	//int Grid = size_Array / numberOfThreads;
@@ -32,21 +32,22 @@ void WaleBySoniMalavCumulantK15Comp::run()
 	dim3 grid(Grid1, Grid2, 1);
 	dim3 threads(numberOfThreads, 1, 1);
 
-	LB_Kernel_WaleBySoniMalavCumulantK15Comp << < grid, threads >> >(	para->getParD(level)->omega,
-																			para->getParD(level)->typeOfGridNode,
-																			para->getParD(level)->neighborX,
-																			para->getParD(level)->neighborY,
-																			para->getParD(level)->neighborZ,
-																			para->getParD(level)->neighborInverse,
-																			para->getParD(level)->velocityX,
-																			para->getParD(level)->velocityY,
-																			para->getParD(level)->velocityZ,
-																			para->getParD(level)->distributions.f[0],
-																			para->getParD(level)->turbViscosity,
-																			para->getParD(level)->numberOfNodes,
-																			level,
-																			para->getForcesDev(),
-																			para->getParD(level)->isEvenTimestep);
+	LB_Kernel_WaleBySoniMalavCumulantK15Comp <<< grid, threads >>>(
+		para->getParD(level)->omega,
+		para->getParD(level)->typeOfGridNode,
+		para->getParD(level)->neighborX,
+		para->getParD(level)->neighborY,
+		para->getParD(level)->neighborZ,
+		para->getParD(level)->neighborInverse,
+		para->getParD(level)->velocityX,
+		para->getParD(level)->velocityY,
+		para->getParD(level)->velocityZ,
+		para->getParD(level)->distributions.f[0],
+		para->getParD(level)->turbViscosity,
+		para->getParD(level)->numberOfNodes,
+		level,
+		para->getForcesDev(),
+		para->getParD(level)->isEvenTimestep);
 	getLastCudaError("LB_Kernel_WaleBySoniMalavCumulantK15Comp execution failed");
 }
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15BySoniMalav/WaleBySoniMalavCumulantK15Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15BySoniMalav/WaleBySoniMalavCumulantK15Comp_Device.cu
index 511219c352c4d156428565f718191a70b9cc6c32..6258c72c36cafa27b06b2934db42a5813ed74f99 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15BySoniMalav/WaleBySoniMalavCumulantK15Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK15BySoniMalav/WaleBySoniMalavCumulantK15Comp_Device.cu
@@ -45,63 +45,63 @@ __global__ void LB_Kernel_WaleBySoniMalavCumulantK15Comp(
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -115,33 +115,33 @@ __global__ void LB_Kernel_WaleBySoniMalavCumulantK15Comp(
 			unsigned int kbsw = neighborZ[ksw];
 
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];
-			real mfabb = (D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];
-			real mfbab = (D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];
-			real mfbba = (D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];
-			real mfacb = (D.f[DIR_MP0  ])[kw ];
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];
-			real mfabc = (D.f[DIR_M0P  ])[kw ];
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];
-			real mfbac = (D.f[DIR_0MP  ])[ks ];
+			real mfcbb = (D.f[DIR_P00])[k  ];
+			real mfabb = (D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];
+			real mfbab = (D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];
+			real mfbba = (D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];
+			real mfaab = (D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];
+			real mfacb = (D.f[DIR_MP0])[kw ];
+			real mfcbc = (D.f[DIR_P0P])[k  ];
+			real mfaba = (D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];
+			real mfabc = (D.f[DIR_M0P])[kw ];
+			real mfbcc = (D.f[DIR_0PP])[k  ];
+			real mfbaa = (D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];
+			real mfbac = (D.f[DIR_0MP])[ks ];
 			real mfbbb = (D.f[DIR_000])[k  ];
-			real mfccc = (D.f[DIR_PPP ])[k  ];
-			real mfaac = (D.f[DIR_MMP ])[ksw];
-			real mfcac = (D.f[DIR_PMP ])[ks ];
-			real mfacc = (D.f[DIR_MPP ])[kw ];
-			real mfcca = (D.f[DIR_PPM ])[kb ];
+			real mfccc = (D.f[DIR_PPP])[k  ];
+			real mfaac = (D.f[DIR_MMP])[ksw];
+			real mfcac = (D.f[DIR_PMP])[ks ];
+			real mfacc = (D.f[DIR_MPP])[kw ];
+			real mfcca = (D.f[DIR_PPM])[kb ];
 			real mfaaa = (D.f[DIR_MMM])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];
-			real mfaca = (D.f[DIR_MPM ])[kbw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];
+			real mfaca = (D.f[DIR_MPM])[kbw];
 			////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
 							(((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) +
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17/WaleCumulantK17Comp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17/WaleCumulantK17Comp.cu
index 5eeea51301c666cf17546c85a444413111bebf2c..c9c16e2d2d2259656248948f3f10977c8f18fd24 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17/WaleCumulantK17Comp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17/WaleCumulantK17Comp.cu
@@ -10,7 +10,7 @@ std::shared_ptr<WaleCumulantK17Comp> WaleCumulantK17Comp::getNewInstance(std::sh
 
 void WaleCumulantK17Comp::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
+	int size_Mat = (int)para->getParD(level)->numberOfNodes;
 	int numberOfThreads = para->getParD(level)->numberofthreads;
 
 	//int Grid = size_Array / numberOfThreads;
@@ -32,23 +32,24 @@ void WaleCumulantK17Comp::run()
 	dim3 grid(Grid1, Grid2, 1);
 	dim3 threads(numberOfThreads, 1, 1);
 
-	LB_Kernel_WaleCumulantK17Comp <<< grid, threads >>>(para->getParD(level)->omega,
-														para->getParD(level)->typeOfGridNode,
-														para->getParD(level)->neighborX,
-														para->getParD(level)->neighborY,
-														para->getParD(level)->neighborZ,
-														para->getParD(level)->neighborInverse,
-														para->getParD(level)->velocityX,
-														para->getParD(level)->velocityY,
-														para->getParD(level)->velocityZ,
-														para->getParD(level)->distributions.f[0],
-														para->getParD(level)->turbViscosity,
-														para->getParD(level)->numberOfNodes,
-														level,
-														para->getTimestepOfCoarseLevel(),
-														para->getForcesDev(),
-                                                        para->getQuadricLimitersDev(),
-														para->getParD(level)->isEvenTimestep);
+	LB_Kernel_WaleCumulantK17Comp <<< grid, threads >>>(
+		para->getParD(level)->omega,
+		para->getParD(level)->typeOfGridNode,
+		para->getParD(level)->neighborX,
+		para->getParD(level)->neighborY,
+		para->getParD(level)->neighborZ,
+		para->getParD(level)->neighborInverse,
+		para->getParD(level)->velocityX,
+		para->getParD(level)->velocityY,
+		para->getParD(level)->velocityZ,
+		para->getParD(level)->distributions.f[0],
+		para->getParD(level)->turbViscosity,
+		para->getParD(level)->numberOfNodes,
+		level,
+		para->getTimestepOfCoarseLevel(),
+		para->getForcesDev(),
+        para->getQuadricLimitersDev(),
+		para->getParD(level)->isEvenTimestep);
 	getLastCudaError("LB_Kernel_WaleCumulantK17Comp execution failed");
 }
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17/WaleCumulantK17Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17/WaleCumulantK17Comp_Device.cu
index 8aaa13ab1d868e15ea5707d1566ba653b44c645d..e3161e0d26efe8993bb4b6c34bda32bf15af5d3d 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17/WaleCumulantK17Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17/WaleCumulantK17Comp_Device.cu
@@ -47,63 +47,63 @@ __global__ void LB_Kernel_WaleCumulantK17Comp(
 			Distributions27 D;
 			if (EvenOrOdd==true)
 			{
-				D.f[DIR_P00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00   ] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00   ] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0   ] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0   ] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M   ] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P   ] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0  ] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0  ] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0  ] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0  ] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M  ] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P  ] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P  ] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M  ] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM  ] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP  ] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP  ] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM  ] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM ] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM ] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM ] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM ] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP ] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP ] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP ] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP ] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
@@ -137,33 +137,33 @@ __global__ void LB_Kernel_WaleCumulantK17Comp(
 			unsigned int kbsw = neighborZ[ksw];
 
 			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[DIR_P00   ])[k  ];
-			real mfabb = (D.f[DIR_M00   ])[kw ];
-			real mfbcb = (D.f[DIR_0P0   ])[k  ];
-			real mfbab = (D.f[DIR_0M0   ])[ks ];
-			real mfbbc = (D.f[DIR_00P   ])[k  ];
-			real mfbba = (D.f[DIR_00M   ])[kb ];
-			real mfccb = (D.f[DIR_PP0  ])[k  ];
-			real mfaab = (D.f[DIR_MM0  ])[ksw];
-			real mfcab = (D.f[DIR_PM0  ])[ks ];
-			real mfacb = (D.f[DIR_MP0  ])[kw ];
-			real mfcbc = (D.f[DIR_P0P  ])[k  ];
-			real mfaba = (D.f[DIR_M0M  ])[kbw];
-			real mfcba = (D.f[DIR_P0M  ])[kb ];
-			real mfabc = (D.f[DIR_M0P  ])[kw ];
-			real mfbcc = (D.f[DIR_0PP  ])[k  ];
-			real mfbaa = (D.f[DIR_0MM  ])[kbs];
-			real mfbca = (D.f[DIR_0PM  ])[kb ];
-			real mfbac = (D.f[DIR_0MP  ])[ks ];
+			real mfcbb = (D.f[DIR_P00])[k  ];
+			real mfabb = (D.f[DIR_M00])[kw ];
+			real mfbcb = (D.f[DIR_0P0])[k  ];
+			real mfbab = (D.f[DIR_0M0])[ks ];
+			real mfbbc = (D.f[DIR_00P])[k  ];
+			real mfbba = (D.f[DIR_00M])[kb ];
+			real mfccb = (D.f[DIR_PP0])[k  ];
+			real mfaab = (D.f[DIR_MM0])[ksw];
+			real mfcab = (D.f[DIR_PM0])[ks ];
+			real mfacb = (D.f[DIR_MP0])[kw ];
+			real mfcbc = (D.f[DIR_P0P])[k  ];
+			real mfaba = (D.f[DIR_M0M])[kbw];
+			real mfcba = (D.f[DIR_P0M])[kb ];
+			real mfabc = (D.f[DIR_M0P])[kw ];
+			real mfbcc = (D.f[DIR_0PP])[k  ];
+			real mfbaa = (D.f[DIR_0MM])[kbs];
+			real mfbca = (D.f[DIR_0PM])[kb ];
+			real mfbac = (D.f[DIR_0MP])[ks ];
 			real mfbbb = (D.f[DIR_000])[k  ];
-			real mfccc = (D.f[DIR_PPP ])[k  ];
-			real mfaac = (D.f[DIR_MMP ])[ksw];
-			real mfcac = (D.f[DIR_PMP ])[ks ];
-			real mfacc = (D.f[DIR_MPP ])[kw ];
-			real mfcca = (D.f[DIR_PPM ])[kb ];
+			real mfccc = (D.f[DIR_PPP])[k  ];
+			real mfaac = (D.f[DIR_MMP])[ksw];
+			real mfcac = (D.f[DIR_PMP])[ks ];
+			real mfacc = (D.f[DIR_MPP])[kw ];
+			real mfcca = (D.f[DIR_PPM])[kb ];
 			real mfaaa = (D.f[DIR_MMM])[kbsw];
-			real mfcaa = (D.f[DIR_PMM ])[kbs];
-			real mfaca = (D.f[DIR_MPM ])[kbw];
+			real mfcaa = (D.f[DIR_PMM])[kbs];
+			real mfaca = (D.f[DIR_MPM])[kbw];
 			////////////////////////////////////////////////////////////////////////////////////
 			real drho = ((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + 
 							(((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) +
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17Debug/WaleCumulantK17DebugComp.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17Debug/WaleCumulantK17DebugComp.cu
index 98dca58f522bf02ce66328819e42c717f0ceef28..b3cdd494c02c6649d60818b6b264b8db8b79d426 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17Debug/WaleCumulantK17DebugComp.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17Debug/WaleCumulantK17DebugComp.cu
@@ -10,7 +10,7 @@ std::shared_ptr<WaleCumulantK17DebugComp> WaleCumulantK17DebugComp::getNewInstan
 
 void WaleCumulantK17DebugComp::run()
 {
-	int size_Mat = para->getParD(level)->numberOfNodes;
+	int size_Mat = (int)para->getParD(level)->numberOfNodes;
 	int numberOfThreads = para->getParD(level)->numberofthreads;
 
 	//int Grid = size_Array / numberOfThreads;
@@ -32,34 +32,34 @@ void WaleCumulantK17DebugComp::run()
 	dim3 grid(Grid1, Grid2, 1);
 	dim3 threads(numberOfThreads, 1, 1);
 
-	LB_Kernel_WaleCumulantK17DebugComp << < grid, threads >> >(
-																		para->getParD(level)->omega,
-																		para->getParD(level)->typeOfGridNode,
-																		para->getParD(level)->neighborX,
-																		para->getParD(level)->neighborY,
-																		para->getParD(level)->neighborZ,
-																		para->getParD(level)->neighborInverse,
-																		para->getParD(level)->velocityX,
-																		para->getParD(level)->velocityY,
-																		para->getParD(level)->velocityZ,
-																		para->getParD(level)->distributions.f[0],
-																		para->getParD(level)->turbViscosity,
-																		para->getParD(level)->gSij,
-																		para->getParD(level)->gSDij,
-																		para->getParD(level)->gDxvx,
-																		para->getParD(level)->gDyvx,
-																		para->getParD(level)->gDzvx,
-																		para->getParD(level)->gDxvy,
-																		para->getParD(level)->gDyvy,
-																		para->getParD(level)->gDzvy,
-																		para->getParD(level)->gDxvz,
-																		para->getParD(level)->gDyvz,
-																		para->getParD(level)->gDzvz,
-																		para->getParD(level)->numberOfNodes,
-																		level,
-																		para->getForcesDev(),
-                                                                        para->getQuadricLimitersDev(),
-																		para->getParD(level)->isEvenTimestep);
+	LB_Kernel_WaleCumulantK17DebugComp <<< grid, threads >>>(
+		para->getParD(level)->omega,
+		para->getParD(level)->typeOfGridNode,
+		para->getParD(level)->neighborX,
+		para->getParD(level)->neighborY,
+		para->getParD(level)->neighborZ,
+		para->getParD(level)->neighborInverse,
+		para->getParD(level)->velocityX,
+		para->getParD(level)->velocityY,
+		para->getParD(level)->velocityZ,
+		para->getParD(level)->distributions.f[0],
+		para->getParD(level)->turbViscosity,
+		para->getParD(level)->gSij,
+		para->getParD(level)->gSDij,
+		para->getParD(level)->gDxvx,
+		para->getParD(level)->gDyvx,
+		para->getParD(level)->gDzvx,
+		para->getParD(level)->gDxvy,
+		para->getParD(level)->gDyvy,
+		para->getParD(level)->gDzvy,
+		para->getParD(level)->gDxvz,
+		para->getParD(level)->gDyvz,
+		para->getParD(level)->gDzvz,
+		para->getParD(level)->numberOfNodes,
+		level,
+		para->getForcesDev(),
+        para->getQuadricLimitersDev(),
+		para->getParD(level)->isEvenTimestep);
 	getLastCudaError("LB_Kernel_WaleCumulantK17DebugComp execution failed");
 }
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17Debug/WaleCumulantK17DebugComp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17Debug/WaleCumulantK17DebugComp_Device.cu
index a1feba477a6555ea728311a6e99d5302652813ff..63f4ecc8716fcd606fb6a75709408b0885d781e9 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17Debug/WaleCumulantK17DebugComp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/WaleKernels/FluidFlow/Compressible/CumulantK17Debug/WaleCumulantK17DebugComp_Device.cu
@@ -57,63 +57,63 @@ __global__ void LB_Kernel_WaleCumulantK17DebugComp(
 			Distributions27 D;
 			if (EvenOrOdd == true)
 			{
-				D.f[DIR_P00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_M00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_PMM]= &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_MPM]= &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_PMM]= &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_MPM]= &DDStart[DIR_MPM * size_Mat];
 			}
 			else
 			{
-				D.f[DIR_M00] = &DDStart[DIR_P00   *size_Mat];
-				D.f[DIR_P00] = &DDStart[DIR_M00   *size_Mat];
-				D.f[DIR_0M0] = &DDStart[DIR_0P0   *size_Mat];
-				D.f[DIR_0P0] = &DDStart[DIR_0M0   *size_Mat];
-				D.f[DIR_00M] = &DDStart[DIR_00P   *size_Mat];
-				D.f[DIR_00P] = &DDStart[DIR_00M   *size_Mat];
-				D.f[DIR_MM0] = &DDStart[DIR_PP0  *size_Mat];
-				D.f[DIR_PP0] = &DDStart[DIR_MM0  *size_Mat];
-				D.f[DIR_MP0] = &DDStart[DIR_PM0  *size_Mat];
-				D.f[DIR_PM0] = &DDStart[DIR_MP0  *size_Mat];
-				D.f[DIR_M0M] = &DDStart[DIR_P0P  *size_Mat];
-				D.f[DIR_P0P] = &DDStart[DIR_M0M  *size_Mat];
-				D.f[DIR_M0P] = &DDStart[DIR_P0M  *size_Mat];
-				D.f[DIR_P0M] = &DDStart[DIR_M0P  *size_Mat];
-				D.f[DIR_0MM] = &DDStart[DIR_0PP  *size_Mat];
-				D.f[DIR_0PP] = &DDStart[DIR_0MM  *size_Mat];
-				D.f[DIR_0MP] = &DDStart[DIR_0PM  *size_Mat];
-				D.f[DIR_0PM] = &DDStart[DIR_0MP  *size_Mat];
-				D.f[DIR_000] = &DDStart[DIR_000*size_Mat];
-				D.f[DIR_MMM] = &DDStart[DIR_PPP *size_Mat];
-				D.f[DIR_PPM] = &DDStart[DIR_MMP *size_Mat];
-				D.f[DIR_MPM]= &DDStart[DIR_PMP *size_Mat];
-				D.f[DIR_PMM]= &DDStart[DIR_MPP *size_Mat];
-				D.f[DIR_MMP] = &DDStart[DIR_PPM *size_Mat];
-				D.f[DIR_PPP] = &DDStart[DIR_MMM *size_Mat];
-				D.f[DIR_MPP] = &DDStart[DIR_PMM *size_Mat];
-				D.f[DIR_PMP] = &DDStart[DIR_MPM *size_Mat];
+				D.f[DIR_M00] = &DDStart[DIR_P00 * size_Mat];
+				D.f[DIR_P00] = &DDStart[DIR_M00 * size_Mat];
+				D.f[DIR_0M0] = &DDStart[DIR_0P0 * size_Mat];
+				D.f[DIR_0P0] = &DDStart[DIR_0M0 * size_Mat];
+				D.f[DIR_00M] = &DDStart[DIR_00P * size_Mat];
+				D.f[DIR_00P] = &DDStart[DIR_00M * size_Mat];
+				D.f[DIR_MM0] = &DDStart[DIR_PP0 * size_Mat];
+				D.f[DIR_PP0] = &DDStart[DIR_MM0 * size_Mat];
+				D.f[DIR_MP0] = &DDStart[DIR_PM0 * size_Mat];
+				D.f[DIR_PM0] = &DDStart[DIR_MP0 * size_Mat];
+				D.f[DIR_M0M] = &DDStart[DIR_P0P * size_Mat];
+				D.f[DIR_P0P] = &DDStart[DIR_M0M * size_Mat];
+				D.f[DIR_M0P] = &DDStart[DIR_P0M * size_Mat];
+				D.f[DIR_P0M] = &DDStart[DIR_M0P * size_Mat];
+				D.f[DIR_0MM] = &DDStart[DIR_0PP * size_Mat];
+				D.f[DIR_0PP] = &DDStart[DIR_0MM * size_Mat];
+				D.f[DIR_0MP] = &DDStart[DIR_0PM * size_Mat];
+				D.f[DIR_0PM] = &DDStart[DIR_0MP * size_Mat];
+				D.f[DIR_000] = &DDStart[DIR_000 * size_Mat];
+				D.f[DIR_MMM] = &DDStart[DIR_PPP * size_Mat];
+				D.f[DIR_PPM] = &DDStart[DIR_MMP * size_Mat];
+				D.f[DIR_MPM]= &DDStart[DIR_PMP * size_Mat];
+				D.f[DIR_PMM]= &DDStart[DIR_MPP * size_Mat];
+				D.f[DIR_MMP] = &DDStart[DIR_PPM * size_Mat];
+				D.f[DIR_PPP] = &DDStart[DIR_MMM * size_Mat];
+				D.f[DIR_MPP] = &DDStart[DIR_PMM * size_Mat];
+				D.f[DIR_PMP] = &DDStart[DIR_MPM * size_Mat];
 			}
 
 			////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cuh
index edd6ad7101bbf98ad6369ded53c3b0b0e37c66bc..fec2403ecad70d1ea550750a5a33780aa35e07bd 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cuh
@@ -43,67 +43,67 @@ using namespace vf::lbm::dir;
 namespace vf::gpu
 {
 
-__inline__ __device__ __host__ void getPointersToDistributions(Distributions27 &dist, real *distributionArray, const uint numberOfLBnodes, const bool isEvenTimestep)
+__inline__ __device__ __host__ void getPointersToDistributions(Distributions27 &dist, real *distributionArray, const unsigned long long numberOfLBnodes, const bool isEvenTimestep)
 {
     if (isEvenTimestep)
     {
-        dist.f[DIR_000] = &distributionArray[(unsigned long long)(DIR_000) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_P00] = &distributionArray[(unsigned long long)(DIR_P00) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_M00] = &distributionArray[(unsigned long long)(DIR_M00) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_0P0] = &distributionArray[(unsigned long long)(DIR_0P0) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_0M0] = &distributionArray[(unsigned long long)(DIR_0M0) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_00P] = &distributionArray[(unsigned long long)(DIR_00P) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_00M] = &distributionArray[(unsigned long long)(DIR_00M) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_PP0] = &distributionArray[(unsigned long long)(DIR_PP0) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_MM0] = &distributionArray[(unsigned long long)(DIR_MM0) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_PM0] = &distributionArray[(unsigned long long)(DIR_PM0) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_MP0] = &distributionArray[(unsigned long long)(DIR_MP0) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_P0P] = &distributionArray[(unsigned long long)(DIR_P0P) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_M0M] = &distributionArray[(unsigned long long)(DIR_M0M) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_P0M] = &distributionArray[(unsigned long long)(DIR_P0M) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_M0P] = &distributionArray[(unsigned long long)(DIR_M0P) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_0PP] = &distributionArray[(unsigned long long)(DIR_0PP) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_0MM] = &distributionArray[(unsigned long long)(DIR_0MM) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_0PM] = &distributionArray[(unsigned long long)(DIR_0PM) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_0MP] = &distributionArray[(unsigned long long)(DIR_0MP) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_PPP] = &distributionArray[(unsigned long long)(DIR_PPP) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_MMP] = &distributionArray[(unsigned long long)(DIR_MMP) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_PMP] = &distributionArray[(unsigned long long)(DIR_PMP) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_MPP] = &distributionArray[(unsigned long long)(DIR_MPP) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_PPM] = &distributionArray[(unsigned long long)(DIR_PPM) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_MMM] = &distributionArray[(unsigned long long)(DIR_MMM) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_PMM] = &distributionArray[(unsigned long long)(DIR_PMM) * (unsigned long long)(numberOfLBnodes)];
-        dist.f[DIR_MPM] = &distributionArray[(unsigned long long)(DIR_MPM) * (unsigned long long)(numberOfLBnodes)];
+        dist.f[DIR_000] = &distributionArray[DIR_000 * numberOfLBnodes];
+        dist.f[DIR_P00] = &distributionArray[DIR_P00 * numberOfLBnodes];
+        dist.f[DIR_M00] = &distributionArray[DIR_M00 * numberOfLBnodes];
+        dist.f[DIR_0P0] = &distributionArray[DIR_0P0 * numberOfLBnodes];
+        dist.f[DIR_0M0] = &distributionArray[DIR_0M0 * numberOfLBnodes];
+        dist.f[DIR_00P] = &distributionArray[DIR_00P * numberOfLBnodes];
+        dist.f[DIR_00M] = &distributionArray[DIR_00M * numberOfLBnodes];
+        dist.f[DIR_PP0] = &distributionArray[DIR_PP0 * numberOfLBnodes];
+        dist.f[DIR_MM0] = &distributionArray[DIR_MM0 * numberOfLBnodes];
+        dist.f[DIR_PM0] = &distributionArray[DIR_PM0 * numberOfLBnodes];
+        dist.f[DIR_MP0] = &distributionArray[DIR_MP0 * numberOfLBnodes];
+        dist.f[DIR_P0P] = &distributionArray[DIR_P0P * numberOfLBnodes];
+        dist.f[DIR_M0M] = &distributionArray[DIR_M0M * numberOfLBnodes];
+        dist.f[DIR_P0M] = &distributionArray[DIR_P0M * numberOfLBnodes];
+        dist.f[DIR_M0P] = &distributionArray[DIR_M0P * numberOfLBnodes];
+        dist.f[DIR_0PP] = &distributionArray[DIR_0PP * numberOfLBnodes];
+        dist.f[DIR_0MM] = &distributionArray[DIR_0MM * numberOfLBnodes];
+        dist.f[DIR_0PM] = &distributionArray[DIR_0PM * numberOfLBnodes];
+        dist.f[DIR_0MP] = &distributionArray[DIR_0MP * numberOfLBnodes];
+        dist.f[DIR_PPP] = &distributionArray[DIR_PPP * numberOfLBnodes];
+        dist.f[DIR_MMP] = &distributionArray[DIR_MMP * numberOfLBnodes];
+        dist.f[DIR_PMP] = &distributionArray[DIR_PMP * numberOfLBnodes];
+        dist.f[DIR_MPP] = &distributionArray[DIR_MPP * numberOfLBnodes];
+        dist.f[DIR_PPM] = &distributionArray[DIR_PPM * numberOfLBnodes];
+        dist.f[DIR_MMM] = &distributionArray[DIR_MMM * numberOfLBnodes];
+        dist.f[DIR_PMM] = &distributionArray[DIR_PMM * numberOfLBnodes];
+        dist.f[DIR_MPM] = &distributionArray[DIR_MPM * numberOfLBnodes];
     }
     else
     {
-         dist.f[DIR_M00] = &distributionArray[(unsigned long long)(DIR_P00) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_P00] = &distributionArray[(unsigned long long)(DIR_M00) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_0M0] = &distributionArray[(unsigned long long)(DIR_0P0) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_0P0] = &distributionArray[(unsigned long long)(DIR_0M0) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_00M] = &distributionArray[(unsigned long long)(DIR_00P) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_00P] = &distributionArray[(unsigned long long)(DIR_00M) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_MM0] = &distributionArray[(unsigned long long)(DIR_PP0) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_PP0] = &distributionArray[(unsigned long long)(DIR_MM0) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_MP0] = &distributionArray[(unsigned long long)(DIR_PM0) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_PM0] = &distributionArray[(unsigned long long)(DIR_MP0) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_M0M] = &distributionArray[(unsigned long long)(DIR_P0P) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_P0P] = &distributionArray[(unsigned long long)(DIR_M0M) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_M0P] = &distributionArray[(unsigned long long)(DIR_P0M) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_P0M] = &distributionArray[(unsigned long long)(DIR_M0P) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_0MM] = &distributionArray[(unsigned long long)(DIR_0PP) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_0PP] = &distributionArray[(unsigned long long)(DIR_0MM) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_0MP] = &distributionArray[(unsigned long long)(DIR_0PM) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_0PM] = &distributionArray[(unsigned long long)(DIR_0MP) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_000] = &distributionArray[(unsigned long long)(DIR_000) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_PPP] = &distributionArray[(unsigned long long)(DIR_MMM) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_MMP] = &distributionArray[(unsigned long long)(DIR_PPM) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_PMP] = &distributionArray[(unsigned long long)(DIR_MPM) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_MPP] = &distributionArray[(unsigned long long)(DIR_PMM) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_PPM] = &distributionArray[(unsigned long long)(DIR_MMP) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_MMM] = &distributionArray[(unsigned long long)(DIR_PPP) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_PMM] = &distributionArray[(unsigned long long)(DIR_MPP) * (unsigned long long)(numberOfLBnodes)];
-         dist.f[DIR_MPM] = &distributionArray[(unsigned long long)(DIR_PMP) * (unsigned long long)(numberOfLBnodes)];
+         dist.f[DIR_M00] = &distributionArray[DIR_P00 * numberOfLBnodes];
+         dist.f[DIR_P00] = &distributionArray[DIR_M00 * numberOfLBnodes];
+         dist.f[DIR_0M0] = &distributionArray[DIR_0P0 * numberOfLBnodes];
+         dist.f[DIR_0P0] = &distributionArray[DIR_0M0 * numberOfLBnodes];
+         dist.f[DIR_00M] = &distributionArray[DIR_00P * numberOfLBnodes];
+         dist.f[DIR_00P] = &distributionArray[DIR_00M * numberOfLBnodes];
+         dist.f[DIR_MM0] = &distributionArray[DIR_PP0 * numberOfLBnodes];
+         dist.f[DIR_PP0] = &distributionArray[DIR_MM0 * numberOfLBnodes];
+         dist.f[DIR_MP0] = &distributionArray[DIR_PM0 * numberOfLBnodes];
+         dist.f[DIR_PM0] = &distributionArray[DIR_MP0 * numberOfLBnodes];
+         dist.f[DIR_M0M] = &distributionArray[DIR_P0P * numberOfLBnodes];
+         dist.f[DIR_P0P] = &distributionArray[DIR_M0M * numberOfLBnodes];
+         dist.f[DIR_M0P] = &distributionArray[DIR_P0M * numberOfLBnodes];
+         dist.f[DIR_P0M] = &distributionArray[DIR_M0P * numberOfLBnodes];
+         dist.f[DIR_0MM] = &distributionArray[DIR_0PP * numberOfLBnodes];
+         dist.f[DIR_0PP] = &distributionArray[DIR_0MM * numberOfLBnodes];
+         dist.f[DIR_0MP] = &distributionArray[DIR_0PM * numberOfLBnodes];
+         dist.f[DIR_0PM] = &distributionArray[DIR_0MP * numberOfLBnodes];
+         dist.f[DIR_000] = &distributionArray[DIR_000 * numberOfLBnodes];
+         dist.f[DIR_PPP] = &distributionArray[DIR_MMM * numberOfLBnodes];
+         dist.f[DIR_MMP] = &distributionArray[DIR_PPM * numberOfLBnodes];
+         dist.f[DIR_PMP] = &distributionArray[DIR_MPM * numberOfLBnodes];
+         dist.f[DIR_MPP] = &distributionArray[DIR_PMM * numberOfLBnodes];
+         dist.f[DIR_PPM] = &distributionArray[DIR_MMP * numberOfLBnodes];
+         dist.f[DIR_MMM] = &distributionArray[DIR_PPP * numberOfLBnodes];
+         dist.f[DIR_PMM] = &distributionArray[DIR_MPP * numberOfLBnodes];
+         dist.f[DIR_MPM] = &distributionArray[DIR_PMP * numberOfLBnodes];
     }
 }
 
@@ -114,7 +114,7 @@ __inline__ __device__ __host__ void getPointersToDistributions(Distributions27 &
 *  @params isEvenTimestep: stored data dependent on timestep is based on the esoteric twist algorithm
 *  @return a data struct containing the addresses to the 27 directions within the 1D distribution array
 */
-__inline__ __device__ __host__ DistributionReferences27 getDistributionReferences27(real* distributions, unsigned int numberOfLBnodes, bool isEvenTimestep){
+__inline__ __device__ __host__ DistributionReferences27 getDistributionReferences27(real* distributions, const unsigned long long numberOfLBnodes, const bool isEvenTimestep){
     DistributionReferences27 distribution_references;
     getPointersToDistributions(distribution_references, distributions, numberOfLBnodes, isEvenTimestep);
     return distribution_references;
diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/ADKernelManager.cpp b/src/gpu/VirtualFluids_GPU/KernelManager/ADKernelManager.cpp
index 9ca813ac4987af618491422acb60207b7fee543c..5a36daecd5a82fc8a052bf51fedc1cb35b94a960 100644
--- a/src/gpu/VirtualFluids_GPU/KernelManager/ADKernelManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/KernelManager/ADKernelManager.cpp
@@ -90,10 +90,10 @@ void ADKernelManager::initAD(const int level) const
 ////////////////////////////////////////////////////////////////////////////////
 void ADKernelManager::setInitialNodeValuesAD(const int level, SPtr<CudaMemoryManager> cudaMemoryManager) const
 {
-    for (uint j = 1; j <= para->getParH(level)->numberOfNodes; j++) {
-        const real coordX = para->getParH(level)->coordinateX[j];
-        const real coordY = para->getParH(level)->coordinateY[j];
-        const real coordZ = para->getParH(level)->coordinateZ[j];
+    for (size_t index = 1; index <= para->getParH(level)->numberOfNodes; index++) {
+        const real coordX = para->getParH(level)->coordinateX[index];
+        const real coordY = para->getParH(level)->coordinateY[index];
+        const real coordZ = para->getParH(level)->coordinateZ[index];
 
         real concentration;
 
@@ -104,7 +104,7 @@ void ADKernelManager::setInitialNodeValuesAD(const int level, SPtr<CudaMemoryMan
             concentration = real(0.0);
         }
 
-        para->getParH(level)->concentration[j] = concentration;
+        para->getParH(level)->concentration[index] = concentration;
     }
 
     cudaMemoryManager->cudaCopyConcentrationHostToDevice(level);
diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/BCKernelManager.cpp b/src/gpu/VirtualFluids_GPU/KernelManager/BCKernelManager.cpp
index 1310cf09e5ce05270e88cd3a53e4910816bd7628..e8fc3f318c920be36be7861a28659124a7b1e977 100644
--- a/src/gpu/VirtualFluids_GPU/KernelManager/BCKernelManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/KernelManager/BCKernelManager.cpp
@@ -428,4 +428,4 @@ void BCKernelManager::runPrecursorBCKernelPost(int level, uint t, CudaMemoryMana
     
     real tRatio = real(t_level-lastTime)/para->getParD(level)->precursorBC.timeStepsBetweenReads;
     precursorBoundaryConditionPost(para->getParD(level).get(), &para->getParD(level)->precursorBC, tRatio, para->getVelocityRatio());
-}
\ No newline at end of file
+}
diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.cpp b/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.cpp
index 2b6a266c0d4e5f523091fa4982eee5d83b2ec675..0841d6931bba32440b47d02c9f83864a80f724be 100644
--- a/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/KernelManager/GridScalingKernelManager.cpp
@@ -47,10 +47,10 @@ GridScalingKernelManager::GridScalingKernelManager(SPtr<Parameter> parameter, Gr
         if(!gridScalingFactory){
             throw std::runtime_error("There is more than one level, but no scalingFactory was provided.");
         }
-        checkScalingFunction(gridScalingFactory->getGridScalingFC(), this->para->getParD(0)->intFC, "scalingFineToCoarse");
-        checkScalingFunction(gridScalingFactory->getGridScalingCF(), this->para->getParD(0)->intCF, "scalingCoarseToFine");
-        this->scalingFineToCoarse = gridScalingFactory->getGridScalingFC();
-        this->scalingCoarseToFine = gridScalingFactory->getGridScalingCF();
+        checkScalingFunction(gridScalingFactory->getGridScalingFC(parameter->getUseTurbulentViscosity()), this->para->getParD(0)->intFC, "scalingFineToCoarse");
+        checkScalingFunction(gridScalingFactory->getGridScalingCF(parameter->getUseTurbulentViscosity()), this->para->getParD(0)->intCF, "scalingCoarseToFine");
+        this->scalingFineToCoarse = gridScalingFactory->getGridScalingFC(parameter->getUseTurbulentViscosity());
+        this->scalingCoarseToFine = gridScalingFactory->getGridScalingCF(parameter->getUseTurbulentViscosity());
     }
     
     if(this->scalingFineToCoarse == nullptr)
diff --git a/src/gpu/VirtualFluids_GPU/LBM/LB.h b/src/gpu/VirtualFluids_GPU/LBM/LB.h
index a7517ca0f07b9c1379501aa3ff750637d230a7bd..cfdbbbae040a13f94e97d40d702b93d5a1e19c86 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/LB.h
+++ b/src/gpu/VirtualFluids_GPU/LBM/LB.h
@@ -15,9 +15,9 @@
 
 //////////////////////////
 //porous media
-#define GEO_PM_0		 5
-#define GEO_PM_1		 6
-#define GEO_PM_2		 7
+#define GEO_PM_0         5
+#define GEO_PM_1         6
+#define GEO_PM_2         7
 //////////////////////////
 
 #define GEO_SOLID       15
@@ -191,7 +191,7 @@ typedef struct OffFC{
 
 // Distribution functions g 6
 typedef struct  Distri6 {
-	real* g[6];
+   real* g[6];
 } Distributions6;
 
 // Distribution functions f 7
@@ -284,55 +284,53 @@ typedef struct WMparas{
 
 //measurePoints
 typedef struct MeasP{
-	std::string name;
-	uint k;
-	std::vector<real> Vx;
-	std::vector<real> Vy;
-	std::vector<real> Vz;
-	std::vector<real> Rho;
-	//real* Vx;
-	//real* Vy;
-	//real* Vz;
-	//real* Rho;
+   std::string name;
+   uint k;
+   std::vector<real> Vx;
+   std::vector<real> Vy;
+   std::vector<real> Vz;
+   std::vector<real> Rho;
+   //real* Vx;
+   //real* Vy;
+   //real* Vz;
+   //real* Rho;
 }MeasurePoints;
 
 //Process Neighbors
 typedef struct PN27{
-	real* f[27];
-	uint memsizeFs;
-	int* index;
-	uint memsizeIndex;
-	uint rankNeighbor;
-	int numberOfNodes;
-	int numberOfFs;
+   real* f[27];
+   uint memsizeFs;
+   int* index;
+   uint memsizeIndex;
+   uint rankNeighbor;
+   int numberOfNodes;
+   int numberOfFs;
 }ProcessNeighbor27;
 
 typedef struct PN_F3 {
-	real* g[6];
-	uint memsizeGs;
-	int* index;
-	uint memsizeIndex;
-	uint rankNeighbor;
-	int numberOfNodes;
-	int numberOfGs;
+   real* g[6];
+   uint memsizeGs;
+   int* index;
+   uint memsizeIndex;
+   uint rankNeighbor;
+   int numberOfNodes;
+   int numberOfGs;
 }ProcessNeighborF3;
 
 //path line particles
 typedef struct PLP{
-	bool *stuck, *hot;
-	real *coordXabsolut, *coordYabsolut, *coordZabsolut;
-	real *coordXlocal,   *coordYlocal,   *coordZlocal;
-	real *veloX,         *veloY,         *veloZ;
-	real *randomLocationInit;
-	uint *timestep;
-	uint *ID;
-	uint *cellBaseID;
-	uint numberOfParticles, numberOfTimestepsParticles;
-	uint memSizeID, memSizeTimestep, memSizerealAll, memSizereal, memSizeBool, memSizeBoolBC;
+   bool *stuck, *hot;
+   real *coordXabsolut, *coordYabsolut, *coordZabsolut;
+   real *coordXlocal,   *coordYlocal,   *coordZlocal;
+   real *veloX,         *veloY,         *veloZ;
+   real *randomLocationInit;
+   uint *timestep;
+   uint *ID;
+   uint *cellBaseID;
+   uint numberOfParticles, numberOfTimestepsParticles;
+   uint memSizeID, memSizeTimestep, memSizerealAll, memSizereal, memSizeBool, memSizeBoolBC;
 }PathLineParticles;
 
-
-
 //////////////////////////////////////////////////////////////////////////
 inline int vectorPosition(int i, int j, int k, int Lx, int Ly )
 {
@@ -341,7 +339,4 @@ inline int vectorPosition(int i, int j, int k, int Lx, int Ly )
 }
 //////////////////////////////////////////////////////////////////////////
 
-
 #endif
-
-
diff --git a/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.cu b/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.cu
index 9ff86ea36c5b3c465990d622547d98cb4686f929..ee3fe322da2ab7a7ea218b27287f2dd5d5d0fd24 100644
--- a/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.cu
+++ b/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.cu
@@ -17,7 +17,7 @@ using namespace vf::lbm::dir;
 
 __global__ void printFs(  real* distributions,
                         bool isEvenTimestep,
-                        unsigned long numberOfFluidNodes,
+                        unsigned long long numberOfFluidNodes,
                         uint* neighborX,
                         uint* neighborY,
                         uint* neighborZ,
@@ -125,7 +125,7 @@ void DistributionDebugInspector::inspect(std::shared_ptr<Parameter> para, uint l
 
     printFs <<< cudaGrid.grid, cudaGrid.threads >>>(    para->getParD(level)->distributions.f[0],
                                                         para->getParD(level)->isEvenTimestep,
-                                                        (unsigned long)para->getParD(level)->numberOfNodes,
+                                                        para->getParD(level)->numberOfNodes,
                                                         para->getParD(level)->neighborX,
                                                         para->getParD(level)->neighborY,
                                                         para->getParD(level)->neighborZ,
diff --git a/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.h b/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.h
index 53e030c0d16116a4edef0135f9ab435c853fd66b..95fea46d4eba0c2f2ff0846d22ee5da4f6c357ea 100644
--- a/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.h
+++ b/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.h
@@ -1,28 +1,28 @@
 //=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __         
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
-//      \    \  |    |   ________________________________________________________________    
-//       \    \ |    |  |  ______________________________________________________________|   
-//        \    \|    |  |  |         __          __     __     __     ______      _______    
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
 //           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
 //
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can 
+//  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 
+//  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 
+//
+//  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/>.
 //
@@ -45,7 +45,7 @@
 class DistributionDebugInspector
 {
 public:
-	DistributionDebugInspector(uint _inspectionLevel, real _minX, real _maxX, real _minY, real _maxY, real _minZ, real _maxZ, std::string _tag):
+    DistributionDebugInspector(uint _inspectionLevel, real _minX, real _maxX, real _minY, real _maxY, real _minZ, real _maxZ, std::string _tag):
     inspectionLevel(_inspectionLevel),
     minX(_minX),
     maxX(_maxX),
@@ -55,8 +55,8 @@ public:
     maxZ(_maxZ),
     tag(_tag)
     {};
-	
-    ~DistributionDebugInspector(){}
+
+    ~DistributionDebugInspector() = default;
 
     void inspect(std::shared_ptr<Parameter> para, uint level, uint t);
 
@@ -73,4 +73,4 @@ std::string tag;
 
 };
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
index 920901553f4a27e4fd8f4657b0bf6d4f680d8ef6..17bd8436a2bea16be3bac86f64d0ba8951df0d4a 100644
--- a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
+++ b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
@@ -81,7 +81,7 @@ void FileWriter::writeTimestep(std::shared_ptr<Parameter> para, unsigned int tim
 
 void FileWriter::writeTimestep(std::shared_ptr<Parameter> para, unsigned int timestep, int level)
 {
-    const unsigned int numberOfParts = para->getParH(level)->numberOfNodes / para->getlimitOfNodesForVTK() + 1;
+    const unsigned int numberOfParts = (uint)para->getParH(level)->numberOfNodes / para->getlimitOfNodesForVTK() + 1;
     std::vector<std::string> fnames;
     std::vector<std::string> fnamesMed;
 
@@ -222,8 +222,8 @@ std::vector<std::string> FileWriter::writeUnstrucuredGridLT(std::shared_ptr<Para
 
     for (unsigned int part = 0; part < fname.size(); part++)
     {
-        if (((part + 1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
-            sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+        if (((part + 1)*para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
+            sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
         else
             sizeOfNodes = para->getlimitOfNodesForVTK();
 
@@ -351,9 +351,9 @@ std::vector<std::string> FileWriter::writeUnstrucuredGridMedianLT(std::shared_pt
     {
         //printf("\n test in if I... \n");
         //////////////////////////////////////////////////////////////////////////
-        if (((part + 1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+        if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
         {
-            sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+            sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
         }
         else
         {
diff --git a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
index 0b1e9dc1c25457457eabe3013a288c4c93577dc3..4d5895b323efa1b94a5780a59c882fd5ce1be7eb 100644
--- a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
@@ -290,10 +290,10 @@ void writeNeighborXPointsDebug(Parameter *para)
     nodesVec.resize(nodeNumberVec);
     int nodeCount2 = 0;
     for (int level = 0; level <= para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->numberOfNodes; u++) {
-            real x1 = para->getParH(level)->coordinateX[para->getParH(level)->neighborX[u]];
-            real x2 = para->getParH(level)->coordinateY[para->getParH(level)->neighborX[u]];
-            real x3 = para->getParH(level)->coordinateZ[para->getParH(level)->neighborX[u]];
+        for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++) {
+            real x1 = para->getParH(level)->coordinateX[para->getParH(level)->neighborX[index]];
+            real x2 = para->getParH(level)->coordinateY[para->getParH(level)->neighborX[index]];
+            real x3 = para->getParH(level)->coordinateZ[para->getParH(level)->neighborX[index]];
 
             nodesVec[nodeCount2++] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
         }
@@ -317,18 +317,18 @@ void writeNeighborXLinesDebug(Parameter *para)
     nodesVec.resize(nodeNumberVec * 2);
     int nodeCount = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->numberOfNodes; u++) {
-            real x1  = para->getParH(level)->coordinateX[u];
-            real x2  = para->getParH(level)->coordinateY[u];
-            real x3  = para->getParH(level)->coordinateZ[u];
-            real x1N = para->getParH(level)->coordinateX[para->getParH(level)->neighborX[u]];
-            real x2N = para->getParH(level)->coordinateY[para->getParH(level)->neighborX[u]];
-            real x3N = para->getParH(level)->coordinateZ[para->getParH(level)->neighborX[u]];
+        for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++) {
+            real x1  = para->getParH(level)->coordinateX[index];
+            real x2  = para->getParH(level)->coordinateY[index];
+            real x3  = para->getParH(level)->coordinateZ[index];
+            real x1N = para->getParH(level)->coordinateX[para->getParH(level)->neighborX[index]];
+            real x2N = para->getParH(level)->coordinateY[para->getParH(level)->neighborX[index]];
+            real x3N = para->getParH(level)->coordinateZ[para->getParH(level)->neighborX[index]];
 
             nodesVec[nodeCount++] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
             nodesVec[nodeCount++] = (makeUbTuple((float)(x1N), (float)(x2N), (float)(x3N)));
 
-            if (para->getParH(level)->typeOfGridNode[u] == GEO_FLUID) {
+            if (para->getParH(level)->typeOfGridNode[index] == GEO_FLUID) {
                 cellsVec.push_back(makeUbTuple(nodeCount - 2, nodeCount - 1));
             }
         }
@@ -350,10 +350,10 @@ void writeNeighborYPointsDebug(Parameter *para)
     nodesVec.resize(nodeNumberVec);
     int nodeCount2 = 0;
     for (int level = 0; level <= para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->numberOfNodes; u++) {
-            real x1 = para->getParH(level)->coordinateX[para->getParH(level)->neighborY[u]];
-            real x2 = para->getParH(level)->coordinateY[para->getParH(level)->neighborY[u]];
-            real x3 = para->getParH(level)->coordinateZ[para->getParH(level)->neighborY[u]];
+        for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++) {
+            real x1 = para->getParH(level)->coordinateX[para->getParH(level)->neighborY[index]];
+            real x2 = para->getParH(level)->coordinateY[para->getParH(level)->neighborY[index]];
+            real x3 = para->getParH(level)->coordinateZ[para->getParH(level)->neighborY[index]];
 
             nodesVec[nodeCount2++] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
         }
@@ -377,18 +377,18 @@ void writeNeighborYLinesDebug(Parameter *para)
     nodesVec.resize(nodeNumberVec * 2);
     int nodeCount = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->numberOfNodes; u++) {
-            real x1  = para->getParH(level)->coordinateX[u];
-            real x2  = para->getParH(level)->coordinateY[u];
-            real x3  = para->getParH(level)->coordinateZ[u];
-            real x1N = para->getParH(level)->coordinateX[para->getParH(level)->neighborY[u]];
-            real x2N = para->getParH(level)->coordinateY[para->getParH(level)->neighborY[u]];
-            real x3N = para->getParH(level)->coordinateZ[para->getParH(level)->neighborY[u]];
+        for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++) {
+            real x1  = para->getParH(level)->coordinateX[index];
+            real x2  = para->getParH(level)->coordinateY[index];
+            real x3  = para->getParH(level)->coordinateZ[index];
+            real x1N = para->getParH(level)->coordinateX[para->getParH(level)->neighborY[index]];
+            real x2N = para->getParH(level)->coordinateY[para->getParH(level)->neighborY[index]];
+            real x3N = para->getParH(level)->coordinateZ[para->getParH(level)->neighborY[index]];
 
             nodesVec[nodeCount++] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
             nodesVec[nodeCount++] = (makeUbTuple((float)(x1N), (float)(x2N), (float)(x3N)));
 
-            if (para->getParH(level)->typeOfGridNode[u] == GEO_FLUID) {
+            if (para->getParH(level)->typeOfGridNode[index] == GEO_FLUID) {
                 cellsVec.push_back(makeUbTuple(nodeCount - 2, nodeCount - 1));
             }
         }
@@ -410,10 +410,10 @@ void writeNeighborZPointsDebug(Parameter *para)
     nodesVec.resize(nodeNumberVec);
     int nodeCount2 = 0;
     for (int level = 0; level <= para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->numberOfNodes; u++) {
-            real x1 = para->getParH(level)->coordinateX[para->getParH(level)->neighborZ[u]];
-            real x2 = para->getParH(level)->coordinateY[para->getParH(level)->neighborZ[u]];
-            real x3 = para->getParH(level)->coordinateZ[para->getParH(level)->neighborZ[u]];
+        for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++) {
+            real x1 = para->getParH(level)->coordinateX[para->getParH(level)->neighborZ[index]];
+            real x2 = para->getParH(level)->coordinateY[para->getParH(level)->neighborZ[index]];
+            real x3 = para->getParH(level)->coordinateZ[para->getParH(level)->neighborZ[index]];
 
             nodesVec[nodeCount2++] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
         }
@@ -437,18 +437,18 @@ void writeNeighborZLinesDebug(Parameter *para)
     nodesVec.resize(nodeNumberVec * 2);
     int nodeCount = 0;
     for (int level = 0; level < para->getMaxLevel(); level++) {
-        for (unsigned int u = 0; u < para->getParH(level)->numberOfNodes; u++) {
-            real x1  = para->getParH(level)->coordinateX[u];
-            real x2  = para->getParH(level)->coordinateY[u];
-            real x3  = para->getParH(level)->coordinateZ[u];
-            real x1N = para->getParH(level)->coordinateX[para->getParH(level)->neighborZ[u]];
-            real x2N = para->getParH(level)->coordinateY[para->getParH(level)->neighborZ[u]];
-            real x3N = para->getParH(level)->coordinateZ[para->getParH(level)->neighborZ[u]];
+        for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++) {
+            real x1  = para->getParH(level)->coordinateX[index];
+            real x2  = para->getParH(level)->coordinateY[index];
+            real x3  = para->getParH(level)->coordinateZ[index];
+            real x1N = para->getParH(level)->coordinateX[para->getParH(level)->neighborZ[index]];
+            real x2N = para->getParH(level)->coordinateY[para->getParH(level)->neighborZ[index]];
+            real x3N = para->getParH(level)->coordinateZ[para->getParH(level)->neighborZ[index]];
 
             nodesVec[nodeCount++] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
             nodesVec[nodeCount++] = (makeUbTuple((float)(x1N), (float)(x2N), (float)(x3N)));
 
-            if (para->getParH(level)->typeOfGridNode[u] == GEO_FLUID) {
+            if (para->getParH(level)->typeOfGridNode[index] == GEO_FLUID) {
                 cellsVec.push_back(makeUbTuple(nodeCount - 2, nodeCount - 1));
             }
         }
diff --git a/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp
index 83f0a677b0012153cf079b466a333acc58bda6be..d325a0c9777954705d1b8eb5f848ac5207633641 100644
--- a/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp
@@ -16,14 +16,14 @@
 namespace NeighborDebugWriter
 {
 
-inline void writeNeighborLinkLines(Parameter *para, const int level, const uint numberOfNodes, const int direction,
+inline void writeNeighborLinkLines(Parameter *para, const int level, const unsigned long long numberOfNodes, const int direction,
                                    const std::string &name)
 {
     VF_LOG_INFO("Write node links in direction {}.", direction);
     std::vector<UbTupleFloat3> nodes(numberOfNodes * 2);
     std::vector<UbTupleInt2> cells(numberOfNodes);
 
-    for (uint position = 0; position < numberOfNodes; position++) {
+    for (size_t position = 0; position < numberOfNodes; position++) {
         if (para->getParH(level)->typeOfGridNode[position] != GEO_FLUID)
             continue;
 
@@ -31,7 +31,7 @@ inline void writeNeighborLinkLines(Parameter *para, const int level, const uint
         const double x2 = para->getParH(level)->coordinateY[position];
         const double x3 = para->getParH(level)->coordinateZ[position];
 
-        const uint positionNeighbor = getNeighborIndex(para->getParH(level).get(), position, direction);
+        const uint positionNeighbor = getNeighborIndex(para->getParH(level).get(), (uint)position, direction);
 
         const double x1Neighbor = para->getParH(level)->coordinateX[positionNeighbor];
         const double x2Neighbor = para->getParH(level)->coordinateY[positionNeighbor];
@@ -48,10 +48,10 @@ inline void writeNeighborLinkLines(Parameter *para, const int level, const uint
 inline void writeNeighborLinkLinesDebug(Parameter *para)
 {
     for (int level = 0; level <= para->getMaxLevel(); level++) {
-        for (int direction = vf::lbm::dir::STARTDIR; direction <= vf::lbm::dir::ENDDIR; direction++) {
+        for (size_t direction = vf::lbm::dir::STARTDIR; direction <= vf::lbm::dir::ENDDIR; direction++) {
             const std::string fileName = para->getFName() + "_" + StringUtil::toString<int>(level) + "_Link_" +
                                          std::to_string(direction) + "_Debug.vtk";
-            writeNeighborLinkLines(para, level, para->getParH(level)->numberOfNodes, direction, fileName);
+            writeNeighborLinkLines(para, level, para->getParH(level)->numberOfNodes, (int)direction, fileName);
         }
     }
 }
diff --git a/src/gpu/VirtualFluids_GPU/Output/PosWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/PosWriter.hpp
index 456f9c148c75c27fb899f976ba4f99b109fc3d4b..ce611d25d1aa3f9e98840a0f04d9b2045d0a224f 100644
--- a/src/gpu/VirtualFluids_GPU/Output/PosWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/PosWriter.hpp
@@ -33,9 +33,9 @@ public:
 			{
 				out.writeInteger(para->getParH(level)->numberOfNodes);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->numberOfNodes; u++)
+				for(size_t index = 0; index < para->getParH(level)->numberOfNodes; index++)
 				{
-					out.writeInteger(para->getParH(level)->typeOfGridNode[u]);
+					out.writeInteger(para->getParH(level)->typeOfGridNode[index]);
 				}
 				out.writeLine();
 			} //end levelloop
@@ -46,9 +46,9 @@ public:
 			{
 				out.writeInteger(para->getParH(level)->numberOfNodes);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->numberOfNodes; u++)
+                for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++)
 				{
-					out.writeInteger(para->getParH(level)->neighborX[u]);
+					out.writeInteger(para->getParH(level)->neighborX[index]);
 				}
 				out.writeLine();
 			} //end levelloop
@@ -59,9 +59,9 @@ public:
 			{
 				out.writeInteger(para->getParH(level)->numberOfNodes);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->numberOfNodes; u++)
+                for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++)
 				{
-					out.writeInteger(para->getParH(level)->neighborY[u]);
+					out.writeInteger(para->getParH(level)->neighborY[index]);
 				}
 				out.writeLine();
 			} //end levelloop
@@ -72,9 +72,9 @@ public:
 			{
 				out.writeInteger(para->getParH(level)->numberOfNodes);
 				out.writeLine();
-				for(unsigned int u=0; u<para->getParH(level)->numberOfNodes; u++)
+                for (size_t index = 0; index < para->getParH(level)->numberOfNodes; index++)
 				{
-					out.writeInteger(para->getParH(level)->neighborZ[u]);
+					out.writeInteger(para->getParH(level)->neighborZ[index]);
 				}
 				out.writeLine();
 			} //end levelloop
diff --git a/src/gpu/VirtualFluids_GPU/Output/UnstructuredGridWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/UnstructuredGridWriter.hpp
index 81f2c028a6bbc7cd9c077571349f4f0465a08a05..f26b4e5795466a72aa1894de37bdb066b9ab9d04 100644
--- a/src/gpu/VirtualFluids_GPU/Output/UnstructuredGridWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/UnstructuredGridWriter.hpp
@@ -33,7 +33,7 @@ namespace UnstructuredGridWriter
 
 		bool neighborsFluid;
 
-		unsigned int allnodes = para->getParH(level)->numberOfNodes * 8;
+		unsigned long long allnodes = para->getParH(level)->numberOfNodes * 8;
 
 		nodes.resize(allnodes);
 		nodedata[0].resize(allnodes);
@@ -45,7 +45,7 @@ namespace UnstructuredGridWriter
 		unsigned int nodeCount = 0;
 		double nodeDeltaLevel = para->getParH(level)->dx;
 
-		for (unsigned int pos=0;pos<para->getParH(level)->numberOfNodes;pos++)
+		for (size_t pos = 0; pos < para->getParH(level)->numberOfNodes; pos++)
 		{
 			if (para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID /*!= GEO_VOID*/)
 			{
@@ -197,9 +197,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if ( ((part+1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+			if ( ((part+1)*para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -340,9 +340,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if (((part + 1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+            if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -479,9 +479,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if (((part + 1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+            if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -628,9 +628,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if (((part + 1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+            if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -771,9 +771,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if ( ((part+1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+            if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -896,10 +896,10 @@ namespace UnstructuredGridWriter
 		vector< vector< double > > nodedata(nodedatanames.size());
 
 		//printf("\n test for if... \n");
-		if (para->getParH(level)->numberOfNodes > limitOfNodes)
+        if ((uint)para->getParH(level)->numberOfNodes > limitOfNodes)
 		{
 			//printf("\n test in if I... \n");
-			unsigned int restOfNodes = para->getParH(level)->numberOfNodes - limitOfNodes;
+            unsigned int restOfNodes = (uint)para->getParH(level)->numberOfNodes - limitOfNodes;
 			//////////////////////////////////////////////////////////////////////////
 			//PART I
 			nodes.resize(limitOfNodes);
@@ -984,7 +984,7 @@ namespace UnstructuredGridWriter
 			nodedata[5].resize(restOfNodes);
 			//printf("\n test in if IV... \n");
 
-			for (unsigned int pos=limitOfNodes;pos<para->getParH(level)->numberOfNodes;pos++)
+			for (size_t pos = limitOfNodes; pos < para->getParH(level)->numberOfNodes; pos++)
 			{
 				if (para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID)
 				{
@@ -1055,7 +1055,7 @@ namespace UnstructuredGridWriter
 			nodedata[5].resize(para->getParH(level)->numberOfNodes);
 
 			//printf("\n test in else II... \n");
-			for (unsigned int pos=0;pos<para->getParH(level)->numberOfNodes;pos++)
+			for (size_t pos = 0; pos < para->getParH(level)->numberOfNodes; pos++)
 			{
 				if (para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID)
 				{
@@ -1148,7 +1148,7 @@ namespace UnstructuredGridWriter
 		unsigned int number1,number2,number3,number4,number5,number6,number7,number8;
 		bool neighborsFluid;
 		double vxmax = 0;
-		vector< vector< double > > nodedata(nodedatanames.size());
+		vector<vector<double>> nodedata(nodedatanames.size());
 
 		nodes.resize(para->getParH(level)->numberOfNodes);
 		nodedata[0].resize(para->getParH(level)->numberOfNodes);
@@ -1158,7 +1158,7 @@ namespace UnstructuredGridWriter
 		nodedata[4].resize(para->getParH(level)->numberOfNodes);
 		nodedata[5].resize(para->getParH(level)->numberOfNodes);
 
-		for (unsigned int pos=0;pos<para->getParH(level)->numberOfNodes;pos++)
+		for (size_t pos = 0; pos < para->getParH(level)->numberOfNodes; pos++)
 		{
 			if (para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID)
 			{
@@ -1244,7 +1244,7 @@ namespace UnstructuredGridWriter
 		nodedata[4].resize(para->getParH(level)->numberOfNodes);
 		nodedata[5].resize(para->getParH(level)->numberOfNodes);
 
-		for (unsigned int pos=0;pos<para->getParH(level)->numberOfNodes;pos++)
+		for (size_t pos = 0; pos < para->getParH(level)->numberOfNodes; pos++)
 		{
 			if (para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID)
 			{
@@ -1342,9 +1342,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if ( ((part+1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+			if ( ((part+1)*para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -1364,7 +1364,7 @@ namespace UnstructuredGridWriter
 			nodedata[5].resize(sizeOfNodes);
 			//////////////////////////////////////////////////////////////////////////
 			//printf("\n test in if II... \n");
-			for (unsigned int pos=startpos;pos<endpos;pos++)
+			for (size_t pos = startpos; pos < endpos; pos++)
 			{
 				if (para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID)
 				{
@@ -1465,9 +1465,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if (((part + 1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+            if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -1595,9 +1595,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if (((part + 1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+            if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -1728,7 +1728,7 @@ namespace UnstructuredGridWriter
 		nodedatanames.push_back("geo");
 		unsigned int number1,number2,number3,number4,number5,number6,number7,number8;
 		bool neighborsFluid;
-		vector< vector< double > > nodedata(nodedatanames.size());
+		vector< vector<double>> nodedata(nodedatanames.size());
 
 		nodes.resize(para->getParH(level)->numberOfNodes);
 		nodedata[0].resize(para->getParH(level)->numberOfNodes);
@@ -1738,7 +1738,7 @@ namespace UnstructuredGridWriter
 		nodedata[4].resize(para->getParH(level)->numberOfNodes);
 		nodedata[5].resize(para->getParH(level)->numberOfNodes);
 
-		for (unsigned int pos=0;pos<para->getParH(level)->numberOfNodes;pos++)
+		for (size_t pos = 0; pos < para->getParH(level)->numberOfNodes; pos++)
 		{
 			if (para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID)
 			{
@@ -1825,7 +1825,7 @@ namespace UnstructuredGridWriter
 		nodedata[4].resize(para->getParH(level)->numberOfNodes);
 		nodedata[5].resize(para->getParH(level)->numberOfNodes);
 
-		for (unsigned int pos=0;pos<para->getParH(level)->numberOfNodes;pos++)
+		for (size_t pos = 0; pos < para->getParH(level)->numberOfNodes; pos++)
 		{
 			if (para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID)
 			{
@@ -1975,9 +1975,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if ( ((part+1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+            if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -2080,9 +2080,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if ( ((part+1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+            if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -2192,9 +2192,9 @@ namespace UnstructuredGridWriter
 			vxmax = 0;
 			//printf("\n test in if I... \n");
 			//////////////////////////////////////////////////////////////////////////
-			if ( ((part+1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->numberOfNodes)
+            if (((part + 1) * para->getlimitOfNodesForVTK()) > (uint)para->getParH(level)->numberOfNodes)
 			{
-				sizeOfNodes = para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
+                sizeOfNodes = (uint)para->getParH(level)->numberOfNodes - (part * para->getlimitOfNodesForVTK());
 			}
 			else
 			{
@@ -2319,7 +2319,7 @@ namespace UnstructuredGridWriter
 			wallX3 = 0.0;
 			q      = 0.0;
 			//////////////////////////////////////////////////////////////////////////
-			for (unsigned int typeOfQ = STARTDIR; typeOfQ <= ENDDIR; typeOfQ++)
+            for (size_t typeOfQ = vf::lbm::dir::STARTDIR; typeOfQ <= vf::lbm::dir::ENDDIR; typeOfQ++)
 			{
 				QQ = para->getParH(level)->geometryBC.q27[0];
 				Q.q27[typeOfQ] = &QQ[typeOfQ*sizeOfNodes];
@@ -2423,7 +2423,7 @@ namespace UnstructuredGridWriter
 			wallX3 = 0.0;
 			q      = 0.0;
 			//////////////////////////////////////////////////////////////////////////
-			for (unsigned int typeOfQ = STARTDIR; typeOfQ <= ENDDIR; typeOfQ++)
+            for (size_t typeOfQ = vf::lbm::dir::STARTDIR; typeOfQ <= vf::lbm::dir::ENDDIR; typeOfQ++)
 			{
 				QQ = para->getParH(level)->velocityBC.q27[0];
 				Q.q27[typeOfQ] = &QQ[typeOfQ*sizeOfNodes];
@@ -2528,7 +2528,7 @@ namespace UnstructuredGridWriter
 			wallX3 = 0.0;
 			q      = 0.0;
 			//////////////////////////////////////////////////////////////////////////
-			for (unsigned int typeOfQ = STARTDIR; typeOfQ <= ENDDIR; typeOfQ++)
+            for (size_t typeOfQ = vf::lbm::dir::STARTDIR; typeOfQ <= vf::lbm::dir::ENDDIR; typeOfQ++)
 			{
 				QQ = para->getParH(level)->pressureBC.q27[0];
 				Q.q27[typeOfQ] = &QQ[typeOfQ*sizeOfNodes];
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
index d1568932d9802d1060e37d26ed37fa48de1abb05..133b6dccf1dc45ee1cfa4ff1f29b4914cbeb6131 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp
@@ -502,10 +502,10 @@ void Parameter::initLBMSimulationParameter()
         parH[i]->sizePlaneXY      = parH[i]->nx * parH[i]->ny;
         parH[i]->sizePlaneYZ      = parH[i]->ny * parH[i]->nz;
         parH[i]->sizePlaneXZ      = parH[i]->nx * parH[i]->nz;
-        parH[i]->mem_size_real    = sizeof(real) * parH[i]->size_Mat;
-        parH[i]->mem_size_int     = sizeof(unsigned int) * parH[i]->size_Mat;
-        parH[i]->mem_size_bool    = sizeof(bool) * parH[i]->size_Mat;
-        parH[i]->mem_size_real_yz = sizeof(real) * parH[i]->ny * parH[i]->nz;
+//        parH[i]->mem_size_real    = sizeof(real) * parH[i]->size_Mat;         //DEPRECATED: related to full matrix
+//        parH[i]->mem_size_int     = sizeof(unsigned int) * parH[i]->size_Mat; //DEPRECATED: related to full matrix
+//        parH[i]->mem_size_bool    = sizeof(bool) * parH[i]->size_Mat;         //DEPRECATED: related to full matrix
+//        parH[i]->mem_size_real_yz = sizeof(real) * parH[i]->ny * parH[i]->nz; //DEPRECATED: related to full matrix
         parH[i]->isEvenTimestep        = true;
         parH[i]->startz           = parH[i]->gridNZ * ic.myProcessId;
         parH[i]->endz             = parH[i]->gridNZ * ic.myProcessId + parH[i]->gridNZ;
@@ -570,10 +570,10 @@ void Parameter::initLBMSimulationParameter()
         parD[i]->sizePlaneXY      = parH[i]->sizePlaneXY;
         parD[i]->sizePlaneYZ      = parH[i]->sizePlaneYZ;
         parD[i]->sizePlaneXZ      = parH[i]->sizePlaneXZ;
-        parD[i]->mem_size_real    = sizeof(real) * parD[i]->size_Mat;
-        parD[i]->mem_size_int     = sizeof(unsigned int) * parD[i]->size_Mat;
-        parD[i]->mem_size_bool    = sizeof(bool) * parD[i]->size_Mat;
-        parD[i]->mem_size_real_yz = sizeof(real) * parD[i]->ny * parD[i]->nz;
+        //parD[i]->mem_size_real    = sizeof(real) * parD[i]->size_Mat;          //DEPRECATED: related to full matrix
+        //parD[i]->mem_size_int     = sizeof(unsigned int) * parD[i]->size_Mat;  //DEPRECATED: related to full matrix
+        //parD[i]->mem_size_bool    = sizeof(bool) * parD[i]->size_Mat;          //DEPRECATED: related to full matrix
+        //parD[i]->mem_size_real_yz = sizeof(real) * parD[i]->ny * parD[i]->nz;  //DEPRECATED: related to full matrix
         parD[i]->isEvenTimestep        = parH[i]->isEvenTimestep;
         parD[i]->startz           = parH[i]->startz;
         parD[i]->endz             = parH[i]->endz;
@@ -1730,22 +1730,22 @@ unsigned int Parameter::getSizeMat(int level)
 {
     return parH[level]->size_Mat;
 }
-unsigned int Parameter::getMemSizereal(int level)
-{
-    return parH[level]->mem_size_real;
-}
-unsigned int Parameter::getMemSizeInt(int level)
-{
-    return parH[level]->mem_size_int;
-}
-unsigned int Parameter::getMemSizeBool(int level)
-{
-    return parH[level]->mem_size_bool;
-}
-unsigned int Parameter::getMemSizerealYZ(int level)
-{
-    return parH[level]->mem_size_real_yz;
-}
+//unsigned int Parameter::getMemSizereal(int level)      //DEPRECATED: related to full matrix
+//{
+//    return parH[level]->mem_size_real;
+//}
+//unsigned int Parameter::getMemSizeInt(int level)     //DEPRECATED: related to full matrix
+//{
+//    return parH[level]->mem_size_int;
+//}
+//unsigned int Parameter::getMemSizeBool(int level)    //DEPRECATED: related to full matrix
+//{
+//    return parH[level]->mem_size_bool;
+//}
+//unsigned int Parameter::getMemSizerealYZ(int level)  //DEPRECATED: related to full matrix
+//{
+//    return parH[level]->mem_size_real_yz;
+//}
 int Parameter::getFine()
 {
     return fine;
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
index 86b7bc2a058d69ba878d4445953a4dc56e524027..2e6d99fa6be200dd8c68af9371f655d7b1d827a1 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
@@ -67,16 +67,78 @@ struct LBMSimulationParameter {
     //////////////////////////////////////////////////////////////////////////
     //! \brief stores the number of threads per GPU block
     uint numberofthreads;
+    //! \brief store all distribution functions for the D3Q27
+    Distributions27 distributions;
+    //////////////////////////////////////////////////////////////////////////
+    //! \brief stores the type for every lattice node (f.e. fluid node)
+    uint *typeOfGridNode;
+    //////////////////////////////////////////////////////////////////////////
+    //! \brief store the neighbors in +X, +Y, +Z, and in diagonal negative direction
+    //! \brief this information is important because we use an indirect addressing scheme
+    uint *neighborX, *neighborY, *neighborZ, *neighborInverse;
+    //////////////////////////////////////////////////////////////////////////
+    //! \brief store the coordinates for every lattice node
+    real *coordinateX, *coordinateY, *coordinateZ;
+    //////////////////////////////////////////////////////////////////////////
+    //! \brief store the macroscopic values (velocity, density, pressure)
+    //! \brief for every lattice node
+    real *velocityX, *velocityY, *velocityZ, *rho, *pressure;
+    //! \brief stores the value for omega
+    real omega;
+    //////////////////////////////////////////////////////////////////////////
+    //! \brief stores the number of nodes (based on indirect addressing scheme)
+    unsigned long long numberOfNodes;
+    //! \brief stores the size of the memory consumption for real/int values of the arrays (e.g. coordinates, velocity)
+    unsigned long long memSizeRealLBnodes, memSizeLonglongLBnodes;
+
+
+
+
+
+
+    //////////////////////////////////////////////////////////////////////////
+    // DEPRECATED
+    //////////////////////////////////////////////////////////////////////////
 
     // distributions///////////
     // Distributions19 d0;
     Distributions27 d0;  // DEPRECATED: distribution functions for full matrix (not sparse)
-    //! \brief store all distribution functions for the D3Q27
-    Distributions27 distributions;
+
+    // typeOfGridNode (formerly known as "geo") /////////////////////
+    int *geo; // DEPRECATED: typeOfGridNode for full matrix (not sparse)
+
+    // k///////////////////////
+    unsigned int *k; // DEPRECATED: index for full matrix
+
+    // memsize/////////////////
+    //unsigned int mem_size_real_yz;
+    //unsigned int mem_size_bool;
+    //unsigned int mem_size_int;
+    //unsigned int mem_size_real;
+
+    //////////////////////////////////////////////////////////////////////////
+
+
+
+
+
+    //////////////////////////////////////////////////////////////////////////
+    // additional logic 
+    //////////////////////////////////////////////////////////////////////////
 
     // distributions F3////////
     Distributions6 g6;
 
+    unsigned int size_Array_SP;
+
+
+    // memsizeSP/////////////////
+
+
+
+    //////////////////////////////////////////////////////////////////////////
+
+
     // advection diffusion //////////////////
     //! \brief store all distribution functions for the D3Q7 advection diffusion field
     Distributions7 distributionsAD7;
@@ -106,22 +168,6 @@ struct LBMSimulationParameter {
     real cStartx, cStarty, cStartz;
     real cFx, cFy, cFz;
 
-    // typeOfGridNode (formerly known as "geo") /////////////////////
-    int *geo; // DEPRECATED: typeOfGridNode for full matrix (not sparse)
-    //! \brief stores the type for every lattice node (f.e. fluid node)
-    unsigned int *typeOfGridNode;
-
-    // k///////////////////////
-    unsigned int *k; // DEPRECATED: index for full matrix
-
-    // neighbor///////////////////////////////////////////////////////////////
-    //! \brief store the neighbors in +X, +Y, +Z, and in diagonal negative direction
-    //! \brief this information is important because we use an indirect addressing scheme
-    uint *neighborX, *neighborY, *neighborZ, *neighborInverse;
-
-    // coordinates////////////////////////////////////////////////////////////
-    //! \brief store the coordinates for every lattice node
-    real *coordinateX, *coordinateY, *coordinateZ;
 
     // body forces////////////
     real *forceX_SP, *forceY_SP, *forceZ_SP;
@@ -140,11 +186,6 @@ struct LBMSimulationParameter {
 
     // macroscopic values//////
     // real *vx, *vy, *vz, *rho;  // DEPRECATED: macroscopic values for full matrix
-    //! \brief store the macroscopic values (velocity, density, pressure)
-    //! \brief for every lattice node
-    real *velocityX, *velocityY, *velocityZ, *rho, *pressure;
-    //! \brief stores the value for omega
-    real omega;
     //! \brief stores the value for viscosity (on level 0)
     real vis;
 
@@ -165,11 +206,6 @@ struct LBMSimulationParameter {
     unsigned int size_Mat;
     unsigned int sizePlaneXY, sizePlaneYZ, sizePlaneXZ;
 
-    // size of sparse matrix//////////
-    //! \brief stores the number of nodes (based on indirect addressing scheme)
-    unsigned int numberOfNodes;
-    unsigned int size_Array_SP;
-
     // size of Plane btw. 2 GPUs//////
     unsigned int sizePlaneSB, sizePlaneRB, startB, endB;
     unsigned int sizePlaneST, sizePlaneRT, startT, endT;
@@ -182,16 +218,6 @@ struct LBMSimulationParameter {
     unsigned int sizePlanePressOUT, startPOUT;
     bool isSetPress;
 
-    // memsizeSP/////////////////
-    //! \brief stores the size of the memory consumption for real/int values of the arrays (e.g. coordinates, velocity)
-    unsigned int mem_size_real_SP;
-    unsigned int mem_size_int_SP;
-
-    // memsize/////////////////
-    unsigned int mem_size_real;
-    unsigned int mem_size_int;
-    unsigned int mem_size_bool;
-    unsigned int mem_size_real_yz;
 
     // print///////////////////
     unsigned int startz, endz;
@@ -739,10 +765,10 @@ public:
     unsigned int getPressOutID();
     unsigned int getPressInZ();
     unsigned int getPressOutZ();
-    unsigned int getMemSizereal(int level);
-    unsigned int getMemSizeInt(int level);
-    unsigned int getMemSizeBool(int level);
-    unsigned int getMemSizerealYZ(int level);
+//    unsigned int getMemSizereal(int level);    //DEPRECATED: related to full matrix
+//    unsigned int getMemSizeInt(int level);     //DEPRECATED: related to full matrix
+//    unsigned int getMemSizeBool(int level);    //DEPRECATED: related to full matrix
+//    unsigned int getMemSizerealYZ(int level);  //DEPRECATED: related to full matrix
     unsigned int getSizeMat(int level);
     unsigned int getTimestepStart();
     unsigned int getTimestepInit();
diff --git a/src/gpu/VirtualFluids_GPU/Particles/Particles.cpp b/src/gpu/VirtualFluids_GPU/Particles/Particles.cpp
index 7c710f50afb0ae07edd53ef9d68e294c7af54ac1..e0156e3fbae46282baeb1359c719a077f021cf6b 100644
--- a/src/gpu/VirtualFluids_GPU/Particles/Particles.cpp
+++ b/src/gpu/VirtualFluids_GPU/Particles/Particles.cpp
@@ -141,12 +141,12 @@ void initParticles(Parameter* para)
 			para->getParH(lev)->plp.coordZabsolut[i] = (real)zCoordVec[i]; 
 
 			// find IDs
-			for (unsigned int ii = 0; ii < para->getParH(lev)->numberOfNodes; ii++)
+			for (size_t index = 0; index < para->getParH(lev)->numberOfNodes; index++)
 			{
-				if ((para->getParH(lev)->coordinateX[ii] <= para->getParH(lev)->plp.coordXabsolut[i]) &&
-					((para->getParH(lev)->plp.coordXabsolut[i] - para->getParH(lev)->coordinateX[ii]) <= dx))
+				if ((para->getParH(lev)->coordinateX[index] <= para->getParH(lev)->plp.coordXabsolut[i]) &&
+					((para->getParH(lev)->plp.coordXabsolut[i] - para->getParH(lev)->coordinateX[index]) <= dx))
 				{
-					tempID.push_back(ii);
+					tempID.push_back((int)index);
 				}
 			}
 
@@ -455,7 +455,7 @@ void rearrangeGeometry(Parameter* para, CudaMemoryManager* cudaMemoryManager)
 		int counter2 = 0;
 		//////////////////////////////////////////////////////////////////////////
 		//redefine fluid nodes
-		for (uint index = 0; index < para->getParH(lev)->numberOfNodes; index++)
+		for (size_t index = 0; index < para->getParH(lev)->numberOfNodes; index++)
 		{
 			if (para->getParH(lev)->typeOfGridNode[index] == GEO_FLUID_OLD)
 			{
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu
index 626e3bc0b745a8f8b029afb38028c81bd8d659e7..8722c9e8f717bc9947daed734c2132f9281ebc88 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu
@@ -496,14 +496,14 @@ void ActuatorFarm::initBoundingSpheres(Parameter* para, CudaMemoryManager* cudaM
         uint minimumNumberOfNodesPerSphere = (uint)(c4o3*cPi*pow(sphereRadius-this->deltaX, c3o1)/pow(this->deltaX, c3o1));
         uint nodesInThisSphere = 0;
 
-        for (uint j = 1; j <= para->getParH(this->level)->numberOfNodes; j++)
+        for (size_t pos = 1; pos <= para->getParH(this->level)->numberOfNodes; pos++)
         {
-            const real distX = para->getParH(this->level)->coordinateX[j]-posX;
-            const real distY = para->getParH(this->level)->coordinateY[j]-posY;
-            const real distZ = para->getParH(this->level)->coordinateZ[j]-posZ;
+            const real distX = para->getParH(this->level)->coordinateX[pos]-posX;
+            const real distY = para->getParH(this->level)->coordinateY[pos]-posY;
+            const real distZ = para->getParH(this->level)->coordinateZ[pos]-posZ;
             if(distSqrd(distX,distY,distZ) < sphereRadiusSqrd) 
             {
-                nodesInSpheres.push_back(j);
+                nodesInSpheres.push_back((int)pos);
                 nodesInThisSphere++;
             }
         }
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h
index f771ce10cdfe81237ae1caa8a26f887488839aa4..8e21cdb6b21efd323f6723e21d6b28614109f1ec 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h
@@ -44,10 +44,7 @@ public:
             throw std::runtime_error("ActuatorFarm::ActuatorFarm: epsilon needs to be larger than dx!");
     }
 
-    virtual  ~ActuatorFarm()
-    {
-        
-    }
+    ~ActuatorFarm() override = default;
     void addTurbine(real turbinePosX, real turbinePosY, real turbinePosZ, real diameter, real omega, real azimuth, real yaw, std::vector<real> bladeRadii);
     void init(Parameter* para, GridProvider* gridProvider, CudaMemoryManager* cudaManager) override;
     void interact(Parameter* para, CudaMemoryManager* cudaManager, int level, uint t) override;
@@ -197,4 +194,4 @@ private:
     int streamIndex;
 };
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu
index aacb1721ad90e9178b3c2ccf49a2aa9ec79d5504..c6d17be97ec9a3c178b9aeb6a3db44ebeb9cf0a8 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu
@@ -128,12 +128,12 @@ void PrecursorWriter::init(Parameter* para, GridProvider* gridProvider, CudaMemo
         std::vector<int> indicesOnPlane;
         std::vector<real> coordY, coordZ;
 
-        for(uint j=1; j<para->getParH(level)->numberOfNodes; j++ )
+        for(size_t pos = 1; pos < para->getParH(level)->numberOfNodes; pos++ )
         {
-            real pointCoordX = para->getParH(level)->coordinateX[j];
-            real pointCoordY = para->getParH(level)->coordinateY[j];
-            real pointCoordZ = para->getParH(level)->coordinateZ[j];
-            if( para->getParH(level)->typeOfGridNode[j] == GEO_FLUID &&
+            real pointCoordX = para->getParH(level)->coordinateX[pos];
+            real pointCoordY = para->getParH(level)->coordinateY[pos];
+            real pointCoordZ = para->getParH(level)->coordinateZ[pos];
+            if( para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID &&
                 pointCoordX < (dx+xPos) && pointCoordX >= xPos       &&
                 pointCoordY<=yMax && pointCoordY>=yMin               && 
                 pointCoordZ<=zMax && pointCoordZ>=zMin)
@@ -143,7 +143,7 @@ void PrecursorWriter::init(Parameter* para, GridProvider* gridProvider, CudaMemo
 
                 lowestY = min(lowestY, pointCoordY);
                 lowestZ = min(lowestZ, pointCoordZ);
-                indicesOnGrid.push_back(j);    
+                indicesOnGrid.push_back((uint)pos);    
                 coordY.push_back(pointCoordY);            
                 coordZ.push_back(pointCoordZ);    
             }
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.h b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.h
index 3959fb2d8f5e719084d2d55e6f6ef84076383b45..3bae63a339255f3f72196e20096f6019cdd7748d 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.h
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.h
@@ -158,4 +158,4 @@ private:
     uint writePrecision = 8;
 };
 
-#endif //PRECURSORPROBE_H_
\ No newline at end of file
+#endif //PRECURSORPROBE_H_
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlanarAverageProbe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlanarAverageProbe.cu
index 210bde9e05979f6fb6551b8a9a4e53f26f733249..ac4177bf1d153f5f950d639bbd0818615aa716e1 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlanarAverageProbe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlanarAverageProbe.cu
@@ -238,7 +238,7 @@ void PlanarAverageProbe::findPoints(Parameter* para, GridProvider* gridProvider,
                                 }
 
     // Find all points along the normal direction
-    for(uint j=1; j<para->getParH(level)->numberOfNodes; j++ )
+    for(size_t j = 1; j < para->getParH(level)->numberOfNodes; j++ )
     {
         if(para->getParH(level)->typeOfGridNode[j] == GEO_FLUID)
         {   
@@ -253,16 +253,16 @@ void PlanarAverageProbe::findPoints(Parameter* para, GridProvider* gridProvider,
     std::sort(pointCoordsNormal->begin(), pointCoordsNormal->end());
     
     // Find all pointCoords in the first plane 
-    for(uint j=1; j<para->getParH(level)->numberOfNodes; j++ )
+    for(size_t pos = 1; pos < para->getParH(level)->numberOfNodes; pos++ )
     {
-        if( para->getParH(level)->typeOfGridNode[j] == GEO_FLUID && pointCoordsNormal_par[j] == pointCoordsNormal->at(0)) 
+        if( para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID && pointCoordsNormal_par[pos] == pointCoordsNormal->at(0)) 
         {
             //not needed in current state, might become relevant for two-point correlations
             // pointCoordsNormal->push_back( pointCoordsNormal_par[j] ); 
             // pointCoordsInplane1->push_back( pointCoordsInplane1_par[j] );
             // pointCoordsInplane2->push_back( pointCoordsInplane2_par[j] );
 
-            probeIndices_level.push_back(j);
+            probeIndices_level.push_back((int)pos);
         }
     }
 }
@@ -272,12 +272,20 @@ void PlanarAverageProbe::findPoints(Parameter* para, GridProvider* gridProvider,
 void PlanarAverageProbe::calculateQuantities(SPtr<ProbeStruct> probeStruct, Parameter* para, uint t_level, int level)
 {   
     // Compute macroscopic variables in entire domain
-    CalcMacCompSP27(para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ,
-                    para->getParD(level)->rho, para->getParD(level)->pressure, para->getParD(level)->typeOfGridNode,
-                    para->getParD(level)->neighborX, para->getParD(level)->neighborY,
-                    para->getParD(level)->neighborZ, para->getParD(level)->numberOfNodes,
-                    para->getParD(level)->numberofthreads, para->getParD(level)->distributions.f[0],
-                    para->getParD(level)->isEvenTimestep);
+    CalcMacCompSP27(
+        para->getParD(level)->velocityX, 
+        para->getParD(level)->velocityY, 
+        para->getParD(level)->velocityZ,
+        para->getParD(level)->rho, 
+        para->getParD(level)->pressure, 
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->neighborX, 
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ, 
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->numberofthreads, 
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->isEvenTimestep);
     getLastCudaError("In PlanarAverageProbe Kernel CalcMacSP27 execution failed");
 
     // Definition of normal and inplane directions for moveIndices kernels
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.cu
index d68f700130599909ae23b843c5fd03c490be229d..19f7f6c62ae7ac83c90fc2a7aff0e286a70063d1 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.cu
@@ -76,11 +76,11 @@ void PlaneProbe::findPoints(Parameter* para, GridProvider* gridProvider, std::ve
                             int level)
 {
     real dx = abs(para->getParH(level)->coordinateX[1]-para->getParH(level)->coordinateX[para->getParH(level)->neighborX[1]]);
-    for(uint j=1; j<para->getParH(level)->numberOfNodes; j++ )
+    for(size_t pos = 1; pos < para->getParH(level)->numberOfNodes; pos++ )
     {
-        real pointCoordX = para->getParH(level)->coordinateX[j];
-        real pointCoordY = para->getParH(level)->coordinateY[j];
-        real pointCoordZ = para->getParH(level)->coordinateZ[j];
+        real pointCoordX = para->getParH(level)->coordinateX[pos];
+        real pointCoordY = para->getParH(level)->coordinateY[pos];
+        real pointCoordZ = para->getParH(level)->coordinateZ[pos];
         real distX = pointCoordX - this->posX;
         real distY = pointCoordY - this->posY;
         real distZ = pointCoordZ - this->posZ;
@@ -88,7 +88,7 @@ void PlaneProbe::findPoints(Parameter* para, GridProvider* gridProvider, std::ve
         if( distX <= this->deltaX && distY <= this->deltaY && distZ <= this->deltaZ &&
             distX >=0.f && distY >=0.f && distZ >=0.f)
         {
-            probeIndices_level.push_back(j);
+            probeIndices_level.push_back((int)pos);
             distX_level.push_back( distX/dx );
             distY_level.push_back( distY/dx );
             distZ_level.push_back( distZ/dx );
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.cu
index fe1df85f74a79a5a862783d526c9ae6176321cb8..19c170608a606227d21c25791776bd3195b16e04 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.cu
@@ -75,20 +75,20 @@ void PointProbe::findPoints(Parameter* para, GridProvider* gridProvider, std::ve
 {
 
     real dx = abs(para->getParH(level)->coordinateX[1]-para->getParH(level)->coordinateX[para->getParH(level)->neighborX[1]]);
-    for(uint j=1; j<para->getParH(level)->numberOfNodes; j++ )
+    for(size_t pos = 1; pos < para->getParH(level)->numberOfNodes; pos++ )
     {    
         for(uint point=0; point<this->pointCoordsX.size(); point++)
         {
             real pointCoordX = this->pointCoordsX[point];
             real pointCoordY = this->pointCoordsY[point];
             real pointCoordZ = this->pointCoordsZ[point];
-            real distX = pointCoordX-para->getParH(level)->coordinateX[j];
-            real distY = pointCoordY-para->getParH(level)->coordinateY[j];
-            real distZ = pointCoordZ-para->getParH(level)->coordinateZ[j];
+            real distX = pointCoordX-para->getParH(level)->coordinateX[pos];
+            real distY = pointCoordY-para->getParH(level)->coordinateY[pos];
+            real distZ = pointCoordZ-para->getParH(level)->coordinateZ[pos];
             if( distX <=dx && distY <=dx && distZ <=dx &&
                 distX >0.f && distY >0.f && distZ >0.f)
             {
-                probeIndices_level.push_back(j);
+                probeIndices_level.push_back((int)pos);
                 distX_level.push_back( distX/dx );
                 distY_level.push_back( distY/dx );
                 distZ_level.push_back( distZ/dx );
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu
index 7ff2c4e3c6cab01d77c092414a3d0235fa1e6153..d2ed278a83babaae464dc4e4b039cabd6532fe13 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu
@@ -117,11 +117,11 @@ void WallModelProbe::findPoints(Parameter* para, GridProvider* gridProvider, std
     {
         if (!para->getIsBodyForce()) throw std::runtime_error("WallModelProbe::findPoints(): bodyforce not allocated!");
         // Find all fluid nodes
-        for(uint j=1; j<para->getParH(level)->numberOfNodes; j++ )
+        for(size_t pos = 1; pos < para->getParH(level)->numberOfNodes; pos++ )
         {
-            if( para->getParH(level)->typeOfGridNode[j] == GEO_FLUID) 
+            if( para->getParH(level)->typeOfGridNode[pos] == GEO_FLUID) 
             {
-                probeIndices_level.push_back(j);
+                probeIndices_level.push_back((int)pos);
             }
         }
     }
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD27/InitCompAD27.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD27/InitCompAD27.cu
index e43fb54a6b56b4d9a501269544cea000df31cdb7..60dbb2228e6d01fdabf7a6e1bfca786e2104d5b0 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD27/InitCompAD27.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD27/InitCompAD27.cu
@@ -2,6 +2,7 @@
 
 #include "InitCompAD27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<PreProcessorStrategy> InitCompAD27::getNewInstance(std::shared_ptr<Parameter> para)
 {
@@ -10,36 +11,21 @@ std::shared_ptr<PreProcessorStrategy> InitCompAD27::getNewInstance(std::shared_p
 
 void InitCompAD27::init(int level)
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Init_Comp_AD_27 << < grid, threads >> >(	para->getParD(level)->neighborX,
-											para->getParD(level)->neighborY,
-											para->getParD(level)->neighborZ,
-											para->getParD(level)->typeOfGridNode,
-											para->getParD(level)->Conc,
-											para->getParD(level)->velocityX,
-											para->getParD(level)->velocityY,
-											para->getParD(level)->velocityZ,
-											para->getParD(level)->numberOfNodes,
-											para->getParD(level)->distributionsAD27.f[0],
-											para->getParD(level)->isEvenTimestep);
-	getLastCudaError("InitAD27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Init_Comp_AD_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->Conc,
+        para->getParD(level)->velocityX,
+        para->getParD(level)->velocityY,
+        para->getParD(level)->velocityZ,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->distributionsAD27.f[0],
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Init_Comp_AD_27 execution failed");
 }
 
 bool InitCompAD27::checkParameter()
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD7/InitCompAD7.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD7/InitCompAD7.cu
index 8a53dff5c14adef69aa012bdf1d870d62a9749b2..8097ee13d9064c4104ead8cd8eb5ba529d8972fc 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD7/InitCompAD7.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompAD7/InitCompAD7.cu
@@ -2,6 +2,7 @@
 
 #include "InitCompAD7_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<InitCompAD7> InitCompAD7::getNewInstance(std::shared_ptr<Parameter> para)
 {
@@ -10,36 +11,21 @@ std::shared_ptr<InitCompAD7> InitCompAD7::getNewInstance(std::shared_ptr<Paramet
 
 void InitCompAD7::init(int level)
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Init_Comp_AD_7 << < grid, threads >> >(	para->getParD(level)->neighborX,
-										para->getParD(level)->neighborY,
-										para->getParD(level)->neighborZ,
-										para->getParD(level)->typeOfGridNode,
-										para->getParD(level)->Conc,
-										para->getParD(level)->velocityX,
-										para->getParD(level)->velocityY,
-										para->getParD(level)->velocityZ,
-										para->getParD(level)->numberOfNodes,
-										para->getParD(level)->distributionsAD7.f[0],
-										para->getParD(level)->isEvenTimestep);
-	getLastCudaError("InitAD7 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Init_Comp_AD_7 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->Conc,
+        para->getParD(level)->velocityX,
+        para->getParD(level)->velocityY,
+        para->getParD(level)->velocityZ,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->distributionsAD7.f[0],
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Init_Comp_AD_7 execution failed");
 }
 
 bool InitCompAD7::checkParameter()
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompSP27/InitCompSP27.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompSP27/InitCompSP27.cu
index 23ec3e5293ec3a49bf632a720ab554d156dc9674..c4676f28f969e2db8ff7f1910ac784a1c0dab351 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompSP27/InitCompSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitCompSP27/InitCompSP27.cu
@@ -2,6 +2,7 @@
 
 #include "InitCompSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<PreProcessorStrategy> InitCompSP27::getNewInstance(std::shared_ptr<Parameter> para)
 {
@@ -10,27 +11,12 @@ std::shared_ptr<PreProcessorStrategy> InitCompSP27::getNewInstance(std::shared_p
 
 void InitCompSP27::init(int level)
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
 
     if( ! para->getUseInitNeq() )
     {
-        LB_Init_Comp_SP_27 <<< grid, threads >>> (para->getParD(level)->neighborX,
+        LB_Init_Comp_SP_27 <<< grid.grid, grid.threads >>> (
+            para->getParD(level)->neighborX,
             para->getParD(level)->neighborY,
             para->getParD(level)->neighborZ,
             para->getParD(level)->typeOfGridNode,
@@ -41,11 +27,12 @@ void InitCompSP27::init(int level)
             para->getParD(level)->numberOfNodes,
             para->getParD(level)->distributions.f[0],
             para->getParD(level)->isEvenTimestep);
-        getLastCudaError("LBInitSP27 execution failed");
+        getLastCudaError("LB_Init_Comp_SP_27 execution failed");
     }
     else
     {
-        LB_Init_Comp_Neq_SP_27 <<< grid, threads >>> (para->getParD(level)->neighborX,
+        LB_Init_Comp_Neq_SP_27 <<< grid.grid, grid.threads >>> (
+            para->getParD(level)->neighborX,
             para->getParD(level)->neighborY,
             para->getParD(level)->neighborZ,
             para->getParD(level)->neighborInverse,
@@ -59,7 +46,7 @@ void InitCompSP27::init(int level)
             para->getParD(level)->omega,
             para->getParD(level)->isEvenTimestep);
         cudaDeviceSynchronize();
-        getLastCudaError("LBInitNeqSP27 execution failed");
+        getLastCudaError("LB_Init_Comp_Neq_SP_27 execution failed");
     }
 
 
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitF3/InitF3.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitF3/InitF3.cu
index cb6b40b4371a206c6d1e031822338621c4907be1..14d6b725337aa8b9af279bf794ff1c0912516b64 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitF3/InitF3.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitF3/InitF3.cu
@@ -2,6 +2,7 @@
 
 #include "InitF3_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<PreProcessorStrategy> InitF3::getNewInstance(std::shared_ptr<Parameter> para)
 {
@@ -10,36 +11,21 @@ std::shared_ptr<PreProcessorStrategy> InitF3::getNewInstance(std::shared_ptr<Par
 
 void InitF3::init(int level)
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Init_F3 << < grid, threads >> >(	para->getParD(level)->neighborX,
-										para->getParD(level)->neighborY,
-										para->getParD(level)->neighborZ,
-										para->getParD(level)->typeOfGridNode,
-										para->getParD(level)->rho,
-										para->getParD(level)->velocityX,
-										para->getParD(level)->velocityY,
-										para->getParD(level)->velocityZ,
-										para->getParD(level)->numberOfNodes,
-										para->getParD(level)->g6.g[0],
-										para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LBInitF3 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Init_F3 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->rho,
+        para->getParD(level)->velocityX,
+        para->getParD(level)->velocityY,
+        para->getParD(level)->velocityZ,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->g6.g[0],
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Init_F3 execution failed");
 }
 
 bool InitF3::checkParameter()
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD27/InitIncompAD27.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD27/InitIncompAD27.cu
index 419ae80b96be57f8dc9c4ebecaccac0d435f00e0..ea700010960b11a1facdda18c35f220f43eb6a66 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD27/InitIncompAD27.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD27/InitIncompAD27.cu
@@ -2,6 +2,7 @@
 
 #include "InitIncompAD27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<PreProcessorStrategy> InitIncompAD27::getNewInstance(std::shared_ptr<Parameter> para)
 {
@@ -10,36 +11,21 @@ std::shared_ptr<PreProcessorStrategy> InitIncompAD27::getNewInstance(std::shared
 
 void InitIncompAD27::init(int level)
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Init_Incomp_AD_27 << < grid, threads >> >(	para->getParD(level)->neighborX,
-												para->getParD(level)->neighborY,
-												para->getParD(level)->neighborZ,
-												para->getParD(level)->typeOfGridNode,
-												para->getParD(level)->Conc,
-												para->getParD(level)->velocityX,
-												para->getParD(level)->velocityY,
-												para->getParD(level)->velocityZ,
-												para->getParD(level)->numberOfNodes,
-												para->getParD(level)->distributionsAD27.f[0],
-												para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LBInitIncompAD27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Init_Incomp_AD_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->Conc,
+        para->getParD(level)->velocityX,
+        para->getParD(level)->velocityY,
+        para->getParD(level)->velocityZ,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->distributionsAD27.f[0],
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Init_Incomp_AD_27 execution failed");
 }
 
 bool InitIncompAD27::checkParameter()
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD7/InitIncompAD7.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD7/InitIncompAD7.cu
index 795cd0496a207e0861e35e4f310481950a037caf..d7c08e6932cacf2fb5a946010c1855212f1631fc 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD7/InitIncompAD7.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitIncompAD7/InitIncompAD7.cu
@@ -2,6 +2,7 @@
 
 #include "InitIncompAD7_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<PreProcessorStrategy> InitIncompAD7::getNewInstance(std::shared_ptr<Parameter> para)
 {
@@ -10,36 +11,21 @@ std::shared_ptr<PreProcessorStrategy> InitIncompAD7::getNewInstance(std::shared_
 
 void InitIncompAD7::init(int level)
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);	
-
-	LB_Init_Incomp_AD_7 << < grid, threads >> >(	para->getParD(level)->neighborX,
-												para->getParD(level)->neighborY,
-												para->getParD(level)->neighborZ,
-												para->getParD(level)->typeOfGridNode,
-												para->getParD(level)->Conc,
-												para->getParD(level)->velocityX,
-												para->getParD(level)->velocityY,
-												para->getParD(level)->velocityZ,
-												para->getParD(level)->numberOfNodes,
-												para->getParD(level)->distributionsAD27.f[0],
-												para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LBInitIncompAD7 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Init_Incomp_AD_7 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->Conc,
+        para->getParD(level)->velocityX,
+        para->getParD(level)->velocityY,
+        para->getParD(level)->velocityZ,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->distributionsAD27.f[0],
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Init_Incomp_AD_7 execution failed");
 }
 
 bool InitIncompAD7::checkParameter()
diff --git a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitSP27/InitSP27.cu b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitSP27/InitSP27.cu
index 0538c7ab89eb750a40cfc47486dc0891d4493976..078ad24f24659bf10a3dc9ed90bfd62b5e021187 100644
--- a/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitSP27/InitSP27.cu
+++ b/src/gpu/VirtualFluids_GPU/PreProcessor/PreProcessorStrategy/InitSP27/InitSP27.cu
@@ -2,6 +2,7 @@
 
 #include "InitSP27_Device.cuh"
 #include "Parameter/Parameter.h"
+#include "cuda/CudaGrid.h"
 
 std::shared_ptr<PreProcessorStrategy> InitSP27::getNewInstance(std::shared_ptr<Parameter> para)
 {
@@ -10,36 +11,21 @@ std::shared_ptr<PreProcessorStrategy> InitSP27::getNewInstance(std::shared_ptr<P
 
 void InitSP27::init(int level)
 {
-	int numberOfThreads = para->getParD(level)->numberofthreads;
-	int size_Mat = para->getParD(level)->numberOfNodes;
-
-	int Grid = (size_Mat / numberOfThreads) + 1;
-	int Grid1, Grid2;
-	if (Grid>512)
-	{
-		Grid1 = 512;
-		Grid2 = (Grid / Grid1) + 1;
-	}
-	else
-	{
-		Grid1 = 1;
-		Grid2 = Grid;
-	}
-	dim3 grid(Grid1, Grid2);
-	dim3 threads(numberOfThreads, 1, 1);
-
-	LB_Init_SP_27 << < grid, threads >> >(	para->getParD(level)->neighborX,
-										para->getParD(level)->neighborY,
-										para->getParD(level)->neighborZ,
-										para->getParD(level)->typeOfGridNode,
-										para->getParD(level)->rho,
-										para->getParD(level)->velocityX,
-										para->getParD(level)->velocityY,
-										para->getParD(level)->velocityZ,
-										para->getParD(level)->numberOfNodes,
-										para->getParD(level)->distributions.f[0],
-										para->getParD(level)->isEvenTimestep);
-	getLastCudaError("LBInitSP27 execution failed");
+    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);
+
+    LB_Init_SP_27 <<< grid.grid, grid.threads >>>(
+        para->getParD(level)->neighborX,
+        para->getParD(level)->neighborY,
+        para->getParD(level)->neighborZ,
+        para->getParD(level)->typeOfGridNode,
+        para->getParD(level)->rho,
+        para->getParD(level)->velocityX,
+        para->getParD(level)->velocityY,
+        para->getParD(level)->velocityZ,
+        para->getParD(level)->numberOfNodes,
+        para->getParD(level)->distributions.f[0],
+        para->getParD(level)->isEvenTimestep);
+    getLastCudaError("LB_Init_SP_27 execution failed");
 }
 
 bool InitSP27::checkParameter()
diff --git a/src/gpu/VirtualFluids_GPU/Restart/RestartObject.cpp b/src/gpu/VirtualFluids_GPU/Restart/RestartObject.cpp
index a38535f7bdff0d87a5af74a69f0ed8255c647382..15813b7967a84e45f44eb4d286c41aa99c4ff343 100644
--- a/src/gpu/VirtualFluids_GPU/Restart/RestartObject.cpp
+++ b/src/gpu/VirtualFluids_GPU/Restart/RestartObject.cpp
@@ -9,12 +9,12 @@ void RestartObject::deserialize(const std::string &filename, std::shared_ptr<Par
 {
     deserialize_internal(filename);
 
-    for (int j = para->getCoarse(); j <= para->getFine(); j++) {
+    for (int index1 = para->getCoarse(); index1 <= para->getFine(); index1++) {
         std::vector<real> vec;
         fs.push_back(vec);
 
-        for (unsigned int i = 0; i < (para->getD3Qxx() * para->getParH(j)->numberOfNodes); i++) {
-            para->getParH(j)->distributions.f[0][i] = fs[j][i];
+        for (size_t index2 = 0; index2 < (para->getD3Qxx() * para->getParH(index1)->numberOfNodes); index2++) {
+            para->getParH(index1)->distributions.f[0][index2] = fs[index1][index2];
         }
     }
 }
@@ -24,15 +24,15 @@ void RestartObject::serialize(const std::string &filename, const std::shared_ptr
     if (fs.size() > 0) {
         clear(para);
     }
-    for (int j = para->getCoarse(); j <= para->getFine(); j++) {
+    for (int index1 = para->getCoarse(); index1 <= para->getFine(); index1++) {
         std::vector<real> vec;
         fs.push_back(vec);
 
-        for (unsigned int i = 0; i < (para->getD3Qxx() * para->getParH(j)->numberOfNodes); i++) {
-            if (UbMath::isNaN(para->getParH(j)->distributions.f[0][i])) {
-                fs[j].push_back((real)0.0);
+        for (size_t index2 = 0; index2 < (para->getD3Qxx() * para->getParH(index1)->numberOfNodes); index2++) {
+            if (UbMath::isNaN(para->getParH(index1)->distributions.f[0][index2])) {
+                fs[index1].push_back((real)0.0);
             } else {
-                fs[j].push_back(para->getParH(j)->distributions.f[0][i]);
+                fs[index1].push_back(para->getParH(index1)->distributions.f[0][index2]);
             }
         }
     }
diff --git a/src/lbm/constants/D3Q27.h b/src/lbm/constants/D3Q27.h
index 6a198e926477eff4534108686793400de3a7e042..c799331815ff92b41b3daf8433bcc10d026a8738 100644
--- a/src/lbm/constants/D3Q27.h
+++ b/src/lbm/constants/D3Q27.h
@@ -7,39 +7,91 @@
 namespace vf::lbm::dir
 {
 
-static constexpr int STARTDIR = 0;
-static constexpr int ENDDIR   = 26;
+static constexpr size_t STARTDIR = 0;
+static constexpr size_t ENDDIR = 26;
 
 // used in the CPU and the GPU version
-static constexpr int DIR_000 = 0;    // REST
-static constexpr int DIR_P00 = 1;    // E
-static constexpr int DIR_M00 = 2;    // W
-static constexpr int DIR_0P0 = 3;    // N
-static constexpr int DIR_0M0 = 4;    // S
-static constexpr int DIR_00P = 5;    // T
-static constexpr int DIR_00M = 6;    // B
-
-static constexpr int DIR_PP0 = 7;    // NE
-static constexpr int DIR_MM0 = 8;    // SW
-static constexpr int DIR_PM0 = 9;    // SE
-static constexpr int DIR_MP0 = 10;   // NW
-static constexpr int DIR_P0P = 11;   // TE
-static constexpr int DIR_M0M = 12;   // BW
-static constexpr int DIR_P0M = 13;   // BE
-static constexpr int DIR_M0P = 14;   // TW
-static constexpr int DIR_0PP = 15;   // TN
-static constexpr int DIR_0MM = 16;   // BS
-static constexpr int DIR_0PM = 17;   // BN
-static constexpr int DIR_0MP = 18;   // TS
-
-static constexpr int DIR_PPP = 19;   // TNE
-static constexpr int DIR_MPP = 20;   // TNW
-static constexpr int DIR_PMP = 21;   // TSE
-static constexpr int DIR_MMP = 22;   // TSW
-static constexpr int DIR_PPM = 23;   // BNE
-static constexpr int DIR_MPM = 24;   // BNW
-static constexpr int DIR_PMM = 25;   // BSE
-static constexpr int DIR_MMM = 26;   // BSW
+static constexpr size_t DIR_000 = 0;
+static constexpr size_t DIR_P00 = 1;
+static constexpr size_t DIR_M00 = 2;
+static constexpr size_t DIR_0P0 = 3;
+static constexpr size_t DIR_0M0 = 4;
+static constexpr size_t DIR_00P = 5;
+static constexpr size_t DIR_00M = 6;
+static constexpr size_t DIR_PP0 = 7;
+static constexpr size_t DIR_MM0 = 8;
+static constexpr size_t DIR_PM0 = 9;
+static constexpr size_t DIR_MP0 = 10;
+static constexpr size_t DIR_P0P = 11;
+static constexpr size_t DIR_M0M = 12;
+static constexpr size_t DIR_P0M = 13;
+static constexpr size_t DIR_M0P = 14;
+static constexpr size_t DIR_0PP = 15;
+static constexpr size_t DIR_0MM = 16;
+static constexpr size_t DIR_0PM = 17;
+static constexpr size_t DIR_0MP = 18;
+static constexpr size_t DIR_PPP = 19;
+static constexpr size_t DIR_MPP = 20;
+static constexpr size_t DIR_PMP = 21;
+static constexpr size_t DIR_MMP = 22;
+static constexpr size_t DIR_PPM = 23;
+static constexpr size_t DIR_MPM = 24;
+static constexpr size_t DIR_PMM = 25;
+static constexpr size_t DIR_MMM = 26;
+
+static constexpr size_t INV_P00 = DIR_M00;
+static constexpr size_t INV_M00 = DIR_P00;
+static constexpr size_t INV_0P0 = DIR_0M0;
+static constexpr size_t INV_0M0 = DIR_0P0;
+static constexpr size_t INV_00P = DIR_00M;
+static constexpr size_t INV_00M = DIR_00P;
+static constexpr size_t INV_PP0 = DIR_MM0;
+static constexpr size_t INV_MM0 = DIR_PP0;
+static constexpr size_t INV_PM0 = DIR_MP0;
+static constexpr size_t INV_MP0 = DIR_PM0;
+static constexpr size_t INV_P0P = DIR_M0M;
+static constexpr size_t INV_M0M = DIR_P0P;
+static constexpr size_t INV_P0M = DIR_M0P;
+static constexpr size_t INV_M0P = DIR_P0M;
+static constexpr size_t INV_0PP = DIR_0MM;
+static constexpr size_t INV_0MM = DIR_0PP;
+static constexpr size_t INV_0PM = DIR_0MP;
+static constexpr size_t INV_0MP = DIR_0PM;
+static constexpr size_t INV_PPP = DIR_MMM;
+static constexpr size_t INV_MPP = DIR_PMM;
+static constexpr size_t INV_PMP = DIR_MPM;
+static constexpr size_t INV_MMP = DIR_PPM;
+static constexpr size_t INV_PPM = DIR_MMP;
+static constexpr size_t INV_MPM = DIR_PMP;
+static constexpr size_t INV_PMM = DIR_MPP;
+static constexpr size_t INV_MMM = DIR_PPP;
+
+static constexpr size_t SGD_P00 = 0;
+static constexpr size_t SGD_M00 = 1;
+static constexpr size_t SGD_0P0 = 2;
+static constexpr size_t SGD_0M0 = 3;
+static constexpr size_t SGD_00P = 4;
+static constexpr size_t SGD_00M = 5;
+static constexpr size_t SGD_PP0 = 6;
+static constexpr size_t SGD_MM0 = 7;
+static constexpr size_t SGD_PM0 = 8;
+static constexpr size_t SGD_MP0 = 9;
+static constexpr size_t SGD_P0P = 10;
+static constexpr size_t SGD_M0M = 11;
+static constexpr size_t SGD_P0M = 12;
+static constexpr size_t SGD_M0P = 13;
+static constexpr size_t SGD_0PP = 14;
+static constexpr size_t SGD_0MM = 15;
+static constexpr size_t SGD_0PM = 16;
+static constexpr size_t SGD_0MP = 17;
+static constexpr size_t SGD_PPP = 18;
+static constexpr size_t SGD_MPP = 19;
+static constexpr size_t SGD_PMP = 20;
+static constexpr size_t SGD_MMP = 21;
+static constexpr size_t SGD_PPM = 22;
+static constexpr size_t SGD_MPM = 23;
+static constexpr size_t SGD_PMM = 24;
+static constexpr size_t SGD_MMM = 25;
 
 struct countersForPointerChasing{
     uint counterInverse;
@@ -48,7 +100,7 @@ struct countersForPointerChasing{
     uint counterZ;
 };
 
-const std::map<const int, const countersForPointerChasing> mapForPointerChasing = 
+const std::map<const size_t, const countersForPointerChasing> mapForPointerChasing = 
 {
     {DIR_000, countersForPointerChasing{0, 0, 0, 0}},
     {DIR_P00, countersForPointerChasing{0, 1, 0, 0}},
diff --git a/src/mpi/MPICommunicator.h b/src/mpi/MPICommunicator.h
index 96d7e3593acb6d94706c9842f176e96c7a0e8969..941bdac8f03d64184c17966ada27111193bbfa2d 100644
--- a/src/mpi/MPICommunicator.h
+++ b/src/mpi/MPICommunicator.h
@@ -142,16 +142,23 @@ void MPICommunicator::allGather(std::vector<T> &svalues, std::vector<T> &rvalues
 
     rvalues.resize(displs[numprocs - 1] + rcounts[numprocs - 1]);
 
-    if (rvalues.size() == 0) {
-        rvalues.resize(1);
-        rvalues[0] = 999;
+    T* sval = NULL;
+    T* rval = NULL;
+
+    if (svalues.size() > 0) {
+        //svalues.resize(1);
+        //svalues[0] = 999;
+        sval = &svalues[0];
     }
-    if (scount == 0) {
-        svalues.resize(1);
-        svalues[0] = 999;
+
+    if (rvalues.size() > 0) {
+        //rvalues.resize(1);
+        //rvalues[0] = 999;
+        rval = &rvalues[0];
     }
 
-    MPI_Allgatherv(&svalues[0], scount, mpiDataType, &rvalues[0], &rcounts[0], &displs[0], mpiDataType, comm);
+    //MPI_Allgatherv(&svalues[0], scount, mpiDataType, &rvalues[0], &rcounts[0], &displs[0], mpiDataType, comm);
+    MPI_Allgatherv(sval, scount, mpiDataType, rval, &rcounts[0], &displs[0], mpiDataType, comm);
 }
 //////////////////////////////////////////////////////////////////////////
 template <class T>
diff --git a/utilities/DirRename.py b/utilities/DirRename.py
new file mode 100644
index 0000000000000000000000000000000000000000..3f01e630a931ec98454c9ac620c3f18d92d7e59a
--- /dev/null
+++ b/utilities/DirRename.py
@@ -0,0 +1,181 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Dec  6 13:21:27 2022
+
+@author: kutscher
+"""
+
+filename = "d:/temp/MultiphaseNonReflectingOutflowBCAlgorithm.cpp"
+
+#read input file
+fin = open(filename, "rt")
+#read file contents to string
+data = fin.read()
+#replace all occurrences of the required string
+data = data.replace('[REST]','[DIR_000]')
+data = data.replace('[TNE]', '[DIR_PPP]')
+data = data.replace('[TNW]', '[DIR_MPP]')
+data = data.replace('[TSE]', '[DIR_PMP]')
+data = data.replace('[TSW]', '[DIR_MMP]')
+data = data.replace('[BNE]', '[DIR_PPM]')
+data = data.replace('[BNW]', '[DIR_MPM]')
+data = data.replace('[BSE]', '[DIR_PMM]')
+data = data.replace('[BSW]', '[DIR_MMM]')
+data = data.replace('[NE]',  '[DIR_PP0]')
+data = data.replace('[SW]',  '[DIR_MM0]')
+data = data.replace('[SE]',  '[DIR_PM0]')
+data = data.replace('[NW]',  '[DIR_MP0]')
+data = data.replace('[TE]',  '[DIR_P0P]')
+data = data.replace('[BW]',  '[DIR_M0M]')
+data = data.replace('[BE]',  '[DIR_P0M]')
+data = data.replace('[TW]',  '[DIR_M0P]')
+data = data.replace('[TN]',  '[DIR_0PP]')
+data = data.replace('[BS]',  '[DIR_0MM]')
+data = data.replace('[BN]',  '[DIR_0PM]')
+data = data.replace('[TS]',  '[DIR_0MP]')
+data = data.replace('[NE ]', '[DIR_PP0]')
+data = data.replace('[SW ]', '[DIR_MM0]')
+data = data.replace('[SE ]', '[DIR_PM0]')
+data = data.replace('[NW ]', '[DIR_MP0]')
+data = data.replace('[TE ]', '[DIR_P0P]')
+data = data.replace('[BW ]', '[DIR_M0M]')
+data = data.replace('[BE ]', '[DIR_P0M]')
+data = data.replace('[TW ]', '[DIR_M0P]')
+data = data.replace('[TN ]', '[DIR_0PP]')
+data = data.replace('[BS ]', '[DIR_0MM]')
+data = data.replace('[BN ]', '[DIR_0PM]')
+data = data.replace('[TS ]', '[DIR_0MP]')
+data = data.replace('[E]',   '[DIR_P00]')
+data = data.replace('[W]',   '[DIR_M00]')
+data = data.replace('[N]',   '[DIR_0P0]')
+data = data.replace('[S]',   '[DIR_0M0]')
+data = data.replace('[T]',   '[DIR_00P]')
+data = data.replace('[B]',   '[DIR_00M]')
+
+# data = data.replace('[REST]','[DIR_000]')
+# data = data.replace('[E  ]', '[DIR_P00]')
+# data = data.replace('[W  ]', '[DIR_M00]')
+# data = data.replace('[N  ]', '[DIR_0P0]')
+# data = data.replace('[S  ]', '[DIR_0M0]')
+# data = data.replace('[T  ]', '[DIR_00P]')
+# data = data.replace('[B  ]', '[DIR_00M]')
+# data = data.replace('[NE ]', '[DIR_PP0]')
+# data = data.replace('[SW ]', '[DIR_MM0]')
+# data = data.replace('[SE ]', '[DIR_PM0]')
+# data = data.replace('[NW ]', '[DIR_MP0]')
+# data = data.replace('[TE ]', '[DIR_P0P]')
+# data = data.replace('[BW ]', '[DIR_M0M]')
+# data = data.replace('[BE ]', '[DIR_P0M]')
+# data = data.replace('[TW ]', '[DIR_M0P]')
+# data = data.replace('[TN ]', '[DIR_0PP]')
+# data = data.replace('[BS ]', '[DIR_0MM]')
+# data = data.replace('[BN ]', '[DIR_0PM]')
+# data = data.replace('[TS ]', '[DIR_0MP]')
+# data = data.replace('[TNE]', '[DIR_PPP]')
+# data = data.replace('[TNW]', '[DIR_MPP]')
+# data = data.replace('[TSE]', '[DIR_PMP]')
+# data = data.replace('[TSW]', '[DIR_MMP]')
+# data = data.replace('[BNE]', '[DIR_PPM]')
+# data = data.replace('[BNW]', '[DIR_MPM]')
+# data = data.replace('[BSE]', '[DIR_PMM]')
+# data = data.replace('[BSW]', '[DIR_MMM]')
+
+# data = data.replace('D3Q27System::REST','[DIR_000]')
+# data = data.replace('D3Q27System::E', '[DIR_P00]')
+# data = data.replace('D3Q27System::W', '[DIR_M00]')
+# data = data.replace('D3Q27System::N', '[DIR_0P0]')
+# data = data.replace('D3Q27System::S', '[DIR_0M0]')
+# data = data.replace('D3Q27System::T', '[DIR_00P]')
+# data = data.replace('D3Q27System::B', '[DIR_00M]')
+# data = data.replace('D3Q27System::NE', '[DIR_PP0]')
+# data = data.replace('D3Q27System::SW', '[DIR_MM0]')
+# data = data.replace('D3Q27System::SE', '[DIR_PM0]')
+# data = data.replace('D3Q27System::NW', '[DIR_MP0]')
+# data = data.replace('D3Q27System::TE', '[DIR_P0P]')
+# data = data.replace('D3Q27System::BW', '[DIR_M0M]')
+# data = data.replace('D3Q27System::BE', '[DIR_P0M]')
+# data = data.replace('D3Q27System::TW', '[DIR_M0P]')
+# data = data.replace('D3Q27System::TN', '[DIR_0PP]')
+# data = data.replace('D3Q27System::BS', '[DIR_0MM]')
+# data = data.replace('D3Q27System::BN', '[DIR_0PM]')
+# data = data.replace('D3Q27System::TS', '[DIR_0MP]')
+# data = data.replace('D3Q27System::TNE', '[DIR_PPP]')
+# data = data.replace('D3Q27System::TNW', '[DIR_MPP]')
+# data = data.replace('D3Q27System::TSE', '[DIR_PMP]')
+# data = data.replace('D3Q27System::TSW', '[DIR_MMP]')
+# data = data.replace('D3Q27System::BNE', '[DIR_PPM]')
+# data = data.replace('D3Q27System::BNW', '[DIR_MPM]')
+# data = data.replace('D3Q27System::BSE', '[DIR_PMM]')
+# data = data.replace('D3Q27System::BSW', '[DIR_MMM]')
+
+data = data.replace('REST)','DIR_000)')
+data = data.replace('TNE)', 'DIR_PPP)')
+data = data.replace('TNW)', 'DIR_MPP)')
+data = data.replace('TSE)', 'DIR_PMP)')
+data = data.replace('TSW)', 'DIR_MMP)')
+data = data.replace('BNE)', 'DIR_PPM)')
+data = data.replace('BNW)', 'DIR_MPM)')
+data = data.replace('BSE)', 'DIR_PMM)')
+data = data.replace('BSW)', 'DIR_MMM)')
+data = data.replace('NE)',  'DIR_PP0)')
+data = data.replace('SW)',  'DIR_MM0)')
+data = data.replace('SE)',  'DIR_PM0)')
+data = data.replace('NW)',  'DIR_MP0)')
+data = data.replace('TE)',  'DIR_P0P)')
+data = data.replace('BW)',  'DIR_M0M)')
+data = data.replace('BE)',  'DIR_P0M)')
+data = data.replace('TW)',  'DIR_M0P)')
+data = data.replace('TN)',  'DIR_0PP)')
+data = data.replace('BS)',  'DIR_0MM)')
+data = data.replace('BN)',  'DIR_0PM)')
+data = data.replace('TS)',  'DIR_0MP)')
+data = data.replace('E)',   'DIR_P00)')
+data = data.replace('W)',   'DIR_M00)')
+data = data.replace('N)',   'DIR_0P0)')
+data = data.replace('S)',   'DIR_0M0)')
+data = data.replace('T)',   'DIR_00P)')
+data = data.replace('B)',   'DIR_00M)')
+
+# data = data.replace('REST','DIR_000')
+# data = data.replace('TNE', 'DIR_PPP')
+# data = data.replace('TNW', 'DIR_MPP')
+# data = data.replace('TSE', 'DIR_PMP')
+# data = data.replace('TSW', 'DIR_MMP')
+# data = data.replace('BNE', 'DIR_PPM')
+# data = data.replace('BNW', 'DIR_MPM')
+# data = data.replace('BSE', 'DIR_PMM')
+# data = data.replace('BSW', 'DIR_MMM')
+# data = data.replace('NE',  'DIR_PP0')
+# data = data.replace('SW',  'DIR_MM0')
+# data = data.replace('SE',  'DIR_PM0')
+# data = data.replace('NW',  'DIR_MP0')
+# data = data.replace('TE',  'DIR_P0P')
+# data = data.replace('BW',  'DIR_M0M')
+# data = data.replace('BE',  'DIR_P0M')
+# data = data.replace('TW',  'DIR_M0P')
+# data = data.replace('TN',  'DIR_0PP')
+# data = data.replace('BS',  'DIR_0MM')
+# data = data.replace('BN',  'DIR_0PM')
+# data = data.replace('TS',  'DIR_0MP')
+# data = data.replace('E',   'DIR_P00')
+# data = data.replace('W',   'DIR_M00')
+# data = data.replace('N',   'DIR_0P0')
+# data = data.replace('S',   'DIR_0M0')
+# data = data.replace('T',   'DIR_00P')
+# data = data.replace('B',   'DIR_00M')
+
+# text = 'bat::ball'
+
+# # replace b with c
+# replaced_text = text.replace('b', 'c')
+# print(replaced_text)
+
+
+#close the input file
+fin.close()
+#open the input file in write mode
+fin = open(filename, "wt")
+#overrite the input file with the resulting data
+fin.write(data)
+#close the file
+fin.close()
\ No newline at end of file