diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0903a6e50d3501f32141582df55736dd0a39ed2d..36970b16f74ac0005322ecee25646cefda1c16f2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -47,11 +47,10 @@ stages:
     - mkdir -p $CI_PROJECT_DIR/$BUILD_FOLDER
     - cd $CI_PROJECT_DIR/$BUILD_FOLDER
     - rm -r -f ./*
-    - cmake ..
+    - cmake .. -LAH
       --preset=all_make_ccache
       -DBUILD_WARNINGS_AS_ERRORS=ON
       -DCMAKE_CUDA_ARCHITECTURES=60
-    - cmake . -LAH
     - make -j4
     - ccache --show-stats
 
diff --git a/CMake/VirtualFluidsMacros.cmake b/CMake/VirtualFluidsMacros.cmake
index 23d5029d2dff46076c27158e4f15d0375bf8565f..2c2bc1d650e5e2c402f34a1a2547b9fa6f5e063b 100644
--- a/CMake/VirtualFluidsMacros.cmake
+++ b/CMake/VirtualFluidsMacros.cmake
@@ -131,18 +131,18 @@ function(vf_add_library)
     #################################################################
     ###   ADD TARGET                                              ###
     #################################################################
-    IF(${ARG_BUILDTYPE} MATCHES binary)
-        ADD_EXECUTABLE(${library_name} ${MY_SRCS} )
+    if(${ARG_BUILDTYPE} MATCHES binary)
+        add_executable(${library_name} ${MY_SRCS} )
         groupTarget(${library_name} ${appFolder})
-    ELSEIF(${ARG_BUILDTYPE} MATCHES shared)
-        ADD_LIBRARY(${library_name} SHARED ${MY_SRCS} )
+    elseif(${ARG_BUILDTYPE} MATCHES shared)
+        add_library(${library_name} SHARED ${MY_SRCS} )
         groupTarget(${library_name} ${libraryFolder})
-    ELSEIF(${ARG_BUILDTYPE} MATCHES static)
-        ADD_LIBRARY(${library_name} STATIC ${MY_SRCS} )
+        elseif(${ARG_BUILDTYPE} MATCHES static)
+        add_library(${library_name} STATIC ${MY_SRCS} )
         groupTarget(${library_name} ${libraryFolder})
-    ELSE()
-        MESSAGE(FATAL_ERROR "build_type=${ARG_BUILDTYPE} doesn't match BINARY, SHARED or STATIC")
-    ENDIF()
+    else()
+        message(FATAL_ERROR "build_type=${ARG_BUILDTYPE} doesn't match BINARY, SHARED or STATIC")
+    endif()
 
     # Set the output directory for build artifacts
     set_target_properties(${library_name}
@@ -152,6 +152,21 @@ function(vf_add_library)
             ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
             PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
 
+    # link time optimization
+    if(BUILD_VF_LTO)
+        if(NOT ${ARG_BUILDTYPE} MATCHES binary)
+            include(CheckIPOSupported)
+            check_ipo_supported(RESULT ipo_supported OUTPUT ipo_error LANGUAGES CXX)
+
+            if( ipo_supported )
+                status_lib("IPO / LTO enabled")
+                set_target_properties(${library_name} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE)
+            else()
+                status_lib("IPO / LTO not supported: <${ipo_error}>")
+            endif()
+        endif()
+    endif()
+
     # clang-tidy
     if(BUILD_VF_CLANG_TIDY)
         find_program(CLANG_TIDY_PROGRAM NAMES clang-tidy)
@@ -286,6 +301,7 @@ function(vf_add_tests)
     # link googlemock
     linkGMOCK()
 
+    # add the target to ctest
     gtest_add_tests(TARGET ${library_test_name})
 
 endfunction()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9685f4de572b180fa32766f6a15b87f4a8d3a922..d74febdac96544fa6f50b65602392d3c44a5ca10 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -51,6 +51,8 @@ option(BUILD_VF_INCLUDE_WHAT_YOU_USE "Add IWYU to the targets" OFF)
 option(BUILD_VF_CPPCHECK "Add cppcheck to the targets" OFF)
 option(BUILD_VF_COVERAGE "Add the -coverage compiler flag." OFF)
 
+option(BUILD_CUDA_LTO "Enables the cuda link optimization." OFF)
+
 option(BUILD_SHARED_LIBS "" OFF)
 option(BUILD_WARNINGS_AS_ERRORS "" OFF)
 
@@ -94,14 +96,36 @@ if(BUILD_VF_GPU)
 
     set(CMAKE_CUDA_STANDARD_REQUIRED TRUE)
 
+    enable_language(CUDA)
+
+
     if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
         message(WARNING "CMAKE_CUDA_ARCHITECTURES was not defined and is set to 30 (CUDA support until 10.1 only).")
         set(CMAKE_CUDA_ARCHITECTURES 30)
     endif()
 
+
+    if(BUILD_CUDA_LTO)
+        
+       if(CMAKE_CUDA_ARCHITECTURES LESS 50)
+            message(FATAL_ERROR "CUDA Link time optimization requires CUDA 11.2 and CC 5.0.")
+       else()
+
+        set(CMAKE_CUDA_FLAGS "-dlto -arch=sm_${CMAKE_CUDA_ARCHITECTURES}")
+        set(CMAKE_CUDA_ARCHITECTURES OFF)
+
+        list(APPEND VF_COMPILER_DEFINITION BUILD_CUDA_LTO)
+
+       endif()
+    endif()
+
+    set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --extended-lambda")
+
+    message("CMAKE_CUDA_FLAGS: ${CMAKE_CUDA_FLAGS}")
     message("CUDA Architecture: ${CMAKE_CUDA_ARCHITECTURES}")
 endif()
 
+
 #################################################################################
 #  COMMON LIBRARIES
 #################################################################################
@@ -119,6 +143,7 @@ find_package(MPI REQUIRED)
 
 
 add_subdirectory(src/basics)
+add_subdirectory(src/lbm)
 
 
 #################################################################################
diff --git a/CMakePresets.json b/CMakePresets.json
index 6863446af85b177bb4dc99eed475aa52f4d50269..6527d5c1f4feba60064b1473fa12dbb2331279aa 100644
--- a/CMakePresets.json
+++ b/CMakePresets.json
@@ -1,133 +1,179 @@
 {
-  "version": 1,
-  "cmakeMinimumRequired": {
-    "major": 3,
-    "minor": 19,
-    "patch": 0
-  },
-  "configurePresets": [
-    {
-      "name": "default",
-      "hidden": true,
-      "binaryDir": "${sourceDir}/build/",
-      "cacheVariables": {
-        "BUILD_VF_UNIT_TESTS": "ON"
-      }
-    },
-    {
-      "name": "default_make",
-      "inherits": "default",
-      "hidden": true,
-      "generator": "Unix Makefiles"
-    },
-    {
-      "name": "default_ccache_make",
-      "inherits": "default_make",
-      "hidden": true,
-      "cacheVariables": {
-        "CMAKE_CXX_COMPILER_LAUNCHER": "ccache",
-        "CMAKE_CUDA_COMPILER_LAUNCHER": "ccache",
-        "CMAKE_C_COMPILER_LAUNCHER": "ccache"
-      }
-    },
-    {
-      "name": "default_msvc",
-      "inherits": "default",
-      "hidden": true,
-      "generator": "Visual Studio 16 2019",
-      "architecture": "x64"
-    },
-    {
-      "name": "default_cpu",
-      "hidden": true,
-      "description": "CPU build of VirtualFluids",
-      "cacheVariables": {
-        "BUILD_VF_CPU": "ON"
-      }
-    },
-    {
-      "name": "default_gpu",
-      "hidden": true,
-      "description": "GPU build of VirtualFluids",
-      "cacheVariables": {
-        "BUILD_VF_GPU": "ON"
-      }
-    },
-    {
-      "name": "default_gpu_numerical_tests",
-      "inherits": ["default_gpu"],
-      "hidden": true,
-      "description": "GPU numerical tests of VirtualFluids",
-      "cacheVariables": {
-        "BUILD_VF_DOUBLE_ACCURACY": "ON",
-        "BUILD_NUMERIC_TESTS": "ON"
-      }
-    },
-    {
-      "name": "default_all",
-      "hidden": true,
-      "description": "All build of VirtualFluids",
-      "inherits": ["default_cpu", "default_gpu"]
-    },
-    {
-      "name": "cpu_make",
-      "inherits": ["default_make", "default_cpu"],
-      "displayName": "cpu make configuration"
-    },
-    {
-      "name": "cpu_make_ccache",
-      "inherits": ["default_ccache_make", "default_cpu"],
-      "displayName": "cpu ccache make configuration"
-    },
-    {
-      "name": "cpu_msvc",
-      "inherits": ["default_msvc", "default_cpu"],
-      "displayName": "cpu msvc configuration"
-    },
-    {
-      "name": "gpu_make",
-      "inherits": ["default_make", "default_gpu"],
-      "displayName": "gpu make configuration"
-    },
-    {
-      "name": "gpu_make_ccache",
-      "inherits": ["default_ccache_make", "default_gpu"],
-      "displayName": "gpu ccache make configuration"
-    },
-    {
-      "name": "gpu_msvc",
-      "inherits": ["default_msvc", "default_gpu"],
-      "displayName": "gpu msvc configuration"
-    },
-    {
-      "name": "all_make",
-      "inherits": ["default_make", "default_all"],
-      "displayName": "all make configuration"
-    },
-    {
-      "name": "all_make_ccache",
-      "inherits": ["default_ccache_make", "default_all"],
-      "displayName": "all ccache make configuration"
-    },
-    {
-      "name": "all_msvc",
-      "inherits": ["default_msvc", "default_all"],
-      "displayName": "all msvc configuration"
-    },
-    {
-      "name": "gpu_numerical_tests_make",
-      "inherits": ["default_make", "default_gpu_numerical_tests"],
-      "displayName": "gpu numerical tests make configuration"
-    },
-    {
-      "name": "gpu_numerical_tests_ccache_make",
-      "inherits": ["default_ccache_make", "default_gpu_numerical_tests"],
-      "displayName": "gpu numerical tests ccache make configuration"
-    },
-    {
-      "name": "gpu_numerical_tests_msvc",
-      "inherits": ["default_msvc", "default_gpu_numerical_tests"],
-      "displayName": "gpu numerical tests msvc configuration"
-    }
-  ]
+    "version": 1,
+    "cmakeMinimumRequired": {
+        "major": 3,
+        "minor": 19,
+        "patch": 0
+    },
+    "configurePresets": [
+        {
+            "name": "default",
+            "hidden": true,
+            "binaryDir": "${sourceDir}/build/",
+            "cacheVariables": {
+                "BUILD_VF_UNIT_TESTS": "ON"
+            }
+        },
+        {
+            "name": "default_make",
+            "inherits": "default",
+            "hidden": true,
+            "generator": "Unix Makefiles"
+        },
+        {
+            "name": "default_ccache_make",
+            "inherits": "default_make",
+            "hidden": true,
+            "cacheVariables": {
+                "CMAKE_CXX_COMPILER_LAUNCHER": "ccache",
+                "CMAKE_CUDA_COMPILER_LAUNCHER": "ccache",
+                "CMAKE_C_COMPILER_LAUNCHER": "ccache"
+            }
+        },
+        {
+            "name": "default_msvc",
+            "inherits": "default",
+            "hidden": true,
+            "generator": "Visual Studio 16 2019",
+            "architecture": "x64"
+        },
+        {
+            "name": "default_cpu",
+            "hidden": true,
+            "description": "CPU build of VirtualFluids",
+            "cacheVariables": {
+                "BUILD_VF_CPU": "ON",
+                "BUILD_VF_DOUBLE_ACCURACY": "ON"
+            }
+        },
+        {
+            "name": "default_gpu",
+            "hidden": true,
+            "description": "GPU build of VirtualFluids",
+            "cacheVariables": {
+                "BUILD_VF_GPU": "ON",
+                "BUILD_VF_DOUBLE_ACCURACY": "OFF"
+            }
+        },
+        {
+            "name": "default_gpu_numerical_tests",
+            "inherits": [
+                "default_gpu"
+            ],
+            "hidden": true,
+            "description": "GPU numerical tests of VirtualFluids",
+            "cacheVariables": {
+                "BUILD_VF_DOUBLE_ACCURACY": "ON",
+                "BUILD_NUMERIC_TESTS": "ON"
+            }
+        },
+        {
+            "name": "default_all",
+            "hidden": true,
+            "description": "All build of VirtualFluids",
+            "inherits": [
+                "default_cpu",
+                "default_gpu"
+            ],
+            "cacheVariables": {
+                "BUILD_VF_DOUBLE_ACCURACY": "ON"
+            }
+        },
+        {
+            "name": "cpu_make",
+            "inherits": [
+                "default_make",
+                "default_cpu"
+            ],
+            "displayName": "cpu make configuration"
+        },
+        {
+            "name": "cpu_make_ccache",
+            "inherits": [
+                "default_ccache_make",
+                "default_cpu"
+            ],
+            "displayName": "cpu ccache make configuration"
+        },
+        {
+            "name": "cpu_msvc",
+            "inherits": [
+                "default_msvc",
+                "default_cpu"
+            ],
+            "displayName": "cpu msvc configuration"
+        },
+        {
+            "name": "gpu_make",
+            "inherits": [
+                "default_make",
+                "default_gpu"
+            ],
+            "displayName": "gpu make configuration"
+        },
+        {
+            "name": "gpu_make_ccache",
+            "inherits": [
+                "default_ccache_make",
+                "default_gpu"
+            ],
+            "displayName": "gpu ccache make configuration"
+        },
+        {
+            "name": "gpu_msvc",
+            "inherits": [
+                "default_msvc",
+                "default_gpu"
+            ],
+            "displayName": "gpu msvc configuration"
+        },
+        {
+            "name": "all_make",
+            "inherits": [
+                "default_make",
+                "default_all"
+            ],
+            "displayName": "all make configuration"
+        },
+        {
+            "name": "all_make_ccache",
+            "inherits": [
+                "default_ccache_make",
+                "default_all"
+            ],
+            "displayName": "all ccache make configuration"
+        },
+        {
+            "name": "all_msvc",
+            "inherits": [
+                "default_msvc",
+                "default_all"
+            ],
+            "displayName": "all msvc configuration"
+        },
+        {
+            "name": "gpu_numerical_tests_make",
+            "inherits": [
+                "default_make",
+                "default_gpu_numerical_tests"
+            ],
+            "displayName": "gpu numerical tests make configuration"
+        },
+        {
+            "name": "gpu_numerical_tests_ccache_make",
+            "inherits": [
+                "default_ccache_make",
+                "default_gpu_numerical_tests"
+            ],
+            "displayName": "gpu numerical tests ccache make configuration"
+        },
+        {
+            "name": "gpu_numerical_tests_msvc",
+            "inherits": [
+                "default_msvc",
+                "default_gpu_numerical_tests"
+            ],
+            "displayName": "gpu numerical tests msvc configuration"
+        }
+    ]
 }
diff --git a/apps/cpu/sphere/CMakeLists.txt b/apps/cpu/sphere/CMakeLists.txt
index d80737cdd94aa0b912a62acd69dcd30372f6fd82..8346e80d26800582c37090b208e846737e087d5d 100644
--- a/apps/cpu/sphere/CMakeLists.txt
+++ b/apps/cpu/sphere/CMakeLists.txt
@@ -1,6 +1,6 @@
 ########################################################
 ## C++ PROJECT                                       ###
 ########################################################
-PROJECT(sphere)
+PROJECT(sphere LANGUAGES CXX)
 
 vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES sphere.cpp )
\ No newline at end of file
diff --git a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt b/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
index e4f62c0150c29f147dee0b99480d1fe28161511a..8384e1bc6fcfa3fd2514434b620b266e96b3626a 100644
--- a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
+++ b/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
@@ -5,3 +5,5 @@ PROJECT(DrivenCavity LANGUAGES CUDA CXX)
 vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES DrivenCavity.cpp)
 
 set_source_files_properties(DrivenCavity.cpp PROPERTIES LANGUAGE CUDA)
+
+set_target_properties(DrivenCavity PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
diff --git a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
index 070d94f6a6921ce395ebc32bb5fc9ef0d17a7ab3..fc12e73a18c3e63b93724fc10bb0828391a1a096 100644
--- a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
+++ b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
@@ -97,7 +97,8 @@ const real dt = (real)1.0e-3; //0.5e-3;
 const uint nx = 64;
 
 //std::string path("F:/Work/Computations/out/DrivenCavity/"); //LEGOLAS
-std::string path("D:/out/DrivenCavity"); //Mollok
+//std::string path("D:/out/DrivenCavity"); //Mollok
+std::string path("/home/sopeters/Computations/out/DrivenCavity64_unified"); // phoenix
 
 std::string simulationName("DrivenCavityChim");
 
@@ -186,7 +187,7 @@ void multipleLevel(const std::string& configPath)
 
         para->setVelocityRatio(velocity/ velocityLB);
 
-		para->setMainKernel("CumulantK17CompChim");
+		//para->setMainKernel("CumulantK17CompChim");
 
 		para->setInitialCondition([&](real coordX, real coordY, real coordZ, real &rho, real &vx, real &vy, real &vz) {
             rho = (real)0.0;
diff --git a/setup.py b/setup.py
index c5de9128136df9c769f0450f01e64234784040f0..ffe6663be9561a209945b91bb396254b703ae892 100644
--- a/setup.py
+++ b/setup.py
@@ -10,6 +10,10 @@ from distutils.version import LooseVersion
 
 vf_cmake_args = [
     "-DBUILD_VF_PYTHON_BINDINGS=ON",
+    "-DBUILD_VF_DOUBLE_ACCURACY=ON",
+    "-DCMAKE_CXX_COMPILER_LAUNCHER=ccache",
+    "-DCMAKE_CUDA_COMPILER_LAUNCHER=ccache",
+    "-DCMAKE_C_COMPILER_LAUNCHER=ccache",
     "-DBUILD_VF_CPU:BOOL=ON",
     "-DBUILD_VF_GPU:BOOL=OFF",
     "-DUSE_METIS=ON",
diff --git a/src/cpu/VirtualFluidsCore/CMakeLists.txt b/src/cpu/VirtualFluidsCore/CMakeLists.txt
index 09766e266935ed1c7d89223c0713363f4df5edcf..36ac278fb8aee484d38a09a3fd4499965875f712 100644
--- a/src/cpu/VirtualFluidsCore/CMakeLists.txt
+++ b/src/cpu/VirtualFluidsCore/CMakeLists.txt
@@ -25,7 +25,7 @@ if(BUILD_USE_OPENMP)
    list(APPEND VF_LIBRARIES OpenMP::OpenMP_CXX)
 endif()
 
-vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser MPI::MPI_CXX ${VF_LIBRARIES})
+vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser MPI::MPI_CXX ${VF_LIBRARIES} PRIVATE_LINK lbm)
 
 
 vf_get_library_name(library_name)
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
index d82c594e6b127f2ade7979f8945b057e7ef6db6c..f51655dee0ff3268e316ea1b2386097568d1f42e 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp
@@ -1325,7 +1325,7 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin
 
     //----------------------------- restore data ---------------------------------
     int blockID;
-    std::vector<double> vectorsOfValues;
+    std::vector<LBMReal> vectorsOfValues;
     size_t index;
     size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3];
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
index 2c5a547c4cca531fe50e7255b0aba6a6a4b5c6e9..153752ecb3f4e8ee19937d515a1dd0568198edd3 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
@@ -1973,10 +1973,10 @@ 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<double> 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<LBMReal> vectorsOfValues;
+    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);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
index 036fea0c780bf2a74b22789ee6e0cb605ddbd065..98a7a3bf41dc74d746fc2dbdea9749b74cf6c10d 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp
@@ -1949,10 +1949,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<double> 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<LBMReal> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2046,10 +2046,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<double> 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<LBMReal> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2144,10 +2144,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<double> 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<LBMReal> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2241,10 +2241,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<double> 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<LBMReal> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2338,10 +2338,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<double> 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<LBMReal> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
@@ -2435,10 +2435,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<double> 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<LBMReal> vectorsOfValues;
+    for (int n = 0; n < blocksCount; n++) {
         vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize);
         index += nextVectorSize;
 
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp
index b350f441b3b237032ca24cd4a3743c3cf629a89e..1c7e47f52e721069b20a6b3c27d1e71857ef74ab 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/PressureCoefficientCoProcessor.cpp
@@ -42,8 +42,8 @@ void PressureCoefficientCoProcessor::collectData(double step)
 //////////////////////////////////////////////////////////////////////////
 void PressureCoefficientCoProcessor::calculateRho()
 {
-    double f[D3Q27System::ENDF + 1];
-    double vx1, vx2, vx3, rho;
+    LBMReal f[D3Q27System::ENDF + 1];
+    LBMReal vx1, vx2, vx3, rho;
     std::vector<double> values;
     std::vector<double> rvalues;
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp
index daed493b9cc1afddbd92acabcd551da0f463ea26..9c52f5e0469ce5b6c6e08136f25d3c027d36bdbd 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp
@@ -39,6 +39,7 @@
 #include "Block3D.h"
 #include "BCArray3D.h"
 
+
 #define PROOF_CORRECTNESS
 
 using namespace UbMath;
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h
index 10cfd49264bb829eac1fc6b9bedeee3b6eace265..3052f50e3e48925ed21a3c3af68cc2d247c88a02 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h
@@ -144,4 +144,4 @@ inline void CumulantK17LBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LB
     mfa = ma;
 }
 
-#endif // CumulantK17LBMKernel_h__
\ No newline at end of file
+#endif // CumulantK17LBMKernel_h__
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9b4c17f9fd6fe9f11abc652c65c09df246c98327
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp
@@ -0,0 +1,336 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 CumulantK17LBMKernel.cpp
+//! \ingroup LBM
+//! \author Konstantin Kutscher, Martin Geier
+//=======================================================================================
+#include "CumulantK17LBMKernelUnified.h"
+#include "D3Q27System.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include <cmath>
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+#include "Block3D.h"
+#include "BCArray3D.h"
+
+#include <lbm/KernelParameter.h>
+#include <lbm/CumulantChimera.h>
+#include <lbm/constants/D3Q27.h>
+
+//#define PROOF_CORRECTNESS
+
+using namespace UbMath;
+
+//////////////////////////////////////////////////////////////////////////
+CumulantK17LBMKernelUnified::CumulantK17LBMKernelUnified()
+{
+    this->compressible = true;
+}
+//////////////////////////////////////////////////////////////////////////
+void CumulantK17LBMKernelUnified::initDataSet()
+{
+    SPtr<DistributionArray3D> d(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9));
+    dataSet->setFdistributions(d);
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> CumulantK17LBMKernelUnified::clone()
+{
+    SPtr<LBMKernel> kernel(new CumulantK17LBMKernelUnified());
+    kernel->setNX(nx);
+    std::dynamic_pointer_cast<CumulantK17LBMKernelUnified>(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 CumulantK17LBMKernelUnified::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 forces[3] = {0., 0., 0.};
+                    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();
+
+                        forces[0] = forcingX1 * deltaT;
+                        forces[1] = forcingX2 * deltaT;
+                        forces[2] = forcingX3 * deltaT;
+                    }
+
+                    vf::lbm::Distribution27 distribution;
+
+                    distribution.f[vf::lbm::dir::PZZ] = mfcbb;
+                    distribution.f[vf::lbm::dir::MZZ] = mfabb;
+                    distribution.f[vf::lbm::dir::ZPZ] = mfbcb;
+                    distribution.f[vf::lbm::dir::ZMZ] = mfbab;
+                    distribution.f[vf::lbm::dir::ZZP] = mfbbc;
+                    distribution.f[vf::lbm::dir::ZZM] = mfbba;
+                    distribution.f[vf::lbm::dir::PPZ] = mfccb;
+                    distribution.f[vf::lbm::dir::MMZ] = mfaab;
+                    distribution.f[vf::lbm::dir::PMZ] = mfcab;
+                    distribution.f[vf::lbm::dir::MPZ] = mfacb;
+                    distribution.f[vf::lbm::dir::PZP] = mfcbc;
+                    distribution.f[vf::lbm::dir::MZM] = mfaba;
+                    distribution.f[vf::lbm::dir::PZM] = mfcba;
+                    distribution.f[vf::lbm::dir::MZP] = mfabc;
+                    distribution.f[vf::lbm::dir::ZPP] = mfbcc;
+                    distribution.f[vf::lbm::dir::ZMM] = mfbaa;
+                    distribution.f[vf::lbm::dir::ZPM] = mfbca;
+                    distribution.f[vf::lbm::dir::ZMP] = mfbac;
+                    distribution.f[vf::lbm::dir::PPP] = mfccc;
+                    distribution.f[vf::lbm::dir::MPP] = mfacc;
+                    distribution.f[vf::lbm::dir::PMP] = mfcac;
+                    distribution.f[vf::lbm::dir::MMP] = mfaac;
+                    distribution.f[vf::lbm::dir::PPM] = mfcca;
+                    distribution.f[vf::lbm::dir::MPM] = mfaca;
+                    distribution.f[vf::lbm::dir::PMM] = mfcaa;
+                    distribution.f[vf::lbm::dir::MMM] = mfaaa;
+                    distribution.f[vf::lbm::dir::ZZZ] = mfbbb;
+
+                    vf::lbm::KernelParameter parameter {distribution, omega, forces};
+                    vf::lbm::cumulantChimera(parameter, vf::lbm::setRelaxationRatesK17);
+
+                    mfcbb = distribution.f[vf::lbm::dir::PZZ];
+                    mfabb = distribution.f[vf::lbm::dir::MZZ];
+                    mfbcb = distribution.f[vf::lbm::dir::ZPZ];
+                    mfbab = distribution.f[vf::lbm::dir::ZMZ];
+                    mfbbc = distribution.f[vf::lbm::dir::ZZP];
+                    mfbba = distribution.f[vf::lbm::dir::ZZM];
+                    mfccb = distribution.f[vf::lbm::dir::PPZ];
+                    mfaab = distribution.f[vf::lbm::dir::MMZ];
+                    mfcab = distribution.f[vf::lbm::dir::PMZ];
+                    mfacb = distribution.f[vf::lbm::dir::MPZ];
+                    mfcbc = distribution.f[vf::lbm::dir::PZP];
+                    mfaba = distribution.f[vf::lbm::dir::MZM];
+                    mfcba = distribution.f[vf::lbm::dir::PZM];
+                    mfabc = distribution.f[vf::lbm::dir::MZP];
+                    mfbcc = distribution.f[vf::lbm::dir::ZPP];
+                    mfbaa = distribution.f[vf::lbm::dir::ZMM];
+                    mfbca = distribution.f[vf::lbm::dir::ZPM];
+                    mfbac = distribution.f[vf::lbm::dir::ZMP];
+                    mfccc = distribution.f[vf::lbm::dir::PPP];
+                    mfacc = distribution.f[vf::lbm::dir::MPP];
+                    mfcac = distribution.f[vf::lbm::dir::PMP];
+                    mfaac = distribution.f[vf::lbm::dir::MMP];
+                    mfcca = distribution.f[vf::lbm::dir::PPM];
+                    mfaca = distribution.f[vf::lbm::dir::MPM];
+                    mfcaa = distribution.f[vf::lbm::dir::PMM];
+                    mfaaa = distribution.f[vf::lbm::dir::MMM];
+                    mfbbb = distribution.f[vf::lbm::dir::ZZZ];
+
+                    //////////////////////////////////////////////////////////////////////////
+                    //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 = distribution.getDensity_() - 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(distribution.getDensity_()) + ", 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
+                    
+                    (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = mfcbb;
+                    (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = mfbcb;
+                    (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = mfbbc;
+                    (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = mfccb;
+                    (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = mfacb;
+                    (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = mfcbc;
+                    (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = mfabc;
+                    (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = mfbcc;
+                    (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = mfbac;
+                    (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = mfccc;
+                    (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = mfacc;
+                    (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = mfcac;
+                    (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfaac;
+
+                    (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) =  mfabb;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) =  mfbab;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) =  mfbba;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = mfaab;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = mfcab;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = mfaba;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = mfcba;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbaa;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = mfbca;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfaaa;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfcaa;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfaca;
+                    (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = mfcca;
+                    (*this->restDistributions)(x1, x2, x3) = mfbbb;
+                    //////////////////////////////////////////////////////////////////////////
+
+                }
+            }
+        }
+    }
+}
+//////////////////////////////////////////////////////////////////////////
+
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.h b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.h
new file mode 100644
index 0000000000000000000000000000000000000000..175fdd4cba2a0c8ce47248f5de6672f34dda0cc3
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.h
@@ -0,0 +1,77 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 CumulantK17LBMKernel.h
+//! \ingroup LBM
+//! \author Konstantin Kutscher, Martin Geier
+//=======================================================================================
+
+#ifndef CumulantK17LBMKernelUnified_h__
+#define CumulantK17LBMKernelUnified_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   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 CumulantK17LBMKernelUnified : public LBMKernel
+{
+public:
+    CumulantK17LBMKernelUnified();
+    ~CumulantK17LBMKernelUnified() = default;
+    void calculate(int step) override;
+    SPtr<LBMKernel> clone() override;
+    double getCalculationTime() override { return .0; }
+
+protected:
+    virtual void initDataSet();
+    LBMReal f[D3Q27System::ENDF + 1];
+
+    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;
+};
+
+
+#endif // CumulantK17LBMKernel_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp
index 5e88242fa23bdf37386f4f4d293ed7c2c33750ee..105603b35d043799672a58fda83ba503af70b703 100644
--- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp
@@ -1,5 +1,7 @@
 #include "D3Q27System.h"
 
+#include "lbm/MacroscopicQuantities.h"
+
 namespace D3Q27System
 {
 using namespace UbMath;
@@ -18,4 +20,31 @@ const int INVDIR[] = { INV_E,   INV_W,   INV_N,   INV_S,   INV_T,   INV_B,   INV
                        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 };
 
+
+
+
+LBMReal getDensity(const LBMReal *const &f /*[27]*/)
+{
+    return vf::lbm::getDensity(f);
+}
+
+LBMReal getIncompVelocityX1(const LBMReal *const &f /*[27]*/)
+{
+    return vf::lbm::getIncompressibleVelocityX1(f);
+}
+
+LBMReal getIncompVelocityX2(const LBMReal *const &f /*[27]*/)
+{
+    return vf::lbm::getIncompressibleVelocityX2(f);
+}
+
+LBMReal getIncompVelocityX3(const LBMReal *const &f /*[27]*/)
+{
+    return vf::lbm::getIncompressibleVelocityX3(f);
+}
+
+
+
+
+
 } // namespace D3Q27System
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
index 8f8c376459ce0b9bd4d0b7691655c173a6d4e149..04fe8a819b143db8cc935fc893faa514805060a6 100644
--- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
+++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
@@ -42,6 +42,7 @@
 #include "UbException.h"
 #include "UbMath.h"
 
+
 //! \brief namespace for global system-functions
 namespace D3Q27System
 {
@@ -147,36 +148,21 @@ static const int ET_BNW = 11;
 static const int ET_TSW = 12;
 static const int ET_BNE = 12;
 
+
 //////////////////////////////////////////////////////////////////////////
 // MACROSCOPIC VALUES
 /*=====================================================================*/
-static LBMReal getDensity(const LBMReal *const &f /*[27]*/)
-{
-    return ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) +
-           (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) +
-            ((f[BN] + f[TS]) + (f[TN] + f[BS]))) +
-           ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[REST];
-}
+LBMReal getDensity(const LBMReal *const &f /*[27]*/);
 /*=====================================================================*/
 static LBMReal getPressure(const LBMReal *const &f /*[27]*/) { return REAL_CAST(UbMath::c1o3) * getDensity(f); }
 /*=====================================================================*/
-static LBMReal getIncompVelocityX1(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]));
-}
+LBMReal getIncompVelocityX1(const LBMReal *const &f /*[27]*/);
 /*=====================================================================*/
-static LBMReal getIncompVelocityX2(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]));
-}
+LBMReal getIncompVelocityX2(const LBMReal *const &f /*[27]*/);
 /*=====================================================================*/
-static LBMReal getIncompVelocityX3(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]));
-}
+LBMReal getIncompVelocityX3(const LBMReal *const &f /*[27]*/);
+
+
 /*=====================================================================*/
 static void calcDensity(const LBMReal *const &f /*[27]*/, LBMReal &rho)
 {
diff --git a/src/cpu/VirtualFluidsCore/LBM/ILBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/ILBMKernel.h
index 4dbe8eee09a37c0c220f47619b72bade2e6ec527..bde61d9d314b61327ff8f8a2a71d2864d50cc7f5 100644
--- a/src/cpu/VirtualFluidsCore/LBM/ILBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/ILBMKernel.h
@@ -36,6 +36,8 @@
 
 #include <PointerDefinitions.h>
 
+#include "LBMSystem.h"
+
 class BCProcessor;
 class DataSet3D;
 
@@ -57,7 +59,7 @@ public:
     virtual void setCollisionFactor(double collFactor)                               = 0;
     virtual bool isInsideOfDomain(const int &x1, const int &x2, const int &x3) const = 0;
     virtual int getGhostLayerWidth() const                                           = 0;
-    virtual double getDeltaT() const                                                 = 0;
+    virtual LBMReal getDeltaT() const                                                = 0;
     virtual bool getWithForcing() const                                              = 0;
 };
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h
index 5c3e067656e2fc5cb06046e28c0442b15c180050..f4d96d946a9f3bab367e7bc935b54352e09063a6 100644
--- a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h
+++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h
@@ -53,6 +53,7 @@ public:
 
 public:
     LBMKernel();
+    virtual ~LBMKernel() = default;
 
     virtual SPtr<LBMKernel> clone() = 0;
 
diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMSystem.h b/src/cpu/VirtualFluidsCore/LBM/LBMSystem.h
index d24775aef0fbe6822fbdc03d42e2acfeb3021430..14b4d223b2e07e3dbca9947cefd89de045bfb3cf 100644
--- a/src/cpu/VirtualFluidsCore/LBM/LBMSystem.h
+++ b/src/cpu/VirtualFluidsCore/LBM/LBMSystem.h
@@ -37,6 +37,8 @@
 #include <iostream>
 #include <string>
 
+#include "basics/Core/DataTypes.h"
+
 //! \brief namespace for global system-functions
 
 namespace LBMSystem
@@ -45,10 +47,10 @@ namespace LBMSystem
 //#define SINGLEPRECISION
 
 #ifdef SINGLEPRECISION
-typedef float real;
+//using real = float;
 #define REAL_CAST(x) ((LBMSystem::real)(x))
 #else
-using real = double;
+//using real = double;
 #define REAL_CAST(x) (x)
 #endif
 
@@ -82,6 +84,7 @@ static real calcOmega2(real viscosity, real deltaT) { return REAL_CAST(1.0 / (4.
 } // namespace LBMSystem
 
 // some typedefs for global namespace
-using LBMReal = LBMSystem::real;
+//using LBMReal = LBMSystem::real;
+using LBMReal = real;
 
 #endif
diff --git a/src/cpu/pythonbindings/CMakeLists.txt b/src/cpu/pythonbindings/CMakeLists.txt
index 4c728febe0e669fa308d45158c7fae4ce3762c05..3b4e7e5a1506899710dc03ea275c0d4ac1cff66d 100644
--- a/src/cpu/pythonbindings/CMakeLists.txt
+++ b/src/cpu/pythonbindings/CMakeLists.txt
@@ -12,4 +12,5 @@ target_compile_definitions(pymuparser PRIVATE VF_METIS VF_MPI)
 target_link_libraries(pyfluids PRIVATE simulationconfig VirtualFluidsCore muparser basics)
 target_link_libraries(pymuparser PRIVATE muparser)
 
-
+target_include_directories(pyfluids PRIVATE ${CMAKE_SOURCE_DIR}/src/)
+target_include_directories(pyfluids PRIVATE ${CMAKE_BINARY_DIR})
\ No newline at end of file
diff --git a/src/cpu/simulationconfig/CMakeLists.txt b/src/cpu/simulationconfig/CMakeLists.txt
index 2e5e7f2eb9cba467e1ecbe3ec9cea13b3a3f322d..95ee969a049fd65cfadc6cc95d814e788a02aa8e 100644
--- a/src/cpu/simulationconfig/CMakeLists.txt
+++ b/src/cpu/simulationconfig/CMakeLists.txt
@@ -1,20 +1,8 @@
-cmake_minimum_required(VERSION 3.1)
 project(simulationconfig)
 
-set(VFBUILDER_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
 
-file(GLOB HEADERS
-        ${VFBUILDER_INCLUDE_DIR}/simulationconfig/*.h
-        ${VFBUILDER_INCLUDE_DIR}/simulationconfig/boundaryconditions/*.h)
+vf_add_library(NAME simulationconfig PUBLIC_LINK VirtualFluidsCore basics muparser)
 
-file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
-
-add_library(simulationconfig STATIC ${SRC} ${HEADERS})
-
-set_target_properties(simulationconfig PROPERTIES CXX_STANDARD 14 POSITION_INDEPENDENT_CODE ON)
-
-target_include_directories(simulationconfig PUBLIC ${VFBUILDER_INCLUDE_DIR})
-target_link_libraries(simulationconfig PRIVATE VirtualFluidsCore basics muparser)
-target_compile_definitions(simulationconfig PRIVATE VF_METIS VF_MPI)
-target_include_directories(simulationconfig PUBLIC ${CMAKE_BINARY_DIR})
+set_target_properties(simulationconfig PROPERTIES POSITION_INDEPENDENT_CODE ON)
 
+target_include_directories(simulationconfig PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
diff --git a/src/cpu/simulationconfig/include/simulationconfig/AbstractLBMSystem.h b/src/cpu/simulationconfig/include/simulationconfig/AbstractLBMSystem.h
index 0c3ac72db2d3cb3488860227171f2fd27600c028..156649c6fd3c060117e8247efab2765f56f7c77b 100644
--- a/src/cpu/simulationconfig/include/simulationconfig/AbstractLBMSystem.h
+++ b/src/cpu/simulationconfig/include/simulationconfig/AbstractLBMSystem.h
@@ -7,6 +7,8 @@
 
 class AbstractLBMSystem {
 public:
+    virtual ~AbstractLBMSystem() = default;
+
     virtual int getNumberOfDirections() = 0;
 
     virtual std::shared_ptr<Interactor3D> makeInteractor() = 0;
diff --git a/src/cpu/simulationconfig/include/simulationconfig/KernelFactory.h b/src/cpu/simulationconfig/include/simulationconfig/KernelFactory.h
index 6b151d96f9c538bcfbf3aeb693afd56e36e6cf35..6f984849bea91a832d0d778107feacb3cfdbdca6 100644
--- a/src/cpu/simulationconfig/include/simulationconfig/KernelFactory.h
+++ b/src/cpu/simulationconfig/include/simulationconfig/KernelFactory.h
@@ -20,6 +20,7 @@ public:
     };
 
     KernelFactory() = default;
+    virtual ~KernelFactory() = default;
 
     std::shared_ptr<LBMKernel> makeKernel(KernelType kernelType);
 
diff --git a/src/cpu/simulationconfig/src/Simulation.cpp b/src/cpu/simulationconfig/src/Simulation.cpp
index 2ac83701cbd17d0c790022552ace5c7c804a7acd..f4fbad090fc60e424e777b4f601243eef8eb151e 100644
--- a/src/cpu/simulationconfig/src/Simulation.cpp
+++ b/src/cpu/simulationconfig/src/Simulation.cpp
@@ -101,7 +101,7 @@ void Simulation::run()
     grid->setPeriodicX2(gridParameters->periodicBoundaryInX2);
     grid->setPeriodicX3(gridParameters->periodicBoundaryInX3);
 
-    int &numberOfNodesInReferenceDirection = gridParameters->numberOfNodesPerDirection[gridParameters->referenceDirectionIndex];
+    //int &numberOfNodesInReferenceDirection = gridParameters->numberOfNodesPerDirection[gridParameters->referenceDirectionIndex];
     std::shared_ptr<LBMUnitConverter> converter = makeLBMUnitConverter();
 
     int &nodesInX1 = gridParameters->numberOfNodesPerDirection[0];
diff --git a/src/gpu/GridGenerator/CMakeLists.txt b/src/gpu/GridGenerator/CMakeLists.txt
index 29d77897ac4e6138057ec2b4f13f5f942bdb0e01..844e933d5c053aaeef38085c5c5a9e01721ff6aa 100644
--- a/src/gpu/GridGenerator/CMakeLists.txt
+++ b/src/gpu/GridGenerator/CMakeLists.txt
@@ -6,11 +6,5 @@ vf_add_library(PRIVATE_LINK basics OpenMP::OpenMP_CXX)
 vf_get_library_name(library_name)
 set_target_properties(${library_name} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
 
-# according to linker error when building static libraries.
-# https://stackoverflow.com/questions/50033435/cmake-cuda-separate-compilation-static-lib-link-error-on-windows-but-not-on-ubun
-if (NOT BUILD_SHARED_LIBRARY)
-    set_target_properties(${library_name} PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON)
-endif()
-
 # we want to suppress all cuda warnings so far for this library.
 target_compile_options(${library_name} PUBLIC $<$<COMPILE_LANGUAGE:CUDA>:-Xcudafe "-w" >)
diff --git a/src/gpu/VirtualFluids_GPU/CMakeLists.txt b/src/gpu/VirtualFluids_GPU/CMakeLists.txt
index ce1bb9d921f114b3d06143901355c56ab24b77fd..5c93599449cb4e5cef1c0112670068aa4e76abb3 100644
--- a/src/gpu/VirtualFluids_GPU/CMakeLists.txt
+++ b/src/gpu/VirtualFluids_GPU/CMakeLists.txt
@@ -5,10 +5,19 @@ if(MSVC)
     set(additional_libraries ws2_32 Traffic) # ws_32 throws an error on Phoenix
 endif()
 
-vf_add_library(PRIVATE_LINK ${additional_libraries} GridGenerator basics MPI::MPI_CXX)
+vf_add_library(PUBLIC_LINK basics lbmCuda PRIVATE_LINK ${additional_libraries} GridGenerator MPI::MPI_CXX)
+
 
 #SET(TPN_WIN32 "/EHsc")
 #https://stackoverflow.com/questions/6832666/lnk2019-when-including-asio-headers-solution-generated-with-cmake
 #https://stackoverflow.com/questions/27442885/syntax-error-with-stdnumeric-limitsmax
 
+set_target_properties(VirtualFluids_GPU PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
+
+
 vf_add_tests()
+
+if(BUILD_VF_UNIT_TESTS)
+    set_target_properties(VirtualFluids_GPUTests PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
+    set_source_files_properties(Kernel/Utilities/DistributionHelperTests.cpp PROPERTIES LANGUAGE CUDA)
+endif()
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
index 2b2a2e68d0980b4d3aa4b27a04bd8ce703704a05..957935756163795945e9ac1c4762e0eb825239ee 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
@@ -118,6 +118,12 @@ void GridProvider::allocAndCopyForcing()
 {
     cudaMemoryManager->cudaAllocForcing();
     cudaMemoryManager->cudaCopyForcingToDevice();
+
+    for (int level = para->getCoarse(); level <= para->getFine(); level++)
+    {
+        cudaMemoryManager->cudaAllocLevelForcing(level);
+        cudaMemoryManager->cudaCopyLevelForcingToDevice(level);
+    }
 }
 
 void GridProvider::allocAndCopyQuadricLimiters()
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu b/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu
index ce3082817776d5b8ed6237b027354956df3a8777..562140eb24bad470604b5782a816a4e60d5000f3 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu
@@ -12,6 +12,11 @@
 
 using namespace vf::lbm::constant;
 
+#include "lbm/MacroscopicQuantities.h"
+
+#include "../Kernel/Utilities/DistributionHelper.cuh"
+
+
 ////////////////////////////////////////////////////////////////////////////////
 extern "C" __global__ void LBCalcMac27( real* vxD,
                                         real* vyD,
@@ -22,196 +27,37 @@ extern "C" __global__ void LBCalcMac27( real* vxD,
                                         unsigned int* neighborY,
                                         unsigned int* neighborZ,
                                         unsigned int size_Mat,
-                                        real* DD,
-                                        bool evenOrOdd)
+                                        real* distributions,
+                                        bool isEvenTimestep)
 {
-   Distributions27 D;
-   if (evenOrOdd==true)
-   {
-      D.f[dirE   ] = &DD[dirE   *size_Mat];
-      D.f[dirW   ] = &DD[dirW   *size_Mat];
-      D.f[dirN   ] = &DD[dirN   *size_Mat];
-      D.f[dirS   ] = &DD[dirS   *size_Mat];
-      D.f[dirT   ] = &DD[dirT   *size_Mat];
-      D.f[dirB   ] = &DD[dirB   *size_Mat];
-      D.f[dirNE  ] = &DD[dirNE  *size_Mat];
-      D.f[dirSW  ] = &DD[dirSW  *size_Mat];
-      D.f[dirSE  ] = &DD[dirSE  *size_Mat];
-      D.f[dirNW  ] = &DD[dirNW  *size_Mat];
-      D.f[dirTE  ] = &DD[dirTE  *size_Mat];
-      D.f[dirBW  ] = &DD[dirBW  *size_Mat];
-      D.f[dirBE  ] = &DD[dirBE  *size_Mat];
-      D.f[dirTW  ] = &DD[dirTW  *size_Mat];
-      D.f[dirTN  ] = &DD[dirTN  *size_Mat];
-      D.f[dirBS  ] = &DD[dirBS  *size_Mat];
-      D.f[dirBN  ] = &DD[dirBN  *size_Mat];
-      D.f[dirTS  ] = &DD[dirTS  *size_Mat];
-      D.f[dirZERO] = &DD[dirZERO*size_Mat];
-      D.f[dirTNE ] = &DD[dirTNE *size_Mat];
-      D.f[dirTSW ] = &DD[dirTSW *size_Mat];
-      D.f[dirTSE ] = &DD[dirTSE *size_Mat];
-      D.f[dirTNW ] = &DD[dirTNW *size_Mat];
-      D.f[dirBNE ] = &DD[dirBNE *size_Mat];
-      D.f[dirBSW ] = &DD[dirBSW *size_Mat];
-      D.f[dirBSE ] = &DD[dirBSE *size_Mat];
-      D.f[dirBNW ] = &DD[dirBNW *size_Mat];
-   } 
-   else
-   {
-      D.f[dirW   ] = &DD[dirE   *size_Mat];
-      D.f[dirE   ] = &DD[dirW   *size_Mat];
-      D.f[dirS   ] = &DD[dirN   *size_Mat];
-      D.f[dirN   ] = &DD[dirS   *size_Mat];
-      D.f[dirB   ] = &DD[dirT   *size_Mat];
-      D.f[dirT   ] = &DD[dirB   *size_Mat];
-      D.f[dirSW  ] = &DD[dirNE  *size_Mat];
-      D.f[dirNE  ] = &DD[dirSW  *size_Mat];
-      D.f[dirNW  ] = &DD[dirSE  *size_Mat];
-      D.f[dirSE  ] = &DD[dirNW  *size_Mat];
-      D.f[dirBW  ] = &DD[dirTE  *size_Mat];
-      D.f[dirTE  ] = &DD[dirBW  *size_Mat];
-      D.f[dirTW  ] = &DD[dirBE  *size_Mat];
-      D.f[dirBE  ] = &DD[dirTW  *size_Mat];
-      D.f[dirBS  ] = &DD[dirTN  *size_Mat];
-      D.f[dirTN  ] = &DD[dirBS  *size_Mat];
-      D.f[dirTS  ] = &DD[dirBN  *size_Mat];
-      D.f[dirBN  ] = &DD[dirTS  *size_Mat];
-      D.f[dirZERO] = &DD[dirZERO*size_Mat];
-      D.f[dirTNE ] = &DD[dirBSW *size_Mat];
-      D.f[dirTSW ] = &DD[dirBNE *size_Mat];
-      D.f[dirTSE ] = &DD[dirBNW *size_Mat];
-      D.f[dirTNW ] = &DD[dirBSE *size_Mat];
-      D.f[dirBNE ] = &DD[dirTSW *size_Mat];
-      D.f[dirBSW ] = &DD[dirTNE *size_Mat];
-      D.f[dirBSE ] = &DD[dirTNW *size_Mat];
-      D.f[dirBNW ] = &DD[dirTSE *size_Mat];
-   }
-   ////////////////////////////////////////////////////////////////////////////////
-   unsigned int  k;                   // Zugriff auf arrays im device
-   //
-   unsigned int tx = threadIdx.x;     // Thread index = lokaler i index
-   unsigned int by = blockIdx.x;      // Block index x
-   unsigned int bz = blockIdx.y;      // Block index y
-   unsigned int  x = tx + STARTOFFX;  // Globaler x-Index 
-   unsigned int  y = by + STARTOFFY;  // Globaler y-Index 
-   unsigned int  z = bz + STARTOFFZ;  // Globaler z-Index 
-
-   const unsigned sizeX = blockDim.x;
-   const unsigned sizeY = gridDim.x;
-   const unsigned nx = sizeX + 2 * STARTOFFX;
-   const unsigned ny = sizeY + 2 * STARTOFFY;
-
-   k = nx*(ny*z + y) + x;
-   //////////////////////////////////////////////////////////////////////////
-   //index
-   unsigned int kzero= k;
-   unsigned int ke   = k;
-   unsigned int kw   = neighborX[k];
-   unsigned int kn   = k;
-   unsigned int ks   = neighborY[k];
-   unsigned int kt   = k;
-   unsigned int kb   = neighborZ[k];
-   unsigned int ksw  = neighborY[kw];
-   unsigned int kne  = k;
-   unsigned int kse  = ks;
-   unsigned int knw  = kw;
-   unsigned int kbw  = neighborZ[kw];
-   unsigned int kte  = k;
-   unsigned int kbe  = kb;
-   unsigned int ktw  = kw;
-   unsigned int kbs  = neighborZ[ks];
-   unsigned int ktn  = k;
-   unsigned int kbn  = kb;
-   unsigned int kts  = ks;
-   unsigned int ktse = ks;
-   unsigned int kbnw = kbw;
-   unsigned int ktnw = kw;
-   unsigned int kbse = kbs;
-   unsigned int ktsw = ksw;
-   unsigned int kbne = kb;
-   unsigned int ktne = k;
-   unsigned int kbsw = neighborZ[ksw];
-   //unsigned int nxny = nx*ny;
-   //unsigned int kzero= k;
-   //unsigned int ke   = k;
-   //unsigned int kw   = k + 1;
-   //unsigned int kn   = k;
-   //unsigned int ks   = k + nx;
-   //unsigned int kt   = k;
-   //unsigned int kb   = k + nxny;
-   //unsigned int ksw  = k + nx + 1;
-   //unsigned int kne  = k;
-   //unsigned int kse  = k + nx;
-   //unsigned int knw  = k + 1;
-   //unsigned int kbw  = k + nxny + 1;
-   //unsigned int kte  = k;
-   //unsigned int kbe  = k + nxny;
-   //unsigned int ktw  = k + 1;
-   //unsigned int kbs  = k + nxny + nx;
-   //unsigned int ktn  = k;
-   //unsigned int kbn  = k + nxny;
-   //unsigned int kts  = k + nx;
-   //unsigned int ktse = k + nx;
-   //unsigned int kbnw = k + nxny + 1;
-   //unsigned int ktnw = k + 1;
-   //unsigned int kbse = k + nxny + nx;
-   //unsigned int ktsw = k + nx + 1;
-   //unsigned int kbne = k + nxny;
-   //unsigned int ktne = k;
-   //unsigned int kbsw = k + nxny + nx + 1;
-   //////////////////////////////////////////////////////////////////////////
+   const unsigned int tx = threadIdx.x;    // Thread index = lokaler i index
+   const unsigned int by = blockIdx.x;     // Block index x
+   const unsigned int bz = blockIdx.y;     // Block index y
+   const unsigned int x = tx + STARTOFFX;  // Globaler x-Index 
+   const unsigned int y = by + STARTOFFY;  // Globaler y-Index 
+   const unsigned int z = bz + STARTOFFZ;  // Globaler z-Index 
+
+   const unsigned nx = blockDim.x + 2 * STARTOFFX;
+   const unsigned ny = gridDim.x + 2 * STARTOFFY;
+
+   const unsigned int k = nx*(ny*z + y) + x; // Zugriff auf arrays im device
+
    rhoD[k] = c0o1;
    vxD[k]  = c0o1;
    vyD[k]  = c0o1;
    vzD[k]  = c0o1;
 
-   if(geoD[k] == GEO_FLUID)
-   {
-      rhoD[k]    =   (D.f[dirE   ])[ke  ]+ (D.f[dirW   ])[kw  ]+ 
-                     (D.f[dirN   ])[kn  ]+ (D.f[dirS   ])[ks  ]+
-                     (D.f[dirT   ])[kt  ]+ (D.f[dirB   ])[kb  ]+
-                     (D.f[dirNE  ])[kne ]+ (D.f[dirSW  ])[ksw ]+
-                     (D.f[dirSE  ])[kse ]+ (D.f[dirNW  ])[knw ]+
-                     (D.f[dirTE  ])[kte ]+ (D.f[dirBW  ])[kbw ]+
-                     (D.f[dirBE  ])[kbe ]+ (D.f[dirTW  ])[ktw ]+
-                     (D.f[dirTN  ])[ktn ]+ (D.f[dirBS  ])[kbs ]+
-                     (D.f[dirBN  ])[kbn ]+ (D.f[dirTS  ])[kts ]+
-                     (D.f[dirZERO])[kzero]+ 
-                     (D.f[dirTNE ])[ktne]+ (D.f[dirTSW ])[ktsw]+ 
-                     (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]+ 
-                     (D.f[dirBNE ])[kbne]+ (D.f[dirBSW ])[kbsw]+ 
-                     (D.f[dirBSE ])[kbse]+ (D.f[dirBNW ])[kbnw];
-
-      vxD[k]     =   (D.f[dirE   ])[ke  ]- (D.f[dirW   ])[kw  ]+ 
-                     (D.f[dirNE  ])[kne ]- (D.f[dirSW  ])[ksw ]+
-                     (D.f[dirSE  ])[kse ]- (D.f[dirNW  ])[knw ]+
-                     (D.f[dirTE  ])[kte ]- (D.f[dirBW  ])[kbw ]+
-                     (D.f[dirBE  ])[kbe ]- (D.f[dirTW  ])[ktw ]+
-                     (D.f[dirTNE ])[ktne]- (D.f[dirTSW ])[ktsw]+ 
-                     (D.f[dirTSE ])[ktse]- (D.f[dirTNW ])[ktnw]+ 
-                     (D.f[dirBNE ])[kbne]- (D.f[dirBSW ])[kbsw]+ 
-                     (D.f[dirBSE ])[kbse]- (D.f[dirBNW ])[kbnw];
-
-      vyD[k]     =   (D.f[dirN   ])[kn  ]- (D.f[dirS   ])[ks  ]+
-                     (D.f[dirNE  ])[kne ]- (D.f[dirSW  ])[ksw ]-
-                     (D.f[dirSE  ])[kse ]+ (D.f[dirNW  ])[knw ]+
-                     (D.f[dirTN  ])[ktn ]- (D.f[dirBS  ])[kbs ]+
-                     (D.f[dirBN  ])[kbn ]- (D.f[dirTS  ])[kts ]+
-                     (D.f[dirTNE ])[ktne]- (D.f[dirTSW ])[ktsw]- 
-                     (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]+ 
-                     (D.f[dirBNE ])[kbne]- (D.f[dirBSW ])[kbsw]- 
-                     (D.f[dirBSE ])[kbse]+ (D.f[dirBNW ])[kbnw];
-
-      vzD[k]     =   (D.f[dirT   ])[kt  ]- (D.f[dirB   ])[kb  ]+
-                     (D.f[dirTE  ])[kte ]- (D.f[dirBW  ])[kbw ]-
-                     (D.f[dirBE  ])[kbe ]+ (D.f[dirTW  ])[ktw ]+
-                     (D.f[dirTN  ])[ktn ]- (D.f[dirBS  ])[kbs ]-
-                     (D.f[dirBN  ])[kbn ]+ (D.f[dirTS  ])[kts ]+
-                     (D.f[dirTNE ])[ktne]+ (D.f[dirTSW ])[ktsw]+ 
-                     (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]- 
-                     (D.f[dirBNE ])[kbne]- (D.f[dirBSW ])[kbsw]- 
-                     (D.f[dirBSE ])[kbse]- (D.f[dirBNW ])[kbnw];
-   }
+   if(!vf::gpu::isValidFluidNode(k, size_Mat, geoD[k]))
+      return;
+
+   vf::gpu::DistributionWrapper distr_wrapper(distributions, size_Mat, isEvenTimestep, k, neighborX, neighborY, neighborZ);
+   const auto& distribution = distr_wrapper.distribution;
+
+   rhoD[k] = vf::lbm::getDensity(distribution.f);
+   vxD[k] = vf::lbm::getIncompressibleVelocityX1(distribution.f);
+   vyD[k] = vf::lbm::getIncompressibleVelocityX2(distribution.f);
+   vzD[k] = vf::lbm::getIncompressibleVelocityX3(distribution.f);
+
 }
 
 
@@ -412,251 +258,34 @@ extern "C" __global__ void LBCalcMacSP27( real* vxD,
 }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 ////////////////////////////////////////////////////////////////////////////////
-extern "C" __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 evenOrOdd)
+extern "C" __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 *distributions,
+                                             bool isEvenTimestep)
 {
-   Distributions27 D;
-   if (evenOrOdd==true)
-   {
-      D.f[dirE   ] = &DD[dirE   *size_Mat];
-      D.f[dirW   ] = &DD[dirW   *size_Mat];
-      D.f[dirN   ] = &DD[dirN   *size_Mat];
-      D.f[dirS   ] = &DD[dirS   *size_Mat];
-      D.f[dirT   ] = &DD[dirT   *size_Mat];
-      D.f[dirB   ] = &DD[dirB   *size_Mat];
-      D.f[dirNE  ] = &DD[dirNE  *size_Mat];
-      D.f[dirSW  ] = &DD[dirSW  *size_Mat];
-      D.f[dirSE  ] = &DD[dirSE  *size_Mat];
-      D.f[dirNW  ] = &DD[dirNW  *size_Mat];
-      D.f[dirTE  ] = &DD[dirTE  *size_Mat];
-      D.f[dirBW  ] = &DD[dirBW  *size_Mat];
-      D.f[dirBE  ] = &DD[dirBE  *size_Mat];
-      D.f[dirTW  ] = &DD[dirTW  *size_Mat];
-      D.f[dirTN  ] = &DD[dirTN  *size_Mat];
-      D.f[dirBS  ] = &DD[dirBS  *size_Mat];
-      D.f[dirBN  ] = &DD[dirBN  *size_Mat];
-      D.f[dirTS  ] = &DD[dirTS  *size_Mat];
-      D.f[dirZERO] = &DD[dirZERO*size_Mat];
-      D.f[dirTNE ] = &DD[dirTNE *size_Mat];
-      D.f[dirTSW ] = &DD[dirTSW *size_Mat];
-      D.f[dirTSE ] = &DD[dirTSE *size_Mat];
-      D.f[dirTNW ] = &DD[dirTNW *size_Mat];
-      D.f[dirBNE ] = &DD[dirBNE *size_Mat];
-      D.f[dirBSW ] = &DD[dirBSW *size_Mat];
-      D.f[dirBSE ] = &DD[dirBSE *size_Mat];
-      D.f[dirBNW ] = &DD[dirBNW *size_Mat];
-   } 
-   else
-   {
-      D.f[dirW   ] = &DD[dirE   *size_Mat];
-      D.f[dirE   ] = &DD[dirW   *size_Mat];
-      D.f[dirS   ] = &DD[dirN   *size_Mat];
-      D.f[dirN   ] = &DD[dirS   *size_Mat];
-      D.f[dirB   ] = &DD[dirT   *size_Mat];
-      D.f[dirT   ] = &DD[dirB   *size_Mat];
-      D.f[dirSW  ] = &DD[dirNE  *size_Mat];
-      D.f[dirNE  ] = &DD[dirSW  *size_Mat];
-      D.f[dirNW  ] = &DD[dirSE  *size_Mat];
-      D.f[dirSE  ] = &DD[dirNW  *size_Mat];
-      D.f[dirBW  ] = &DD[dirTE  *size_Mat];
-      D.f[dirTE  ] = &DD[dirBW  *size_Mat];
-      D.f[dirTW  ] = &DD[dirBE  *size_Mat];
-      D.f[dirBE  ] = &DD[dirTW  *size_Mat];
-      D.f[dirBS  ] = &DD[dirTN  *size_Mat];
-      D.f[dirTN  ] = &DD[dirBS  *size_Mat];
-      D.f[dirTS  ] = &DD[dirBN  *size_Mat];
-      D.f[dirBN  ] = &DD[dirTS  *size_Mat];
-      D.f[dirZERO] = &DD[dirZERO*size_Mat];
-      D.f[dirTNE ] = &DD[dirBSW *size_Mat];
-      D.f[dirTSW ] = &DD[dirBNE *size_Mat];
-      D.f[dirTSE ] = &DD[dirBNW *size_Mat];
-      D.f[dirTNW ] = &DD[dirBSE *size_Mat];
-      D.f[dirBNE ] = &DD[dirTSW *size_Mat];
-      D.f[dirBSW ] = &DD[dirTNE *size_Mat];
-      D.f[dirBSE ] = &DD[dirTNW *size_Mat];
-      D.f[dirBNW ] = &DD[dirTSE *size_Mat];
-   }
-   ////////////////////////////////////////////////////////////////////////////////
-   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<size_Mat)
-   {
-      //////////////////////////////////////////////////////////////////////////
-      //index
-      unsigned int kzero= k;
-      unsigned int ke   = k;
-      unsigned int kw   = neighborX[k];
-      unsigned int kn   = k;
-      unsigned int ks   = neighborY[k];
-      unsigned int kt   = k;
-      unsigned int kb   = neighborZ[k];
-      unsigned int ksw  = neighborY[kw];
-      unsigned int kne  = k;
-      unsigned int kse  = ks;
-      unsigned int knw  = kw;
-      unsigned int kbw  = neighborZ[kw];
-      unsigned int kte  = k;
-      unsigned int kbe  = kb;
-      unsigned int ktw  = kw;
-      unsigned int kbs  = neighborZ[ks];
-      unsigned int ktn  = k;
-      unsigned int kbn  = kb;
-      unsigned int kts  = ks;
-      unsigned int ktse = ks;
-      unsigned int kbnw = kbw;
-      unsigned int ktnw = kw;
-      unsigned int kbse = kbs;
-      unsigned int ktsw = ksw;
-      unsigned int kbne = kb;
-      unsigned int ktne = k;
-      unsigned int kbsw = neighborZ[ksw];
-      //////////////////////////////////////////////////////////////////////////
-      pressD[k] = c0o1;
-	  rhoD[k]   = c0o1;
-	  vxD[k]    = c0o1;
-	  vyD[k]    = c0o1;
-	  vzD[k]    = c0o1;
-
-      if(geoD[k] == GEO_FLUID || geoD[k] == GEO_PM_0 || geoD[k] == GEO_PM_1 || geoD[k] == GEO_PM_2)
-      {
-         rhoD[k]    =   (D.f[dirE   ])[ke  ]+ (D.f[dirW   ])[kw  ]+ 
-                        (D.f[dirN   ])[kn  ]+ (D.f[dirS   ])[ks  ]+
-                        (D.f[dirT   ])[kt  ]+ (D.f[dirB   ])[kb  ]+
-                        (D.f[dirNE  ])[kne ]+ (D.f[dirSW  ])[ksw ]+
-                        (D.f[dirSE  ])[kse ]+ (D.f[dirNW  ])[knw ]+
-                        (D.f[dirTE  ])[kte ]+ (D.f[dirBW  ])[kbw ]+
-                        (D.f[dirBE  ])[kbe ]+ (D.f[dirTW  ])[ktw ]+
-                        (D.f[dirTN  ])[ktn ]+ (D.f[dirBS  ])[kbs ]+
-                        (D.f[dirBN  ])[kbn ]+ (D.f[dirTS  ])[kts ]+
-                        (D.f[dirZERO])[kzero]+ 
-                        (D.f[dirTNE ])[ktne]+ (D.f[dirTSW ])[ktsw]+ 
-                        (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]+ 
-                        (D.f[dirBNE ])[kbne]+ (D.f[dirBSW ])[kbsw]+ 
-                        (D.f[dirBSE ])[kbse]+ (D.f[dirBNW ])[kbnw];
-
-         vxD[k]     =  ((D.f[dirE   ])[ke  ]- (D.f[dirW   ])[kw  ]+ 
-                        (D.f[dirNE  ])[kne ]- (D.f[dirSW  ])[ksw ]+
-                        (D.f[dirSE  ])[kse ]- (D.f[dirNW  ])[knw ]+
-                        (D.f[dirTE  ])[kte ]- (D.f[dirBW  ])[kbw ]+
-                        (D.f[dirBE  ])[kbe ]- (D.f[dirTW  ])[ktw ]+
-                        (D.f[dirTNE ])[ktne]- (D.f[dirTSW ])[ktsw]+ 
-                        (D.f[dirTSE ])[ktse]- (D.f[dirTNW ])[ktnw]+ 
-                        (D.f[dirBNE ])[kbne]- (D.f[dirBSW ])[kbsw]+ 
-						(D.f[dirBSE ])[kbse]- (D.f[dirBNW ])[kbnw]) / (c1o1 + rhoD[k]);
-
-         vyD[k]     =  ((D.f[dirN   ])[kn  ]- (D.f[dirS   ])[ks  ]+
-                        (D.f[dirNE  ])[kne ]- (D.f[dirSW  ])[ksw ]-
-                        (D.f[dirSE  ])[kse ]+ (D.f[dirNW  ])[knw ]+
-                        (D.f[dirTN  ])[ktn ]- (D.f[dirBS  ])[kbs ]+
-                        (D.f[dirBN  ])[kbn ]- (D.f[dirTS  ])[kts ]+
-                        (D.f[dirTNE ])[ktne]- (D.f[dirTSW ])[ktsw]- 
-                        (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]+ 
-                        (D.f[dirBNE ])[kbne]- (D.f[dirBSW ])[kbsw]- 
-                        (D.f[dirBSE ])[kbse]+ (D.f[dirBNW ])[kbnw]) / (c1o1 + rhoD[k]);
-
-         vzD[k]     =  ((D.f[dirT   ])[kt  ]- (D.f[dirB   ])[kb  ]+
-                        (D.f[dirTE  ])[kte ]- (D.f[dirBW  ])[kbw ]-
-                        (D.f[dirBE  ])[kbe ]+ (D.f[dirTW  ])[ktw ]+
-                        (D.f[dirTN  ])[ktn ]- (D.f[dirBS  ])[kbs ]-
-                        (D.f[dirBN  ])[kbn ]+ (D.f[dirTS  ])[kts ]+
-                        (D.f[dirTNE ])[ktne]+ (D.f[dirTSW ])[ktsw]+ 
-                        (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]- 
-                        (D.f[dirBNE ])[kbne]- (D.f[dirBSW ])[kbsw]- 
-                        (D.f[dirBSE ])[kbse]- (D.f[dirBNW ])[kbnw]) / (c1o1 + rhoD[k]);
-
-         pressD[k]  =  ((D.f[dirE   ])[ke  ]+ (D.f[dirW   ])[kw  ]+ 
-                        (D.f[dirN   ])[kn  ]+ (D.f[dirS   ])[ks  ]+
-                        (D.f[dirT   ])[kt  ]+ (D.f[dirB   ])[kb  ]+
-                        c2o1*(
-                        (D.f[dirNE  ])[kne ]+ (D.f[dirSW  ])[ksw ]+
-                        (D.f[dirSE  ])[kse ]+ (D.f[dirNW  ])[knw ]+
-                        (D.f[dirTE  ])[kte ]+ (D.f[dirBW  ])[kbw ]+
-                        (D.f[dirBE  ])[kbe ]+ (D.f[dirTW  ])[ktw ]+
-                        (D.f[dirTN  ])[ktn ]+ (D.f[dirBS  ])[kbs ]+
-                        (D.f[dirBN  ])[kbn ]+ (D.f[dirTS  ])[kts ])+
-                        c3o1*(
-                        (D.f[dirTNE ])[ktne]+ (D.f[dirTSW ])[ktsw]+ 
-                        (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]+ 
-                        (D.f[dirBNE ])[kbne]+ (D.f[dirBSW ])[kbsw]+ 
-                        (D.f[dirBSE ])[kbse]+ (D.f[dirBNW ])[kbnw])-
-                        rhoD[k]-(vxD[k] * vxD[k] + vyD[k] * vyD[k] + vzD[k] * vzD[k]) * (c1o1+rhoD[k])) * c1o2+rhoD[k]; // times zero for incompressible case   
-         //achtung op hart gesetzt Annahme op = 1 ;                                                      ^^^^(1.0/op-0.5)=0.5
-
-      }
-   }
+    const unsigned k = vf::gpu::getNodeIndex();
+
+    pressD[k] = c0o1;
+    rhoD[k]   = c0o1;
+    vxD[k]    = c0o1;
+    vyD[k]    = c0o1;
+    vzD[k]    = c0o1;
+
+    if (!vf::gpu::isValidFluidNode(k, size_Mat, geoD[k]))
+        return;
+
+    vf::gpu::DistributionWrapper distr_wrapper(distributions, size_Mat, isEvenTimestep, k, neighborX, neighborY,
+                                               neighborZ);
+    const auto &distribution = distr_wrapper.distribution;
+
+    rhoD[k]   = vf::lbm::getDensity(distribution.f);
+    vxD[k]    = vf::lbm::getCompressibleVelocityX1(distribution.f, rhoD[k]);
+    vyD[k]    = vf::lbm::getCompressibleVelocityX2(distribution.f, rhoD[k]);
+    vzD[k]    = vf::lbm::getCompressibleVelocityX3(distribution.f, rhoD[k]);
+    pressD[k] = vf::lbm::getPressure(distribution.f, rhoD[k], vxD[k], vyD[k], vzD[k]); 
 }
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 ////////////////////////////////////////////////////////////////////////////////
 extern "C" __global__ void LBCalcMacThS7( real* Conc,
                                           unsigned int* geoD,
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
index 6c1585bd689a5f2e2da603d5e9fdb81cbc175aab..aeafe342f0680763fbbffe63cf1c6760e61c2102 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp
@@ -6,6 +6,8 @@
 
 #include <Parameter/Parameter.h>
 
+#include <lbm/constants/NumericConstants.h>
+
 void CudaMemoryManager::cudaAllocFull(int lev)
 {
     checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->geo      ), parameter->getParH(lev)->mem_size_int  ));
@@ -404,6 +406,44 @@ void CudaMemoryManager::cudaFreeForcing()
 {
 	checkCudaErrors( cudaFreeHost(parameter->getForcesHost()));
 }
+
+void CudaMemoryManager::cudaAllocLevelForcing(int level)
+{
+    real fx_t{ 1. }, fy_t{ 1. }, fz_t{ 1. };
+    for (int i = 0; i < level; i++) {
+        fx_t *= vf::lbm::constant::c2o1;
+        fy_t *= vf::lbm::constant::c2o1;
+        fz_t *= vf::lbm::constant::c2o1;
+    }
+
+    const unsigned int mem_size = sizeof(real) * 3;
+
+    //Host
+    checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(level)->forcing), mem_size));
+    parameter->getParH(level)->forcing[0] = parameter->forcingH[0] / fx_t;
+    parameter->getParH(level)->forcing[1] = parameter->forcingH[1] / fy_t;
+    parameter->getParH(level)->forcing[2] = parameter->forcingH[2] / fz_t;
+
+	//Device
+	checkCudaErrors( cudaMalloc((void**) &parameter->getParD(level)->forcing, mem_size));
+	//////////////////////////////////////////////////////////////////////////
+	const double tmp = (double)mem_size;
+	setMemsizeGPU(tmp, false);
+}
+
+void CudaMemoryManager::cudaCopyLevelForcingToDevice(int level)
+{
+	unsigned int mem_size = sizeof(real) * 3;
+	checkCudaErrors( cudaMemcpy(parameter->getParD(level)->forcing, parameter->getParH(level)->forcing, mem_size, cudaMemcpyHostToDevice));
+}
+
+void CudaMemoryManager::cudaFreeLevelForcing(int level)
+{
+	checkCudaErrors( cudaFreeHost(parameter->getParH(level)->forcing));
+    checkCudaErrors( cudaFree(parameter->getParD(level)->forcing));
+}
+
+
 //quadric Limiters
 void CudaMemoryManager::cudaAllocQuadricLimiters()
 {
diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h
index c26db65afd384ac7a4e6c436c4dea2c46647ae95..4853205f510348a954fbc8dcdaed72385a30d559 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h
+++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h
@@ -78,6 +78,10 @@ public:
 	void cudaCopyForcingToHost();
 	void cudaFreeForcing();
 
+    void cudaAllocLevelForcing(int level);
+	void cudaCopyLevelForcingToDevice(int level);
+	void cudaFreeLevelForcing(int level);
+
 	void cudaAllocQuadricLimiters();
 	void cudaCopyQuadricLimitersToDevice();
 	void cudaFreeQuadricLimiters();
diff --git a/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu b/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu
index bb34a11a7337a499f8558a48d27c3547932618a6..9dc75cfa6019a29350263f9a554aa9a489566cfa 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu
@@ -1,10 +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 Cumulant27chim.cu
+//! \ingroup GPU
+//! \author Martin Schoenherr
+//=======================================================================================
 /* Device code */
 #include "LBM/LB.h" 
 #include "LBM/D3Q27.h"
@@ -13,951 +38,882 @@
 using namespace vf::lbm::constant;
 #include "math.h"
 
-
-////////////////////////////////////////////////////////////////////////////////
-inline __device__ void forwardInverseChimeraWithK(real &mfa, real &mfb, real &mfc, real vv, real v2, real Kinverse, real K) {
-	real m2 = mfa + mfc;
-	real m1 = mfc - mfa;
-	real m0 = m2 + mfb;
-	mfa = m0;
-	m0 *= Kinverse;
-	m0 += c1o1;
-	mfb = (m1*Kinverse - m0 * vv) * K;
-	mfc = ((m2 - c2o1*	m1 * vv)*Kinverse + v2 * m0) * K;
-}
-
-inline __device__ void backwardInverseChimeraWithK(real &mfa, real &mfb, real &mfc, real vv, real v2, real Kinverse, real K) {
-	real m0 = (((mfc - mfb) * c1o2 + mfb *  vv)*Kinverse + (mfa*Kinverse + c1o1) * (v2 - vv) * c1o2) * K;
-	real m1 = (((mfa - mfc) -  c2o1 * mfb *  vv)*Kinverse + (mfa*Kinverse + c1o1) * (           -v2)) * K;
-	mfc     = (((mfc + mfb) * c1o2 + mfb *  vv)*Kinverse + (mfa*Kinverse + c1o1) * (v2 + vv) * c1o2) * K;
-	mfa = m0;
-	mfb = m1;
-}
-////////////////////////////////////////////////////////////////////////////////
-
-
-
-
-
-inline __device__ void forwardChimeraWithK(real &mfa, real &mfb, real &mfc, real vv, real v2, real K) {
-
-	real m2 = mfa + mfc;
-	real m1 = mfc - mfa;
-	real m0 = m2 + mfb;
-	mfa = m0;
-	//m0     += K;
-	mfb = (m1 - K*vv) - m0 * vv;
-	mfc = ((m2 - c2o1*	m1 * vv) + v2*K) + v2 * m0;
-	//m0 += K;
-	//mfb = m1 - m0 * vv;
-	//mfc = m2 - two*	m1 * vv + v2 * m0;
-}
-
-inline __device__ void forwardChimera(real &mfa, real &mfb, real &mfc, real vv, real v2) {
-	real m1 = (mfa + mfc) + mfb;
-	real m2 = mfc - mfa;
-	mfc = (mfc + mfa) + (v2*m1 - c2o1*vv*m2);
-	mfb = m2 - vv*m1;
-	mfa = m1;
-}
-
-
-inline __device__ void backwardChimera(real &mfa, real &mfb, real &mfc, real vv, real v2) {
-	real ma = (mfc + mfa*(v2 - vv))*c1o2 + mfb*(vv - c1o2);
-	real mb = ((mfa - mfc) - mfa*v2) - c2o1*mfb*vv;
-	mfc = (mfc + mfa*(v2 + vv))*c1o2 + mfb*(vv + c1o2);
-	mfb = mb;
-	mfa = ma;
-}
-
-
-inline __device__ void backwardChimeraWithK(real &mfa, real &mfb, real &mfc, real vv, real v2, real K) {
-	real  m0 = (mfc - mfb)* c1o2 + mfb * (vv)+(mfa + K) * (v2 - vv) * c1o2;
-	real m1 = (mfa - mfc) - c2o1* mfb * vv + (mfa + K) * (-v2);
-	mfc = (mfc + mfb)* c1o2 + mfb * (vv)+(mfa + K) * (v2 + vv) * c1o2;
-	mfa = m0;
-	mfb = m1;
-
-}
-
-
-
-
+#include <lbm/Chimera.h>
 
 
 ////////////////////////////////////////////////////////////////////////////////
 extern "C" __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,
+    int size_Mat,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
 {
-	////////////////////////////////////////////////////////////////////////////////
-	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<size_Mat)
-	{
-		////////////////////////////////////////////////////////////////////////////////
-		unsigned int BC;
-		BC = bcMatD[k];
-
-		if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/)
-		{
-			Distributions27 D;
-			if (EvenOrOdd == true)
-			{
-				D.f[dirE] = &DDStart[dirE   *size_Mat];
-				D.f[dirW] = &DDStart[dirW   *size_Mat];
-				D.f[dirN] = &DDStart[dirN   *size_Mat];
-				D.f[dirS] = &DDStart[dirS   *size_Mat];
-				D.f[dirT] = &DDStart[dirT   *size_Mat];
-				D.f[dirB] = &DDStart[dirB   *size_Mat];
-				D.f[dirNE] = &DDStart[dirNE  *size_Mat];
-				D.f[dirSW] = &DDStart[dirSW  *size_Mat];
-				D.f[dirSE] = &DDStart[dirSE  *size_Mat];
-				D.f[dirNW] = &DDStart[dirNW  *size_Mat];
-				D.f[dirTE] = &DDStart[dirTE  *size_Mat];
-				D.f[dirBW] = &DDStart[dirBW  *size_Mat];
-				D.f[dirBE] = &DDStart[dirBE  *size_Mat];
-				D.f[dirTW] = &DDStart[dirTW  *size_Mat];
-				D.f[dirTN] = &DDStart[dirTN  *size_Mat];
-				D.f[dirBS] = &DDStart[dirBS  *size_Mat];
-				D.f[dirBN] = &DDStart[dirBN  *size_Mat];
-				D.f[dirTS] = &DDStart[dirTS  *size_Mat];
-				D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
-				D.f[dirTNE] = &DDStart[dirTNE *size_Mat];
-				D.f[dirTSW] = &DDStart[dirTSW *size_Mat];
-				D.f[dirTSE] = &DDStart[dirTSE *size_Mat];
-				D.f[dirTNW] = &DDStart[dirTNW *size_Mat];
-				D.f[dirBNE] = &DDStart[dirBNE *size_Mat];
-				D.f[dirBSW] = &DDStart[dirBSW *size_Mat];
-				D.f[dirBSE] = &DDStart[dirBSE *size_Mat];
-				D.f[dirBNW] = &DDStart[dirBNW *size_Mat];
-			}
-			else
-			{
-				D.f[dirW] = &DDStart[dirE   *size_Mat];
-				D.f[dirE] = &DDStart[dirW   *size_Mat];
-				D.f[dirS] = &DDStart[dirN   *size_Mat];
-				D.f[dirN] = &DDStart[dirS   *size_Mat];
-				D.f[dirB] = &DDStart[dirT   *size_Mat];
-				D.f[dirT] = &DDStart[dirB   *size_Mat];
-				D.f[dirSW] = &DDStart[dirNE  *size_Mat];
-				D.f[dirNE] = &DDStart[dirSW  *size_Mat];
-				D.f[dirNW] = &DDStart[dirSE  *size_Mat];
-				D.f[dirSE] = &DDStart[dirNW  *size_Mat];
-				D.f[dirBW] = &DDStart[dirTE  *size_Mat];
-				D.f[dirTE] = &DDStart[dirBW  *size_Mat];
-				D.f[dirTW] = &DDStart[dirBE  *size_Mat];
-				D.f[dirBE] = &DDStart[dirTW  *size_Mat];
-				D.f[dirBS] = &DDStart[dirTN  *size_Mat];
-				D.f[dirTN] = &DDStart[dirBS  *size_Mat];
-				D.f[dirTS] = &DDStart[dirBN  *size_Mat];
-				D.f[dirBN] = &DDStart[dirTS  *size_Mat];
-				D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
-				D.f[dirBSW] = &DDStart[dirTNE *size_Mat];
-				D.f[dirBNE] = &DDStart[dirTSW *size_Mat];
-				D.f[dirBNW] = &DDStart[dirTSE *size_Mat];
-				D.f[dirBSE] = &DDStart[dirTNW *size_Mat];
-				D.f[dirTSW] = &DDStart[dirBNE *size_Mat];
-				D.f[dirTNE] = &DDStart[dirBSW *size_Mat];
-				D.f[dirTNW] = &DDStart[dirBSE *size_Mat];
-				D.f[dirTSE] = &DDStart[dirBNW *size_Mat];
-			}
-
-			////////////////////////////////////////////////////////////////////////////////
-			//index
-			//unsigned int kzero= k;
-			//unsigned int ke   = k;
-			unsigned int kw = neighborX[k];
-			//unsigned int kn   = k;
-			unsigned int ks = neighborY[k];
-			//unsigned int kt   = k;
-			unsigned int kb = neighborZ[k];
-			unsigned int ksw = neighborY[kw];
-			//unsigned int kne  = k;
-			//unsigned int kse  = ks;
-			//unsigned int knw  = kw;
-			unsigned int kbw = neighborZ[kw];
-			//unsigned int kte  = k;
-			//unsigned int kbe  = kb;
-			//unsigned int ktw  = kw;
-			unsigned int kbs = neighborZ[ks];
-			//unsigned int ktn  = k;
-			//unsigned int kbn  = kb;
-			//unsigned int kts  = ks;
-			//unsigned int ktse = ks;
-			//unsigned int kbnw = kbw;
-			//unsigned int ktnw = kw;
-			//unsigned int kbse = kbs;
-			//unsigned int ktsw = ksw;
-			//unsigned int kbne = kb;
-			//unsigned int ktne = k;
-			unsigned int kbsw = neighborZ[ksw];
-
-
-
-			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[dirE])[k];//[ke   ];// +  c2over27 ;(D.f[dirE   ])[k  ];//ke
-			real mfabb = (D.f[dirW])[kw];//[kw   ];// +  c2over27 ;(D.f[dirW   ])[kw ];
-			real mfbcb = (D.f[dirN])[k];//[kn   ];// +  c2over27 ;(D.f[dirN   ])[k  ];//kn
-			real mfbab = (D.f[dirS])[ks];//[ks   ];// +  c2over27 ;(D.f[dirS   ])[ks ];
-			real mfbbc = (D.f[dirT])[k];//[kt   ];// +  c2over27 ;(D.f[dirT   ])[k  ];//kt
-			real mfbba = (D.f[dirB])[kb];//[kb   ];// +  c2over27 ;(D.f[dirB   ])[kb ];
-			real mfccb = (D.f[dirNE])[k];//[kne  ];// +  c1over54 ;(D.f[dirNE  ])[k  ];//kne
-			real mfaab = (D.f[dirSW])[ksw];//[ksw  ];// +  c1over54 ;(D.f[dirSW  ])[ksw];
-			real mfcab = (D.f[dirSE])[ks];//[kse  ];// +  c1over54 ;(D.f[dirSE  ])[ks ];//kse
-			real mfacb = (D.f[dirNW])[kw];//[knw  ];// +  c1over54 ;(D.f[dirNW  ])[kw ];//knw
-			real mfcbc = (D.f[dirTE])[k];//[kte  ];// +  c1over54 ;(D.f[dirTE  ])[k  ];//kte
-			real mfaba = (D.f[dirBW])[kbw];//[kbw  ];// +  c1over54 ;(D.f[dirBW  ])[kbw];
-			real mfcba = (D.f[dirBE])[kb];//[kbe  ];// +  c1over54 ;(D.f[dirBE  ])[kb ];//kbe
-			real mfabc = (D.f[dirTW])[kw];//[ktw  ];// +  c1over54 ;(D.f[dirTW  ])[kw ];//ktw
-			real mfbcc = (D.f[dirTN])[k];//[ktn  ];// +  c1over54 ;(D.f[dirTN  ])[k  ];//ktn
-			real mfbaa = (D.f[dirBS])[kbs];//[kbs  ];// +  c1over54 ;(D.f[dirBS  ])[kbs];
-			real mfbca = (D.f[dirBN])[kb];//[kbn  ];// +  c1over54 ;(D.f[dirBN  ])[kb ];//kbn
-			real mfbac = (D.f[dirTS])[ks];//[kts  ];// +  c1over54 ;(D.f[dirTS  ])[ks ];//kts
-			real mfbbb = (D.f[dirZERO])[k];//[kzero];// +  c8over27 ;(D.f[dirZERO])[k  ];//kzero
-			real mfccc = (D.f[dirTNE])[k];//[ktne ];// +  c1over216;(D.f[dirTNE ])[k  ];//ktne
-			real mfaac = (D.f[dirTSW])[ksw];//[ktsw ];// +  c1over216;(D.f[dirTSW ])[ksw];//ktsw
-			real mfcac = (D.f[dirTSE])[ks];//[ktse ];// +  c1over216;(D.f[dirTSE ])[ks ];//ktse
-			real mfacc = (D.f[dirTNW])[kw];//[ktnw ];// +  c1over216;(D.f[dirTNW ])[kw ];//ktnw
-			real mfcca = (D.f[dirBNE])[kb];//[kbne ];// +  c1over216;(D.f[dirBNE ])[kb ];//kbne
-			real mfaaa = (D.f[dirBSW])[kbsw];//[kbsw ];// +  c1over216;(D.f[dirBSW ])[kbsw];
-			real mfcaa = (D.f[dirBSE])[kbs];//[kbse ];// +  c1over216;(D.f[dirBSE ])[kbs];//kbse
-			real mfaca = (D.f[dirBNW])[kbw];//[kbnw ];// +  c1over216;(D.f[dirBNW ])[kbw];//kbnw
-											   ////////////////////////////////////////////////////////////////////////////////////
-			real 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;
-
-			real rho = c1o1 + drho;
-			////////////////////////////////////////////////////////////////////////////////////
-			real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
-				(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
-				(mfcbb - mfabb)) / rho;
-			real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
-				(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
-				(mfbcb - mfbab)) / rho;
-			real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
-				(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
-				(mfbbc - mfbba)) / rho;
-			////////////////////////////////////////////////////////////////////////////////////
-			//the force be with you
-			real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; //
-			real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero;
-			real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero;
-			vvx += fx*c1o2;
-			vvy += fy*c1o2;
-			vvz += fz*c1o2;
-			////////////////////////////////////////////////////////////////////////////////////
-			//real omega = omega_in;
-			////////////////////////////////////////////////////////////////////////////////////
-			//fast
-			//real oMdrho = c1o1; // comp special
-			//real m0, m1, m2;
-			real vx2;
-			real vy2;
-			real vz2;
-			vx2 = vvx*vvx;
-			vy2 = vvy*vvy;
-			vz2 = vvz*vvz;
-			////////////////////////////////////////////////////////////////////////////////////
-			//real wadjust;
-			//real qudricLimitP = c1o100;// * 0.0001f;
-			//real qudricLimitM = c1o100;// * 0.0001f;
-			//real qudricLimitD = c1o100;// * 0.001f;
-			//real s9 = minusomega;
-			//test
-			//s9 = 0.;
-
-
-			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real EQcbb = c0o1;
-			real EQabb = c0o1;
-			real EQbcb = c0o1;
-			real EQbab = c0o1;
-			real EQbbc = c0o1;
-			real EQbba = c0o1;
-			real EQccb = c0o1;
-			real EQaab = c0o1;
-			real EQcab = c0o1;
-			real EQacb = c0o1;
-			real EQcbc = c0o1;
-			real EQaba = c0o1;
-			real EQcba = c0o1;
-			real EQabc = c0o1;
-			real EQbcc = c0o1;
-			real EQbaa = c0o1;
-			real EQbca = c0o1;
-			real EQbac = c0o1;
-			real EQbbb = c0o1;
-			real EQccc = drho * c1o27;
-			real EQaac = drho * c1o3;
-			real EQcac = drho * c1o9;
-			real EQacc = drho * c1o9;
-			real EQcca = drho * c1o9;
-			real EQaaa = drho;
-			real EQcaa = drho * c1o3;
-			real EQaca = drho * c1o3;
-			////////////////////////////////////////////////////////////////////////////////////
-			backwardChimeraWithK(EQaaa, EQaab, EQaac, vvz, vz2, c1o1);
-			backwardChimeraWithK(EQaca, EQacb, EQacc, vvz, vz2, c1o3);
-			///////////////////////////////////////////////////////////
-			EQcaa = EQaca; EQcab = EQacb; EQcac = EQacc;
-			///////////////////////////////////////////////////////////
-			backwardChimeraWithK(EQcca, EQccb, EQccc, vvz, vz2, c1o9);
-
-			backwardChimeraWithK(EQaaa, EQaba, EQaca, vvy, vy2, c1o6);
-			backwardChimeraWithK(EQaab, EQabb, EQacb, vvy, vy2, c2o3);
-			backwardChimeraWithK(EQaac, EQabc, EQacc, vvy, vy2, c1o6);
-			backwardChimeraWithK(EQcaa, EQcba, EQcca, vvy, vy2, c1o18);
-			backwardChimeraWithK(EQcab, EQcbb, EQccb, vvy, vy2, c2o9);
-			backwardChimeraWithK(EQcac, EQcbc, EQccc, vvy, vy2, c1o18);
-
-			backwardChimeraWithK(EQaaa, EQbaa, EQcaa, vvx, vx2, c1o36);
-			backwardChimeraWithK(EQaab, EQbab, EQcab, vvx, vx2, c1o9);
-			backwardChimeraWithK(EQaac, EQbac, EQcac, vvx, vx2, c1o36);
-			backwardChimeraWithK(EQaba, EQbba, EQcba, vvx, vx2, c1o9);
-			backwardChimeraWithK(EQabb, EQbbb, EQcbb, vvx, vx2, c4o9);
-			backwardChimeraWithK(EQabc, EQbbc, EQcbc, vvx, vx2, c1o9);
-			backwardChimeraWithK(EQaca, EQbca, EQcca, vvx, vx2, c1o36);
-			backwardChimeraWithK(EQacb, EQbcb, EQccb, vvx, vx2, c1o9);
-			backwardChimeraWithK(EQacc, EQbcc, EQccc, vvx, vx2, c1o36);
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//Pre-condition
-			mfcbb -= EQcbb;
-			mfabb -= EQabb;
-			mfbcb -= EQbcb;
-			mfbab -= EQbab;
-			mfbbc -= EQbbc;
-			mfbba -= EQbba;
-			mfccb -= EQccb;
-			mfaab -= EQaab;
-			mfcab -= EQcab;
-			mfacb -= EQacb;
-			mfcbc -= EQcbc;
-			mfaba -= EQaba;
-			mfcba -= EQcba;
-			mfabc -= EQabc;
-			mfbcc -= EQbcc;
-			mfbaa -= EQbaa;
-			mfbca -= EQbca;
-			mfbac -= EQbac;
-			mfbbb -= EQbbb;
-			mfccc -= EQccc;
-			mfaac -= EQaac;
-			mfcac -= EQcac;
-			mfacc -= EQacc;
-			mfcca -= EQcca;
-			mfaaa -= EQaaa;
-			mfcaa -= EQcaa;
-			mfaca -= EQaca;
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//Hin
-			////////////////////////////////////////////////////////////////////////////////////
-			forwardChimera(mfaaa, mfaab, mfaac, vvz, vz2);
-			forwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
-			forwardChimera(mfaca, mfacb, mfacc, vvz, vz2);
-			forwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
-			forwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
-			forwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
-			forwardChimera(mfcaa, mfcab, mfcac, vvz, vz2);
-			forwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
-			forwardChimera(mfcca, mfccb, mfccc, vvz, vz2);
-
-			forwardChimera(mfaaa, mfaba, mfaca, vvy, vy2);
-			forwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
-			forwardChimera(mfaac, mfabc, mfacc, vvy, vy2);
-			forwardChimera(mfbaa, mfbba, mfbca, vvy, vy2);
-			forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
-			forwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2);
-			forwardChimera(mfcaa, mfcba, mfcca, vvy, vy2);
-			forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
-			forwardChimera(mfcac, mfcbc, mfccc, vvy, vy2);
-
-			forwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2);
-			forwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
-			forwardChimera(mfaac, mfbac, mfcac, vvx, vx2);
-			forwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
-			forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
-			forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
-			forwardChimera(mfaca, mfbca, mfcca, vvx, vx2);
-			forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
-			forwardChimera(mfacc, mfbcc, mfccc, vvx, vx2);
-
-			//////////////////////////////////////////////////////////////////////////////////////
-			////Hin
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// Z - Dir
-			//forwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c4o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// Y - Dir
-			//forwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o18);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c2o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c2o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o6);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9		Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// X - Dir
-			//forwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, one);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-
-
-			////////////////////////////////////////////////////////////////////////////////////
-			// Cumulants
-			////////////////////////////////////////////////////////////////////////////////////
-			real OxxPyyPzz = c1o1; //omega; // one;	//set the bulk viscosity one is high / two is very low and zero is (too) high
-
-			////////////////////////////////////////////////////////////
-			//3.
-			//////////////////////////////
-			real OxyyPxzz = c1o1;
-			real OxyyMxzz = c1o1;
-			//real Oxyz = c1o1;
-			////////////////////////////////////////////////////////////
-			//4.
-			//////////////////////////////
-			real O4 = c1o1;
-			////////////////////////////////////////////////////////////
-			//5.
-			//////////////////////////////
-			real O5 = c1o1;
-			////////////////////////////////////////////////////////////
-			//6.
-			//////////////////////////////
-			real O6 = c1o1;
-			////////////////////////////////////////////////////////////
-
-
-			//central moments to cumulants
-			//4.
-			real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho;
-			real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho;
-			real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho;
-
-			real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
-			real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
-			real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
-
-			//5.
-			real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
-			real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
-			real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
-
-			//6.
-
-			real CUMccc = mfccc + ((-c4o1 *  mfbbb * mfbbb
-				- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-				- c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
-				- c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
-				+ (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-					+ c2o1 * (mfcaa * mfaca * mfaac)
-					+ c16o1 *  mfbba * mfbab * mfabb) / (rho * rho)
-				- c1o3 * (mfacc + mfcac + mfcca) / rho
-				- c1o9 * (mfcaa + mfaca + mfaac) / rho
-				+ (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
-					+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
-				+ c1o27*((drho * drho - drho) / (rho*rho)));
-
-
-
-
-			//2.
-			// linear combinations
-			real mxxPyyPzz = mfcaa + mfaca + mfaac;
-			real mxxMyy = mfcaa - mfaca;
-			real mxxMzz = mfcaa - mfaac;
-
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			//incl. correction		(hat noch nicht so gut funktioniert...Optimierungsbedarf??)
-			{
-				real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 *  OxxPyyPzz * (mfaaa - mxxPyyPzz);
-				real dyuy = dxux + omega * c3o2 * mxxMyy;
-				real dzuz = dxux + omega * c3o2 * mxxMzz;
-
-				//relax
-				mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz;
-				mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
-				mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz);
-
-			}
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			////no correction
-			//mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz;
-			//mxxMyy += -(-omega) * (-mxxMyy);
-			//mxxMzz += -(-omega) * (-mxxMzz);
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			mfabb += omega * (-mfabb);
-			mfbab += omega * (-mfbab);
-			mfbba += omega * (-mfbba);
-
-			//////////////////////////////////////////////////////////////////////////
-
-			// linear combinations back
-			mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
-			mfaca = c1o3 * (-c2o1*  mxxMyy + mxxMzz + mxxPyyPzz);
-			mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz);
-
-			//3.
-			// linear combinations
-
-			real mxxyPyzz = mfcba + mfabc;
-			real mxxyMyzz = mfcba - mfabc;
-
-			real mxxzPyyz = mfcab + mfacb;
-			real mxxzMyyz = mfcab - mfacb;
-
-			real mxyyPxzz = mfbca + mfbac;
-			real mxyyMxzz = mfbca - mfbac;
-
-			//relax
-			//////////////////////////////////////////////////////////////////////////
-			mfbbb += OxyyMxzz * (-mfbbb);
-			mxxyPyzz += OxyyPxzz * (-mxxyPyzz);
-			mxxyMyzz += OxyyMxzz * (-mxxyMyzz);
-			mxxzPyyz += OxyyPxzz * (-mxxzPyyz);
-			mxxzMyyz += OxyyMxzz * (-mxxzMyyz);
-			mxyyPxzz += OxyyPxzz * (-mxyyPxzz);
-			mxyyMxzz += OxyyMxzz * (-mxyyMxzz);
-			//////////////////////////////////////////////////////////////////////////
-
-			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 + c2o1 * mfbba * mfbab) / rho;
-			mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho;
-			mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho;
-
-			mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
-			mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
-			mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
-
-			//5.
-			mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
-			mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
-			mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
-
-			//6.
-			mfccc = CUMccc - ((-c4o1 *  mfbbb * mfbbb
-				- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-				- c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
-				- c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
-				+ (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-					+ c2o1 * (mfcaa * mfaca * mfaac)
-					+ c16o1 *  mfbba * mfbab * mfabb) / (rho * rho)
-				- c1o3 * (mfacc + mfcac + mfcca) / rho
-				- c1o9 * (mfcaa + mfaca + mfaac) / rho
-				+ (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
-					+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
-				+ c1o27*((drho * drho - drho) / (rho*rho)));
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//the force be with you
-			mfbaa = -mfbaa;
-			mfaba = -mfaba;
-			mfaab = -mfaab;
-			////////////////////////////////////////////////////////////////////////////////////
-
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//back
-			////////////////////////////////////////////////////////////////////////////////////
-			backwardChimera(mfaaa, mfaab, mfaac, vvz, vz2);
-			backwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
-			backwardChimera(mfaca, mfacb, mfacc, vvz, vz2);
-			backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
-			backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
-			backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
-			backwardChimera(mfcaa, mfcab, mfcac, vvz, vz2);
-			backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
-			backwardChimera(mfcca, mfccb, mfccc, vvz, vz2);
-
-			backwardChimera(mfaaa, mfaba, mfaca, vvy, vy2);
-			backwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
-			backwardChimera(mfaac, mfabc, mfacc, vvy, vy2);
-			backwardChimera(mfbaa, mfbba, mfbca, vvy, vy2);
-			backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
-			backwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2);
-			backwardChimera(mfcaa, mfcba, mfcca, vvy, vy2);
-			backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
-			backwardChimera(mfcac, mfcbc, mfccc, vvy, vy2);
-
-			backwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2);
-			backwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
-			backwardChimera(mfaac, mfbac, mfcac, vvx, vx2);
-			backwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
-			backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
-			backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
-			backwardChimera(mfaca, mfbca, mfcca, vvx, vx2);
-			backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
-			backwardChimera(mfacc, mfbcc, mfccc, vvx, vx2);
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//mfcbb += EQcbb;
-			//mfabb += EQabb;
-			//mfbcb += EQbcb;
-			//mfbab += EQbab;
-			//mfbbc += EQbbc;
-			//mfbba += EQbba;
-			//mfccb += EQccb;
-			//mfaab += EQaab;
-			//mfcab += EQcab;
-			//mfacb += EQacb;
-			//mfcbc += EQcbc;
-			//mfaba += EQaba;
-			//mfcba += EQcba;
-			//mfabc += EQabc;
-			//mfbcc += EQbcc;
-			//mfbaa += EQbaa;
-			//mfbca += EQbca;
-			//mfbac += EQbac;
-			//mfbbb += EQbbb;
-			//mfccc += EQccc;
-			//mfaac += EQaac;
-			//mfcac += EQcac;
-			//mfacc += EQacc;
-			//mfcca += EQcca;
-			//mfaaa += EQaaa;
-			//mfcaa += EQcaa;
-			//mfaca += EQaca;
-			////////////////////////////////////////////////////////////////////////////////////
-			////Error diffusion
-			real fTEMP = mfbbb + EQbbb;
-			real delta0 = mfbbb - (fTEMP - EQbbb);
-			delta0 *= c1o4;
-			mfbbb = fTEMP;
-
-
-			fTEMP = mfcbb + EQcbb;
-			real deltacbb = mfcbb - (fTEMP - EQcbb);
-			mfcbb = fTEMP;
-			//mfcbb+=EQcbb;
-
-			fTEMP = mfabb + EQabb;
-			real deltaabb = mfabb - (fTEMP - EQabb);
-			mfabb = fTEMP;
-			//mfabb+=EQabb;
-
-			fTEMP = mfbcb + EQbcb;
-			real deltabcb = mfbcb - (fTEMP - EQbcb);
-			mfbcb = fTEMP;
-			//mfbcb+=EQbcb;
-
-			fTEMP = mfbab + EQbab;
-			real deltabab = mfbab - (fTEMP - EQbab);
-			mfbab = fTEMP;
-			//mfbab+=EQbab;
-
-			fTEMP = mfbbc + EQbbc;
-			real deltabbc = mfbbc - (fTEMP - EQbbc);
-			mfbbc = fTEMP;
-			//mfbbc+=EQbbc;
-
-			fTEMP = mfbba + EQbba;
-			real deltabba = mfbba - (fTEMP - EQbba);
-			mfbba = fTEMP;
-			//mfbba+=EQbba;
-
-			EQccb += (delta0 + c1o2*(deltacbb + deltabcb));
-			fTEMP = mfccb + EQccb;
-			real deltaccb = mfccb - (fTEMP - EQccb);
-			mfccb = fTEMP;
-			//mfccb+=EQccb+(delta0+c1o2*(deltacbb+deltabcb));
-
-			EQaab += (delta0 + c1o2*(deltaabb + deltabab));
-			fTEMP = mfaab + EQaab;
-			real deltaaab = mfaab - (fTEMP - EQaab);
-			mfaab = fTEMP;
-			//mfaab+=EQaab+(delta0+c1o2*(deltaabb+deltabab));
-
-			EQcab += (delta0 + c1o2*(deltacbb + deltabab));
-			fTEMP = mfcab + EQcab;
-			real deltacab = mfcab - (fTEMP - EQcab);
-			mfcab = fTEMP;
-			//mfcab+=EQcab+(delta0+c1o2*(deltacbb+deltabab));
-
-			EQacb += (delta0 + c1o2*(deltaabb + deltabcb));
-			fTEMP = mfacb + EQacb;
-			real deltaacb = mfacb - (fTEMP - EQacb);
-			mfacb = fTEMP;
-			//mfacb+=EQacb+(delta0+c1o2*(deltaabb+deltabcb));
-
-			EQcbc += (delta0 + c1o2*(deltacbb + deltabbc));
-			fTEMP = mfcbc + EQcbc;
-			real deltacbc = mfcbc - (fTEMP - EQcbc);
-			mfcbc = fTEMP;
-			//mfcbc+=EQcbc+(delta0+c1o2*(deltacbb+deltabbc));
-
-			EQaba += (delta0 + c1o2*(deltaabb + deltabba));
-			fTEMP = mfaba + EQaba;
-			real deltaaba = mfaba - (fTEMP - EQaba);
-			mfaba = fTEMP;
-			//mfaba+=EQaba+(delta0+c1o2*(deltaabb+deltabba));
-
-			EQcba += (delta0 + c1o2*(deltacbb + deltabba));
-			fTEMP = mfcba + EQcba;
-			real deltacba = mfcba - (fTEMP - EQcba);
-			mfcba = fTEMP;
-			//mfcba+=EQcba+(delta0+c1o2*(deltacbb+deltabba));
-
-			EQabc += (delta0 + c1o2*(deltaabb + deltabbc));
-			fTEMP = mfabc + EQabc;
-			real deltaabc = mfabc - (fTEMP - EQabc);
-			mfabc = fTEMP;
-			//mfabc+=EQabc+(delta0+c1o2*(deltaabb+deltabbc));
-
-			EQbcc += (delta0 + c1o2*(deltabcb + deltabbc));
-			fTEMP = mfbcc + EQbcc;
-			real deltabcc = mfbcc - (fTEMP - EQbcc);
-			mfbcc = fTEMP;
-			//mfbcc+=EQbcc+(delta0+c1o2*(deltabcb+deltabbc));
-
-			EQbaa += (delta0 + c1o2*(deltabab + deltabba));
-			fTEMP = mfbaa + EQbaa;
-			real deltabaa = mfbaa - (fTEMP - EQbaa);
-			mfbaa = fTEMP;
-			//mfbaa+=EQbaa+(delta0+c1o2*(deltabab+deltabba));
-
-			EQbca += (delta0 + c1o2*(deltabcb + deltabba));
-			fTEMP = mfbca + EQbca;
-			real deltabca = mfbca - (fTEMP - EQbca);
-			mfbca = fTEMP;
-			//mfbca+=EQbca+(delta0+c1o2*(deltabcb+deltabba));
-
-			EQbac += (delta0 + c1o2*(deltabab + deltabbc));
-			fTEMP = mfbac + EQbac;
-			real deltabac = mfbac - (fTEMP - EQbac);
-			mfbac = fTEMP;
-			//mfbac+=EQbac+(delta0+c1o2*(deltabab+deltabbc));
-
-			mfccc += EQccc - (delta0 + c1o4*(deltacbb + deltabcb + deltabbc) - c1o2*(deltabcc + deltacbc + deltaccb));
-			mfaac += EQaac - (delta0 + c1o4*(deltaabb + deltabab + deltabbc) - c1o2*(deltabac + deltaabc + deltaaab));
-			mfcac += EQcac - (delta0 + c1o4*(deltacbb + deltabab + deltabbc) - c1o2*(deltabac + deltacbc + deltacab));
-			mfacc += EQacc - (delta0 + c1o4*(deltaabb + deltabcb + deltabbc) - c1o2*(deltabcc + deltaabc + deltaacb));
-			mfcca += EQcca - (delta0 + c1o4*(deltacbb + deltabcb + deltabba) - c1o2*(deltabca + deltacba + deltaccb));
-			mfaaa += EQaaa - (delta0 + c1o4*(deltaabb + deltabab + deltabba) - c1o2*(deltabaa + deltaaba + deltaaab));
-			mfcaa += EQcaa - (delta0 + c1o4*(deltacbb + deltabab + deltabba) - c1o2*(deltabaa + deltacba + deltacab));
-			mfaca += EQaca - (delta0 + c1o4*(deltaabb + deltabcb + deltabba) - c1o2*(deltabca + deltaaba + deltaacb));
-
-
-
-			//////////////////////////////////////////////////////////////////////////////////////
-			////back
-			//////////////////////////////////////////////////////////////////////////////////////
-			////mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// Z - Dir
-			//backwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, one);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
-			///////////b//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
-			///////////b//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o3);
-			///////////c//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
-			///////////c//////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			////mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// Y - Dir
-			//backwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaab, mfabb, mfacb, vvy, vy2, c2o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o6);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbaa, mfbba, mfbca, vvz, vz2);
-			///////////b//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbab, mfbbb, mfbcb, vvz, vz2);
-			///////////b//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbac, mfbbc, mfbcc, vvz, vz2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o18);
-			///////////c//////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcab, mfcbb, mfccb, vvy, vy2, c2o9);
-			///////////c//////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			////mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// X - Dir
-			//backwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaba, mfbba, mfcba, vvx, vx2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaab, mfbab, mfcab, vvx, vx2, c1o9);
-			/////////////b////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfabb, mfbbb, mfcbb, vvx, vx2, c4o9);
-			/////////////b////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfacb, mfbcb, mfccb, vvx, vx2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o36);
-			/////////////c////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfabc, mfbbc, mfcbc, vvx, vx2, c1o9);
-			/////////////c////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-
-			////////////////////////////////////////////////////////////////////////////////////////
-			//real drhoPost =
-			//	((((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;
-			//mfbbb += drho - drhoPost;
-			////////////////////////////////////////////////////////////////////////////////////
-			(D.f[dirE])[k] = mfabb;//(D.f[ dirE   ])[ke   ] = mfabb;// -  c2over27 ;  (D.f[ dirE   ])[k   ]                                                                     
-			(D.f[dirW])[kw] = mfcbb;//(D.f[ dirW   ])[kw   ] = mfcbb;// -  c2over27 ;  (D.f[ dirW   ])[kw  ]                                                                   
-			(D.f[dirN])[k] = mfbab;//(D.f[ dirN   ])[kn   ] = mfbab;// -  c2over27 ;	 (D.f[ dirN   ])[k   ]
-			(D.f[dirS])[ks] = mfbcb;//(D.f[ dirS   ])[ks   ] = mfbcb;// -  c2over27 ;	 (D.f[ dirS   ])[ks  ]
-			(D.f[dirT])[k] = mfbba;//(D.f[ dirT   ])[kt   ] = mfbba;// -  c2over27 ;	 (D.f[ dirT   ])[k   ]
-			(D.f[dirB])[kb] = mfbbc;//(D.f[ dirB   ])[kb   ] = mfbbc;// -  c2over27 ;	 (D.f[ dirB   ])[kb  ]
-			(D.f[dirNE])[k] = mfaab;//(D.f[ dirNE  ])[kne  ] = mfaab;// -  c1over54 ;	 (D.f[ dirNE  ])[k   ]
-			(D.f[dirSW])[ksw] = mfccb;//(D.f[ dirSW  ])[ksw  ] = mfccb;// -  c1over54 ;	 (D.f[ dirSW  ])[ksw ]
-			(D.f[dirSE])[ks] = mfacb;//(D.f[ dirSE  ])[kse  ] = mfacb;// -  c1over54 ;	 (D.f[ dirSE  ])[ks  ]
-			(D.f[dirNW])[kw] = mfcab;//(D.f[ dirNW  ])[knw  ] = mfcab;// -  c1over54 ;	 (D.f[ dirNW  ])[kw  ]
-			(D.f[dirTE])[k] = mfaba;//(D.f[ dirTE  ])[kte  ] = mfaba;// -  c1over54 ;	 (D.f[ dirTE  ])[k   ]
-			(D.f[dirBW])[kbw] = mfcbc;//(D.f[ dirBW  ])[kbw  ] = mfcbc;// -  c1over54 ;	 (D.f[ dirBW  ])[kbw ]
-			(D.f[dirBE])[kb] = mfabc;//(D.f[ dirBE  ])[kbe  ] = mfabc;// -  c1over54 ;	 (D.f[ dirBE  ])[kb  ]
-			(D.f[dirTW])[kw] = mfcba;//(D.f[ dirTW  ])[ktw  ] = mfcba;// -  c1over54 ;	 (D.f[ dirTW  ])[kw  ]
-			(D.f[dirTN])[k] = mfbaa;//(D.f[ dirTN  ])[ktn  ] = mfbaa;// -  c1over54 ;	 (D.f[ dirTN  ])[k   ]
-			(D.f[dirBS])[kbs] = mfbcc;//(D.f[ dirBS  ])[kbs  ] = mfbcc;// -  c1over54 ;	 (D.f[ dirBS  ])[kbs ]
-			(D.f[dirBN])[kb] = mfbac;//(D.f[ dirBN  ])[kbn  ] = mfbac;// -  c1over54 ;	 (D.f[ dirBN  ])[kb  ]
-			(D.f[dirTS])[ks] = mfbca;//(D.f[ dirTS  ])[kts  ] = mfbca;// -  c1over54 ;	 (D.f[ dirTS  ])[ks  ]
-			(D.f[dirZERO])[k] = mfbbb;//(D.f[ dirZERO])[kzero] = mfbbb;// -  c8over27 ;	 (D.f[ dirZERO])[k   ]
-			(D.f[dirTNE])[k] = mfaaa;//(D.f[ dirTNE ])[ktne ] = mfaaa;// -  c1over216;	 (D.f[ dirTNE ])[k   ]
-			(D.f[dirTSE])[ks] = mfaca;//(D.f[ dirTSE ])[ktse ] = mfaca;// -  c1over216;	 (D.f[ dirTSE ])[ks  ]
-			(D.f[dirBNE])[kb] = mfaac;//(D.f[ dirBNE ])[kbne ] = mfaac;// -  c1over216;	 (D.f[ dirBNE ])[kb  ]
-			(D.f[dirBSE])[kbs] = mfacc;//(D.f[ dirBSE ])[kbse ] = mfacc;// -  c1over216;	 (D.f[ dirBSE ])[kbs ]
-			(D.f[dirTNW])[kw] = mfcaa;//(D.f[ dirTNW ])[ktnw ] = mfcaa;// -  c1over216;	 (D.f[ dirTNW ])[kw  ]
-			(D.f[dirTSW])[ksw] = mfcca;//(D.f[ dirTSW ])[ktsw ] = mfcca;// -  c1over216;	 (D.f[ dirTSW ])[ksw ]
-			(D.f[dirBNW])[kbw] = mfcac;//(D.f[ dirBNW ])[kbnw ] = mfcac;// -  c1over216;	 (D.f[ dirBNW ])[kbw ]
-			(D.f[dirBSW])[kbsw] = mfccc;//(D.f[ dirBSW ])[kbsw ] = mfccc;// -  c1over216;	 (D.f[ dirBSW ])[kbsw]
-										////////////////////////////////////////////////////////////////////////////////////
-		}
-	}
+    ////////////////////////////////////////////////////////////////////////////////
+    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<size_Mat)
+    {
+        ////////////////////////////////////////////////////////////////////////////////
+        unsigned int BC;
+        BC = bcMatD[k];
+
+        if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/)
+        {
+            Distributions27 D;
+            if (EvenOrOdd == true)
+            {
+                D.f[dirE] = &DDStart[dirE   *size_Mat];
+                D.f[dirW] = &DDStart[dirW   *size_Mat];
+                D.f[dirN] = &DDStart[dirN   *size_Mat];
+                D.f[dirS] = &DDStart[dirS   *size_Mat];
+                D.f[dirT] = &DDStart[dirT   *size_Mat];
+                D.f[dirB] = &DDStart[dirB   *size_Mat];
+                D.f[dirNE] = &DDStart[dirNE  *size_Mat];
+                D.f[dirSW] = &DDStart[dirSW  *size_Mat];
+                D.f[dirSE] = &DDStart[dirSE  *size_Mat];
+                D.f[dirNW] = &DDStart[dirNW  *size_Mat];
+                D.f[dirTE] = &DDStart[dirTE  *size_Mat];
+                D.f[dirBW] = &DDStart[dirBW  *size_Mat];
+                D.f[dirBE] = &DDStart[dirBE  *size_Mat];
+                D.f[dirTW] = &DDStart[dirTW  *size_Mat];
+                D.f[dirTN] = &DDStart[dirTN  *size_Mat];
+                D.f[dirBS] = &DDStart[dirBS  *size_Mat];
+                D.f[dirBN] = &DDStart[dirBN  *size_Mat];
+                D.f[dirTS] = &DDStart[dirTS  *size_Mat];
+                D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
+                D.f[dirTNE] = &DDStart[dirTNE *size_Mat];
+                D.f[dirTSW] = &DDStart[dirTSW *size_Mat];
+                D.f[dirTSE] = &DDStart[dirTSE *size_Mat];
+                D.f[dirTNW] = &DDStart[dirTNW *size_Mat];
+                D.f[dirBNE] = &DDStart[dirBNE *size_Mat];
+                D.f[dirBSW] = &DDStart[dirBSW *size_Mat];
+                D.f[dirBSE] = &DDStart[dirBSE *size_Mat];
+                D.f[dirBNW] = &DDStart[dirBNW *size_Mat];
+            }
+            else
+            {
+                D.f[dirW] = &DDStart[dirE   *size_Mat];
+                D.f[dirE] = &DDStart[dirW   *size_Mat];
+                D.f[dirS] = &DDStart[dirN   *size_Mat];
+                D.f[dirN] = &DDStart[dirS   *size_Mat];
+                D.f[dirB] = &DDStart[dirT   *size_Mat];
+                D.f[dirT] = &DDStart[dirB   *size_Mat];
+                D.f[dirSW] = &DDStart[dirNE  *size_Mat];
+                D.f[dirNE] = &DDStart[dirSW  *size_Mat];
+                D.f[dirNW] = &DDStart[dirSE  *size_Mat];
+                D.f[dirSE] = &DDStart[dirNW  *size_Mat];
+                D.f[dirBW] = &DDStart[dirTE  *size_Mat];
+                D.f[dirTE] = &DDStart[dirBW  *size_Mat];
+                D.f[dirTW] = &DDStart[dirBE  *size_Mat];
+                D.f[dirBE] = &DDStart[dirTW  *size_Mat];
+                D.f[dirBS] = &DDStart[dirTN  *size_Mat];
+                D.f[dirTN] = &DDStart[dirBS  *size_Mat];
+                D.f[dirTS] = &DDStart[dirBN  *size_Mat];
+                D.f[dirBN] = &DDStart[dirTS  *size_Mat];
+                D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
+                D.f[dirBSW] = &DDStart[dirTNE *size_Mat];
+                D.f[dirBNE] = &DDStart[dirTSW *size_Mat];
+                D.f[dirBNW] = &DDStart[dirTSE *size_Mat];
+                D.f[dirBSE] = &DDStart[dirTNW *size_Mat];
+                D.f[dirTSW] = &DDStart[dirBNE *size_Mat];
+                D.f[dirTNE] = &DDStart[dirBSW *size_Mat];
+                D.f[dirTNW] = &DDStart[dirBSE *size_Mat];
+                D.f[dirTSE] = &DDStart[dirBNW *size_Mat];
+            }
+
+            ////////////////////////////////////////////////////////////////////////////////
+            //index
+            //unsigned int kzero= k;
+            //unsigned int ke   = k;
+            unsigned int kw = neighborX[k];
+            //unsigned int kn   = k;
+            unsigned int ks = neighborY[k];
+            //unsigned int kt   = k;
+            unsigned int kb = neighborZ[k];
+            unsigned int ksw = neighborY[kw];
+            //unsigned int kne  = k;
+            //unsigned int kse  = ks;
+            //unsigned int knw  = kw;
+            unsigned int kbw = neighborZ[kw];
+            //unsigned int kte  = k;
+            //unsigned int kbe  = kb;
+            //unsigned int ktw  = kw;
+            unsigned int kbs = neighborZ[ks];
+            //unsigned int ktn  = k;
+            //unsigned int kbn  = kb;
+            //unsigned int kts  = ks;
+            //unsigned int ktse = ks;
+            //unsigned int kbnw = kbw;
+            //unsigned int ktnw = kw;
+            //unsigned int kbse = kbs;
+            //unsigned int ktsw = ksw;
+            //unsigned int kbne = kb;
+            //unsigned int ktne = k;
+            unsigned int kbsw = neighborZ[ksw];
+
+
+
+            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            real mfcbb = (D.f[dirE])[k];//[ke   ];// +  c2over27 ;(D.f[dirE   ])[k  ];//ke
+            real mfabb = (D.f[dirW])[kw];//[kw   ];// +  c2over27 ;(D.f[dirW   ])[kw ];
+            real mfbcb = (D.f[dirN])[k];//[kn   ];// +  c2over27 ;(D.f[dirN   ])[k  ];//kn
+            real mfbab = (D.f[dirS])[ks];//[ks   ];// +  c2over27 ;(D.f[dirS   ])[ks ];
+            real mfbbc = (D.f[dirT])[k];//[kt   ];// +  c2over27 ;(D.f[dirT   ])[k  ];//kt
+            real mfbba = (D.f[dirB])[kb];//[kb   ];// +  c2over27 ;(D.f[dirB   ])[kb ];
+            real mfccb = (D.f[dirNE])[k];//[kne  ];// +  c1over54 ;(D.f[dirNE  ])[k  ];//kne
+            real mfaab = (D.f[dirSW])[ksw];//[ksw  ];// +  c1over54 ;(D.f[dirSW  ])[ksw];
+            real mfcab = (D.f[dirSE])[ks];//[kse  ];// +  c1over54 ;(D.f[dirSE  ])[ks ];//kse
+            real mfacb = (D.f[dirNW])[kw];//[knw  ];// +  c1over54 ;(D.f[dirNW  ])[kw ];//knw
+            real mfcbc = (D.f[dirTE])[k];//[kte  ];// +  c1over54 ;(D.f[dirTE  ])[k  ];//kte
+            real mfaba = (D.f[dirBW])[kbw];//[kbw  ];// +  c1over54 ;(D.f[dirBW  ])[kbw];
+            real mfcba = (D.f[dirBE])[kb];//[kbe  ];// +  c1over54 ;(D.f[dirBE  ])[kb ];//kbe
+            real mfabc = (D.f[dirTW])[kw];//[ktw  ];// +  c1over54 ;(D.f[dirTW  ])[kw ];//ktw
+            real mfbcc = (D.f[dirTN])[k];//[ktn  ];// +  c1over54 ;(D.f[dirTN  ])[k  ];//ktn
+            real mfbaa = (D.f[dirBS])[kbs];//[kbs  ];// +  c1over54 ;(D.f[dirBS  ])[kbs];
+            real mfbca = (D.f[dirBN])[kb];//[kbn  ];// +  c1over54 ;(D.f[dirBN  ])[kb ];//kbn
+            real mfbac = (D.f[dirTS])[ks];//[kts  ];// +  c1over54 ;(D.f[dirTS  ])[ks ];//kts
+            real mfbbb = (D.f[dirZERO])[k];//[kzero];// +  c8over27 ;(D.f[dirZERO])[k  ];//kzero
+            real mfccc = (D.f[dirTNE])[k];//[ktne ];// +  c1over216;(D.f[dirTNE ])[k  ];//ktne
+            real mfaac = (D.f[dirTSW])[ksw];//[ktsw ];// +  c1over216;(D.f[dirTSW ])[ksw];//ktsw
+            real mfcac = (D.f[dirTSE])[ks];//[ktse ];// +  c1over216;(D.f[dirTSE ])[ks ];//ktse
+            real mfacc = (D.f[dirTNW])[kw];//[ktnw ];// +  c1over216;(D.f[dirTNW ])[kw ];//ktnw
+            real mfcca = (D.f[dirBNE])[kb];//[kbne ];// +  c1over216;(D.f[dirBNE ])[kb ];//kbne
+            real mfaaa = (D.f[dirBSW])[kbsw];//[kbsw ];// +  c1over216;(D.f[dirBSW ])[kbsw];
+            real mfcaa = (D.f[dirBSE])[kbs];//[kbse ];// +  c1over216;(D.f[dirBSE ])[kbs];//kbse
+            real mfaca = (D.f[dirBNW])[kbw];//[kbnw ];// +  c1over216;(D.f[dirBNW ])[kbw];//kbnw
+                                               ////////////////////////////////////////////////////////////////////////////////////
+            real 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;
+
+            real rho = c1o1 + drho;
+            ////////////////////////////////////////////////////////////////////////////////////
+            real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+                (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+                (mfcbb - mfabb)) / rho;
+            real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+                (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+                (mfbcb - mfbab)) / rho;
+            real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+                (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+                (mfbbc - mfbba)) / rho;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //the force be with you
+            real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; //
+            real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero;
+            real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero;
+            vvx += fx*c1o2;
+            vvy += fy*c1o2;
+            vvz += fz*c1o2;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //real omega = omega_in;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //fast
+            //real oMdrho = c1o1; // comp special
+            //real m0, m1, m2;
+            real vx2;
+            real vy2;
+            real vz2;
+            vx2 = vvx*vvx;
+            vy2 = vvy*vvy;
+            vz2 = vvz*vvz;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //real wadjust;
+            //real qudricLimitP = c1o100;// * 0.0001f;
+            //real qudricLimitM = c1o100;// * 0.0001f;
+            //real qudricLimitD = c1o100;// * 0.001f;
+            //real s9 = minusomega;
+            //test
+            //s9 = 0.;
+
+
+            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            real EQcbb = c0o1;
+            real EQabb = c0o1;
+            real EQbcb = c0o1;
+            real EQbab = c0o1;
+            real EQbbc = c0o1;
+            real EQbba = c0o1;
+            real EQccb = c0o1;
+            real EQaab = c0o1;
+            real EQcab = c0o1;
+            real EQacb = c0o1;
+            real EQcbc = c0o1;
+            real EQaba = c0o1;
+            real EQcba = c0o1;
+            real EQabc = c0o1;
+            real EQbcc = c0o1;
+            real EQbaa = c0o1;
+            real EQbca = c0o1;
+            real EQbac = c0o1;
+            real EQbbb = c0o1;
+            real EQccc = drho * c1o27;
+            real EQaac = drho * c1o3;
+            real EQcac = drho * c1o9;
+            real EQacc = drho * c1o9;
+            real EQcca = drho * c1o9;
+            real EQaaa = drho;
+            real EQcaa = drho * c1o3;
+            real EQaca = drho * c1o3;
+            ////////////////////////////////////////////////////////////////////////////////////
+            vf::lbm::backwardChimeraWithK(EQaaa, EQaab, EQaac, vvz, vz2, c1o1);
+            vf::lbm::backwardChimeraWithK(EQaca, EQacb, EQacc, vvz, vz2, c1o3);
+            ///////////////////////////////////////////////////////////
+            EQcaa = EQaca; EQcab = EQacb; EQcac = EQacc;
+            ///////////////////////////////////////////////////////////
+            vf::lbm::backwardChimeraWithK(EQcca, EQccb, EQccc, vvz, vz2, c1o9);
+
+            vf::lbm::backwardChimeraWithK(EQaaa, EQaba, EQaca, vvy, vy2, c1o6);
+            vf::lbm::backwardChimeraWithK(EQaab, EQabb, EQacb, vvy, vy2, c2o3);
+            vf::lbm::backwardChimeraWithK(EQaac, EQabc, EQacc, vvy, vy2, c1o6);
+            vf::lbm::backwardChimeraWithK(EQcaa, EQcba, EQcca, vvy, vy2, c1o18);
+            vf::lbm::backwardChimeraWithK(EQcab, EQcbb, EQccb, vvy, vy2, c2o9);
+            vf::lbm::backwardChimeraWithK(EQcac, EQcbc, EQccc, vvy, vy2, c1o18);
+
+            vf::lbm::backwardChimeraWithK(EQaaa, EQbaa, EQcaa, vvx, vx2, c1o36);
+            vf::lbm::backwardChimeraWithK(EQaab, EQbab, EQcab, vvx, vx2, c1o9);
+            vf::lbm::backwardChimeraWithK(EQaac, EQbac, EQcac, vvx, vx2, c1o36);
+            vf::lbm::backwardChimeraWithK(EQaba, EQbba, EQcba, vvx, vx2, c1o9);
+            vf::lbm::backwardChimeraWithK(EQabb, EQbbb, EQcbb, vvx, vx2, c4o9);
+            vf::lbm::backwardChimeraWithK(EQabc, EQbbc, EQcbc, vvx, vx2, c1o9);
+            vf::lbm::backwardChimeraWithK(EQaca, EQbca, EQcca, vvx, vx2, c1o36);
+            vf::lbm::backwardChimeraWithK(EQacb, EQbcb, EQccb, vvx, vx2, c1o9);
+            vf::lbm::backwardChimeraWithK(EQacc, EQbcc, EQccc, vvx, vx2, c1o36);
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //Pre-condition
+            mfcbb -= EQcbb;
+            mfabb -= EQabb;
+            mfbcb -= EQbcb;
+            mfbab -= EQbab;
+            mfbbc -= EQbbc;
+            mfbba -= EQbba;
+            mfccb -= EQccb;
+            mfaab -= EQaab;
+            mfcab -= EQcab;
+            mfacb -= EQacb;
+            mfcbc -= EQcbc;
+            mfaba -= EQaba;
+            mfcba -= EQcba;
+            mfabc -= EQabc;
+            mfbcc -= EQbcc;
+            mfbaa -= EQbaa;
+            mfbca -= EQbca;
+            mfbac -= EQbac;
+            mfbbb -= EQbbb;
+            mfccc -= EQccc;
+            mfaac -= EQaac;
+            mfcac -= EQcac;
+            mfacc -= EQacc;
+            mfcca -= EQcca;
+            mfaaa -= EQaaa;
+            mfcaa -= EQcaa;
+            mfaca -= EQaca;
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //Hin
+            ////////////////////////////////////////////////////////////////////////////////////
+            vf::lbm::forwardChimera(mfaaa, mfaab, mfaac, vvz, vz2);
+            vf::lbm::forwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
+            vf::lbm::forwardChimera(mfaca, mfacb, mfacc, vvz, vz2);
+            vf::lbm::forwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
+            vf::lbm::forwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
+            vf::lbm::forwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
+            vf::lbm::forwardChimera(mfcaa, mfcab, mfcac, vvz, vz2);
+            vf::lbm::forwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
+            vf::lbm::forwardChimera(mfcca, mfccb, mfccc, vvz, vz2);
+
+            vf::lbm::forwardChimera(mfaaa, mfaba, mfaca, vvy, vy2);
+            vf::lbm::forwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
+            vf::lbm::forwardChimera(mfaac, mfabc, mfacc, vvy, vy2);
+            vf::lbm::forwardChimera(mfbaa, mfbba, mfbca, vvy, vy2);
+            vf::lbm::forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
+            vf::lbm::forwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2);
+            vf::lbm::forwardChimera(mfcaa, mfcba, mfcca, vvy, vy2);
+            vf::lbm::forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
+            vf::lbm::forwardChimera(mfcac, mfcbc, mfccc, vvy, vy2);
+
+            vf::lbm::forwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2);
+            vf::lbm::forwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
+            vf::lbm::forwardChimera(mfaac, mfbac, mfcac, vvx, vx2);
+            vf::lbm::forwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
+            vf::lbm::forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
+            vf::lbm::forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
+            vf::lbm::forwardChimera(mfaca, mfbca, mfcca, vvx, vx2);
+            vf::lbm::forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
+            vf::lbm::forwardChimera(mfacc, mfbcc, mfccc, vvx, vx2);
+
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////Hin
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// Z - Dir
+            //forwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c4o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// Y - Dir
+            //forwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o18);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c2o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c2o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o6);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9		Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// X - Dir
+            //forwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, one);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            // Cumulants
+            ////////////////////////////////////////////////////////////////////////////////////
+            real OxxPyyPzz = c1o1; //omega; // one;	//set the bulk viscosity one is high / two is very low and zero is (too) high
+
+            ////////////////////////////////////////////////////////////
+            //3.
+            //////////////////////////////
+            real OxyyPxzz = c1o1;
+            real OxyyMxzz = c1o1;
+            //real Oxyz = c1o1;
+            ////////////////////////////////////////////////////////////
+            //4.
+            //////////////////////////////
+            real O4 = c1o1;
+            ////////////////////////////////////////////////////////////
+            //5.
+            //////////////////////////////
+            real O5 = c1o1;
+            ////////////////////////////////////////////////////////////
+            //6.
+            //////////////////////////////
+            real O6 = c1o1;
+            ////////////////////////////////////////////////////////////
+
+
+            //central moments to cumulants
+            //4.
+            real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho;
+            real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho;
+            real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho;
+
+            real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
+            real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
+            real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
+
+            //5.
+            real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+            real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+            real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+
+            //6.
+
+            real CUMccc = mfccc + ((-c4o1 *  mfbbb * mfbbb
+                - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+                - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+                - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+                + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                    + c2o1 * (mfcaa * mfaca * mfaac)
+                    + c16o1 *  mfbba * mfbab * mfabb) / (rho * rho)
+                - c1o3 * (mfacc + mfcac + mfcca) / rho
+                - c1o9 * (mfcaa + mfaca + mfaac) / rho
+                + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+                    + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
+                + c1o27*((drho * drho - drho) / (rho*rho)));
+
+
+
+
+            //2.
+            // linear combinations
+            real mxxPyyPzz = mfcaa + mfaca + mfaac;
+            real mxxMyy = mfcaa - mfaca;
+            real mxxMzz = mfcaa - mfaac;
+
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            //incl. correction		(hat noch nicht so gut funktioniert...Optimierungsbedarf??)
+            {
+                real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 *  OxxPyyPzz * (mfaaa - mxxPyyPzz);
+                real dyuy = dxux + omega * c3o2 * mxxMyy;
+                real dzuz = dxux + omega * c3o2 * mxxMzz;
+
+                //relax
+                mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz;
+                mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
+                mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz);
+
+            }
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            ////no correction
+            //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz;
+            //mxxMyy += -(-omega) * (-mxxMyy);
+            //mxxMzz += -(-omega) * (-mxxMzz);
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            mfabb += omega * (-mfabb);
+            mfbab += omega * (-mfbab);
+            mfbba += omega * (-mfbba);
+
+            //////////////////////////////////////////////////////////////////////////
+
+            // linear combinations back
+            mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+            mfaca = c1o3 * (-c2o1*  mxxMyy + mxxMzz + mxxPyyPzz);
+            mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz);
+
+            //3.
+            // linear combinations
+
+            real mxxyPyzz = mfcba + mfabc;
+            real mxxyMyzz = mfcba - mfabc;
+
+            real mxxzPyyz = mfcab + mfacb;
+            real mxxzMyyz = mfcab - mfacb;
+
+            real mxyyPxzz = mfbca + mfbac;
+            real mxyyMxzz = mfbca - mfbac;
+
+            //relax
+            //////////////////////////////////////////////////////////////////////////
+            mfbbb += OxyyMxzz * (-mfbbb);
+            mxxyPyzz += OxyyPxzz * (-mxxyPyzz);
+            mxxyMyzz += OxyyMxzz * (-mxxyMyzz);
+            mxxzPyyz += OxyyPxzz * (-mxxzPyyz);
+            mxxzMyyz += OxyyMxzz * (-mxxzMyyz);
+            mxyyPxzz += OxyyPxzz * (-mxyyPxzz);
+            mxyyMxzz += OxyyMxzz * (-mxyyMxzz);
+            //////////////////////////////////////////////////////////////////////////
+
+            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 + c2o1 * mfbba * mfbab) / rho;
+            mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho;
+            mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho;
+
+            mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
+            mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
+            mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
+
+            //5.
+            mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+            mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+            mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+
+            //6.
+            mfccc = CUMccc - ((-c4o1 *  mfbbb * mfbbb
+                - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+                - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+                - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+                + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                    + c2o1 * (mfcaa * mfaca * mfaac)
+                    + c16o1 *  mfbba * mfbab * mfabb) / (rho * rho)
+                - c1o3 * (mfacc + mfcac + mfcca) / rho
+                - c1o9 * (mfcaa + mfaca + mfaac) / rho
+                + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+                    + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
+                + c1o27*((drho * drho - drho) / (rho*rho)));
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //the force be with you
+            mfbaa = -mfbaa;
+            mfaba = -mfaba;
+            mfaab = -mfaab;
+            ////////////////////////////////////////////////////////////////////////////////////
+
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //back
+            ////////////////////////////////////////////////////////////////////////////////////
+            vf::lbm::backwardChimera(mfaaa, mfaab, mfaac, vvz, vz2);
+            vf::lbm::backwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
+            vf::lbm::backwardChimera(mfaca, mfacb, mfacc, vvz, vz2);
+            vf::lbm::backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
+            vf::lbm::backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
+            vf::lbm::backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
+            vf::lbm::backwardChimera(mfcaa, mfcab, mfcac, vvz, vz2);
+            vf::lbm::backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
+            vf::lbm::backwardChimera(mfcca, mfccb, mfccc, vvz, vz2);
+
+            vf::lbm::backwardChimera(mfaaa, mfaba, mfaca, vvy, vy2);
+            vf::lbm::backwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
+            vf::lbm::backwardChimera(mfaac, mfabc, mfacc, vvy, vy2);
+            vf::lbm::backwardChimera(mfbaa, mfbba, mfbca, vvy, vy2);
+            vf::lbm::backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
+            vf::lbm::backwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2);
+            vf::lbm::backwardChimera(mfcaa, mfcba, mfcca, vvy, vy2);
+            vf::lbm::backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
+            vf::lbm::backwardChimera(mfcac, mfcbc, mfccc, vvy, vy2);
+
+            vf::lbm::backwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2);
+            vf::lbm::backwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
+            vf::lbm::backwardChimera(mfaac, mfbac, mfcac, vvx, vx2);
+            vf::lbm::backwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
+            vf::lbm::backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
+            vf::lbm::backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
+            vf::lbm::backwardChimera(mfaca, mfbca, mfcca, vvx, vx2);
+            vf::lbm::backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
+            vf::lbm::backwardChimera(mfacc, mfbcc, mfccc, vvx, vx2);
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //mfcbb += EQcbb;
+            //mfabb += EQabb;
+            //mfbcb += EQbcb;
+            //mfbab += EQbab;
+            //mfbbc += EQbbc;
+            //mfbba += EQbba;
+            //mfccb += EQccb;
+            //mfaab += EQaab;
+            //mfcab += EQcab;
+            //mfacb += EQacb;
+            //mfcbc += EQcbc;
+            //mfaba += EQaba;
+            //mfcba += EQcba;
+            //mfabc += EQabc;
+            //mfbcc += EQbcc;
+            //mfbaa += EQbaa;
+            //mfbca += EQbca;
+            //mfbac += EQbac;
+            //mfbbb += EQbbb;
+            //mfccc += EQccc;
+            //mfaac += EQaac;
+            //mfcac += EQcac;
+            //mfacc += EQacc;
+            //mfcca += EQcca;
+            //mfaaa += EQaaa;
+            //mfcaa += EQcaa;
+            //mfaca += EQaca;
+            ////////////////////////////////////////////////////////////////////////////////////
+            ////Error diffusion
+            real fTEMP = mfbbb + EQbbb;
+            real delta0 = mfbbb - (fTEMP - EQbbb);
+            delta0 *= c1o4;
+            mfbbb = fTEMP;
+
+
+            fTEMP = mfcbb + EQcbb;
+            real deltacbb = mfcbb - (fTEMP - EQcbb);
+            mfcbb = fTEMP;
+            //mfcbb+=EQcbb;
+
+            fTEMP = mfabb + EQabb;
+            real deltaabb = mfabb - (fTEMP - EQabb);
+            mfabb = fTEMP;
+            //mfabb+=EQabb;
+
+            fTEMP = mfbcb + EQbcb;
+            real deltabcb = mfbcb - (fTEMP - EQbcb);
+            mfbcb = fTEMP;
+            //mfbcb+=EQbcb;
+
+            fTEMP = mfbab + EQbab;
+            real deltabab = mfbab - (fTEMP - EQbab);
+            mfbab = fTEMP;
+            //mfbab+=EQbab;
+
+            fTEMP = mfbbc + EQbbc;
+            real deltabbc = mfbbc - (fTEMP - EQbbc);
+            mfbbc = fTEMP;
+            //mfbbc+=EQbbc;
+
+            fTEMP = mfbba + EQbba;
+            real deltabba = mfbba - (fTEMP - EQbba);
+            mfbba = fTEMP;
+            //mfbba+=EQbba;
+
+            EQccb += (delta0 + c1o2*(deltacbb + deltabcb));
+            fTEMP = mfccb + EQccb;
+            real deltaccb = mfccb - (fTEMP - EQccb);
+            mfccb = fTEMP;
+            //mfccb+=EQccb+(delta0+c1o2*(deltacbb+deltabcb));
+
+            EQaab += (delta0 + c1o2*(deltaabb + deltabab));
+            fTEMP = mfaab + EQaab;
+            real deltaaab = mfaab - (fTEMP - EQaab);
+            mfaab = fTEMP;
+            //mfaab+=EQaab+(delta0+c1o2*(deltaabb+deltabab));
+
+            EQcab += (delta0 + c1o2*(deltacbb + deltabab));
+            fTEMP = mfcab + EQcab;
+            real deltacab = mfcab - (fTEMP - EQcab);
+            mfcab = fTEMP;
+            //mfcab+=EQcab+(delta0+c1o2*(deltacbb+deltabab));
+
+            EQacb += (delta0 + c1o2*(deltaabb + deltabcb));
+            fTEMP = mfacb + EQacb;
+            real deltaacb = mfacb - (fTEMP - EQacb);
+            mfacb = fTEMP;
+            //mfacb+=EQacb+(delta0+c1o2*(deltaabb+deltabcb));
+
+            EQcbc += (delta0 + c1o2*(deltacbb + deltabbc));
+            fTEMP = mfcbc + EQcbc;
+            real deltacbc = mfcbc - (fTEMP - EQcbc);
+            mfcbc = fTEMP;
+            //mfcbc+=EQcbc+(delta0+c1o2*(deltacbb+deltabbc));
+
+            EQaba += (delta0 + c1o2*(deltaabb + deltabba));
+            fTEMP = mfaba + EQaba;
+            real deltaaba = mfaba - (fTEMP - EQaba);
+            mfaba = fTEMP;
+            //mfaba+=EQaba+(delta0+c1o2*(deltaabb+deltabba));
+
+            EQcba += (delta0 + c1o2*(deltacbb + deltabba));
+            fTEMP = mfcba + EQcba;
+            real deltacba = mfcba - (fTEMP - EQcba);
+            mfcba = fTEMP;
+            //mfcba+=EQcba+(delta0+c1o2*(deltacbb+deltabba));
+
+            EQabc += (delta0 + c1o2*(deltaabb + deltabbc));
+            fTEMP = mfabc + EQabc;
+            real deltaabc = mfabc - (fTEMP - EQabc);
+            mfabc = fTEMP;
+            //mfabc+=EQabc+(delta0+c1o2*(deltaabb+deltabbc));
+
+            EQbcc += (delta0 + c1o2*(deltabcb + deltabbc));
+            fTEMP = mfbcc + EQbcc;
+            real deltabcc = mfbcc - (fTEMP - EQbcc);
+            mfbcc = fTEMP;
+            //mfbcc+=EQbcc+(delta0+c1o2*(deltabcb+deltabbc));
+
+            EQbaa += (delta0 + c1o2*(deltabab + deltabba));
+            fTEMP = mfbaa + EQbaa;
+            real deltabaa = mfbaa - (fTEMP - EQbaa);
+            mfbaa = fTEMP;
+            //mfbaa+=EQbaa+(delta0+c1o2*(deltabab+deltabba));
+
+            EQbca += (delta0 + c1o2*(deltabcb + deltabba));
+            fTEMP = mfbca + EQbca;
+            real deltabca = mfbca - (fTEMP - EQbca);
+            mfbca = fTEMP;
+            //mfbca+=EQbca+(delta0+c1o2*(deltabcb+deltabba));
+
+            EQbac += (delta0 + c1o2*(deltabab + deltabbc));
+            fTEMP = mfbac + EQbac;
+            real deltabac = mfbac - (fTEMP - EQbac);
+            mfbac = fTEMP;
+            //mfbac+=EQbac+(delta0+c1o2*(deltabab+deltabbc));
+
+            mfccc += EQccc - (delta0 + c1o4*(deltacbb + deltabcb + deltabbc) - c1o2*(deltabcc + deltacbc + deltaccb));
+            mfaac += EQaac - (delta0 + c1o4*(deltaabb + deltabab + deltabbc) - c1o2*(deltabac + deltaabc + deltaaab));
+            mfcac += EQcac - (delta0 + c1o4*(deltacbb + deltabab + deltabbc) - c1o2*(deltabac + deltacbc + deltacab));
+            mfacc += EQacc - (delta0 + c1o4*(deltaabb + deltabcb + deltabbc) - c1o2*(deltabcc + deltaabc + deltaacb));
+            mfcca += EQcca - (delta0 + c1o4*(deltacbb + deltabcb + deltabba) - c1o2*(deltabca + deltacba + deltaccb));
+            mfaaa += EQaaa - (delta0 + c1o4*(deltaabb + deltabab + deltabba) - c1o2*(deltabaa + deltaaba + deltaaab));
+            mfcaa += EQcaa - (delta0 + c1o4*(deltacbb + deltabab + deltabba) - c1o2*(deltabaa + deltacba + deltacab));
+            mfaca += EQaca - (delta0 + c1o4*(deltaabb + deltabcb + deltabba) - c1o2*(deltabca + deltaaba + deltaacb));
+
+
+
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////back
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// Z - Dir
+            //backwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, one);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
+            ///////////b//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
+            ///////////b//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o3);
+            ///////////c//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
+            ///////////c//////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// Y - Dir
+            //backwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaab, mfabb, mfacb, vvy, vy2, c2o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o6);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbaa, mfbba, mfbca, vvz, vz2);
+            ///////////b//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbab, mfbbb, mfbcb, vvz, vz2);
+            ///////////b//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbac, mfbbc, mfbcc, vvz, vz2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o18);
+            ///////////c//////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcab, mfcbb, mfccb, vvy, vy2, c2o9);
+            ///////////c//////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// X - Dir
+            //backwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaba, mfbba, mfcba, vvx, vx2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaab, mfbab, mfcab, vvx, vx2, c1o9);
+            /////////////b////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfabb, mfbbb, mfcbb, vvx, vx2, c4o9);
+            /////////////b////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfacb, mfbcb, mfccb, vvx, vx2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o36);
+            /////////////c////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfabc, mfbbc, mfcbc, vvx, vx2, c1o9);
+            /////////////c////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+
+            ////////////////////////////////////////////////////////////////////////////////////////
+            //real drhoPost =
+            //	((((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;
+            //mfbbb += drho - drhoPost;
+            ////////////////////////////////////////////////////////////////////////////////////
+            (D.f[dirE])[k] = mfabb;//(D.f[ dirE   ])[ke   ] = mfabb;// -  c2over27 ;  (D.f[ dirE   ])[k   ]                                                                     
+            (D.f[dirW])[kw] = mfcbb;//(D.f[ dirW   ])[kw   ] = mfcbb;// -  c2over27 ;  (D.f[ dirW   ])[kw  ]                                                                   
+            (D.f[dirN])[k] = mfbab;//(D.f[ dirN   ])[kn   ] = mfbab;// -  c2over27 ;	 (D.f[ dirN   ])[k   ]
+            (D.f[dirS])[ks] = mfbcb;//(D.f[ dirS   ])[ks   ] = mfbcb;// -  c2over27 ;	 (D.f[ dirS   ])[ks  ]
+            (D.f[dirT])[k] = mfbba;//(D.f[ dirT   ])[kt   ] = mfbba;// -  c2over27 ;	 (D.f[ dirT   ])[k   ]
+            (D.f[dirB])[kb] = mfbbc;//(D.f[ dirB   ])[kb   ] = mfbbc;// -  c2over27 ;	 (D.f[ dirB   ])[kb  ]
+            (D.f[dirNE])[k] = mfaab;//(D.f[ dirNE  ])[kne  ] = mfaab;// -  c1over54 ;	 (D.f[ dirNE  ])[k   ]
+            (D.f[dirSW])[ksw] = mfccb;//(D.f[ dirSW  ])[ksw  ] = mfccb;// -  c1over54 ;	 (D.f[ dirSW  ])[ksw ]
+            (D.f[dirSE])[ks] = mfacb;//(D.f[ dirSE  ])[kse  ] = mfacb;// -  c1over54 ;	 (D.f[ dirSE  ])[ks  ]
+            (D.f[dirNW])[kw] = mfcab;//(D.f[ dirNW  ])[knw  ] = mfcab;// -  c1over54 ;	 (D.f[ dirNW  ])[kw  ]
+            (D.f[dirTE])[k] = mfaba;//(D.f[ dirTE  ])[kte  ] = mfaba;// -  c1over54 ;	 (D.f[ dirTE  ])[k   ]
+            (D.f[dirBW])[kbw] = mfcbc;//(D.f[ dirBW  ])[kbw  ] = mfcbc;// -  c1over54 ;	 (D.f[ dirBW  ])[kbw ]
+            (D.f[dirBE])[kb] = mfabc;//(D.f[ dirBE  ])[kbe  ] = mfabc;// -  c1over54 ;	 (D.f[ dirBE  ])[kb  ]
+            (D.f[dirTW])[kw] = mfcba;//(D.f[ dirTW  ])[ktw  ] = mfcba;// -  c1over54 ;	 (D.f[ dirTW  ])[kw  ]
+            (D.f[dirTN])[k] = mfbaa;//(D.f[ dirTN  ])[ktn  ] = mfbaa;// -  c1over54 ;	 (D.f[ dirTN  ])[k   ]
+            (D.f[dirBS])[kbs] = mfbcc;//(D.f[ dirBS  ])[kbs  ] = mfbcc;// -  c1over54 ;	 (D.f[ dirBS  ])[kbs ]
+            (D.f[dirBN])[kb] = mfbac;//(D.f[ dirBN  ])[kbn  ] = mfbac;// -  c1over54 ;	 (D.f[ dirBN  ])[kb  ]
+            (D.f[dirTS])[ks] = mfbca;//(D.f[ dirTS  ])[kts  ] = mfbca;// -  c1over54 ;	 (D.f[ dirTS  ])[ks  ]
+            (D.f[dirZERO])[k] = mfbbb;//(D.f[ dirZERO])[kzero] = mfbbb;// -  c8over27 ;	 (D.f[ dirZERO])[k   ]
+            (D.f[dirTNE])[k] = mfaaa;//(D.f[ dirTNE ])[ktne ] = mfaaa;// -  c1over216;	 (D.f[ dirTNE ])[k   ]
+            (D.f[dirTSE])[ks] = mfaca;//(D.f[ dirTSE ])[ktse ] = mfaca;// -  c1over216;	 (D.f[ dirTSE ])[ks  ]
+            (D.f[dirBNE])[kb] = mfaac;//(D.f[ dirBNE ])[kbne ] = mfaac;// -  c1over216;	 (D.f[ dirBNE ])[kb  ]
+            (D.f[dirBSE])[kbs] = mfacc;//(D.f[ dirBSE ])[kbse ] = mfacc;// -  c1over216;	 (D.f[ dirBSE ])[kbs ]
+            (D.f[dirTNW])[kw] = mfcaa;//(D.f[ dirTNW ])[ktnw ] = mfcaa;// -  c1over216;	 (D.f[ dirTNW ])[kw  ]
+            (D.f[dirTSW])[ksw] = mfcca;//(D.f[ dirTSW ])[ktsw ] = mfcca;// -  c1over216;	 (D.f[ dirTSW ])[ksw ]
+            (D.f[dirBNW])[kbw] = mfcac;//(D.f[ dirBNW ])[kbnw ] = mfcac;// -  c1over216;	 (D.f[ dirBNW ])[kbw ]
+            (D.f[dirBSW])[kbsw] = mfccc;//(D.f[ dirBSW ])[kbsw ] = mfccc;// -  c1over216;	 (D.f[ dirBSW ])[kbsw]
+                                        ////////////////////////////////////////////////////////////////////////////////////
+        }
+    }
 }
 ////////////////////////////////////////////////////////////////////////////////
 
@@ -1002,758 +958,758 @@ extern "C" __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_
 
 ////////////////////////////////////////////////////////////////////////////////
 extern "C" __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,
+    int size_Mat,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
 {
-	////////////////////////////////////////////////////////////////////////////////
-	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<size_Mat)
-	{
-		////////////////////////////////////////////////////////////////////////////////
-		unsigned int BC;
-		BC = bcMatD[k];
-
-		if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/)
-		{
-			Distributions27 D;
-			if (EvenOrOdd == true)
-			{
-				D.f[dirE] = &DDStart[dirE   *size_Mat];
-				D.f[dirW] = &DDStart[dirW   *size_Mat];
-				D.f[dirN] = &DDStart[dirN   *size_Mat];
-				D.f[dirS] = &DDStart[dirS   *size_Mat];
-				D.f[dirT] = &DDStart[dirT   *size_Mat];
-				D.f[dirB] = &DDStart[dirB   *size_Mat];
-				D.f[dirNE] = &DDStart[dirNE  *size_Mat];
-				D.f[dirSW] = &DDStart[dirSW  *size_Mat];
-				D.f[dirSE] = &DDStart[dirSE  *size_Mat];
-				D.f[dirNW] = &DDStart[dirNW  *size_Mat];
-				D.f[dirTE] = &DDStart[dirTE  *size_Mat];
-				D.f[dirBW] = &DDStart[dirBW  *size_Mat];
-				D.f[dirBE] = &DDStart[dirBE  *size_Mat];
-				D.f[dirTW] = &DDStart[dirTW  *size_Mat];
-				D.f[dirTN] = &DDStart[dirTN  *size_Mat];
-				D.f[dirBS] = &DDStart[dirBS  *size_Mat];
-				D.f[dirBN] = &DDStart[dirBN  *size_Mat];
-				D.f[dirTS] = &DDStart[dirTS  *size_Mat];
-				D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
-				D.f[dirTNE] = &DDStart[dirTNE *size_Mat];
-				D.f[dirTSW] = &DDStart[dirTSW *size_Mat];
-				D.f[dirTSE] = &DDStart[dirTSE *size_Mat];
-				D.f[dirTNW] = &DDStart[dirTNW *size_Mat];
-				D.f[dirBNE] = &DDStart[dirBNE *size_Mat];
-				D.f[dirBSW] = &DDStart[dirBSW *size_Mat];
-				D.f[dirBSE] = &DDStart[dirBSE *size_Mat];
-				D.f[dirBNW] = &DDStart[dirBNW *size_Mat];
-			}
-			else
-			{
-				D.f[dirW] = &DDStart[dirE   *size_Mat];
-				D.f[dirE] = &DDStart[dirW   *size_Mat];
-				D.f[dirS] = &DDStart[dirN   *size_Mat];
-				D.f[dirN] = &DDStart[dirS   *size_Mat];
-				D.f[dirB] = &DDStart[dirT   *size_Mat];
-				D.f[dirT] = &DDStart[dirB   *size_Mat];
-				D.f[dirSW] = &DDStart[dirNE  *size_Mat];
-				D.f[dirNE] = &DDStart[dirSW  *size_Mat];
-				D.f[dirNW] = &DDStart[dirSE  *size_Mat];
-				D.f[dirSE] = &DDStart[dirNW  *size_Mat];
-				D.f[dirBW] = &DDStart[dirTE  *size_Mat];
-				D.f[dirTE] = &DDStart[dirBW  *size_Mat];
-				D.f[dirTW] = &DDStart[dirBE  *size_Mat];
-				D.f[dirBE] = &DDStart[dirTW  *size_Mat];
-				D.f[dirBS] = &DDStart[dirTN  *size_Mat];
-				D.f[dirTN] = &DDStart[dirBS  *size_Mat];
-				D.f[dirTS] = &DDStart[dirBN  *size_Mat];
-				D.f[dirBN] = &DDStart[dirTS  *size_Mat];
-				D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
-				D.f[dirBSW] = &DDStart[dirTNE *size_Mat];
-				D.f[dirBNE] = &DDStart[dirTSW *size_Mat];
-				D.f[dirBNW] = &DDStart[dirTSE *size_Mat];
-				D.f[dirBSE] = &DDStart[dirTNW *size_Mat];
-				D.f[dirTSW] = &DDStart[dirBNE *size_Mat];
-				D.f[dirTNE] = &DDStart[dirBSW *size_Mat];
-				D.f[dirTNW] = &DDStart[dirBSE *size_Mat];
-				D.f[dirTSE] = &DDStart[dirBNW *size_Mat];
-			}
-
-			////////////////////////////////////////////////////////////////////////////////
-			//index
-			//unsigned int kzero= k;
-			//unsigned int ke   = k;
-			unsigned int kw = neighborX[k];
-			//unsigned int kn   = k;
-			unsigned int ks = neighborY[k];
-			//unsigned int kt   = k;
-			unsigned int kb = neighborZ[k];
-			unsigned int ksw = neighborY[kw];
-			//unsigned int kne  = k;
-			//unsigned int kse  = ks;
-			//unsigned int knw  = kw;
-			unsigned int kbw = neighborZ[kw];
-			//unsigned int kte  = k;
-			//unsigned int kbe  = kb;
-			//unsigned int ktw  = kw;
-			unsigned int kbs = neighborZ[ks];
-			//unsigned int ktn  = k;
-			//unsigned int kbn  = kb;
-			//unsigned int kts  = ks;
-			//unsigned int ktse = ks;
-			//unsigned int kbnw = kbw;
-			//unsigned int ktnw = kw;
-			//unsigned int kbse = kbs;
-			//unsigned int ktsw = ksw;
-			//unsigned int kbne = kb;
-			//unsigned int ktne = k;
-			unsigned int kbsw = neighborZ[ksw];
-
-
-
-			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[dirE])[k];//[ke   ];// +  c2over27 ;(D.f[dirE   ])[k  ];//ke
-			real mfabb = (D.f[dirW])[kw];//[kw   ];// +  c2over27 ;(D.f[dirW   ])[kw ];
-			real mfbcb = (D.f[dirN])[k];//[kn   ];// +  c2over27 ;(D.f[dirN   ])[k  ];//kn
-			real mfbab = (D.f[dirS])[ks];//[ks   ];// +  c2over27 ;(D.f[dirS   ])[ks ];
-			real mfbbc = (D.f[dirT])[k];//[kt   ];// +  c2over27 ;(D.f[dirT   ])[k  ];//kt
-			real mfbba = (D.f[dirB])[kb];//[kb   ];// +  c2over27 ;(D.f[dirB   ])[kb ];
-			real mfccb = (D.f[dirNE])[k];//[kne  ];// +  c1over54 ;(D.f[dirNE  ])[k  ];//kne
-			real mfaab = (D.f[dirSW])[ksw];//[ksw  ];// +  c1over54 ;(D.f[dirSW  ])[ksw];
-			real mfcab = (D.f[dirSE])[ks];//[kse  ];// +  c1over54 ;(D.f[dirSE  ])[ks ];//kse
-			real mfacb = (D.f[dirNW])[kw];//[knw  ];// +  c1over54 ;(D.f[dirNW  ])[kw ];//knw
-			real mfcbc = (D.f[dirTE])[k];//[kte  ];// +  c1over54 ;(D.f[dirTE  ])[k  ];//kte
-			real mfaba = (D.f[dirBW])[kbw];//[kbw  ];// +  c1over54 ;(D.f[dirBW  ])[kbw];
-			real mfcba = (D.f[dirBE])[kb];//[kbe  ];// +  c1over54 ;(D.f[dirBE  ])[kb ];//kbe
-			real mfabc = (D.f[dirTW])[kw];//[ktw  ];// +  c1over54 ;(D.f[dirTW  ])[kw ];//ktw
-			real mfbcc = (D.f[dirTN])[k];//[ktn  ];// +  c1over54 ;(D.f[dirTN  ])[k  ];//ktn
-			real mfbaa = (D.f[dirBS])[kbs];//[kbs  ];// +  c1over54 ;(D.f[dirBS  ])[kbs];
-			real mfbca = (D.f[dirBN])[kb];//[kbn  ];// +  c1over54 ;(D.f[dirBN  ])[kb ];//kbn
-			real mfbac = (D.f[dirTS])[ks];//[kts  ];// +  c1over54 ;(D.f[dirTS  ])[ks ];//kts
-			real mfbbb = (D.f[dirZERO])[k];//[kzero];// +  c8over27 ;(D.f[dirZERO])[k  ];//kzero
-			real mfccc = (D.f[dirTNE])[k];//[ktne ];// +  c1over216;(D.f[dirTNE ])[k  ];//ktne
-			real mfaac = (D.f[dirTSW])[ksw];//[ktsw ];// +  c1over216;(D.f[dirTSW ])[ksw];//ktsw
-			real mfcac = (D.f[dirTSE])[ks];//[ktse ];// +  c1over216;(D.f[dirTSE ])[ks ];//ktse
-			real mfacc = (D.f[dirTNW])[kw];//[ktnw ];// +  c1over216;(D.f[dirTNW ])[kw ];//ktnw
-			real mfcca = (D.f[dirBNE])[kb];//[kbne ];// +  c1over216;(D.f[dirBNE ])[kb ];//kbne
-			real mfaaa = (D.f[dirBSW])[kbsw];//[kbsw ];// +  c1over216;(D.f[dirBSW ])[kbsw];
-			real mfcaa = (D.f[dirBSE])[kbs];//[kbse ];// +  c1over216;(D.f[dirBSE ])[kbs];//kbse
-			real mfaca = (D.f[dirBNW])[kbw];//[kbnw ];// +  c1over216;(D.f[dirBNW ])[kbw];//kbnw
-											   ////////////////////////////////////////////////////////////////////////////////////
-			real 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;
-
-			real rho = c1o1 + drho;
-			////////////////////////////////////////////////////////////////////////////////////
-			real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
-				(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
-				(mfcbb - mfabb)) / rho;
-			real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
-				(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
-				(mfbcb - mfbab)) / rho;
-			real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
-				(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
-				(mfbbc - mfbba)) / rho;
-			////////////////////////////////////////////////////////////////////////////////////
-			//the force be with you
-			real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; //
-			real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero;
-			real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero;
-			vvx += fx*c1o2;
-			vvy += fy*c1o2;
-			vvz += fz*c1o2;
-			////////////////////////////////////////////////////////////////////////////////////
-			//real omega = omega_in;
-			////////////////////////////////////////////////////////////////////////////////////
-			//fast
-			//real oMdrho = c1o1; // comp special
-			//real m0, m1, m2;
-			real vx2;
-			real vy2;
-			real vz2;
-			vx2 = vvx*vvx;
-			vy2 = vvy*vvy;
-			vz2 = vvz*vvz;
-			////////////////////////////////////////////////////////////////////////////////////
-			//real wadjust;
-			//real qudricLimitP = c1o100;// * 0.0001f;
-			//real qudricLimitM = c1o100;// * 0.0001f;
-			//real qudricLimitD = c1o100;// * 0.001f;
-			//real s9 = minusomega;
-			//test
-			//s9 = 0.;
-
-
-			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			real EQcbb = c0o1;
-			real EQabb = c0o1;
-			real EQbcb = c0o1;
-			real EQbab = c0o1;
-			real EQbbc = c0o1;
-			real EQbba = c0o1;
-			real EQccb = c0o1;
-			real EQaab = c0o1;
-			real EQcab = c0o1;
-			real EQacb = c0o1;
-			real EQcbc = c0o1;
-			real EQaba = c0o1;
-			real EQcba = c0o1;
-			real EQabc = c0o1;
-			real EQbcc = c0o1;
-			real EQbaa = c0o1;
-			real EQbca = c0o1;
-			real EQbac = c0o1;
-			real EQbbb = c0o1;
-			real EQccc = drho * c1o27;
-			real EQaac = drho * c1o3;
-			real EQcac = drho * c1o9;
-			real EQacc = drho * c1o9;
-			real EQcca = drho * c1o9;
-			real EQaaa = drho;
-			real EQcaa = drho * c1o3;
-			real EQaca = drho * c1o3;
-			////////////////////////////////////////////////////////////////////////////////////
-			backwardChimeraWithK(EQaaa, EQaab, EQaac, vvz, vz2, c1o1);
-			backwardChimeraWithK(EQaca, EQacb, EQacc, vvz, vz2, c1o3);
-			///////////////////////////////////////////////////////////
-			EQcaa = EQaca; EQcab = EQacb; EQcac = EQacc;
-			///////////////////////////////////////////////////////////
-			backwardChimeraWithK(EQcca, EQccb, EQccc, vvz, vz2, c1o9);
-
-			backwardChimeraWithK(EQaaa, EQaba, EQaca, vvy, vy2, c1o6);
-			backwardChimeraWithK(EQaab, EQabb, EQacb, vvy, vy2, c2o3);
-			backwardChimeraWithK(EQaac, EQabc, EQacc, vvy, vy2, c1o6);
-			backwardChimeraWithK(EQcaa, EQcba, EQcca, vvy, vy2, c1o18);
-			backwardChimeraWithK(EQcab, EQcbb, EQccb, vvy, vy2, c2o9);
-			backwardChimeraWithK(EQcac, EQcbc, EQccc, vvy, vy2, c1o18);
-
-			backwardChimeraWithK(EQaaa, EQbaa, EQcaa, vvx, vx2, c1o36);
-			backwardChimeraWithK(EQaab, EQbab, EQcab, vvx, vx2, c1o9);
-			backwardChimeraWithK(EQaac, EQbac, EQcac, vvx, vx2, c1o36);
-			backwardChimeraWithK(EQaba, EQbba, EQcba, vvx, vx2, c1o9);
-			backwardChimeraWithK(EQabb, EQbbb, EQcbb, vvx, vx2, c4o9);
-			backwardChimeraWithK(EQabc, EQbbc, EQcbc, vvx, vx2, c1o9);
-			backwardChimeraWithK(EQaca, EQbca, EQcca, vvx, vx2, c1o36);
-			backwardChimeraWithK(EQacb, EQbcb, EQccb, vvx, vx2, c1o9);
-			backwardChimeraWithK(EQacc, EQbcc, EQccc, vvx, vx2, c1o36);
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//Pre-condition
-			mfcbb -= EQcbb;
-			mfabb -= EQabb;
-			mfbcb -= EQbcb;
-			mfbab -= EQbab;
-			mfbbc -= EQbbc;
-			mfbba -= EQbba;
-			mfccb -= EQccb;
-			mfaab -= EQaab;
-			mfcab -= EQcab;
-			mfacb -= EQacb;
-			mfcbc -= EQcbc;
-			mfaba -= EQaba;
-			mfcba -= EQcba;
-			mfabc -= EQabc;
-			mfbcc -= EQbcc;
-			mfbaa -= EQbaa;
-			mfbca -= EQbca;
-			mfbac -= EQbac;
-			mfbbb -= EQbbb;
-			mfccc -= EQccc;
-			mfaac -= EQaac;
-			mfcac -= EQcac;
-			mfacc -= EQacc;
-			mfcca -= EQcca;
-			mfaaa -= EQaaa;
-			mfcaa -= EQcaa;
-			mfaca -= EQaca;
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//Hin
-			////////////////////////////////////////////////////////////////////////////////////
-			forwardChimera(mfaaa, mfaab, mfaac, vvz, vz2);
-			forwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
-			forwardChimera(mfaca, mfacb, mfacc, vvz, vz2);
-			forwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
-			forwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
-			forwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
-			forwardChimera(mfcaa, mfcab, mfcac, vvz, vz2);
-			forwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
-			forwardChimera(mfcca, mfccb, mfccc, vvz, vz2);
-
-			forwardChimera(mfaaa, mfaba, mfaca, vvy, vy2);
-			forwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
-			forwardChimera(mfaac, mfabc, mfacc, vvy, vy2);
-			forwardChimera(mfbaa, mfbba, mfbca, vvy, vy2);
-			forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
-			forwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2);
-			forwardChimera(mfcaa, mfcba, mfcca, vvy, vy2);
-			forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
-			forwardChimera(mfcac, mfcbc, mfccc, vvy, vy2);
-
-			forwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2);
-			forwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
-			forwardChimera(mfaac, mfbac, mfcac, vvx, vx2);
-			forwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
-			forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
-			forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
-			forwardChimera(mfaca, mfbca, mfcca, vvx, vx2);
-			forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
-			forwardChimera(mfacc, mfbcc, mfccc, vvx, vx2);
-
-			//////////////////////////////////////////////////////////////////////////////////////
-			////Hin
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// Z - Dir
-			//forwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c4o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// Y - Dir
-			//forwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o18);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c2o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c2o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o6);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9		Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// X - Dir
-			//forwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, one);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//forwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-
-
-			////////////////////////////////////////////////////////////////////////////////////
-			// Cumulants
-			////////////////////////////////////////////////////////////////////////////////////
-			real OxxPyyPzz = c1o1; //omega; // one;	//set the bulk viscosity one is high / two is very low and zero is (too) high
-
-			////////////////////////////////////////////////////////////
-			//3.
-			//////////////////////////////
-			real OxyyPxzz = c1o1;
-			real OxyyMxzz = c1o1;
-			//real Oxyz = c1o1;
-			////////////////////////////////////////////////////////////
-			//4.
-			//////////////////////////////
-			real O4 = c1o1;
-			////////////////////////////////////////////////////////////
-			//5.
-			//////////////////////////////
-			real O5 = c1o1;
-			////////////////////////////////////////////////////////////
-			//6.
-			//////////////////////////////
-			real O6 = c1o1;
-			////////////////////////////////////////////////////////////
-
-
-			//central moments to cumulants
-			//4.
-			real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho;
-			real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho;
-			real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho;
-
-			real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
-			real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
-			real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
-
-			//5.
-			real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
-			real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
-			real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
-
-			//6.
-
-			real CUMccc = mfccc + ((-c4o1 *  mfbbb * mfbbb
-				- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-				- c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
-				- c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
-				+ (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-					+ c2o1 * (mfcaa * mfaca * mfaac)
-					+ c16o1 *  mfbba * mfbab * mfabb) / (rho * rho)
-				- c1o3 * (mfacc + mfcac + mfcca) / rho
-				- c1o9 * (mfcaa + mfaca + mfaac) / rho
-				+ (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
-					+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
-				+ c1o27*((drho * drho - drho) / (rho*rho)));
-
-
-
-
-			//2.
-			// linear combinations
-			real mxxPyyPzz = mfcaa + mfaca + mfaac;
-			real mxxMyy = mfcaa - mfaca;
-			real mxxMzz = mfcaa - mfaac;
-
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			//incl. correction		(hat noch nicht so gut funktioniert...Optimierungsbedarf??)
-			{
-				real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 *  OxxPyyPzz * (mfaaa - mxxPyyPzz);
-				real dyuy = dxux + omega * c3o2 * mxxMyy;
-				real dzuz = dxux + omega * c3o2 * mxxMzz;
-
-				//relax
-				mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz;
-				mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
-				mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz);
-
-			}
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			////no correction
-			//mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz;
-			//mxxMyy += -(-omega) * (-mxxMyy);
-			//mxxMzz += -(-omega) * (-mxxMzz);
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			mfabb += omega * (-mfabb);
-			mfbab += omega * (-mfbab);
-			mfbba += omega * (-mfbba);
-
-			//////////////////////////////////////////////////////////////////////////
-
-			// linear combinations back
-			mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
-			mfaca = c1o3 * (-c2o1*  mxxMyy + mxxMzz + mxxPyyPzz);
-			mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz);
-
-			//3.
-			// linear combinations
-
-			real mxxyPyzz = mfcba + mfabc;
-			real mxxyMyzz = mfcba - mfabc;
-
-			real mxxzPyyz = mfcab + mfacb;
-			real mxxzMyyz = mfcab - mfacb;
-
-			real mxyyPxzz = mfbca + mfbac;
-			real mxyyMxzz = mfbca - mfbac;
-
-			//relax
-			//////////////////////////////////////////////////////////////////////////
-			mfbbb += OxyyMxzz * (-mfbbb);
-			mxxyPyzz += OxyyPxzz * (-mxxyPyzz);
-			mxxyMyzz += OxyyMxzz * (-mxxyMyzz);
-			mxxzPyyz += OxyyPxzz * (-mxxzPyyz);
-			mxxzMyyz += OxyyMxzz * (-mxxzMyyz);
-			mxyyPxzz += OxyyPxzz * (-mxyyPxzz);
-			mxyyMxzz += OxyyMxzz * (-mxyyMxzz);
-			//////////////////////////////////////////////////////////////////////////
-
-			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 + c2o1 * mfbba * mfbab) / rho;
-			mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho;
-			mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho;
-
-			mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
-			mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
-			mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
-
-			//5.
-			mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
-			mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
-			mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
-
-			//6.
-			mfccc = CUMccc - ((-c4o1 *  mfbbb * mfbbb
-				- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-				- c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
-				- c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
-				+ (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-					+ c2o1 * (mfcaa * mfaca * mfaac)
-					+ c16o1 *  mfbba * mfbab * mfabb) / (rho * rho)
-				- c1o3 * (mfacc + mfcac + mfcca) / rho
-				- c1o9 * (mfcaa + mfaca + mfaac) / rho
-				+ (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
-					+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
-				+ c1o27*((drho * drho - drho) / (rho*rho)));
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//the force be with you
-			mfbaa = -mfbaa;
-			mfaba = -mfaba;
-			mfaab = -mfaab;
-			////////////////////////////////////////////////////////////////////////////////////
-
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//back
-			////////////////////////////////////////////////////////////////////////////////////
-			backwardChimera(mfaaa, mfaab, mfaac, vvz, vz2);
-			backwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
-			backwardChimera(mfaca, mfacb, mfacc, vvz, vz2);
-			backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
-			backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
-			backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
-			backwardChimera(mfcaa, mfcab, mfcac, vvz, vz2);
-			backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
-			backwardChimera(mfcca, mfccb, mfccc, vvz, vz2);
-
-			backwardChimera(mfaaa, mfaba, mfaca, vvy, vy2);
-			backwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
-			backwardChimera(mfaac, mfabc, mfacc, vvy, vy2);
-			backwardChimera(mfbaa, mfbba, mfbca, vvy, vy2);
-			backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
-			backwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2);
-			backwardChimera(mfcaa, mfcba, mfcca, vvy, vy2);
-			backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
-			backwardChimera(mfcac, mfcbc, mfccc, vvy, vy2);
-
-			backwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2);
-			backwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
-			backwardChimera(mfaac, mfbac, mfcac, vvx, vx2);
-			backwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
-			backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
-			backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
-			backwardChimera(mfaca, mfbca, mfcca, vvx, vx2);
-			backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
-			backwardChimera(mfacc, mfbcc, mfccc, vvx, vx2);
-
-			////////////////////////////////////////////////////////////////////////////////////
-			mfcbb+=EQcbb;
-			mfabb+=EQabb;
-			mfbcb+=EQbcb;
-			mfbab+=EQbab;
-			mfbbc+=EQbbc;
-			mfbba+=EQbba;
-			mfccb+=EQccb;
-			mfaab+=EQaab;
-			mfcab+=EQcab;
-			mfacb+=EQacb;
-			mfcbc+=EQcbc;
-			mfaba+=EQaba;
-			mfcba+=EQcba;
-			mfabc+=EQabc;
-			mfbcc+=EQbcc;
-			mfbaa+=EQbaa;
-			mfbca+=EQbca;
-			mfbac+=EQbac;
-			mfbbb+=EQbbb;
-			mfccc+=EQccc;
-			mfaac+=EQaac;
-			mfcac+=EQcac;
-			mfacc+=EQacc;
-			mfcca+=EQcca;
-			mfaaa+=EQaaa;
-			mfcaa+=EQcaa;
-			mfaca+=EQaca;
-
-
-			//////////////////////////////////////////////////////////////////////////////////////
-			////back
-			//////////////////////////////////////////////////////////////////////////////////////
-			////mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// Z - Dir
-			//backwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, one);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
-			///////////b//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
-			///////////b//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o3);
-			///////////c//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
-			///////////c//////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			////mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// Y - Dir
-			//backwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaab, mfabb, mfacb, vvy, vy2, c2o3);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o6);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbaa, mfbba, mfbca, vvz, vz2);
-			///////////b//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbab, mfbbb, mfbcb, vvz, vz2);
-			///////////b//////////////////////////////////////////////////////////////////////////
-			//backwardChimera(mfbac, mfbbc, mfbcc, vvz, vz2);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o18);
-			///////////c//////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcab, mfcbb, mfccb, vvy, vy2, c2o9);
-			///////////c//////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			////mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
-			//////////////////////////////////////////////////////////////////////////////////////
-			//// X - Dir
-			//backwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaba, mfbba, mfcba, vvx, vx2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaab, mfbab, mfcab, vvx, vx2, c1o9);
-			/////////////b////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfabb, mfbbb, mfcbb, vvx, vx2, c4o9);
-			/////////////b////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfacb, mfbcb, mfccb, vvx, vx2, c1o9);
-			//////////////////////////////////////////////////////////////////////////////////////
-			//////////////////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o36);
-			/////////////c////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfabc, mfbbc, mfcbc, vvx, vx2, c1o9);
-			/////////////c////////////////////////////////////////////////////////////////////////
-			//backwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o36);
-			//////////////////////////////////////////////////////////////////////////////////////
-
-			//////////////////////////////////////////////////////////////////////////////////////
-			real drhoPost =
-				((((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;
-			mfbbb += drho - drhoPost;
-			////////////////////////////////////////////////////////////////////////////////////
-			(D.f[dirE])[k] = mfabb;//(D.f[ dirE   ])[ke   ] = mfabb;// -  c2over27 ;  (D.f[ dirE   ])[k   ]                                                                     
-			(D.f[dirW])[kw] = mfcbb;//(D.f[ dirW   ])[kw   ] = mfcbb;// -  c2over27 ;  (D.f[ dirW   ])[kw  ]                                                                   
-			(D.f[dirN])[k] = mfbab;//(D.f[ dirN   ])[kn   ] = mfbab;// -  c2over27 ;	 (D.f[ dirN   ])[k   ]
-			(D.f[dirS])[ks] = mfbcb;//(D.f[ dirS   ])[ks   ] = mfbcb;// -  c2over27 ;	 (D.f[ dirS   ])[ks  ]
-			(D.f[dirT])[k] = mfbba;//(D.f[ dirT   ])[kt   ] = mfbba;// -  c2over27 ;	 (D.f[ dirT   ])[k   ]
-			(D.f[dirB])[kb] = mfbbc;//(D.f[ dirB   ])[kb   ] = mfbbc;// -  c2over27 ;	 (D.f[ dirB   ])[kb  ]
-			(D.f[dirNE])[k] = mfaab;//(D.f[ dirNE  ])[kne  ] = mfaab;// -  c1over54 ;	 (D.f[ dirNE  ])[k   ]
-			(D.f[dirSW])[ksw] = mfccb;//(D.f[ dirSW  ])[ksw  ] = mfccb;// -  c1over54 ;	 (D.f[ dirSW  ])[ksw ]
-			(D.f[dirSE])[ks] = mfacb;//(D.f[ dirSE  ])[kse  ] = mfacb;// -  c1over54 ;	 (D.f[ dirSE  ])[ks  ]
-			(D.f[dirNW])[kw] = mfcab;//(D.f[ dirNW  ])[knw  ] = mfcab;// -  c1over54 ;	 (D.f[ dirNW  ])[kw  ]
-			(D.f[dirTE])[k] = mfaba;//(D.f[ dirTE  ])[kte  ] = mfaba;// -  c1over54 ;	 (D.f[ dirTE  ])[k   ]
-			(D.f[dirBW])[kbw] = mfcbc;//(D.f[ dirBW  ])[kbw  ] = mfcbc;// -  c1over54 ;	 (D.f[ dirBW  ])[kbw ]
-			(D.f[dirBE])[kb] = mfabc;//(D.f[ dirBE  ])[kbe  ] = mfabc;// -  c1over54 ;	 (D.f[ dirBE  ])[kb  ]
-			(D.f[dirTW])[kw] = mfcba;//(D.f[ dirTW  ])[ktw  ] = mfcba;// -  c1over54 ;	 (D.f[ dirTW  ])[kw  ]
-			(D.f[dirTN])[k] = mfbaa;//(D.f[ dirTN  ])[ktn  ] = mfbaa;// -  c1over54 ;	 (D.f[ dirTN  ])[k   ]
-			(D.f[dirBS])[kbs] = mfbcc;//(D.f[ dirBS  ])[kbs  ] = mfbcc;// -  c1over54 ;	 (D.f[ dirBS  ])[kbs ]
-			(D.f[dirBN])[kb] = mfbac;//(D.f[ dirBN  ])[kbn  ] = mfbac;// -  c1over54 ;	 (D.f[ dirBN  ])[kb  ]
-			(D.f[dirTS])[ks] = mfbca;//(D.f[ dirTS  ])[kts  ] = mfbca;// -  c1over54 ;	 (D.f[ dirTS  ])[ks  ]
-			(D.f[dirZERO])[k] = mfbbb;//(D.f[ dirZERO])[kzero] = mfbbb;// -  c8over27 ;	 (D.f[ dirZERO])[k   ]
-			(D.f[dirTNE])[k] = mfaaa;//(D.f[ dirTNE ])[ktne ] = mfaaa;// -  c1over216;	 (D.f[ dirTNE ])[k   ]
-			(D.f[dirTSE])[ks] = mfaca;//(D.f[ dirTSE ])[ktse ] = mfaca;// -  c1over216;	 (D.f[ dirTSE ])[ks  ]
-			(D.f[dirBNE])[kb] = mfaac;//(D.f[ dirBNE ])[kbne ] = mfaac;// -  c1over216;	 (D.f[ dirBNE ])[kb  ]
-			(D.f[dirBSE])[kbs] = mfacc;//(D.f[ dirBSE ])[kbse ] = mfacc;// -  c1over216;	 (D.f[ dirBSE ])[kbs ]
-			(D.f[dirTNW])[kw] = mfcaa;//(D.f[ dirTNW ])[ktnw ] = mfcaa;// -  c1over216;	 (D.f[ dirTNW ])[kw  ]
-			(D.f[dirTSW])[ksw] = mfcca;//(D.f[ dirTSW ])[ktsw ] = mfcca;// -  c1over216;	 (D.f[ dirTSW ])[ksw ]
-			(D.f[dirBNW])[kbw] = mfcac;//(D.f[ dirBNW ])[kbnw ] = mfcac;// -  c1over216;	 (D.f[ dirBNW ])[kbw ]
-			(D.f[dirBSW])[kbsw] = mfccc;//(D.f[ dirBSW ])[kbsw ] = mfccc;// -  c1over216;	 (D.f[ dirBSW ])[kbsw]
-			////////////////////////////////////////////////////////////////////////////////////
-		}
-	}
+    ////////////////////////////////////////////////////////////////////////////////
+    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<size_Mat)
+    {
+        ////////////////////////////////////////////////////////////////////////////////
+        unsigned int BC;
+        BC = bcMatD[k];
+
+        if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/)
+        {
+            Distributions27 D;
+            if (EvenOrOdd == true)
+            {
+                D.f[dirE] = &DDStart[dirE   *size_Mat];
+                D.f[dirW] = &DDStart[dirW   *size_Mat];
+                D.f[dirN] = &DDStart[dirN   *size_Mat];
+                D.f[dirS] = &DDStart[dirS   *size_Mat];
+                D.f[dirT] = &DDStart[dirT   *size_Mat];
+                D.f[dirB] = &DDStart[dirB   *size_Mat];
+                D.f[dirNE] = &DDStart[dirNE  *size_Mat];
+                D.f[dirSW] = &DDStart[dirSW  *size_Mat];
+                D.f[dirSE] = &DDStart[dirSE  *size_Mat];
+                D.f[dirNW] = &DDStart[dirNW  *size_Mat];
+                D.f[dirTE] = &DDStart[dirTE  *size_Mat];
+                D.f[dirBW] = &DDStart[dirBW  *size_Mat];
+                D.f[dirBE] = &DDStart[dirBE  *size_Mat];
+                D.f[dirTW] = &DDStart[dirTW  *size_Mat];
+                D.f[dirTN] = &DDStart[dirTN  *size_Mat];
+                D.f[dirBS] = &DDStart[dirBS  *size_Mat];
+                D.f[dirBN] = &DDStart[dirBN  *size_Mat];
+                D.f[dirTS] = &DDStart[dirTS  *size_Mat];
+                D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
+                D.f[dirTNE] = &DDStart[dirTNE *size_Mat];
+                D.f[dirTSW] = &DDStart[dirTSW *size_Mat];
+                D.f[dirTSE] = &DDStart[dirTSE *size_Mat];
+                D.f[dirTNW] = &DDStart[dirTNW *size_Mat];
+                D.f[dirBNE] = &DDStart[dirBNE *size_Mat];
+                D.f[dirBSW] = &DDStart[dirBSW *size_Mat];
+                D.f[dirBSE] = &DDStart[dirBSE *size_Mat];
+                D.f[dirBNW] = &DDStart[dirBNW *size_Mat];
+            }
+            else
+            {
+                D.f[dirW] = &DDStart[dirE   *size_Mat];
+                D.f[dirE] = &DDStart[dirW   *size_Mat];
+                D.f[dirS] = &DDStart[dirN   *size_Mat];
+                D.f[dirN] = &DDStart[dirS   *size_Mat];
+                D.f[dirB] = &DDStart[dirT   *size_Mat];
+                D.f[dirT] = &DDStart[dirB   *size_Mat];
+                D.f[dirSW] = &DDStart[dirNE  *size_Mat];
+                D.f[dirNE] = &DDStart[dirSW  *size_Mat];
+                D.f[dirNW] = &DDStart[dirSE  *size_Mat];
+                D.f[dirSE] = &DDStart[dirNW  *size_Mat];
+                D.f[dirBW] = &DDStart[dirTE  *size_Mat];
+                D.f[dirTE] = &DDStart[dirBW  *size_Mat];
+                D.f[dirTW] = &DDStart[dirBE  *size_Mat];
+                D.f[dirBE] = &DDStart[dirTW  *size_Mat];
+                D.f[dirBS] = &DDStart[dirTN  *size_Mat];
+                D.f[dirTN] = &DDStart[dirBS  *size_Mat];
+                D.f[dirTS] = &DDStart[dirBN  *size_Mat];
+                D.f[dirBN] = &DDStart[dirTS  *size_Mat];
+                D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
+                D.f[dirBSW] = &DDStart[dirTNE *size_Mat];
+                D.f[dirBNE] = &DDStart[dirTSW *size_Mat];
+                D.f[dirBNW] = &DDStart[dirTSE *size_Mat];
+                D.f[dirBSE] = &DDStart[dirTNW *size_Mat];
+                D.f[dirTSW] = &DDStart[dirBNE *size_Mat];
+                D.f[dirTNE] = &DDStart[dirBSW *size_Mat];
+                D.f[dirTNW] = &DDStart[dirBSE *size_Mat];
+                D.f[dirTSE] = &DDStart[dirBNW *size_Mat];
+            }
+
+            ////////////////////////////////////////////////////////////////////////////////
+            //index
+            //unsigned int kzero= k;
+            //unsigned int ke   = k;
+            unsigned int kw = neighborX[k];
+            //unsigned int kn   = k;
+            unsigned int ks = neighborY[k];
+            //unsigned int kt   = k;
+            unsigned int kb = neighborZ[k];
+            unsigned int ksw = neighborY[kw];
+            //unsigned int kne  = k;
+            //unsigned int kse  = ks;
+            //unsigned int knw  = kw;
+            unsigned int kbw = neighborZ[kw];
+            //unsigned int kte  = k;
+            //unsigned int kbe  = kb;
+            //unsigned int ktw  = kw;
+            unsigned int kbs = neighborZ[ks];
+            //unsigned int ktn  = k;
+            //unsigned int kbn  = kb;
+            //unsigned int kts  = ks;
+            //unsigned int ktse = ks;
+            //unsigned int kbnw = kbw;
+            //unsigned int ktnw = kw;
+            //unsigned int kbse = kbs;
+            //unsigned int ktsw = ksw;
+            //unsigned int kbne = kb;
+            //unsigned int ktne = k;
+            unsigned int kbsw = neighborZ[ksw];
+
+
+
+            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            real mfcbb = (D.f[dirE])[k];//[ke   ];// +  c2over27 ;(D.f[dirE   ])[k  ];//ke
+            real mfabb = (D.f[dirW])[kw];//[kw   ];// +  c2over27 ;(D.f[dirW   ])[kw ];
+            real mfbcb = (D.f[dirN])[k];//[kn   ];// +  c2over27 ;(D.f[dirN   ])[k  ];//kn
+            real mfbab = (D.f[dirS])[ks];//[ks   ];// +  c2over27 ;(D.f[dirS   ])[ks ];
+            real mfbbc = (D.f[dirT])[k];//[kt   ];// +  c2over27 ;(D.f[dirT   ])[k  ];//kt
+            real mfbba = (D.f[dirB])[kb];//[kb   ];// +  c2over27 ;(D.f[dirB   ])[kb ];
+            real mfccb = (D.f[dirNE])[k];//[kne  ];// +  c1over54 ;(D.f[dirNE  ])[k  ];//kne
+            real mfaab = (D.f[dirSW])[ksw];//[ksw  ];// +  c1over54 ;(D.f[dirSW  ])[ksw];
+            real mfcab = (D.f[dirSE])[ks];//[kse  ];// +  c1over54 ;(D.f[dirSE  ])[ks ];//kse
+            real mfacb = (D.f[dirNW])[kw];//[knw  ];// +  c1over54 ;(D.f[dirNW  ])[kw ];//knw
+            real mfcbc = (D.f[dirTE])[k];//[kte  ];// +  c1over54 ;(D.f[dirTE  ])[k  ];//kte
+            real mfaba = (D.f[dirBW])[kbw];//[kbw  ];// +  c1over54 ;(D.f[dirBW  ])[kbw];
+            real mfcba = (D.f[dirBE])[kb];//[kbe  ];// +  c1over54 ;(D.f[dirBE  ])[kb ];//kbe
+            real mfabc = (D.f[dirTW])[kw];//[ktw  ];// +  c1over54 ;(D.f[dirTW  ])[kw ];//ktw
+            real mfbcc = (D.f[dirTN])[k];//[ktn  ];// +  c1over54 ;(D.f[dirTN  ])[k  ];//ktn
+            real mfbaa = (D.f[dirBS])[kbs];//[kbs  ];// +  c1over54 ;(D.f[dirBS  ])[kbs];
+            real mfbca = (D.f[dirBN])[kb];//[kbn  ];// +  c1over54 ;(D.f[dirBN  ])[kb ];//kbn
+            real mfbac = (D.f[dirTS])[ks];//[kts  ];// +  c1over54 ;(D.f[dirTS  ])[ks ];//kts
+            real mfbbb = (D.f[dirZERO])[k];//[kzero];// +  c8over27 ;(D.f[dirZERO])[k  ];//kzero
+            real mfccc = (D.f[dirTNE])[k];//[ktne ];// +  c1over216;(D.f[dirTNE ])[k  ];//ktne
+            real mfaac = (D.f[dirTSW])[ksw];//[ktsw ];// +  c1over216;(D.f[dirTSW ])[ksw];//ktsw
+            real mfcac = (D.f[dirTSE])[ks];//[ktse ];// +  c1over216;(D.f[dirTSE ])[ks ];//ktse
+            real mfacc = (D.f[dirTNW])[kw];//[ktnw ];// +  c1over216;(D.f[dirTNW ])[kw ];//ktnw
+            real mfcca = (D.f[dirBNE])[kb];//[kbne ];// +  c1over216;(D.f[dirBNE ])[kb ];//kbne
+            real mfaaa = (D.f[dirBSW])[kbsw];//[kbsw ];// +  c1over216;(D.f[dirBSW ])[kbsw];
+            real mfcaa = (D.f[dirBSE])[kbs];//[kbse ];// +  c1over216;(D.f[dirBSE ])[kbs];//kbse
+            real mfaca = (D.f[dirBNW])[kbw];//[kbnw ];// +  c1over216;(D.f[dirBNW ])[kbw];//kbnw
+                                               ////////////////////////////////////////////////////////////////////////////////////
+            real 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;
+
+            real rho = c1o1 + drho;
+            ////////////////////////////////////////////////////////////////////////////////////
+            real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+                (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+                (mfcbb - mfabb)) / rho;
+            real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+                (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+                (mfbcb - mfbab)) / rho;
+            real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+                (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+                (mfbbc - mfbba)) / rho;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //the force be with you
+            real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; //
+            real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero;
+            real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero;
+            vvx += fx*c1o2;
+            vvy += fy*c1o2;
+            vvz += fz*c1o2;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //real omega = omega_in;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //fast
+            //real oMdrho = c1o1; // comp special
+            //real m0, m1, m2;
+            real vx2;
+            real vy2;
+            real vz2;
+            vx2 = vvx*vvx;
+            vy2 = vvy*vvy;
+            vz2 = vvz*vvz;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //real wadjust;
+            //real qudricLimitP = c1o100;// * 0.0001f;
+            //real qudricLimitM = c1o100;// * 0.0001f;
+            //real qudricLimitD = c1o100;// * 0.001f;
+            //real s9 = minusomega;
+            //test
+            //s9 = 0.;
+
+
+            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            real EQcbb = c0o1;
+            real EQabb = c0o1;
+            real EQbcb = c0o1;
+            real EQbab = c0o1;
+            real EQbbc = c0o1;
+            real EQbba = c0o1;
+            real EQccb = c0o1;
+            real EQaab = c0o1;
+            real EQcab = c0o1;
+            real EQacb = c0o1;
+            real EQcbc = c0o1;
+            real EQaba = c0o1;
+            real EQcba = c0o1;
+            real EQabc = c0o1;
+            real EQbcc = c0o1;
+            real EQbaa = c0o1;
+            real EQbca = c0o1;
+            real EQbac = c0o1;
+            real EQbbb = c0o1;
+            real EQccc = drho * c1o27;
+            real EQaac = drho * c1o3;
+            real EQcac = drho * c1o9;
+            real EQacc = drho * c1o9;
+            real EQcca = drho * c1o9;
+            real EQaaa = drho;
+            real EQcaa = drho * c1o3;
+            real EQaca = drho * c1o3;
+            ////////////////////////////////////////////////////////////////////////////////////
+            vf::lbm::backwardChimeraWithK(EQaaa, EQaab, EQaac, vvz, vz2, c1o1);
+            vf::lbm::backwardChimeraWithK(EQaca, EQacb, EQacc, vvz, vz2, c1o3);
+            ///////////////////////////////////////////////////////////
+            EQcaa = EQaca; EQcab = EQacb; EQcac = EQacc;
+            ///////////////////////////////////////////////////////////
+            vf::lbm::backwardChimeraWithK(EQcca, EQccb, EQccc, vvz, vz2, c1o9);
+
+            vf::lbm::backwardChimeraWithK(EQaaa, EQaba, EQaca, vvy, vy2, c1o6);
+            vf::lbm::backwardChimeraWithK(EQaab, EQabb, EQacb, vvy, vy2, c2o3);
+            vf::lbm::backwardChimeraWithK(EQaac, EQabc, EQacc, vvy, vy2, c1o6);
+            vf::lbm::backwardChimeraWithK(EQcaa, EQcba, EQcca, vvy, vy2, c1o18);
+            vf::lbm::backwardChimeraWithK(EQcab, EQcbb, EQccb, vvy, vy2, c2o9);
+            vf::lbm::backwardChimeraWithK(EQcac, EQcbc, EQccc, vvy, vy2, c1o18);
+
+            vf::lbm::backwardChimeraWithK(EQaaa, EQbaa, EQcaa, vvx, vx2, c1o36);
+            vf::lbm::backwardChimeraWithK(EQaab, EQbab, EQcab, vvx, vx2, c1o9);
+            vf::lbm::backwardChimeraWithK(EQaac, EQbac, EQcac, vvx, vx2, c1o36);
+            vf::lbm::backwardChimeraWithK(EQaba, EQbba, EQcba, vvx, vx2, c1o9);
+            vf::lbm::backwardChimeraWithK(EQabb, EQbbb, EQcbb, vvx, vx2, c4o9);
+            vf::lbm::backwardChimeraWithK(EQabc, EQbbc, EQcbc, vvx, vx2, c1o9);
+            vf::lbm::backwardChimeraWithK(EQaca, EQbca, EQcca, vvx, vx2, c1o36);
+            vf::lbm::backwardChimeraWithK(EQacb, EQbcb, EQccb, vvx, vx2, c1o9);
+            vf::lbm::backwardChimeraWithK(EQacc, EQbcc, EQccc, vvx, vx2, c1o36);
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //Pre-condition
+            mfcbb -= EQcbb;
+            mfabb -= EQabb;
+            mfbcb -= EQbcb;
+            mfbab -= EQbab;
+            mfbbc -= EQbbc;
+            mfbba -= EQbba;
+            mfccb -= EQccb;
+            mfaab -= EQaab;
+            mfcab -= EQcab;
+            mfacb -= EQacb;
+            mfcbc -= EQcbc;
+            mfaba -= EQaba;
+            mfcba -= EQcba;
+            mfabc -= EQabc;
+            mfbcc -= EQbcc;
+            mfbaa -= EQbaa;
+            mfbca -= EQbca;
+            mfbac -= EQbac;
+            mfbbb -= EQbbb;
+            mfccc -= EQccc;
+            mfaac -= EQaac;
+            mfcac -= EQcac;
+            mfacc -= EQacc;
+            mfcca -= EQcca;
+            mfaaa -= EQaaa;
+            mfcaa -= EQcaa;
+            mfaca -= EQaca;
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //Hin
+            ////////////////////////////////////////////////////////////////////////////////////
+            vf::lbm::forwardChimera(mfaaa, mfaab, mfaac, vvz, vz2);
+            vf::lbm::forwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
+            vf::lbm::forwardChimera(mfaca, mfacb, mfacc, vvz, vz2);
+            vf::lbm::forwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
+            vf::lbm::forwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
+            vf::lbm::forwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
+            vf::lbm::forwardChimera(mfcaa, mfcab, mfcac, vvz, vz2);
+            vf::lbm::forwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
+            vf::lbm::forwardChimera(mfcca, mfccb, mfccc, vvz, vz2);
+
+            vf::lbm::forwardChimera(mfaaa, mfaba, mfaca, vvy, vy2);
+            vf::lbm::forwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
+            vf::lbm::forwardChimera(mfaac, mfabc, mfacc, vvy, vy2);
+            vf::lbm::forwardChimera(mfbaa, mfbba, mfbca, vvy, vy2);
+            vf::lbm::forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
+            vf::lbm::forwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2);
+            vf::lbm::forwardChimera(mfcaa, mfcba, mfcca, vvy, vy2);
+            vf::lbm::forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
+            vf::lbm::forwardChimera(mfcac, mfcbc, mfccc, vvy, vy2);
+
+            vf::lbm::forwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2);
+            vf::lbm::forwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
+            vf::lbm::forwardChimera(mfaac, mfbac, mfcac, vvx, vx2);
+            vf::lbm::forwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
+            vf::lbm::forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
+            vf::lbm::forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
+            vf::lbm::forwardChimera(mfaca, mfbca, mfcca, vvx, vx2);
+            vf::lbm::forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
+            vf::lbm::forwardChimera(mfacc, mfbcc, mfccc, vvx, vx2);
+
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////Hin
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// Z - Dir
+            //forwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c4o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// Y - Dir
+            //forwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o18);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c2o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c2o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o6);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9		Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// X - Dir
+            //forwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, one);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //forwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            // Cumulants
+            ////////////////////////////////////////////////////////////////////////////////////
+            real OxxPyyPzz = c1o1; //omega; // one;	//set the bulk viscosity one is high / two is very low and zero is (too) high
+
+            ////////////////////////////////////////////////////////////
+            //3.
+            //////////////////////////////
+            real OxyyPxzz = c1o1;
+            real OxyyMxzz = c1o1;
+            //real Oxyz = c1o1;
+            ////////////////////////////////////////////////////////////
+            //4.
+            //////////////////////////////
+            real O4 = c1o1;
+            ////////////////////////////////////////////////////////////
+            //5.
+            //////////////////////////////
+            real O5 = c1o1;
+            ////////////////////////////////////////////////////////////
+            //6.
+            //////////////////////////////
+            real O6 = c1o1;
+            ////////////////////////////////////////////////////////////
+
+
+            //central moments to cumulants
+            //4.
+            real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho;
+            real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho;
+            real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho;
+
+            real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
+            real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
+            real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
+
+            //5.
+            real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+            real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+            real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+
+            //6.
+
+            real CUMccc = mfccc + ((-c4o1 *  mfbbb * mfbbb
+                - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+                - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+                - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+                + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                    + c2o1 * (mfcaa * mfaca * mfaac)
+                    + c16o1 *  mfbba * mfbab * mfabb) / (rho * rho)
+                - c1o3 * (mfacc + mfcac + mfcca) / rho
+                - c1o9 * (mfcaa + mfaca + mfaac) / rho
+                + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+                    + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
+                + c1o27*((drho * drho - drho) / (rho*rho)));
+
+
+
+
+            //2.
+            // linear combinations
+            real mxxPyyPzz = mfcaa + mfaca + mfaac;
+            real mxxMyy = mfcaa - mfaca;
+            real mxxMzz = mfcaa - mfaac;
+
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            //incl. correction		(hat noch nicht so gut funktioniert...Optimierungsbedarf??)
+            {
+                real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 *  OxxPyyPzz * (mfaaa - mxxPyyPzz);
+                real dyuy = dxux + omega * c3o2 * mxxMyy;
+                real dzuz = dxux + omega * c3o2 * mxxMzz;
+
+                //relax
+                mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz;
+                mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
+                mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz);
+
+            }
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            ////no correction
+            //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz;
+            //mxxMyy += -(-omega) * (-mxxMyy);
+            //mxxMzz += -(-omega) * (-mxxMzz);
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            mfabb += omega * (-mfabb);
+            mfbab += omega * (-mfbab);
+            mfbba += omega * (-mfbba);
+
+            //////////////////////////////////////////////////////////////////////////
+
+            // linear combinations back
+            mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+            mfaca = c1o3 * (-c2o1*  mxxMyy + mxxMzz + mxxPyyPzz);
+            mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz);
+
+            //3.
+            // linear combinations
+
+            real mxxyPyzz = mfcba + mfabc;
+            real mxxyMyzz = mfcba - mfabc;
+
+            real mxxzPyyz = mfcab + mfacb;
+            real mxxzMyyz = mfcab - mfacb;
+
+            real mxyyPxzz = mfbca + mfbac;
+            real mxyyMxzz = mfbca - mfbac;
+
+            //relax
+            //////////////////////////////////////////////////////////////////////////
+            mfbbb += OxyyMxzz * (-mfbbb);
+            mxxyPyzz += OxyyPxzz * (-mxxyPyzz);
+            mxxyMyzz += OxyyMxzz * (-mxxyMyzz);
+            mxxzPyyz += OxyyPxzz * (-mxxzPyyz);
+            mxxzMyyz += OxyyMxzz * (-mxxzMyyz);
+            mxyyPxzz += OxyyPxzz * (-mxyyPxzz);
+            mxyyMxzz += OxyyMxzz * (-mxyyMxzz);
+            //////////////////////////////////////////////////////////////////////////
+
+            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 + c2o1 * mfbba * mfbab) / rho;
+            mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho;
+            mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho;
+
+            mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
+            mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
+            mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
+
+            //5.
+            mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+            mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+            mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+
+            //6.
+            mfccc = CUMccc - ((-c4o1 *  mfbbb * mfbbb
+                - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+                - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+                - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+                + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                    + c2o1 * (mfcaa * mfaca * mfaac)
+                    + c16o1 *  mfbba * mfbab * mfabb) / (rho * rho)
+                - c1o3 * (mfacc + mfcac + mfcca) / rho
+                - c1o9 * (mfcaa + mfaca + mfaac) / rho
+                + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+                    + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
+                + c1o27*((drho * drho - drho) / (rho*rho)));
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //the force be with you
+            mfbaa = -mfbaa;
+            mfaba = -mfaba;
+            mfaab = -mfaab;
+            ////////////////////////////////////////////////////////////////////////////////////
+
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //back
+            ////////////////////////////////////////////////////////////////////////////////////
+            vf::lbm::backwardChimera(mfaaa, mfaab, mfaac, vvz, vz2);
+            vf::lbm::backwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
+            vf::lbm::backwardChimera(mfaca, mfacb, mfacc, vvz, vz2);
+            vf::lbm::backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
+            vf::lbm::backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
+            vf::lbm::backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
+            vf::lbm::backwardChimera(mfcaa, mfcab, mfcac, vvz, vz2);
+            vf::lbm::backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
+            vf::lbm::backwardChimera(mfcca, mfccb, mfccc, vvz, vz2);
+
+            vf::lbm::backwardChimera(mfaaa, mfaba, mfaca, vvy, vy2);
+            vf::lbm::backwardChimera(mfaab, mfabb, mfacb, vvy, vy2);
+            vf::lbm::backwardChimera(mfaac, mfabc, mfacc, vvy, vy2);
+            vf::lbm::backwardChimera(mfbaa, mfbba, mfbca, vvy, vy2);
+            vf::lbm::backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2);
+            vf::lbm::backwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2);
+            vf::lbm::backwardChimera(mfcaa, mfcba, mfcca, vvy, vy2);
+            vf::lbm::backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2);
+            vf::lbm::backwardChimera(mfcac, mfcbc, mfccc, vvy, vy2);
+
+            vf::lbm::backwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2);
+            vf::lbm::backwardChimera(mfaab, mfbab, mfcab, vvx, vx2);
+            vf::lbm::backwardChimera(mfaac, mfbac, mfcac, vvx, vx2);
+            vf::lbm::backwardChimera(mfaba, mfbba, mfcba, vvx, vx2);
+            vf::lbm::backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2);
+            vf::lbm::backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2);
+            vf::lbm::backwardChimera(mfaca, mfbca, mfcca, vvx, vx2);
+            vf::lbm::backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2);
+            vf::lbm::backwardChimera(mfacc, mfbcc, mfccc, vvx, vx2);
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            mfcbb+=EQcbb;
+            mfabb+=EQabb;
+            mfbcb+=EQbcb;
+            mfbab+=EQbab;
+            mfbbc+=EQbbc;
+            mfbba+=EQbba;
+            mfccb+=EQccb;
+            mfaab+=EQaab;
+            mfcab+=EQcab;
+            mfacb+=EQacb;
+            mfcbc+=EQcbc;
+            mfaba+=EQaba;
+            mfcba+=EQcba;
+            mfabc+=EQabc;
+            mfbcc+=EQbcc;
+            mfbaa+=EQbaa;
+            mfbca+=EQbca;
+            mfbac+=EQbac;
+            mfbbb+=EQbbb;
+            mfccc+=EQccc;
+            mfaac+=EQaac;
+            mfcac+=EQcac;
+            mfacc+=EQacc;
+            mfcca+=EQcca;
+            mfaaa+=EQaaa;
+            mfcaa+=EQcaa;
+            mfaca+=EQaca;
+
+
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////back
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// Z - Dir
+            //backwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, one);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfaba, mfabb, mfabc, vvz, vz2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2);
+            ///////////b//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2);
+            ///////////b//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o3);
+            ///////////c//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2);
+            ///////////c//////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// Y - Dir
+            //backwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaab, mfabb, mfacb, vvy, vy2, c2o3);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o6);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbaa, mfbba, mfbca, vvz, vz2);
+            ///////////b//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbab, mfbbb, mfbcb, vvz, vz2);
+            ///////////b//////////////////////////////////////////////////////////////////////////
+            //backwardChimera(mfbac, mfbbc, mfbcc, vvz, vz2);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o18);
+            ///////////c//////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcab, mfcbb, mfccb, vvy, vy2, c2o9);
+            ///////////c//////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            ////mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+            //////////////////////////////////////////////////////////////////////////////////////
+            //// X - Dir
+            //backwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaba, mfbba, mfcba, vvx, vx2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaab, mfbab, mfcab, vvx, vx2, c1o9);
+            /////////////b////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfabb, mfbbb, mfcbb, vvx, vx2, c4o9);
+            /////////////b////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfacb, mfbcb, mfccb, vvx, vx2, c1o9);
+            //////////////////////////////////////////////////////////////////////////////////////
+            //////////////////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o36);
+            /////////////c////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfabc, mfbbc, mfcbc, vvx, vx2, c1o9);
+            /////////////c////////////////////////////////////////////////////////////////////////
+            //backwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o36);
+            //////////////////////////////////////////////////////////////////////////////////////
+
+            //////////////////////////////////////////////////////////////////////////////////////
+            real drhoPost =
+                ((((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;
+            mfbbb += drho - drhoPost;
+            ////////////////////////////////////////////////////////////////////////////////////
+            (D.f[dirE])[k] = mfabb;//(D.f[ dirE   ])[ke   ] = mfabb;// -  c2over27 ;  (D.f[ dirE   ])[k   ]                                                                     
+            (D.f[dirW])[kw] = mfcbb;//(D.f[ dirW   ])[kw   ] = mfcbb;// -  c2over27 ;  (D.f[ dirW   ])[kw  ]                                                                   
+            (D.f[dirN])[k] = mfbab;//(D.f[ dirN   ])[kn   ] = mfbab;// -  c2over27 ;	 (D.f[ dirN   ])[k   ]
+            (D.f[dirS])[ks] = mfbcb;//(D.f[ dirS   ])[ks   ] = mfbcb;// -  c2over27 ;	 (D.f[ dirS   ])[ks  ]
+            (D.f[dirT])[k] = mfbba;//(D.f[ dirT   ])[kt   ] = mfbba;// -  c2over27 ;	 (D.f[ dirT   ])[k   ]
+            (D.f[dirB])[kb] = mfbbc;//(D.f[ dirB   ])[kb   ] = mfbbc;// -  c2over27 ;	 (D.f[ dirB   ])[kb  ]
+            (D.f[dirNE])[k] = mfaab;//(D.f[ dirNE  ])[kne  ] = mfaab;// -  c1over54 ;	 (D.f[ dirNE  ])[k   ]
+            (D.f[dirSW])[ksw] = mfccb;//(D.f[ dirSW  ])[ksw  ] = mfccb;// -  c1over54 ;	 (D.f[ dirSW  ])[ksw ]
+            (D.f[dirSE])[ks] = mfacb;//(D.f[ dirSE  ])[kse  ] = mfacb;// -  c1over54 ;	 (D.f[ dirSE  ])[ks  ]
+            (D.f[dirNW])[kw] = mfcab;//(D.f[ dirNW  ])[knw  ] = mfcab;// -  c1over54 ;	 (D.f[ dirNW  ])[kw  ]
+            (D.f[dirTE])[k] = mfaba;//(D.f[ dirTE  ])[kte  ] = mfaba;// -  c1over54 ;	 (D.f[ dirTE  ])[k   ]
+            (D.f[dirBW])[kbw] = mfcbc;//(D.f[ dirBW  ])[kbw  ] = mfcbc;// -  c1over54 ;	 (D.f[ dirBW  ])[kbw ]
+            (D.f[dirBE])[kb] = mfabc;//(D.f[ dirBE  ])[kbe  ] = mfabc;// -  c1over54 ;	 (D.f[ dirBE  ])[kb  ]
+            (D.f[dirTW])[kw] = mfcba;//(D.f[ dirTW  ])[ktw  ] = mfcba;// -  c1over54 ;	 (D.f[ dirTW  ])[kw  ]
+            (D.f[dirTN])[k] = mfbaa;//(D.f[ dirTN  ])[ktn  ] = mfbaa;// -  c1over54 ;	 (D.f[ dirTN  ])[k   ]
+            (D.f[dirBS])[kbs] = mfbcc;//(D.f[ dirBS  ])[kbs  ] = mfbcc;// -  c1over54 ;	 (D.f[ dirBS  ])[kbs ]
+            (D.f[dirBN])[kb] = mfbac;//(D.f[ dirBN  ])[kbn  ] = mfbac;// -  c1over54 ;	 (D.f[ dirBN  ])[kb  ]
+            (D.f[dirTS])[ks] = mfbca;//(D.f[ dirTS  ])[kts  ] = mfbca;// -  c1over54 ;	 (D.f[ dirTS  ])[ks  ]
+            (D.f[dirZERO])[k] = mfbbb;//(D.f[ dirZERO])[kzero] = mfbbb;// -  c8over27 ;	 (D.f[ dirZERO])[k   ]
+            (D.f[dirTNE])[k] = mfaaa;//(D.f[ dirTNE ])[ktne ] = mfaaa;// -  c1over216;	 (D.f[ dirTNE ])[k   ]
+            (D.f[dirTSE])[ks] = mfaca;//(D.f[ dirTSE ])[ktse ] = mfaca;// -  c1over216;	 (D.f[ dirTSE ])[ks  ]
+            (D.f[dirBNE])[kb] = mfaac;//(D.f[ dirBNE ])[kbne ] = mfaac;// -  c1over216;	 (D.f[ dirBNE ])[kb  ]
+            (D.f[dirBSE])[kbs] = mfacc;//(D.f[ dirBSE ])[kbse ] = mfacc;// -  c1over216;	 (D.f[ dirBSE ])[kbs ]
+            (D.f[dirTNW])[kw] = mfcaa;//(D.f[ dirTNW ])[ktnw ] = mfcaa;// -  c1over216;	 (D.f[ dirTNW ])[kw  ]
+            (D.f[dirTSW])[ksw] = mfcca;//(D.f[ dirTSW ])[ktsw ] = mfcca;// -  c1over216;	 (D.f[ dirTSW ])[ksw ]
+            (D.f[dirBNW])[kbw] = mfcac;//(D.f[ dirBNW ])[kbnw ] = mfcac;// -  c1over216;	 (D.f[ dirBNW ])[kbw ]
+            (D.f[dirBSW])[kbsw] = mfccc;//(D.f[ dirBSW ])[kbsw ] = mfccc;// -  c1over216;	 (D.f[ dirBSW ])[kbsw]
+            ////////////////////////////////////////////////////////////////////////////////////
+        }
+    }
 }
 ////////////////////////////////////////////////////////////////////////////////
 
@@ -1798,483 +1754,483 @@ extern "C" __global__ void Cumulant_One_preconditioned_chim_Comp_SP_27(
 
 ////////////////////////////////////////////////////////////////////////////////
 extern "C" __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,
+    int size_Mat,
+    int level,
+    real* forces,
+    bool EvenOrOdd)
 {
-	////////////////////////////////////////////////////////////////////////////////
-	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<size_Mat)
-	{
-		////////////////////////////////////////////////////////////////////////////////
-		unsigned int BC;
-		BC = bcMatD[k];
-
-		if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/)
-		{
-			Distributions27 D;
-			if (EvenOrOdd == true)
-			{
-				D.f[dirE   ] = &DDStart[dirE   *size_Mat];
-				D.f[dirW   ] = &DDStart[dirW   *size_Mat];
-				D.f[dirN   ] = &DDStart[dirN   *size_Mat];
-				D.f[dirS   ] = &DDStart[dirS   *size_Mat];
-				D.f[dirT   ] = &DDStart[dirT   *size_Mat];
-				D.f[dirB   ] = &DDStart[dirB   *size_Mat];
-				D.f[dirNE  ] = &DDStart[dirNE  *size_Mat];
-				D.f[dirSW  ] = &DDStart[dirSW  *size_Mat];
-				D.f[dirSE  ] = &DDStart[dirSE  *size_Mat];
-				D.f[dirNW  ] = &DDStart[dirNW  *size_Mat];
-				D.f[dirTE  ] = &DDStart[dirTE  *size_Mat];
-				D.f[dirBW  ] = &DDStart[dirBW  *size_Mat];
-				D.f[dirBE  ] = &DDStart[dirBE  *size_Mat];
-				D.f[dirTW  ] = &DDStart[dirTW  *size_Mat];
-				D.f[dirTN  ] = &DDStart[dirTN  *size_Mat];
-				D.f[dirBS  ] = &DDStart[dirBS  *size_Mat];
-				D.f[dirBN  ] = &DDStart[dirBN  *size_Mat];
-				D.f[dirTS  ] = &DDStart[dirTS  *size_Mat];
-				D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
-				D.f[dirTNE ] = &DDStart[dirTNE *size_Mat];
-				D.f[dirTSW ] = &DDStart[dirTSW *size_Mat];
-				D.f[dirTSE ] = &DDStart[dirTSE *size_Mat];
-				D.f[dirTNW ] = &DDStart[dirTNW *size_Mat];
-				D.f[dirBNE ] = &DDStart[dirBNE *size_Mat];
-				D.f[dirBSW ] = &DDStart[dirBSW *size_Mat];
-				D.f[dirBSE ] = &DDStart[dirBSE *size_Mat];
-				D.f[dirBNW ] = &DDStart[dirBNW *size_Mat];
-			}
-			else
-			{
-				D.f[dirW   ] = &DDStart[dirE   *size_Mat];
-				D.f[dirE   ] = &DDStart[dirW   *size_Mat];
-				D.f[dirS   ] = &DDStart[dirN   *size_Mat];
-				D.f[dirN   ] = &DDStart[dirS   *size_Mat];
-				D.f[dirB   ] = &DDStart[dirT   *size_Mat];
-				D.f[dirT   ] = &DDStart[dirB   *size_Mat];
-				D.f[dirSW  ] = &DDStart[dirNE  *size_Mat];
-				D.f[dirNE  ] = &DDStart[dirSW  *size_Mat];
-				D.f[dirNW  ] = &DDStart[dirSE  *size_Mat];
-				D.f[dirSE  ] = &DDStart[dirNW  *size_Mat];
-				D.f[dirBW  ] = &DDStart[dirTE  *size_Mat];
-				D.f[dirTE  ] = &DDStart[dirBW  *size_Mat];
-				D.f[dirTW  ] = &DDStart[dirBE  *size_Mat];
-				D.f[dirBE  ] = &DDStart[dirTW  *size_Mat];
-				D.f[dirBS  ] = &DDStart[dirTN  *size_Mat];
-				D.f[dirTN  ] = &DDStart[dirBS  *size_Mat];
-				D.f[dirTS  ] = &DDStart[dirBN  *size_Mat];
-				D.f[dirBN  ] = &DDStart[dirTS  *size_Mat];
-				D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
-				D.f[dirBSW ] = &DDStart[dirTNE *size_Mat];
-				D.f[dirBNE ] = &DDStart[dirTSW *size_Mat];
-				D.f[dirBNW ] = &DDStart[dirTSE *size_Mat];
-				D.f[dirBSE ] = &DDStart[dirTNW *size_Mat];
-				D.f[dirTSW ] = &DDStart[dirBNE *size_Mat];
-				D.f[dirTNE ] = &DDStart[dirBSW *size_Mat];
-				D.f[dirTNW ] = &DDStart[dirBSE *size_Mat];
-				D.f[dirTSE ] = &DDStart[dirBNW *size_Mat];
-			}
-			////////////////////////////////////////////////////////////////////////////////
-			//index
-			unsigned int kw = neighborX[k];
-			unsigned int ks = neighborY[k];
-			unsigned int kb = neighborZ[k];
-			unsigned int ksw = neighborY[kw];
-			unsigned int kbw = neighborZ[kw];
-			unsigned int kbs = neighborZ[ks];
-			unsigned int kbsw = neighborZ[ksw];
-			////////////////////////////////////////////////////////////////////////////////////
-			real mfcbb = (D.f[dirE   ])[k   ];
-			real mfabb = (D.f[dirW   ])[kw  ];
-			real mfbcb = (D.f[dirN   ])[k   ];
-			real mfbab = (D.f[dirS   ])[ks  ];
-			real mfbbc = (D.f[dirT   ])[k   ];
-			real mfbba = (D.f[dirB   ])[kb  ];
-			real mfccb = (D.f[dirNE  ])[k   ];
-			real mfaab = (D.f[dirSW  ])[ksw ];
-			real mfcab = (D.f[dirSE  ])[ks  ];
-			real mfacb = (D.f[dirNW  ])[kw  ];
-			real mfcbc = (D.f[dirTE  ])[k   ];
-			real mfaba = (D.f[dirBW  ])[kbw ];
-			real mfcba = (D.f[dirBE  ])[kb  ];
-			real mfabc = (D.f[dirTW  ])[kw  ];
-			real mfbcc = (D.f[dirTN  ])[k   ];
-			real mfbaa = (D.f[dirBS  ])[kbs ];
-			real mfbca = (D.f[dirBN  ])[kb  ];
-			real mfbac = (D.f[dirTS  ])[ks  ];
-			real mfbbb = (D.f[dirZERO])[k   ];
-			real mfccc = (D.f[dirTNE ])[k   ];
-			real mfaac = (D.f[dirTSW ])[ksw ];
-			real mfcac = (D.f[dirTSE ])[ks  ];
-			real mfacc = (D.f[dirTNW ])[kw  ];
-			real mfcca = (D.f[dirBNE ])[kb  ];
-			real mfaaa = (D.f[dirBSW ])[kbsw];
-			real mfcaa = (D.f[dirBSE ])[kbs ];
-			real mfaca = (D.f[dirBNW ])[kbw ];
-			////////////////////////////////////////////////////////////////////////////////////
-			real 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;
-
-			real rho = c1o1 + drho;
-			real OOrho = c1o1 / rho;
-			////////////////////////////////////////////////////////////////////////////////////
-			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;
-			////////////////////////////////////////////////////////////////////////////////////
-			//the force be with you
-			real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; //
-			real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero;
-			real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero;
-			vvx += fx*c1o2;
-			vvy += fy*c1o2;
-			vvz += fz*c1o2;
-			////////////////////////////////////////////////////////////////////////////////////
-			//real omega = omega_in;
-			////////////////////////////////////////////////////////////////////////////////////
-			//fast
-			//real oMdrho = c1o1; // comp special
-			//real m0, m1, m2;
-			real vx2;
-			real vy2;
-			real vz2;
-			vx2 = vvx*vvx;
-			vy2 = vvy*vvy;
-			vz2 = vvz*vvz;
-			////////////////////////////////////////////////////////////////////////////////////
-			//real wadjust;
-			//real qudricLimitP = c1o100;// * 0.0001f;
-			//real qudricLimitM = c1o100;// * 0.0001f;
-			//real qudricLimitD = c1o100;// * 0.001f;
-			////////////////////////////////////////////////////////////////////////////////////
-			//Hin
-			////////////////////////////////////////////////////////////////////////////////////
-			// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
-			////////////////////////////////////////////////////////////////////////////////////
-			// Z - Dir
-			forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, 36.0f, c1o36);
-			forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, 9.0f , c1o9 );
-			forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, 36.0f, c1o36);
-			forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, 9.0f , c1o9 );
-			forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, 2.25f, c4o9 );
-			forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, 9.0f , c1o9 );
-			forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, 36.0f, c1o36);
-			forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, 9.0f , c1o9 );
-			forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, 36.0f, c1o36);
-
-			////////////////////////////////////////////////////////////////////////////////////
-			// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
-			////////////////////////////////////////////////////////////////////////////////////
-			// Y - Dir
-			forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, 6.0f , c1o6 );
-			forwardChimera(     mfaab, mfabb, mfacb, vvy, vy2);
-			forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, 18.0f, c1o18);
-			forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, 1.5f , c2o3 );
-			forwardChimera(     mfbab, mfbbb, mfbcb, vvy, vy2);
-			forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, 4.5f , c2o9 );
-			forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, 6.0f , c1o6 );
-			forwardChimera(     mfcab, mfcbb, mfccb, vvy, vy2);
-			forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, 18.0f, c1o18);
-
-			////////////////////////////////////////////////////////////////////////////////////
-			// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9		Konditionieren
-			////////////////////////////////////////////////////////////////////////////////////
-			// X - Dir
-			forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1);
-			forwardChimera(     mfaba, mfbba, mfcba, vvx, vx2);
-			forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, 3.0f, 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, 3.0f, c1o3);
-			forwardChimera(     mfabc, mfbbc, mfcbc, vvx, vx2);
-			forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, 9.0f, c1o9);
-
-			////////////////////////////////////////////////////////////////////////////////////
-			// Cumulants
-			////////////////////////////////////////////////////////////////////////////////////
-			real OxxPyyPzz = c1o1;
-			////////////////////////////////////////////////////////////
-			//3.
-			//////////////////////////////
-			real OxyyPxzz = c1o1;
-			real OxyyMxzz = c1o1;
-			//real Oxyz = c1o1;
-			////////////////////////////////////////////////////////////
-			//4.
-			//////////////////////////////
-			real O4 = c1o1;
-			////////////////////////////////////////////////////////////
-			//5.
-			//////////////////////////////
-			real O5 = c1o1;
-			////////////////////////////////////////////////////////////
-			//6.
-			//////////////////////////////
-			real O6 = c1o1;
-			////////////////////////////////////////////////////////////
-
-
-			//central moments to cumulants
-			//4.
-			real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) * OOrho;
-			real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) * OOrho;
-			real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) * OOrho;
-
-			real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - c1o9*(drho * OOrho));
-			real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - c1o9*(drho * OOrho));
-			real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - c1o9*(drho * OOrho));
-
-			//5.
-			real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) * OOrho;
-			real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) * OOrho;
-			real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) * OOrho;
-
-			//6.
-			real CUMccc = mfccc + ((-c4o1 *  mfbbb * mfbbb
-				- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-				- c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
-				- c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho
-				+ (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-				+ c2o1 * (mfcaa * mfaca * mfaac)
-				+ c16o1 *  mfbba * mfbab * mfabb) * OOrho * OOrho
-				- c1o3 * (mfacc + mfcac + mfcca) * OOrho
-				- c1o9 * (mfcaa + mfaca + mfaac) * OOrho
-				+ (c2o1 * (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 ));
-
-
-			//2.
-			// linear combinations
-			real mxxPyyPzz = mfcaa + mfaca + mfaac;
-			real mxxMyy = mfcaa - mfaca;
-			real mxxMzz = mfcaa - mfaac;
-
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			//incl. correction		(hat noch nicht so gut funktioniert...Optimierungsbedarf??)
-			{
-				real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 *  OxxPyyPzz * (mfaaa - mxxPyyPzz);
-				real dyuy = dxux + omega * c3o2 * mxxMyy;
-				real dzuz = dxux + omega * c3o2 * mxxMzz;
-
-				//relax
-				mxxPyyPzz += OxxPyyPzz*(mfaaa  - mxxPyyPzz)- c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz;
-				mxxMyy    += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
-				mxxMzz    += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz);
-
-			}
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			////no correction
-			//mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz;
-			//mxxMyy += -(-omega) * (-mxxMyy);
-			//mxxMzz += -(-omega) * (-mxxMzz);
-			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-			mfabb += omega * (-mfabb);
-			mfbab += omega * (-mfbab);
-			mfbba += omega * (-mfbba);
-
-			//////////////////////////////////////////////////////////////////////////
-
-			// linear combinations back
-			mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
-			mfaca = c1o3 * (-c2o1*  mxxMyy + mxxMzz + mxxPyyPzz);
-			mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz);
-
-			//3.
-			// linear combinations
-
-			real mxxyPyzz = mfcba + mfabc;
-			real mxxyMyzz = mfcba - mfabc;
-
-			real mxxzPyyz = mfcab + mfacb;
-			real mxxzMyyz = mfcab - mfacb;
-
-			real mxyyPxzz = mfbca + mfbac;
-			real mxyyMxzz = mfbca - mfbac;
-
-			//relax
-			//////////////////////////////////////////////////////////////////////////
-			mfbbb     += OxyyMxzz * (-mfbbb);
-			mxxyPyzz  += OxyyPxzz * (-mxxyPyzz);
-			mxxyMyzz  += OxyyMxzz * (-mxxyMyzz);
-			mxxzPyyz  += OxyyPxzz * (-mxxzPyyz);
-			mxxzMyyz  += OxyyMxzz * (-mxxzMyyz);
-			mxyyPxzz  += OxyyPxzz * (-mxyyPxzz);
-			mxyyMxzz  += OxyyMxzz * (-mxyyMxzz);
-			//////////////////////////////////////////////////////////////////////////
-
-			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 + c1o3*((c3o1*mfcaa + c1o1) * mfabb + c6o1 * mfbba * mfbab) * OOrho; 
-			mfbcb = CUMbcb + c1o3*((c3o1*mfaca + c1o1) * mfbab + c6o1 * mfbba * mfabb) * OOrho;
-			mfbbc = CUMbbc + c1o3*((c3o1*mfaac + c1o1) * mfbba + c6o1 * mfbab * mfabb) * OOrho;
-
-			mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba)*c9o1 + c3o1 * (mfcaa + mfaca)) * OOrho - (drho * OOrho))*c1o9;
-			mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab)*c9o1 + c3o1 * (mfcaa + mfaac)) * OOrho - (drho * OOrho))*c1o9;
-			mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb)*c9o1 + c3o1 * (mfaac + mfaca)) * OOrho - (drho * OOrho))*c1o9;
-
-			//5.
-			mfbcc = CUMbcc + c1o3 *(c3o1*(mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + (mfbca + mfbac)) * OOrho;
-			mfcbc = CUMcbc + c1o3 *(c3o1*(mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + (mfcba + mfabc)) * OOrho;
-			mfccb = CUMccb + c1o3 *(c3o1*(mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) +  (mfacb + mfcab)) * OOrho;
-
-			//6.
-			mfccc = 
-				CUMccc - ((-c4o1 *  mfbbb * mfbbb
-				- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
-				- c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
-				- c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho
-				+ (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
-				+ c2o1 * (mfcaa * mfaca * mfaac)
-				+ c16o1 *  mfbba * mfbab * mfabb) * OOrho * OOrho
-				- c1o3 * (mfacc + mfcac + mfcca) * OOrho
-				- c1o9 * (mfcaa + mfaca + mfaac) * OOrho
-				+ (c2o1 * (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 ));
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//the force be with you
-			mfbaa = -mfbaa;
-			mfaba = -mfaba;
-			mfaab = -mfaab;
-			////////////////////////////////////////////////////////////////////////////////////
-
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//back
-			////////////////////////////////////////////////////////////////////////////////////
-			//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
-			////////////////////////////////////////////////////////////////////////////////////
-			// X - Dir
-			backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1);
-			backwardChimera(			mfaba, mfbba, mfcba, vvx, vx2);
-			backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, 3.0f, 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, 3.0f, c1o3);
-			backwardChimera(			mfabc, mfbbc, mfcbc, vvx, vx2);
-			backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, 9.0f, c1o9);
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
-			////////////////////////////////////////////////////////////////////////////////////
-			// Y - Dir
-			backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, 6.0f , c1o6 );
-			backwardChimera(			mfaab, mfabb, mfacb, vvy, vy2);
-			backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, 18.0f, c1o18);
-			backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, 1.5f , c2o3 );
-			backwardChimera(			mfbab, mfbbb, mfbcb, vvy, vy2);
-			backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, 4.5f , c2o9 );
-			backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, 6.0f , c1o6 );
-			backwardChimera(			mfcab, mfcbb, mfccb, vvy, vy2);
-			backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, 18.0f, c1o18);
-
-			////////////////////////////////////////////////////////////////////////////////////
-			//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
-			////////////////////////////////////////////////////////////////////////////////////
-			// Z - Dir
-			backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, 36.0f, c1o36);
-			backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, 9.0f , c1o9 );
-			backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, 36.0f, c1o36);
-			backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, 9.0f , c1o9 );
-			backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, 2.25f, c4o9 );
-			backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, 9.0f , c1o9 );
-			backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, 36.0f, c1o36);
-			backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, 9.0f , c1o9 );
-			backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, 36.0f, c1o36);
-
-			//////////////////////////////////////////////////////////////////////////////////////
-			real drhoPost =
-				((((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;
-			mfbbb += drho - drhoPost;
-			////////////////////////////////////////////////////////////////////////////////////
-			(D.f[dirE   ])[k   ] = mfabb;                                                                   
-			(D.f[dirW   ])[kw  ] = mfcbb;                                                                 
-			(D.f[dirN   ])[k   ] = mfbab;
-			(D.f[dirS   ])[ks  ] = mfbcb;
-			(D.f[dirT   ])[k   ] = mfbba;
-			(D.f[dirB   ])[kb  ] = mfbbc;
-			(D.f[dirNE  ])[k   ] = mfaab;
-			(D.f[dirSW  ])[ksw ] = mfccb;
-			(D.f[dirSE  ])[ks  ] = mfacb;
-			(D.f[dirNW  ])[kw  ] = mfcab;
-			(D.f[dirTE  ])[k   ] = mfaba;
-			(D.f[dirBW  ])[kbw ] = mfcbc;
-			(D.f[dirBE  ])[kb  ] = mfabc;
-			(D.f[dirTW  ])[kw  ] = mfcba;
-			(D.f[dirTN  ])[k   ] = mfbaa;
-			(D.f[dirBS  ])[kbs ] = mfbcc;
-			(D.f[dirBN  ])[kb  ] = mfbac;
-			(D.f[dirTS  ])[ks  ] = mfbca;
-			(D.f[dirZERO])[k   ] = mfbbb;
-			(D.f[dirTNE ])[k   ] = mfaaa;
-			(D.f[dirTSE ])[ks  ] = mfaca;
-			(D.f[dirBNE ])[kb  ] = mfaac;
-			(D.f[dirBSE ])[kbs ] = mfacc;
-			(D.f[dirTNW ])[kw  ] = mfcaa;
-			(D.f[dirTSW ])[ksw ] = mfcca;
-			(D.f[dirBNW ])[kbw ] = mfcac;
-			(D.f[dirBSW ])[kbsw] = mfccc;
-		}
-	}
+    ////////////////////////////////////////////////////////////////////////////////
+    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<size_Mat)
+    {
+        ////////////////////////////////////////////////////////////////////////////////
+        unsigned int BC;
+        BC = bcMatD[k];
+
+        if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/)
+        {
+            Distributions27 D;
+            if (EvenOrOdd == true)
+            {
+                D.f[dirE   ] = &DDStart[dirE   *size_Mat];
+                D.f[dirW   ] = &DDStart[dirW   *size_Mat];
+                D.f[dirN   ] = &DDStart[dirN   *size_Mat];
+                D.f[dirS   ] = &DDStart[dirS   *size_Mat];
+                D.f[dirT   ] = &DDStart[dirT   *size_Mat];
+                D.f[dirB   ] = &DDStart[dirB   *size_Mat];
+                D.f[dirNE  ] = &DDStart[dirNE  *size_Mat];
+                D.f[dirSW  ] = &DDStart[dirSW  *size_Mat];
+                D.f[dirSE  ] = &DDStart[dirSE  *size_Mat];
+                D.f[dirNW  ] = &DDStart[dirNW  *size_Mat];
+                D.f[dirTE  ] = &DDStart[dirTE  *size_Mat];
+                D.f[dirBW  ] = &DDStart[dirBW  *size_Mat];
+                D.f[dirBE  ] = &DDStart[dirBE  *size_Mat];
+                D.f[dirTW  ] = &DDStart[dirTW  *size_Mat];
+                D.f[dirTN  ] = &DDStart[dirTN  *size_Mat];
+                D.f[dirBS  ] = &DDStart[dirBS  *size_Mat];
+                D.f[dirBN  ] = &DDStart[dirBN  *size_Mat];
+                D.f[dirTS  ] = &DDStart[dirTS  *size_Mat];
+                D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
+                D.f[dirTNE ] = &DDStart[dirTNE *size_Mat];
+                D.f[dirTSW ] = &DDStart[dirTSW *size_Mat];
+                D.f[dirTSE ] = &DDStart[dirTSE *size_Mat];
+                D.f[dirTNW ] = &DDStart[dirTNW *size_Mat];
+                D.f[dirBNE ] = &DDStart[dirBNE *size_Mat];
+                D.f[dirBSW ] = &DDStart[dirBSW *size_Mat];
+                D.f[dirBSE ] = &DDStart[dirBSE *size_Mat];
+                D.f[dirBNW ] = &DDStart[dirBNW *size_Mat];
+            }
+            else
+            {
+                D.f[dirW   ] = &DDStart[dirE   *size_Mat];
+                D.f[dirE   ] = &DDStart[dirW   *size_Mat];
+                D.f[dirS   ] = &DDStart[dirN   *size_Mat];
+                D.f[dirN   ] = &DDStart[dirS   *size_Mat];
+                D.f[dirB   ] = &DDStart[dirT   *size_Mat];
+                D.f[dirT   ] = &DDStart[dirB   *size_Mat];
+                D.f[dirSW  ] = &DDStart[dirNE  *size_Mat];
+                D.f[dirNE  ] = &DDStart[dirSW  *size_Mat];
+                D.f[dirNW  ] = &DDStart[dirSE  *size_Mat];
+                D.f[dirSE  ] = &DDStart[dirNW  *size_Mat];
+                D.f[dirBW  ] = &DDStart[dirTE  *size_Mat];
+                D.f[dirTE  ] = &DDStart[dirBW  *size_Mat];
+                D.f[dirTW  ] = &DDStart[dirBE  *size_Mat];
+                D.f[dirBE  ] = &DDStart[dirTW  *size_Mat];
+                D.f[dirBS  ] = &DDStart[dirTN  *size_Mat];
+                D.f[dirTN  ] = &DDStart[dirBS  *size_Mat];
+                D.f[dirTS  ] = &DDStart[dirBN  *size_Mat];
+                D.f[dirBN  ] = &DDStart[dirTS  *size_Mat];
+                D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
+                D.f[dirBSW ] = &DDStart[dirTNE *size_Mat];
+                D.f[dirBNE ] = &DDStart[dirTSW *size_Mat];
+                D.f[dirBNW ] = &DDStart[dirTSE *size_Mat];
+                D.f[dirBSE ] = &DDStart[dirTNW *size_Mat];
+                D.f[dirTSW ] = &DDStart[dirBNE *size_Mat];
+                D.f[dirTNE ] = &DDStart[dirBSW *size_Mat];
+                D.f[dirTNW ] = &DDStart[dirBSE *size_Mat];
+                D.f[dirTSE ] = &DDStart[dirBNW *size_Mat];
+            }
+            ////////////////////////////////////////////////////////////////////////////////
+            //index
+            unsigned int kw = neighborX[k];
+            unsigned int ks = neighborY[k];
+            unsigned int kb = neighborZ[k];
+            unsigned int ksw = neighborY[kw];
+            unsigned int kbw = neighborZ[kw];
+            unsigned int kbs = neighborZ[ks];
+            unsigned int kbsw = neighborZ[ksw];
+            ////////////////////////////////////////////////////////////////////////////////////
+            real mfcbb = (D.f[dirE   ])[k   ];
+            real mfabb = (D.f[dirW   ])[kw  ];
+            real mfbcb = (D.f[dirN   ])[k   ];
+            real mfbab = (D.f[dirS   ])[ks  ];
+            real mfbbc = (D.f[dirT   ])[k   ];
+            real mfbba = (D.f[dirB   ])[kb  ];
+            real mfccb = (D.f[dirNE  ])[k   ];
+            real mfaab = (D.f[dirSW  ])[ksw ];
+            real mfcab = (D.f[dirSE  ])[ks  ];
+            real mfacb = (D.f[dirNW  ])[kw  ];
+            real mfcbc = (D.f[dirTE  ])[k   ];
+            real mfaba = (D.f[dirBW  ])[kbw ];
+            real mfcba = (D.f[dirBE  ])[kb  ];
+            real mfabc = (D.f[dirTW  ])[kw  ];
+            real mfbcc = (D.f[dirTN  ])[k   ];
+            real mfbaa = (D.f[dirBS  ])[kbs ];
+            real mfbca = (D.f[dirBN  ])[kb  ];
+            real mfbac = (D.f[dirTS  ])[ks  ];
+            real mfbbb = (D.f[dirZERO])[k   ];
+            real mfccc = (D.f[dirTNE ])[k   ];
+            real mfaac = (D.f[dirTSW ])[ksw ];
+            real mfcac = (D.f[dirTSE ])[ks  ];
+            real mfacc = (D.f[dirTNW ])[kw  ];
+            real mfcca = (D.f[dirBNE ])[kb  ];
+            real mfaaa = (D.f[dirBSW ])[kbsw];
+            real mfcaa = (D.f[dirBSE ])[kbs ];
+            real mfaca = (D.f[dirBNW ])[kbw ];
+            ////////////////////////////////////////////////////////////////////////////////////
+            real 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;
+
+            real rho = c1o1 + drho;
+            real OOrho = c1o1 / rho;
+            ////////////////////////////////////////////////////////////////////////////////////
+            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;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //the force be with you
+            real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; //
+            real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero;
+            real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero;
+            vvx += fx*c1o2;
+            vvy += fy*c1o2;
+            vvz += fz*c1o2;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //real omega = omega_in;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //fast
+            //real oMdrho = c1o1; // comp special
+            //real m0, m1, m2;
+            real vx2;
+            real vy2;
+            real vz2;
+            vx2 = vvx*vvx;
+            vy2 = vvy*vvy;
+            vz2 = vvz*vvz;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //real wadjust;
+            //real qudricLimitP = c1o100;// * 0.0001f;
+            //real qudricLimitM = c1o100;// * 0.0001f;
+            //real qudricLimitD = c1o100;// * 0.001f;
+            ////////////////////////////////////////////////////////////////////////////////////
+            //Hin
+            ////////////////////////////////////////////////////////////////////////////////////
+            // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+            ////////////////////////////////////////////////////////////////////////////////////
+            // Z - Dir
+            vf::lbm::forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, 36.0f, c1o36);
+            vf::lbm::forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, 9.0f , c1o9 );
+            vf::lbm::forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, 36.0f, c1o36);
+            vf::lbm::forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, 9.0f , c1o9 );
+            vf::lbm::forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, 2.25f, c4o9 );
+            vf::lbm::forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, 9.0f , c1o9 );
+            vf::lbm::forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, 36.0f, c1o36);
+            vf::lbm::forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, 9.0f , c1o9 );
+            vf::lbm::forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, 36.0f, c1o36);
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+            ////////////////////////////////////////////////////////////////////////////////////
+            // Y - Dir
+            vf::lbm::forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, 6.0f , c1o6 );
+            vf::lbm::forwardChimera(     mfaab, mfabb, mfacb, vvy, vy2);
+            vf::lbm::forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, 18.0f, c1o18);
+            vf::lbm::forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, 1.5f , c2o3 );
+            vf::lbm::forwardChimera(     mfbab, mfbbb, mfbcb, vvy, vy2);
+            vf::lbm::forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, 4.5f , c2o9 );
+            vf::lbm::forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, 6.0f , c1o6 );
+            vf::lbm::forwardChimera(     mfcab, mfcbb, mfccb, vvy, vy2);
+            vf::lbm::forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, 18.0f, c1o18);
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9		Konditionieren
+            ////////////////////////////////////////////////////////////////////////////////////
+            // X - Dir
+            vf::lbm::forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1);
+            vf::lbm::forwardChimera(     mfaba, mfbba, mfcba, vvx, vx2);
+            vf::lbm::forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, 3.0f, c1o3);
+            vf::lbm::forwardChimera(     mfaab, mfbab, mfcab, vvx, vx2);
+            vf::lbm::forwardChimera(     mfabb, mfbbb, mfcbb, vvx, vx2);
+            vf::lbm::forwardChimera(     mfacb, mfbcb, mfccb, vvx, vx2);
+            vf::lbm::forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, 3.0f, c1o3);
+            vf::lbm::forwardChimera(     mfabc, mfbbc, mfcbc, vvx, vx2);
+            vf::lbm::forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, 9.0f, c1o9);
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            // Cumulants
+            ////////////////////////////////////////////////////////////////////////////////////
+            real OxxPyyPzz = c1o1;
+            ////////////////////////////////////////////////////////////
+            //3.
+            //////////////////////////////
+            real OxyyPxzz = c1o1;
+            real OxyyMxzz = c1o1;
+            //real Oxyz = c1o1;
+            ////////////////////////////////////////////////////////////
+            //4.
+            //////////////////////////////
+            real O4 = c1o1;
+            ////////////////////////////////////////////////////////////
+            //5.
+            //////////////////////////////
+            real O5 = c1o1;
+            ////////////////////////////////////////////////////////////
+            //6.
+            //////////////////////////////
+            real O6 = c1o1;
+            ////////////////////////////////////////////////////////////
+
+
+            //central moments to cumulants
+            //4.
+            real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) * OOrho;
+            real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) * OOrho;
+            real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) * OOrho;
+
+            real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - c1o9*(drho * OOrho));
+            real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - c1o9*(drho * OOrho));
+            real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - c1o9*(drho * OOrho));
+
+            //5.
+            real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) * OOrho;
+            real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) * OOrho;
+            real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) * OOrho;
+
+            //6.
+            real CUMccc = mfccc + ((-c4o1 *  mfbbb * mfbbb
+                - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+                - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+                - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho
+                + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                + c2o1 * (mfcaa * mfaca * mfaac)
+                + c16o1 *  mfbba * mfbab * mfabb) * OOrho * OOrho
+                - c1o3 * (mfacc + mfcac + mfcca) * OOrho
+                - c1o9 * (mfcaa + mfaca + mfaac) * OOrho
+                + (c2o1 * (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 ));
+
+
+            //2.
+            // linear combinations
+            real mxxPyyPzz = mfcaa + mfaca + mfaac;
+            real mxxMyy = mfcaa - mfaca;
+            real mxxMzz = mfcaa - mfaac;
+
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            //incl. correction		(hat noch nicht so gut funktioniert...Optimierungsbedarf??)
+            {
+                real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 *  OxxPyyPzz * (mfaaa - mxxPyyPzz);
+                real dyuy = dxux + omega * c3o2 * mxxMyy;
+                real dzuz = dxux + omega * c3o2 * mxxMzz;
+
+                //relax
+                mxxPyyPzz += OxxPyyPzz*(mfaaa  - mxxPyyPzz)- c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz;
+                mxxMyy    += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
+                mxxMzz    += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz);
+
+            }
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            ////no correction
+            //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz;
+            //mxxMyy += -(-omega) * (-mxxMyy);
+            //mxxMzz += -(-omega) * (-mxxMzz);
+            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            mfabb += omega * (-mfabb);
+            mfbab += omega * (-mfbab);
+            mfbba += omega * (-mfbba);
+
+            //////////////////////////////////////////////////////////////////////////
+
+            // linear combinations back
+            mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+            mfaca = c1o3 * (-c2o1*  mxxMyy + mxxMzz + mxxPyyPzz);
+            mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz);
+
+            //3.
+            // linear combinations
+
+            real mxxyPyzz = mfcba + mfabc;
+            real mxxyMyzz = mfcba - mfabc;
+
+            real mxxzPyyz = mfcab + mfacb;
+            real mxxzMyyz = mfcab - mfacb;
+
+            real mxyyPxzz = mfbca + mfbac;
+            real mxyyMxzz = mfbca - mfbac;
+
+            //relax
+            //////////////////////////////////////////////////////////////////////////
+            mfbbb     += OxyyMxzz * (-mfbbb);
+            mxxyPyzz  += OxyyPxzz * (-mxxyPyzz);
+            mxxyMyzz  += OxyyMxzz * (-mxxyMyzz);
+            mxxzPyyz  += OxyyPxzz * (-mxxzPyyz);
+            mxxzMyyz  += OxyyMxzz * (-mxxzMyyz);
+            mxyyPxzz  += OxyyPxzz * (-mxyyPxzz);
+            mxyyMxzz  += OxyyMxzz * (-mxyyMxzz);
+            //////////////////////////////////////////////////////////////////////////
+
+            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 + c1o3*((c3o1*mfcaa + c1o1) * mfabb + c6o1 * mfbba * mfbab) * OOrho; 
+            mfbcb = CUMbcb + c1o3*((c3o1*mfaca + c1o1) * mfbab + c6o1 * mfbba * mfabb) * OOrho;
+            mfbbc = CUMbbc + c1o3*((c3o1*mfaac + c1o1) * mfbba + c6o1 * mfbab * mfabb) * OOrho;
+
+            mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba)*c9o1 + c3o1 * (mfcaa + mfaca)) * OOrho - (drho * OOrho))*c1o9;
+            mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab)*c9o1 + c3o1 * (mfcaa + mfaac)) * OOrho - (drho * OOrho))*c1o9;
+            mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb)*c9o1 + c3o1 * (mfaac + mfaca)) * OOrho - (drho * OOrho))*c1o9;
+
+            //5.
+            mfbcc = CUMbcc + c1o3 *(c3o1*(mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + (mfbca + mfbac)) * OOrho;
+            mfcbc = CUMcbc + c1o3 *(c3o1*(mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + (mfcba + mfabc)) * OOrho;
+            mfccb = CUMccb + c1o3 *(c3o1*(mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) +  (mfacb + mfcab)) * OOrho;
+
+            //6.
+            mfccc = 
+                CUMccc - ((-c4o1 *  mfbbb * mfbbb
+                - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+                - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+                - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho
+                + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                + c2o1 * (mfcaa * mfaca * mfaac)
+                + c16o1 *  mfbba * mfbab * mfabb) * OOrho * OOrho
+                - c1o3 * (mfacc + mfcac + mfcca) * OOrho
+                - c1o9 * (mfcaa + mfaca + mfaac) * OOrho
+                + (c2o1 * (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 ));
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //the force be with you
+            mfbaa = -mfbaa;
+            mfaba = -mfaba;
+            mfaab = -mfaab;
+            ////////////////////////////////////////////////////////////////////////////////////
+
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //back
+            ////////////////////////////////////////////////////////////////////////////////////
+            //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+            ////////////////////////////////////////////////////////////////////////////////////
+            // X - Dir
+            vf::lbm::backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1);
+            vf::lbm::backwardChimera(			mfaba, mfbba, mfcba, vvx, vx2);
+            vf::lbm::backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, 3.0f, c1o3);
+            vf::lbm::backwardChimera(			mfaab, mfbab, mfcab, vvx, vx2);
+            vf::lbm::backwardChimera(			mfabb, mfbbb, mfcbb, vvx, vx2);
+            vf::lbm::backwardChimera(			mfacb, mfbcb, mfccb, vvx, vx2);
+            vf::lbm::backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, 3.0f, c1o3);
+            vf::lbm::backwardChimera(			mfabc, mfbbc, mfcbc, vvx, vx2);
+            vf::lbm::backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, 9.0f, c1o9);
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+            ////////////////////////////////////////////////////////////////////////////////////
+            // Y - Dir
+            vf::lbm::backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, 6.0f , c1o6 );
+            vf::lbm::backwardChimera(			mfaab, mfabb, mfacb, vvy, vy2);
+            vf::lbm::backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, 18.0f, c1o18);
+            vf::lbm::backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, 1.5f , c2o3 );
+            vf::lbm::backwardChimera(			mfbab, mfbbb, mfbcb, vvy, vy2);
+            vf::lbm::backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, 4.5f , c2o9 );
+            vf::lbm::backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, 6.0f , c1o6 );
+            vf::lbm::backwardChimera(			mfcab, mfcbb, mfccb, vvy, vy2);
+            vf::lbm::backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, 18.0f, c1o18);
+
+            ////////////////////////////////////////////////////////////////////////////////////
+            //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+            ////////////////////////////////////////////////////////////////////////////////////
+            // Z - Dir
+            vf::lbm::backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, 36.0f, c1o36);
+            vf::lbm::backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, 9.0f , c1o9 );
+            vf::lbm::backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, 36.0f, c1o36);
+            vf::lbm::backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, 9.0f , c1o9 );
+            vf::lbm::backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, 2.25f, c4o9 );
+            vf::lbm::backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, 9.0f , c1o9 );
+            vf::lbm::backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, 36.0f, c1o36);
+            vf::lbm::backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, 9.0f , c1o9 );
+            vf::lbm::backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, 36.0f, c1o36);
+
+            //////////////////////////////////////////////////////////////////////////////////////
+            real drhoPost =
+                ((((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;
+            mfbbb += drho - drhoPost;
+            ////////////////////////////////////////////////////////////////////////////////////
+            (D.f[dirE   ])[k   ] = mfabb;                                                                   
+            (D.f[dirW   ])[kw  ] = mfcbb;                                                                 
+            (D.f[dirN   ])[k   ] = mfbab;
+            (D.f[dirS   ])[ks  ] = mfbcb;
+            (D.f[dirT   ])[k   ] = mfbba;
+            (D.f[dirB   ])[kb  ] = mfbbc;
+            (D.f[dirNE  ])[k   ] = mfaab;
+            (D.f[dirSW  ])[ksw ] = mfccb;
+            (D.f[dirSE  ])[ks  ] = mfacb;
+            (D.f[dirNW  ])[kw  ] = mfcab;
+            (D.f[dirTE  ])[k   ] = mfaba;
+            (D.f[dirBW  ])[kbw ] = mfcbc;
+            (D.f[dirBE  ])[kb  ] = mfabc;
+            (D.f[dirTW  ])[kw  ] = mfcba;
+            (D.f[dirTN  ])[k   ] = mfbaa;
+            (D.f[dirBS  ])[kbs ] = mfbcc;
+            (D.f[dirBN  ])[kb  ] = mfbac;
+            (D.f[dirTS  ])[ks  ] = mfbca;
+            (D.f[dirZERO])[k   ] = mfbbb;
+            (D.f[dirTNE ])[k   ] = mfaaa;
+            (D.f[dirTSE ])[ks  ] = mfaca;
+            (D.f[dirBNE ])[kb  ] = mfaac;
+            (D.f[dirBSE ])[kbs ] = mfacc;
+            (D.f[dirTNW ])[kw  ] = mfcaa;
+            (D.f[dirTSW ])[ksw ] = mfcca;
+            (D.f[dirBNW ])[kbw ] = mfcac;
+            (D.f[dirBSW ])[kbsw] = mfccc;
+        }
+    }
 }
 ////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
index 3589bcea15dd73771ff0f7579401e65da7010389..dfdbac44d197e55e3e78eb794692fd9443cb7ab6 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
+++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
@@ -131,6 +131,7 @@ extern "C" void KernelKumNewSP27(   unsigned int numberOfThreads,
 									int size_Mat,
 									bool EvenOrOdd);
 
+
 extern "C" void CumulantOnePreconditionedErrorDiffusionChimCompSP27(
 	unsigned int numberOfThreads,
 	real s9,
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
index b41724df488f7aea97ed5e9e2bcf9282ff6bc370..288db43e7bcd36dc4d187982b86178d345601094 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
+++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh
@@ -140,7 +140,6 @@ extern "C" __global__ void LB_Kernel_Kum_Comp_SP_27(real s9,
 													int size_Mat,
 													bool EvenOrOdd);
 
-
 extern "C" __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27(
 	real omega,
 	unsigned int* bcMatD,
diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
index a203cca15bfd0fccac53d1d86555a023063ea86a..8b80e5ea9dbed3deef4c4332b2d43bf62ba9e48b 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
@@ -353,6 +353,7 @@ extern "C" void KernelKumNewCompSP27(unsigned int numberOfThreads,
 		//													EvenOrOdd); 
 		//getLastCudaError("LB_Kernel_Kum_New_Comp_SP_27 execution failed"); 
 }
+
 //////////////////////////////////////////////////////////////////////////
 extern "C" void CumulantOnePreconditionedErrorDiffusionChimCompSP27(unsigned int numberOfThreads,
 																	real s9,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernel.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernel.h
index 8932dadb3f92256cba279121193f94dbabdc0a6d..213127e64c5e7bfe2b3d4c9d1154c11d374f9552 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernel.h
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernel.h
@@ -1,26 +1,19 @@
-#ifndef KERNEL_H
-#define KERNEL_H
+#ifndef GPU_KERNEL_H
+#define GPU_KERNEL_H
 
-#include <DataTypes.h>
-
-#include <cuda_runtime.h>
-#include <helper_functions.h>
-#include <helper_cuda.h>
+#include <vector>
 
 #include "Kernel/Utilities/KernelGroup.h"
 #include "PreProcessor/PreProcessorType.h"
 
-#include <vector>
-
-
 class Kernel
 {
 public:
-    virtual ~Kernel() = default;
-	virtual void run() = 0;
+    virtual ~Kernel()  = default;
+    virtual void run() = 0;
 
-	virtual bool checkParameter() = 0;
-	virtual std::vector<PreProcessorType> getPreProcessorTypes() = 0;
-	virtual KernelGroup getKernelGroup() = 0;
+    virtual bool checkParameter()                                = 0;
+    virtual std::vector<PreProcessorType> getPreProcessorTypes() = 0;
+    virtual KernelGroup getKernelGroup()                         = 0;
 };
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.cpp b/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.cpp
index 6d06d4c9175c7935bb609c2e342b29c50c42846d..5e4c5aa08e37e88008da13466bfeed6893ec94f6 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.cpp
+++ b/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.cpp
@@ -2,26 +2,26 @@
 
 #include "Kernel/Utilities/CheckParameterStrategy/CheckParameterStrategy.h"
 
-bool KernelImp::checkParameter()
-{
-	return checkStrategy->checkParameter(para);
+bool KernelImp::checkParameter() 
+{ 
+    return checkStrategy->checkParameter(para);
 }
 
-std::vector<PreProcessorType> KernelImp::getPreProcessorTypes()
-{
-	return myPreProcessorTypes;
+std::vector<PreProcessorType> KernelImp::getPreProcessorTypes() 
+{ 
+    return myPreProcessorTypes;
 }
 
-KernelGroup KernelImp::getKernelGroup()
-{
-	return myKernelGroup;
+KernelGroup KernelImp::getKernelGroup() 
+{ 
+    return myKernelGroup; 
 }
 
 void KernelImp::setCheckParameterStrategy(std::shared_ptr<CheckParameterStrategy> strategy)
 {
-	this->checkStrategy = strategy;
+    this->checkStrategy = strategy;
 }
 
-KernelImp::KernelImp()
-{
-}
+KernelImp::KernelImp(std::shared_ptr<Parameter> para, int level) : para(para), level(level) {}
+
+KernelImp::KernelImp() {}
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h b/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h
index f902a7aaec82acd1eb0a55e97f5a4f31f4334575..08b71d42e79564d9eac887289a1ae36824095c46 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h
+++ b/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h
@@ -5,28 +5,33 @@
 
 #include <memory>
 
+#include "Utilities/CudaGrid.h"
+
 class CheckParameterStrategy;
 class Parameter;
 
 class KernelImp : public Kernel
 {
 public:
-	virtual void run() = 0;
+    virtual void run() = 0;
 
-	bool checkParameter();
-	std::vector<PreProcessorType> getPreProcessorTypes();
-	KernelGroup getKernelGroup();
+    bool checkParameter();
+    std::vector<PreProcessorType> getPreProcessorTypes();
+    KernelGroup getKernelGroup();
 
-	void setCheckParameterStrategy(std::shared_ptr<CheckParameterStrategy> strategy);
+    void setCheckParameterStrategy(std::shared_ptr<CheckParameterStrategy> strategy);
 
 protected:
-	KernelImp();
+    KernelImp(std::shared_ptr<Parameter> para, int level);
+    KernelImp();
 
-	std::shared_ptr< Parameter> para;
-	std::shared_ptr<CheckParameterStrategy> checkStrategy;
-	int level;
-	std::vector<PreProcessorType> myPreProcessorTypes;
-	KernelGroup myKernelGroup;
+    std::shared_ptr<Parameter> para;
+    std::shared_ptr<CheckParameterStrategy> checkStrategy;
+    int level;
+    std::vector<PreProcessorType> myPreProcessorTypes;
+    KernelGroup myKernelGroup;
 
+    vf::gpu::CudaGrid cudaGrid;
 };
-#endif
\ No newline at end of file
+
+#endif
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
new file mode 100644
index 0000000000000000000000000000000000000000..4c82851996646590d8c246df5f940b58a308d52c
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.cu
@@ -0,0 +1,56 @@
+#include "BGKUnified.h"
+
+#include <stdexcept>
+
+#include "Parameter/Parameter.h"
+#include "../RunLBMKernel.cuh"
+#include "Kernel/Utilities/CudaGrid.h"
+
+#include <lbm/BGK.h>
+
+
+namespace vf
+{
+namespace gpu
+{
+
+
+BGKUnified::BGKUnified(std::shared_ptr<Parameter> para, int level) 
+    : KernelImp(para, level)
+{
+#ifndef BUILD_CUDA_LTO
+    throw std::invalid_argument("To use the BKGUnified kernel, pass -DBUILD_CUDA_LTO=ON to cmake. Requires: CUDA 11.2 & cc 5.0");
+#endif
+
+    myPreProcessorTypes.push_back(InitCompSP27);
+
+    myKernelGroup = BasicKernel;
+
+    this->cudaGrid = CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->size_Mat_SP);
+}
+
+
+void BGKUnified::run()
+{
+    GPUKernelParameter kernelParameter{ para->getParD(level)->omega,
+                                                 para->getParD(level)->geoSP,
+                                                 para->getParD(level)->neighborX_SP,
+                                                 para->getParD(level)->neighborY_SP,
+                                                 para->getParD(level)->neighborZ_SP,
+                                                 para->getParD(level)->d0SP.f[0],
+                                                 (int)para->getParD(level)->size_Mat_SP,
+                                                 nullptr, /* forces not used in bgk kernel */
+                                                 para->getParD(level)->evenOrOdd };
+
+    auto lambda = [] __device__(lbm::KernelParameter parameter) {
+        return lbm::bgk(parameter);
+    };
+
+    runKernel<<<cudaGrid.grid, cudaGrid.threads>>>(lambda, kernelParameter);
+
+    getLastCudaError("LB_Kernel_BGKUnified execution failed");
+}
+
+
+}
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.h
new file mode 100644
index 0000000000000000000000000000000000000000..762eaaa5935bd01fa6ae002521a40e45cd239dfd
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.h
@@ -0,0 +1,22 @@
+#ifndef GPU_BKGUnified_H
+#define GPU_BKGUnified_H
+
+#include "Kernel/KernelImp.h"
+
+namespace vf
+{
+namespace gpu
+{
+
+class BGKUnified : public KernelImp
+{
+public:
+    BGKUnified(std::shared_ptr<Parameter> para, int level);
+
+    void run();
+};
+
+}
+}
+
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh
index 6a8eede33bc210eacad184afb42a7011dd684708..208fbec553507812bfe4339577734292b248c027 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh
@@ -14,4 +14,4 @@ extern "C" __global__ void LB_Kernel_CumulantK15Comp(	real omega,
 														int level,
 														real* forces,
 														bool EvenOrOdd);
-#endif 
\ No newline at end of file
+#endif
\ No newline at end of file
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
new file mode 100644
index 0000000000000000000000000000000000000000..b6f5d21ccf909f1ce3bcf11a4558f4771d87d021
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu
@@ -0,0 +1,54 @@
+#include "CumulantK15Unified.h"
+
+#include <stdexcept>
+
+#include "../RunLBMKernel.cuh"
+
+#include "Parameter/Parameter.h"
+
+#include <lbm/CumulantChimera.h>
+
+namespace vf
+{
+namespace gpu
+{
+
+CumulantK15Unified::CumulantK15Unified(std::shared_ptr<Parameter> para, int level)
+    : KernelImp(para, level)
+{
+#ifndef BUILD_CUDA_LTO
+    throw std::invalid_argument(
+        "To use the CumulantK15Unified kernel, pass -DBUILD_CUDA_LTO=ON to cmake. Requires: CUDA 11.2 & cc 5.0");
+#endif
+
+    myPreProcessorTypes.push_back(InitCompSP27);
+
+    myKernelGroup = BasicKernel;
+
+    this->cudaGrid = CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->size_Mat_SP);
+}
+
+void CumulantK15Unified::run()
+{
+    GPUKernelParameter kernelParameter{ para->getParD(level)->omega,
+                                                 para->getParD(level)->geoSP,
+                                                 para->getParD(level)->neighborX_SP,
+                                                 para->getParD(level)->neighborY_SP,
+                                                 para->getParD(level)->neighborZ_SP,
+                                                 para->getParD(level)->d0SP.f[0],
+                                                 (int)para->getParD(level)->size_Mat_SP,
+                                                 para->getParD(level)->forcing,
+                                                 para->getParD(level)->evenOrOdd };
+
+    auto lambda = [] __device__(lbm::KernelParameter parameter) {
+        return lbm::cumulantChimera(parameter, lbm::setRelaxationRatesK15);
+    };
+
+    vf::gpu::runKernel<<<cudaGrid.grid, cudaGrid.threads>>>(lambda, kernelParameter);
+
+    getLastCudaError("LB_Kernel_CumulantK15Comp execution failed");
+}
+
+
+}
+}
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h
new file mode 100644
index 0000000000000000000000000000000000000000..8756253950484e00773af89327589c3d8f157729
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h
@@ -0,0 +1,21 @@
+#ifndef CUMULANT_K15_UNIFIED_COMP_H
+#define CUMULANT_K15_UNIFIED_COMP_H
+
+#include "Kernel/KernelImp.h"
+
+namespace vf
+{
+namespace gpu
+{
+class CumulantK15Unified : public KernelImp
+{
+public:
+    CumulantK15Unified(std::shared_ptr<Parameter> para, int level);
+    
+    void run();
+};
+
+}
+}
+
+#endif
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
new file mode 100644
index 0000000000000000000000000000000000000000..989fce0c5e797ef90d644845f6c502bee700f6e1
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu
@@ -0,0 +1,56 @@
+#include "CumulantK17Unified.h"
+
+#include <stdexcept>
+
+#include "Parameter/Parameter.h"
+#include "../RunLBMKernel.cuh"
+#include "Kernel/Utilities/CudaGrid.h"
+
+#include <lbm/CumulantChimera.h>
+
+namespace vf
+{
+namespace gpu
+{
+
+
+CumulantK17Unified::CumulantK17Unified(std::shared_ptr<Parameter> para, int level)
+    : KernelImp(para, level)
+{
+#ifndef BUILD_CUDA_LTO
+    throw std::invalid_argument("To use the CumulantK17Unified kernel, pass -DBUILD_CUDA_LTO=ON to cmake. Requires: CUDA 11.2 & cc 5.0");
+#endif
+
+    myPreProcessorTypes.push_back(InitCompSP27);
+
+    myKernelGroup = BasicKernel;
+
+    this->cudaGrid = CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->size_Mat_SP);
+}
+
+
+
+void CumulantK17Unified::run()
+{
+    GPUKernelParameter kernelParameter{ para->getParD(level)->omega,
+                                                 para->getParD(level)->geoSP,
+                                                 para->getParD(level)->neighborX_SP,
+                                                 para->getParD(level)->neighborY_SP,
+                                                 para->getParD(level)->neighborZ_SP,
+                                                 para->getParD(level)->d0SP.f[0],
+                                                 (int)para->getParD(level)->size_Mat_SP,
+                                                 para->getParD(level)->forcing,
+                                                 para->getParD(level)->evenOrOdd };
+
+    auto lambda = [] __device__(lbm::KernelParameter parameter) {
+        return lbm::cumulantChimera(parameter, lbm::setRelaxationRatesK17);
+    };
+
+    runKernel<<<cudaGrid.grid, cudaGrid.threads>>>(lambda, kernelParameter);
+
+    getLastCudaError("LB_Kernel_CumulantK17Unified execution failed");
+}
+
+
+}
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h
new file mode 100644
index 0000000000000000000000000000000000000000..af8470b717ad7a98e7a3fcd507976353d9e8bd41
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h
@@ -0,0 +1,23 @@
+#ifndef CUMULANT_K17_UNIFIED_H
+#define CUMULANT_K17_UNIFIED_H
+
+#include "Kernel/KernelImp.h"
+
+namespace vf
+{
+namespace gpu
+{
+
+
+class CumulantK17Unified : public KernelImp
+{
+public:
+    CumulantK17Unified(std::shared_ptr<Parameter> para, int level);
+
+    void run();
+};
+
+}
+}
+
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/FluidFlowCompStrategy.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/FluidFlowCompStrategy.h
index 5bdf2e9bb0f00e3e2ae3642baa42545079f93c2c..c9a6675bd7a4b82442c55b23bac6f9b49b811938 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/FluidFlowCompStrategy.h
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/FluidFlowCompStrategy.h
@@ -15,4 +15,4 @@ private:
     FluidFlowCompStrategy();
 
 };
-#endif 
\ No newline at end of file
+#endif 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/RunLBMKernel.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/RunLBMKernel.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..b4097851b251b7447f6ce06856d0b9187999a20b
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/RunLBMKernel.cuh
@@ -0,0 +1,59 @@
+#ifndef GPU_CUMULANT_KERNEL_H
+#define GPU_CUMULANT_KERNEL_H
+
+
+#include <DataTypes.h>
+#include <cuda_runtime.h>
+
+#include <lbm/KernelParameter.h>
+
+#include "Kernel/Utilities/DistributionHelper.cuh"
+
+namespace vf
+{
+namespace gpu
+{
+
+
+struct GPUKernelParameter
+{
+    real omega;
+    unsigned int* typeOfGridNode;
+    unsigned int* neighborX;
+    unsigned int* neighborY;
+    unsigned int* neighborZ;
+    real* distributions;
+    int size_Mat;
+    real* forces;
+    bool isEvenTimestep;
+};
+
+template<typename KernelFunctor>
+__global__ void runKernel(KernelFunctor kernel, GPUKernelParameter kernelParameter)
+{
+    const uint k = getNodeIndex();
+    const uint nodeType = kernelParameter.typeOfGridNode[k];
+
+    if (!isValidFluidNode(k, kernelParameter.size_Mat, nodeType))
+        return;
+
+    DistributionWrapper distributionWrapper {
+        kernelParameter.distributions,
+        kernelParameter.size_Mat,
+        kernelParameter.isEvenTimestep,
+        k,
+        kernelParameter.neighborX,
+        kernelParameter.neighborY,
+        kernelParameter.neighborZ
+    };
+
+    lbm::KernelParameter parameter {distributionWrapper.distribution, kernelParameter.omega, kernelParameter.forces};
+    kernel(parameter);
+
+    distributionWrapper.write();
+}
+
+}
+}
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.cpp b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fa17bf449915eba509dbabbe71f556c19fa43bcf
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.cpp
@@ -0,0 +1,27 @@
+#include "CudaGrid.h"
+
+
+
+namespace vf
+{
+namespace gpu
+{
+
+CudaGrid::CudaGrid(unsigned int numberOfThreads, unsigned int size_matrix)
+{
+    int Grid = (size_matrix / numberOfThreads) + 1;
+    int Grid1, Grid2;
+    if (Grid > 512) {
+        Grid1 = 512;
+        Grid2 = (Grid / Grid1) + 1;
+    } else {
+        Grid1 = 1;
+        Grid2 = Grid;
+    }
+    
+    grid = dim3(Grid1, Grid2);
+    threads = dim3(numberOfThreads, 1, 1);
+}
+
+}
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.h b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.h
new file mode 100644
index 0000000000000000000000000000000000000000..27a18a58843b0de064009ab0f837518e3bb44b9d
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.h
@@ -0,0 +1,25 @@
+#ifndef GPU_CUDA_GRID_H
+#define GPU_CUDA_GRID_H
+
+
+#include <cuda_runtime.h>
+
+namespace vf
+{
+namespace gpu
+{
+
+
+struct CudaGrid 
+{
+    dim3 threads;
+    dim3 grid;
+
+    CudaGrid(unsigned int numberOfEntities, unsigned int threadsPerBlock);
+    CudaGrid() = default;
+};
+
+}
+}
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cu b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cu
new file mode 100644
index 0000000000000000000000000000000000000000..bbb01d95410612d36d55f1e0113175a8741b9ade
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cu
@@ -0,0 +1,169 @@
+#include "DistributionHelper.cuh"
+
+#include <cuda_runtime.h>
+
+#include "LBM/D3Q27.h"
+
+#include <lbm/constants/NumericConstants.h>
+#include <lbm/constants/D3Q27.h>
+
+namespace vf
+{
+namespace gpu
+{
+
+__device__ __host__ DistributionReferences27 getDistributionReferences27(real *distributions, unsigned int size_Mat, bool isEvenTimestep)
+{
+    DistributionReferences27 distribution_references;
+
+    if (isEvenTimestep) {
+        distribution_references.f[dirE]    = &distributions[dirE * size_Mat];
+        distribution_references.f[dirW]    = &distributions[dirW * size_Mat];
+        distribution_references.f[dirN]    = &distributions[dirN * size_Mat];
+        distribution_references.f[dirS]    = &distributions[dirS * size_Mat];
+        distribution_references.f[dirT]    = &distributions[dirT * size_Mat];
+        distribution_references.f[dirB]    = &distributions[dirB * size_Mat];
+        distribution_references.f[dirNE]   = &distributions[dirNE * size_Mat];
+        distribution_references.f[dirSW]   = &distributions[dirSW * size_Mat];
+        distribution_references.f[dirSE]   = &distributions[dirSE * size_Mat];
+        distribution_references.f[dirNW]   = &distributions[dirNW * size_Mat];
+        distribution_references.f[dirTE]   = &distributions[dirTE * size_Mat];
+        distribution_references.f[dirBW]   = &distributions[dirBW * size_Mat];
+        distribution_references.f[dirBE]   = &distributions[dirBE * size_Mat];
+        distribution_references.f[dirTW]   = &distributions[dirTW * size_Mat];
+        distribution_references.f[dirTN]   = &distributions[dirTN * size_Mat];
+        distribution_references.f[dirBS]   = &distributions[dirBS * size_Mat];
+        distribution_references.f[dirBN]   = &distributions[dirBN * size_Mat];
+        distribution_references.f[dirTS]   = &distributions[dirTS * size_Mat];
+        distribution_references.f[dirREST] = &distributions[dirREST * size_Mat];
+        distribution_references.f[dirTNE]  = &distributions[dirTNE * size_Mat];
+        distribution_references.f[dirTSW]  = &distributions[dirTSW * size_Mat];
+        distribution_references.f[dirTSE]  = &distributions[dirTSE * size_Mat];
+        distribution_references.f[dirTNW]  = &distributions[dirTNW * size_Mat];
+        distribution_references.f[dirBNE]  = &distributions[dirBNE * size_Mat];
+        distribution_references.f[dirBSW]  = &distributions[dirBSW * size_Mat];
+        distribution_references.f[dirBSE]  = &distributions[dirBSE * size_Mat];
+        distribution_references.f[dirBNW]  = &distributions[dirBNW * size_Mat];
+    } else {
+        distribution_references.f[dirW]    = &distributions[dirE * size_Mat];
+        distribution_references.f[dirE]    = &distributions[dirW * size_Mat];
+        distribution_references.f[dirS]    = &distributions[dirN * size_Mat];
+        distribution_references.f[dirN]    = &distributions[dirS * size_Mat];
+        distribution_references.f[dirB]    = &distributions[dirT * size_Mat];
+        distribution_references.f[dirT]    = &distributions[dirB * size_Mat];
+        distribution_references.f[dirSW]   = &distributions[dirNE * size_Mat];
+        distribution_references.f[dirNE]   = &distributions[dirSW * size_Mat];
+        distribution_references.f[dirNW]   = &distributions[dirSE * size_Mat];
+        distribution_references.f[dirSE]   = &distributions[dirNW * size_Mat];
+        distribution_references.f[dirBW]   = &distributions[dirTE * size_Mat];
+        distribution_references.f[dirTE]   = &distributions[dirBW * size_Mat];
+        distribution_references.f[dirTW]   = &distributions[dirBE * size_Mat];
+        distribution_references.f[dirBE]   = &distributions[dirTW * size_Mat];
+        distribution_references.f[dirBS]   = &distributions[dirTN * size_Mat];
+        distribution_references.f[dirTN]   = &distributions[dirBS * size_Mat];
+        distribution_references.f[dirTS]   = &distributions[dirBN * size_Mat];
+        distribution_references.f[dirBN]   = &distributions[dirTS * size_Mat];
+        distribution_references.f[dirREST] = &distributions[dirREST * size_Mat];
+        distribution_references.f[dirBSW]  = &distributions[dirTNE * size_Mat];
+        distribution_references.f[dirBNE]  = &distributions[dirTSW * size_Mat];
+        distribution_references.f[dirBNW]  = &distributions[dirTSE * size_Mat];
+        distribution_references.f[dirBSE]  = &distributions[dirTNW * size_Mat];
+        distribution_references.f[dirTSW]  = &distributions[dirBNE * size_Mat];
+        distribution_references.f[dirTNE]  = &distributions[dirBSW * size_Mat];
+        distribution_references.f[dirTNW]  = &distributions[dirBSE * size_Mat];
+        distribution_references.f[dirTSE]  = &distributions[dirBNW * size_Mat];
+    }
+    return distribution_references;
+}
+
+__device__ DistributionWrapper::DistributionWrapper(real *distributions, unsigned int size_Mat, bool isEvenTimestep,
+                                                    uint k, uint *neighborX, uint *neighborY, uint *neighborZ)
+    : distribution_references(getDistributionReferences27(distributions, size_Mat, isEvenTimestep)), k(k), kw(neighborX[k]), ks(neighborY[k]),
+      kb(neighborZ[k]), ksw(neighborY[kw]), kbw(neighborZ[kw]), kbs(neighborZ[ks]), kbsw(neighborZ[ksw])
+{
+    read();
+}
+
+__device__ void DistributionWrapper::read()
+{
+    distribution.f[vf::lbm::dir::PZZ] = (distribution_references.f[dirE])[k];
+    distribution.f[vf::lbm::dir::MZZ] = (distribution_references.f[dirW])[kw];
+    distribution.f[vf::lbm::dir::ZPZ] = (distribution_references.f[dirN])[k];
+    distribution.f[vf::lbm::dir::ZMZ] = (distribution_references.f[dirS])[ks];
+    distribution.f[vf::lbm::dir::ZZP] = (distribution_references.f[dirT])[k];
+    distribution.f[vf::lbm::dir::ZZM] = (distribution_references.f[dirB])[kb];
+    distribution.f[vf::lbm::dir::PPZ] = (distribution_references.f[dirNE])[k];
+    distribution.f[vf::lbm::dir::MMZ] = (distribution_references.f[dirSW])[ksw];
+    distribution.f[vf::lbm::dir::PMZ] = (distribution_references.f[dirSE])[ks];
+    distribution.f[vf::lbm::dir::MPZ] = (distribution_references.f[dirNW])[kw];
+    distribution.f[vf::lbm::dir::PZP] = (distribution_references.f[dirTE])[k];
+    distribution.f[vf::lbm::dir::MZM] = (distribution_references.f[dirBW])[kbw];
+    distribution.f[vf::lbm::dir::PZM] = (distribution_references.f[dirBE])[kb];
+    distribution.f[vf::lbm::dir::MZP] = (distribution_references.f[dirTW])[kw];
+    distribution.f[vf::lbm::dir::ZPP] = (distribution_references.f[dirTN])[k];
+    distribution.f[vf::lbm::dir::ZMM] = (distribution_references.f[dirBS])[kbs];
+    distribution.f[vf::lbm::dir::ZPM] = (distribution_references.f[dirBN])[kb];
+    distribution.f[vf::lbm::dir::ZMP] = (distribution_references.f[dirTS])[ks];
+    distribution.f[vf::lbm::dir::PPP] = (distribution_references.f[dirTNE])[k];
+    distribution.f[vf::lbm::dir::MPP] = (distribution_references.f[dirTNW])[kw];
+    distribution.f[vf::lbm::dir::PMP] = (distribution_references.f[dirTSE])[ks];
+    distribution.f[vf::lbm::dir::MMP] = (distribution_references.f[dirTSW])[ksw];
+    distribution.f[vf::lbm::dir::PPM] = (distribution_references.f[dirBNE])[kb];
+    distribution.f[vf::lbm::dir::MPM] = (distribution_references.f[dirBNW])[kbw];
+    distribution.f[vf::lbm::dir::PMM] = (distribution_references.f[dirBSE])[kbs];
+    distribution.f[vf::lbm::dir::MMM] = (distribution_references.f[dirBSW])[kbsw];
+    distribution.f[vf::lbm::dir::ZZZ] = (distribution_references.f[dirREST])[k];
+}
+
+__device__ void DistributionWrapper::write()
+{
+    (distribution_references.f[dirE])[k]      = distribution.f[vf::lbm::dir::PZZ];
+    (distribution_references.f[dirW])[kw]     = distribution.f[vf::lbm::dir::MZZ];
+    (distribution_references.f[dirN])[k]      = distribution.f[vf::lbm::dir::ZPZ];
+    (distribution_references.f[dirS])[ks]     = distribution.f[vf::lbm::dir::ZMZ];
+    (distribution_references.f[dirT])[k]      = distribution.f[vf::lbm::dir::ZZP];
+    (distribution_references.f[dirB])[kb]     = distribution.f[vf::lbm::dir::ZZM];
+    (distribution_references.f[dirNE])[k]     = distribution.f[vf::lbm::dir::PPZ];
+    (distribution_references.f[dirSW])[ksw]   = distribution.f[vf::lbm::dir::MMZ];
+    (distribution_references.f[dirSE])[ks]    = distribution.f[vf::lbm::dir::PMZ];
+    (distribution_references.f[dirNW])[kw]    = distribution.f[vf::lbm::dir::MPZ];
+    (distribution_references.f[dirTE])[k]     = distribution.f[vf::lbm::dir::PZP];
+    (distribution_references.f[dirBW])[kbw]   = distribution.f[vf::lbm::dir::MZM];
+    (distribution_references.f[dirBE])[kb]    = distribution.f[vf::lbm::dir::PZM];
+    (distribution_references.f[dirTW])[kw]    = distribution.f[vf::lbm::dir::MZP];
+    (distribution_references.f[dirTN])[k]     = distribution.f[vf::lbm::dir::ZPP];
+    (distribution_references.f[dirBS])[kbs]   = distribution.f[vf::lbm::dir::ZMM];
+    (distribution_references.f[dirBN])[kb]    = distribution.f[vf::lbm::dir::ZPM];
+    (distribution_references.f[dirTS])[ks]    = distribution.f[vf::lbm::dir::ZMP];
+    (distribution_references.f[dirTNE])[k]    = distribution.f[vf::lbm::dir::PPP];
+    (distribution_references.f[dirTNW])[kw]   = distribution.f[vf::lbm::dir::MPP];
+    (distribution_references.f[dirTSE])[ks]   = distribution.f[vf::lbm::dir::PMP];
+    (distribution_references.f[dirTSW])[ksw]  = distribution.f[vf::lbm::dir::MMP];
+    (distribution_references.f[dirBNE])[kb]   = distribution.f[vf::lbm::dir::PPM];
+    (distribution_references.f[dirBNW])[kbw]  = distribution.f[vf::lbm::dir::MPM];
+    (distribution_references.f[dirBSE])[kbs]  = distribution.f[vf::lbm::dir::PMM];
+    (distribution_references.f[dirBSW])[kbsw] = distribution.f[vf::lbm::dir::MMM];
+    (distribution_references.f[dirREST])[k]   = distribution.f[vf::lbm::dir::ZZZ];
+}
+
+__device__ unsigned int getNodeIndex()
+{
+    const unsigned x = threadIdx.x;
+    const unsigned y = blockIdx.x;
+    const unsigned z = blockIdx.y;
+
+    const unsigned nx = blockDim.x;
+    const unsigned ny = gridDim.x;
+
+    return nx * (ny * z + y) + x;
+}
+
+__device__ bool isValidFluidNode(uint k, int size_Mat, uint nodeType)
+{
+    return (k < size_Mat) &&
+           (nodeType == GEO_FLUID || nodeType == GEO_PM_0 || nodeType == GEO_PM_1 || nodeType == GEO_PM_2);
+}
+
+
+} // namespace gpu
+} // namespace vf
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..935030701924233d959fb69b74a7c3087feb0834
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cuh
@@ -0,0 +1,98 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __         
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
+//      \    \  |    |   ________________________________________________________________    
+//       \    \ |    |  |  ______________________________________________________________|   
+//        \    \|    |  |  |         __          __     __     __     ______      _______    
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
+//
+//  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 Cumulant27chim.cu
+//! \ingroup GPU
+//! \author Martin Schoenherr, Soeren Peters
+//=======================================================================================
+#ifndef DISTRIBUTUION_HELPER_CUH
+#define DISTRIBUTUION_HELPER_CUH
+
+#include "LBM/LB.h" 
+
+#include <lbm/KernelParameter.h>
+
+namespace vf
+{
+namespace gpu
+{
+
+/**
+*  Getting references to the 27 directions.
+*  @params distributions 1D real* array containing all data (number of elements = 27 * matrix_size)
+*  @params matrix_size number of discretizations nodes
+*  @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
+*/
+__device__ __host__ DistributionReferences27 getDistributionReferences27(real* distributions, unsigned int matrix_size, bool isEvenTimestep);
+
+
+/**
+*  Holds the references to all directions and the concrete distributions for a single node.
+*  After instantiation the distributions are read to the member "distribution" from "distribution_references".
+*  After computation the data can be written back to "distribution_references".
+*/
+struct DistributionWrapper
+{
+    __device__ DistributionWrapper(
+        real* distributions,
+        unsigned int size_Mat,
+        bool isEvenTimestep,
+        uint k,
+        uint* neighborX,
+        uint* neighborY,
+        uint* neighborZ);
+
+    __device__ void read();
+
+    __device__ void write();
+
+    // origin distributions to read from and write to after computation
+    DistributionReferences27 distribution_references;
+
+    // distribution pass to kernel computation
+    vf::lbm::Distribution27 distribution;
+
+    const uint k;
+    const uint kw;
+    const uint ks;
+    const uint kb;
+    const uint ksw;
+    const uint kbw;
+    const uint kbs;
+    const uint kbsw;
+};
+
+__device__ unsigned int getNodeIndex();
+
+__device__ bool isValidFluidNode(uint k, int size_Mat, uint nodeType);
+
+}
+}
+
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelperTests.cpp b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelperTests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..46d3fe890fd2f412251044cce6ade51f08ba0185
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/DistributionHelperTests.cpp
@@ -0,0 +1,93 @@
+#include <gmock/gmock.h>
+
+#include "DistributionHelper.cuh"
+
+#include "LBM/D3Q27.h"
+
+
+auto RealEq = [](auto value) { 
+#ifdef VF_DOUBLE_ACCURACY
+    return testing::DoubleEq(value); 
+#else 
+    return testing::FloatEq(value);
+#endif
+};
+
+
+TEST(DistributionHelperTests, getPointerToDistribution_WhenEvenTimeStep_ShouldBeEqualToInput)
+{
+    real distributions_in[27];
+    for (int i = 0; i < 27; i++)
+        distributions_in[i] = i;
+    const uint size_Mat = 1;
+    const bool isEvenTimeStep = true;
+
+    Distributions27 distribution_out = vf::gpu::getDistributionReferences27(distributions_in, size_Mat, isEvenTimeStep);
+
+    EXPECT_THAT(*distribution_out.f[dirE], RealEq(distributions_in[dirE]));
+    EXPECT_THAT(*distribution_out.f[dirW], RealEq(distributions_in[dirW]));
+    EXPECT_THAT(*distribution_out.f[dirN], RealEq(distributions_in[dirN]));
+    EXPECT_THAT(*distribution_out.f[dirS], RealEq(distributions_in[dirS]));
+    EXPECT_THAT(*distribution_out.f[dirT], RealEq(distributions_in[dirT]));
+    EXPECT_THAT(*distribution_out.f[dirB], RealEq(distributions_in[dirB]));
+    EXPECT_THAT(*distribution_out.f[dirNE], RealEq(distributions_in[dirNE]));
+    EXPECT_THAT(*distribution_out.f[dirSW], RealEq(distributions_in[dirSW]));
+    EXPECT_THAT(*distribution_out.f[dirSE], RealEq(distributions_in[dirSE]));
+    EXPECT_THAT(*distribution_out.f[dirNW], RealEq(distributions_in[dirNW]));
+    EXPECT_THAT(*distribution_out.f[dirTE], RealEq(distributions_in[dirTE]));
+    EXPECT_THAT(*distribution_out.f[dirBW], RealEq(distributions_in[dirBW]));
+    EXPECT_THAT(*distribution_out.f[dirBE], RealEq(distributions_in[dirBE]));
+    EXPECT_THAT(*distribution_out.f[dirTW], RealEq(distributions_in[dirTW]));
+    EXPECT_THAT(*distribution_out.f[dirTN], RealEq(distributions_in[dirTN]));
+    EXPECT_THAT(*distribution_out.f[dirBS], RealEq(distributions_in[dirBS]));
+    EXPECT_THAT(*distribution_out.f[dirBN], RealEq(distributions_in[dirBN]));
+    EXPECT_THAT(*distribution_out.f[dirTS], RealEq(distributions_in[dirTS]));
+    EXPECT_THAT(*distribution_out.f[dirREST], RealEq(distributions_in[dirREST]));
+    EXPECT_THAT(*distribution_out.f[dirTNE], RealEq(distributions_in[dirTNE]));
+    EXPECT_THAT(*distribution_out.f[dirTSW], RealEq(distributions_in[dirTSW]));
+    EXPECT_THAT(*distribution_out.f[dirTSE], RealEq(distributions_in[dirTSE]));
+    EXPECT_THAT(*distribution_out.f[dirTNW], RealEq(distributions_in[dirTNW]));
+    EXPECT_THAT(*distribution_out.f[dirBNE], RealEq(distributions_in[dirBNE]));
+    EXPECT_THAT(*distribution_out.f[dirBSW], RealEq(distributions_in[dirBSW]));
+    EXPECT_THAT(*distribution_out.f[dirBSE], RealEq(distributions_in[dirBSE]));
+    EXPECT_THAT(*distribution_out.f[dirBNW], RealEq(distributions_in[dirBNW]));
+}
+
+TEST(DistributionHelperTests, getPointerToDistribution_WhenOddTimeStep_ShouldBeSwapped)
+{
+    real distributions_in[27];
+    for (int i = 0; i < 27; i++)
+        distributions_in[i] = i;
+    const int size_Mat = 1;
+    const bool isEvenTimeStep = false;
+
+    Distributions27 distribution_out = vf::gpu::getDistributionReferences27(distributions_in, size_Mat, isEvenTimeStep);
+
+    EXPECT_THAT(*distribution_out.f[dirW], RealEq(distributions_in[dirE]));
+    EXPECT_THAT(*distribution_out.f[dirE], RealEq(distributions_in[dirW]));
+    EXPECT_THAT(*distribution_out.f[dirS], RealEq(distributions_in[dirN]));
+    EXPECT_THAT(*distribution_out.f[dirN], RealEq(distributions_in[dirS]));
+    EXPECT_THAT(*distribution_out.f[dirB], RealEq(distributions_in[dirT]));
+    EXPECT_THAT(*distribution_out.f[dirT], RealEq(distributions_in[dirB]));
+    EXPECT_THAT(*distribution_out.f[dirSW], RealEq(distributions_in[dirNE]));
+    EXPECT_THAT(*distribution_out.f[dirNE], RealEq(distributions_in[dirSW]));
+    EXPECT_THAT(*distribution_out.f[dirNW], RealEq(distributions_in[dirSE]));
+    EXPECT_THAT(*distribution_out.f[dirSE], RealEq(distributions_in[dirNW]));
+    EXPECT_THAT(*distribution_out.f[dirBW], RealEq(distributions_in[dirTE]));
+    EXPECT_THAT(*distribution_out.f[dirTE], RealEq(distributions_in[dirBW]));
+    EXPECT_THAT(*distribution_out.f[dirTW], RealEq(distributions_in[dirBE]));
+    EXPECT_THAT(*distribution_out.f[dirBE], RealEq(distributions_in[dirTW]));
+    EXPECT_THAT(*distribution_out.f[dirBS], RealEq(distributions_in[dirTN]));
+    EXPECT_THAT(*distribution_out.f[dirTN], RealEq(distributions_in[dirBS]));
+    EXPECT_THAT(*distribution_out.f[dirTS], RealEq(distributions_in[dirBN]));
+    EXPECT_THAT(*distribution_out.f[dirBN], RealEq(distributions_in[dirTS]));
+    EXPECT_THAT(*distribution_out.f[dirREST], RealEq(distributions_in[dirREST]));
+    EXPECT_THAT(*distribution_out.f[dirBSW], RealEq(distributions_in[dirTNE]));
+    EXPECT_THAT(*distribution_out.f[dirBNE], RealEq(distributions_in[dirTSW]));
+    EXPECT_THAT(*distribution_out.f[dirBNW], RealEq(distributions_in[dirTSE]));
+    EXPECT_THAT(*distribution_out.f[dirBSE], RealEq(distributions_in[dirTNW]));
+    EXPECT_THAT(*distribution_out.f[dirTSW], RealEq(distributions_in[dirBNE]));
+    EXPECT_THAT(*distribution_out.f[dirTNE], RealEq(distributions_in[dirBSW]));
+    EXPECT_THAT(*distribution_out.f[dirTNW], RealEq(distributions_in[dirBSE]));
+    EXPECT_THAT(*distribution_out.f[dirTSE], RealEq(distributions_in[dirBNW]));
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
index b0d167974275a227b99da6a0ac8e32e1f2976c13..5f63df1c9afc17a62a9a47ce82401ebba4453872 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
@@ -4,16 +4,19 @@
 
 //LBM kernel (compressible)
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGK/BGKCompSP27.h"
+#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKUnified/BGKUnified.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/BGKPlus/BGKPlusCompSP27.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cascade/CascadeCompSP27.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/Cumulant/CumulantCompSP27.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17Comp.h"
+#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17chim/CumulantK17CompChim.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Bulk/CumulantK17BulkComp.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantAll4/CumulantAll4CompSP27.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.h"
+#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.h"
@@ -96,13 +99,17 @@ void KernelFactoryImp::setKernelAtLevel(std::vector<std::shared_ptr<Kernel>> ker
 
 std::shared_ptr<Kernel> KernelFactoryImp::makeKernel(std::shared_ptr<Parameter> para, std::string kernel, int level)
 {
+    printf("Instantiating Kernel: %s\n", kernel.c_str());
 	std::shared_ptr<KernelImp> newKernel;
 	std::shared_ptr<CheckParameterStrategy> checkStrategy;
 
-	if (       kernel == "BGKCompSP27") {
-        newKernel     = BGKCompSP27::getNewInstance(para, level);				// compressible
-        checkStrategy = FluidFlowCompStrategy::getInstance();     //	   ||
-    } else if (kernel == "BGKPlusCompSP27") {									//     \/
+    if (kernel == "BGKCompSP27") {
+        newKernel     = BGKCompSP27::getNewInstance(para, level);   // compressible
+        checkStrategy = FluidFlowCompStrategy::getInstance();       //      ||
+    } else if (kernel == "BGKUnified") {                            //      \/
+        newKernel     = std::make_shared<vf::gpu::BGKUnified>(para, level);
+        checkStrategy = FluidFlowCompStrategy::getInstance();
+    } else if (kernel == "BGKPlusCompSP27") {
         newKernel     = BGKPlusCompSP27::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == "MRTCompSP27") {
@@ -117,6 +124,12 @@ std::shared_ptr<Kernel> KernelFactoryImp::makeKernel(std::shared_ptr<Parameter>
     } else if (kernel == "CumulantK17Comp") {
         newKernel     = CumulantK17Comp::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
+    } else if (kernel == "CumulantK15Unified") {
+        newKernel     = std::make_shared<vf::gpu::CumulantK15Unified>(para, level);
+        checkStrategy = FluidFlowCompStrategy::getInstance();
+    } else if (kernel == "CumulantK17Unified") {
+        newKernel     = std::make_shared<vf::gpu::CumulantK17Unified>(para, level);
+        checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == "CumulantK17BulkComp") {
         newKernel     = CumulantK17BulkComp::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
diff --git a/src/gpu/VirtualFluids_GPU/LBM/D3Q27.h b/src/gpu/VirtualFluids_GPU/LBM/D3Q27.h
index 546dccd463a96ad3173517d09f222acde11e2448..5e769b603e7c6677b7f9e1189f5c4fe27051f795 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/D3Q27.h
+++ b/src/gpu/VirtualFluids_GPU/LBM/D3Q27.h
@@ -21,6 +21,7 @@
 #define dirBN   /*f17*/  16
 #define dirTS   /*f18*/  17
 #define dirZERO /*f0 */  18
+#define dirREST /*f0 */  18
 
 #define dirTNE    /*f */  19
 #define dirBNE    /*f */  20
diff --git a/src/gpu/VirtualFluids_GPU/LBM/LB.h b/src/gpu/VirtualFluids_GPU/LBM/LB.h
index f5f91738739b95f897a1192cb7c1d77a6cfea9cb..52f932c7b751b0d31e9bf733a4f3b5c439a6755f 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/LB.h
+++ b/src/gpu/VirtualFluids_GPU/LBM/LB.h
@@ -144,7 +144,7 @@ typedef struct  Distri19{
 // Distribution functions f 27
 typedef struct  Distri27{
    real* f[27];
-} Distributions27;
+} Distributions27, DistributionReferences27;
 
 //Q for second order BCs
 typedef struct QforBC{
diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
index 6f468507949a62933c278b1c17801ea25536b07f..7dc916a47cbe08e543cc73d3c6c6cf5f163a16e7 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -1,4 +1,10 @@
 #include "Simulation.h"
+
+#include <stdio.h>
+#include <vector>
+
+#include <helper_timer.h>
+
 #include "LBM/LB.h"
 #include "Communication/Communicator.h"
 #include "Communication/ExchangeData27.h"
@@ -85,12 +91,13 @@ void Simulation::init(SPtr<Parameter> para, SPtr<GridProvider> gridProvider, std
    para->setNumprocs(comm->getNummberOfProcess());
    devCheck(comm->mapCudaDevice(para->getMyID(), para->getNumprocs(), para->getDevices(), para->getMaxDev()));
 
+   para->initParameter();
+
    gridProvider->allocAndCopyForcing();
    gridProvider->allocAndCopyQuadricLimiters();
    gridProvider->setDimensions();
    gridProvider->setBoundingBox();
 
-   para->initParameter();
    para->setRe(para->getVelocity() * (real)1.0 / para->getViscosity());
    para->setPhi((real) 0.0);
    para->setlimitOfNodesForVTK(30000000); //max 30 Million nodes per VTK file
diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.h b/src/gpu/VirtualFluids_GPU/LBM/Simulation.h
index ae46034ce3e6080e0b9f03a92dd0326d640c6f32..d6c6702c4db8a671d4f6dbfea4c90cdf8f48356d 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.h
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.h
@@ -5,13 +5,12 @@
 #include <vector>
 #include <PointerDefinitions.h>
 
-
-
 #include "Output/LogWriter.hpp"
 #include "GPU/KineticEnergyAnalyzer.h"
 #include "GPU/EnstrophyAnalyzer.h"
 #include "Utilities/Buffer2D.hpp"
 #include "LBM/LB.h"
+
 #include "VirtualFluids_GPU_export.h"
 
 namespace vf
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
index 25946704edcad12513d1b8a2c70cd551eb1dd619..ccb13e83bcc68b9c9d85725666a02ea1c23ec293 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
@@ -186,6 +186,7 @@ struct ParameterStruct{
 	//velocities to fit the force
 	real *VxForce, *VyForce, *VzForce;
 	//////////////////////////////////////////////////////////////////////////
+	real *forcing;
 
 	//Measure Points/////////
 	std::vector<MeasurePoints> MP; 
diff --git a/src/gpu/VirtualFluids_GPU/Restart/RestartObjectTests.cpp b/src/gpu/VirtualFluids_GPU/Restart/RestartObjectTests.cpp
index a9b485ab25871066c201e631b97022bc6f7e08fb..c30f514c60ba1af2fb852ed8a68b36121ebced04 100644
--- a/src/gpu/VirtualFluids_GPU/Restart/RestartObjectTests.cpp
+++ b/src/gpu/VirtualFluids_GPU/Restart/RestartObjectTests.cpp
@@ -8,7 +8,7 @@ void saveAndLoad()
 {
     std::shared_ptr<RestartObject> write_object = std::make_shared<Type>();
 
-    write_object->fs = std::vector<std::vector<float>> {
+    write_object->fs = std::vector<std::vector<real>> {
                 { 1,2,3 },
                 { 4,5,6 }
             };
diff --git a/src/lbm/BGK.cpp b/src/lbm/BGK.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fa3af6777a0492687768dd4945cbf1e9b186f514
--- /dev/null
+++ b/src/lbm/BGK.cpp
@@ -0,0 +1,140 @@
+#include "BGK.h"
+
+
+#include <basics/Core/DataTypes.h>
+#include <basics/Core/RealConstants.h>
+
+#include "constants/NumericConstants.h"
+#include "constants/D3Q27.h"
+
+#include "MacroscopicQuantities.h"
+
+namespace vf
+{
+namespace lbm
+{
+
+using namespace constant;
+
+
+
+__host__ __device__ void bgk(KernelParameter parameter)
+{
+    auto& distribution = parameter.distribution;
+    const auto omega = parameter.omega;
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - 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>
+    //!
+    real mfcbb = distribution.f[dir::PZZ];
+    real mfabb = distribution.f[dir::MZZ];
+    real mfbcb = distribution.f[dir::ZPZ];
+    real mfbab = distribution.f[dir::ZMZ];
+    real mfbbc = distribution.f[dir::ZZP];
+    real mfbba = distribution.f[dir::ZZM];
+    real mfccb = distribution.f[dir::PPZ];
+    real mfaab = distribution.f[dir::MMZ];
+    real mfcab = distribution.f[dir::PMZ];
+    real mfacb = distribution.f[dir::MPZ];
+    real mfcbc = distribution.f[dir::PZP];
+    real mfaba = distribution.f[dir::MZM];
+    real mfcba = distribution.f[dir::PZM];
+    real mfabc = distribution.f[dir::MZP];
+    real mfbcc = distribution.f[dir::ZPP];
+    real mfbaa = distribution.f[dir::ZMM];
+    real mfbca = distribution.f[dir::ZPM];
+    real mfbac = distribution.f[dir::ZMP];
+    real mfccc = distribution.f[dir::PPP];
+    real mfacc = distribution.f[dir::MPP];
+    real mfcac = distribution.f[dir::PMP];
+    real mfaac = distribution.f[dir::MMP];
+    real mfcca = distribution.f[dir::PPM];
+    real mfaca = distribution.f[dir::MPM];
+    real mfcaa = distribution.f[dir::PMM];
+    real mfaaa = distribution.f[dir::MMM];
+    real mfbbb = distribution.f[dir::ZZZ];
+
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - Acquire macroscopic quantities
+    const real drho = getDensity(distribution.f);
+    const real rho = c1o1 + drho;
+    const real OOrho = constant::c1o1 / (constant::c1o1 + drho);    
+
+    const real vvx = getIncompressibleVelocityX1(distribution.f) * OOrho;
+    const real vvy = getIncompressibleVelocityX2(distribution.f) * OOrho;
+    const real vvz = getIncompressibleVelocityX3(distribution.f) * OOrho;
+
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - BGK computation
+    const real cusq = c3o2*(vvx*vvx + vvy*vvy + vvz*vvz);
+
+    mfbbb = mfbbb  *(c1o1 + (-omega)) - (-omega)*   c8o27*  (drho - rho * cusq);
+    mfcbb = mfcbb  *(c1o1 + (-omega)) - (-omega)*   c2o27*  (drho + rho * (c3o1*(vvx)+c9o2*(vvx)*(vvx)-cusq));
+    mfabb = mfabb  *(c1o1 + (-omega)) - (-omega)*   c2o27*  (drho + rho * (c3o1*(-vvx) + c9o2*(-vvx)*(-vvx) - cusq));
+    mfbcb = mfbcb  *(c1o1 + (-omega)) - (-omega)*   c2o27*  (drho + rho * (c3o1*(vvy)+c9o2*(vvy)*(vvy)-cusq));
+    mfbab = mfbab  *(c1o1 + (-omega)) - (-omega)*   c2o27*  (drho + rho * (c3o1*(-vvy) + c9o2*(-vvy)*(-vvy) - cusq));
+    mfbbc = mfbbc  *(c1o1 + (-omega)) - (-omega)*   c2o27*  (drho + rho * (c3o1*(vvz)+c9o2*(vvz)*(vvz)-cusq));
+    mfbba = mfbba  *(c1o1 + (-omega)) - (-omega)*   c2o27*  (drho + rho * (c3o1*(-vvz) + c9o2*(-vvz)*(-vvz) - cusq));
+    mfccb = mfccb  *(c1o1 + (-omega)) - (-omega)*   c1o54*  (drho + rho * (c3o1*(vvx + vvy) + c9o2*(vvx + vvy)*(vvx + vvy) - cusq));
+    mfaab = mfaab  *(c1o1 + (-omega)) - (-omega)*   c1o54*  (drho + rho * (c3o1*(-vvx - vvy) + c9o2*(-vvx - vvy)*(-vvx - vvy) - cusq));
+    mfcab = mfcab  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(vvx - vvy) + c9o2*(vvx - vvy)*(vvx - vvy) - cusq));
+    mfacb = mfacb  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(-vvx + vvy) + c9o2*(-vvx + vvy)*(-vvx + vvy) - cusq));
+    mfcbc = mfcbc  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(vvx + vvz) + c9o2*(vvx + vvz)*(vvx + vvz) - cusq));
+    mfaba = mfaba  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(-vvx - vvz) + c9o2*(-vvx - vvz)*(-vvx - vvz) - cusq));
+    mfcba = mfcba  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(vvx - vvz) + c9o2*(vvx - vvz)*(vvx - vvz) - cusq));
+    mfabc = mfabc  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(-vvx + vvz) + c9o2*(-vvx + vvz)*(-vvx + vvz) - cusq));
+    mfbcc = mfbcc  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(vvy + vvz) + c9o2*(vvy + vvz)*(vvy + vvz) - cusq));
+    mfbaa = mfbaa  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(-vvy - vvz) + c9o2*(-vvy - vvz)*(-vvy - vvz) - cusq));
+    mfbca = mfbca  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(vvy - vvz) + c9o2*(vvy - vvz)*(vvy - vvz) - cusq));
+    mfbac = mfbac  *(c1o1 + (-omega)) - (-omega)*    c1o54* (drho + rho * (c3o1*(-vvy + vvz) + c9o2*(-vvy + vvz)*(-vvy + vvz) - cusq));
+    mfccc = mfccc  *(c1o1 + (-omega)) - (-omega)*    c1o216*(drho + rho * (c3o1*(vvx + vvy + vvz) + c9o2*(vvx + vvy + vvz)*(vvx + vvy + vvz) - cusq));
+    mfaaa = mfaaa  *(c1o1 + (-omega)) - (-omega)*    c1o216*(drho + rho * (c3o1*(-vvx - vvy - vvz) + c9o2*(-vvx - vvy - vvz)*(-vvx - vvy - vvz) - cusq));
+    mfcca = mfcca  *(c1o1 + (-omega)) - (-omega)*    c1o216*(drho + rho * (c3o1*(vvx + vvy - vvz) + c9o2*(vvx + vvy - vvz)*(vvx + vvy - vvz) - cusq));
+    mfaac = mfaac  *(c1o1 + (-omega)) - (-omega)*    c1o216*(drho + rho * (c3o1*(-vvx - vvy + vvz) + c9o2*(-vvx - vvy + vvz)*(-vvx - vvy + vvz) - cusq));
+    mfcac = mfcac  *(c1o1 + (-omega)) - (-omega)*    c1o216*(drho + rho * (c3o1*(vvx - vvy + vvz) + c9o2*(vvx - vvy + vvz)*(vvx - vvy + vvz) - cusq));
+    mfaca = mfaca  *(c1o1 + (-omega)) - (-omega)*    c1o216*(drho + rho * (c3o1*(-vvx + vvy - vvz) + c9o2*(-vvx + vvy - vvz)*(-vvx + vvy - vvz) - cusq));
+    mfcaa = mfcaa  *(c1o1 + (-omega)) - (-omega)*    c1o216*(drho + rho * (c3o1*(vvx - vvy - vvz) + c9o2*(vvx - vvy - vvz)*(vvx - vvy - vvz) - cusq));
+    mfacc = mfacc  *(c1o1 + (-omega)) - (-omega)*    c1o216*(drho + rho * (c3o1*(-vvx + vvy + vvz) + c9o2*(-vvx + vvy + vvz)*(-vvx + vvy + vvz) - cusq));
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - 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>
+    //!
+    distribution.f[dir::MZZ] = mfcbb;
+    distribution.f[dir::PZZ] = mfabb;
+    distribution.f[dir::ZMZ] = mfbcb;
+    distribution.f[dir::ZPZ] = mfbab;
+    distribution.f[dir::ZZM] = mfbbc;
+    distribution.f[dir::ZZP] = mfbba;
+    distribution.f[dir::MMZ] = mfccb;
+    distribution.f[dir::PPZ] = mfaab;
+    distribution.f[dir::MPZ] = mfcab;
+    distribution.f[dir::PMZ] = mfacb;
+    distribution.f[dir::MZM] = mfcbc;
+    distribution.f[dir::PZP] = mfaba;
+    distribution.f[dir::MZP] = mfcba;
+    distribution.f[dir::PZM] = mfabc;
+    distribution.f[dir::ZMM] = mfbcc;
+    distribution.f[dir::ZPP] = mfbaa;
+    distribution.f[dir::ZMP] = mfbca;
+    distribution.f[dir::ZPM] = mfbac;
+    distribution.f[dir::MMM] = mfccc;
+    distribution.f[dir::PMM] = mfacc;
+    distribution.f[dir::MPM] = mfcac;
+    distribution.f[dir::PPM] = mfaac;
+    distribution.f[dir::MMP] = mfcca;
+    distribution.f[dir::PMP] = mfaca;
+    distribution.f[dir::MPP] = mfcaa;
+    distribution.f[dir::PPP] = mfaaa;
+    distribution.f[dir::ZZZ] = mfbbb;
+}
+
+
+}
+}
+
diff --git a/src/lbm/BGK.h b/src/lbm/BGK.h
new file mode 100644
index 0000000000000000000000000000000000000000..2c82f5bd445ee008954add02fd0d6d6093364e90
--- /dev/null
+++ b/src/lbm/BGK.h
@@ -0,0 +1,24 @@
+#ifndef LBM_BGK_H
+#define LBM_BGK_H
+
+#ifndef __host__
+#define __host__
+#endif
+#ifndef __device__
+#define __device__
+#endif
+
+#include <basics/Core/DataTypes.h>
+
+#include "KernelParameter.h"
+
+namespace vf
+{
+namespace lbm
+{
+
+__host__ __device__ void bgk(KernelParameter parameter);
+
+}
+}
+#endif
diff --git a/src/lbm/CMakeLists.txt b/src/lbm/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6e9f76793825ccf4e4e9e921e9fd4b6ab3584707
--- /dev/null
+++ b/src/lbm/CMakeLists.txt
@@ -0,0 +1,10 @@
+project(lbm LANGUAGES CXX)
+
+vf_add_library(NAME lbm PUBLIC_LINK basics)
+
+if(BUILD_VF_GPU)
+    add_subdirectory(cuda)
+endif()
+
+
+vf_add_tests()
diff --git a/src/lbm/Chimera.h b/src/lbm/Chimera.h
new file mode 100644
index 0000000000000000000000000000000000000000..6ffa0918aac4e6303efe4db82aa98ee645dc63e8
--- /dev/null
+++ b/src/lbm/Chimera.h
@@ -0,0 +1,121 @@
+#ifndef LBM_CHIMERA_H
+#define LBM_CHIMERA_H
+
+#ifndef __host__
+#define __host__
+#endif
+#ifndef __device__
+#define __device__
+#endif
+
+#include <basics/Core/DataTypes.h>
+
+#include <lbm/constants/NumericConstants.h>
+
+namespace vf
+{
+namespace lbm
+{
+
+using namespace constant;
+
+////////////////////////////////////////////////////////////////////////////////
+//! \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 __host__ __device__ void forwardInverseChimeraWithK(real &mfa, real &mfb, real &mfc, real vv,
+                                       real v2, real Kinverse, real K)
+{
+    const real m2 = mfa + mfc;
+    const real m1 = mfc - mfa;
+    real m0 = m2 + mfb;
+
+    mfa = m0;
+    m0 *= Kinverse;
+    m0 += c1o1;
+    mfb = (m1 * Kinverse - m0 * vv) * K;
+    mfc = ((m2 - c2o1 * 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 __host__ __device__ void backwardInverseChimeraWithK(real &mfa, real &mfb, real &mfc, real vv,
+                                        real v2, real Kinverse, real K)
+{
+    const real m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1o1) * (v2 - vv) * c1o2) * K;
+    const real m1 = (((mfa - mfc) - c2o1 * mfb * vv) * Kinverse + (mfa * Kinverse + c1o1) * (-v2)) * K;
+
+    mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1o1) * (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 __host__ __device__ void forwardChimera(real &mfa, real &mfb, real &mfc, real vv, real v2)
+{
+    const real m1 = (mfa + mfc) + mfb;
+    const real m2 = mfc - mfa;
+
+    mfc = (mfc + mfa) + (v2 * m1 - c2o1 * 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 __host__ __device__ void backwardChimera(real &mfa, real &mfb, real &mfc, real vv, real v2)
+{
+    const real ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2);
+    const real mb = ((mfa - mfc) - mfa * v2) - c2o1 * mfb * vv;
+
+    mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2);
+    mfb = mb;
+    mfa = ma;
+}
+
+
+inline __host__ __device__ void forwardChimeraWithK(real &mfa, real &mfb, real &mfc, real vv, real v2, real K) 
+{
+
+    const real m2 = mfa + mfc;
+    const real m1 = mfc - mfa;
+    const real m0 = m2 + mfb;
+    mfa = m0;
+    //m0     += K;
+    mfb = (m1 - K*vv) - m0 * vv;
+    mfc = ((m2 - c2o1*	m1 * vv) + v2*K) + v2 * m0;
+    //m0 += K;
+    //mfb = m1 - m0 * vv;
+    //mfc = m2 - two*	m1 * vv + v2 * m0;
+}
+
+
+inline __host__ __device__ void backwardChimeraWithK(real &mfa, real &mfb, real &mfc, real vv, real v2, real K) 
+{
+    const real  m0 = (mfc - mfb)* c1o2 + mfb * (vv)+(mfa + K) * (v2 - vv) * c1o2;
+    const real m1 = (mfa - mfc) - c2o1* mfb * vv + (mfa + K) * (-v2);
+    mfc = (mfc + mfb)* c1o2 + mfb * (vv)+(mfa + K) * (v2 + vv) * c1o2;
+    mfa = m0;
+    mfb = m1;
+}
+
+}
+}
+#endif
diff --git a/src/lbm/ChimeraTests.cpp b/src/lbm/ChimeraTests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..01abbe82764c276f53a4cdd479d333536199c3a9
--- /dev/null
+++ b/src/lbm/ChimeraTests.cpp
@@ -0,0 +1,133 @@
+#include <gmock/gmock.h>
+
+#include "Chimera.h"
+
+#ifdef VF_DOUBLE_ACCURACY
+#define REAL_EQ(a) testing::DoubleEq(a)
+#else
+#define REAL_EQ(a) testing::FloatEq(a)
+#endif
+
+/*
+* InverseChimeraWithK
+*/
+TEST(ChimeraTest, forwardInverseChimeraWithK)
+{
+    real mfa = 1;
+    real mfb = 1;
+    real mfc = 1;
+
+    const real vv = 1.;
+    const real v2 = 1.;
+
+    const real K = 1.;
+    const real Kinverse = 1 / K;
+
+    vf::lbm::forwardInverseChimeraWithK(mfa, mfb, mfc, vv, v2, K, Kinverse);
+
+    EXPECT_THAT(mfa, REAL_EQ(3.));  // mfa + mfb + mfc
+    EXPECT_THAT(mfb, REAL_EQ(-4.)); // -(mfa + mfb + mfc + 1)
+    EXPECT_THAT(mfc, REAL_EQ(6.));  // (mfa + mfc) + (mfa + mfb + mfc + 1)
+}
+
+
+TEST(ChimeraTest, backwardInverseChimeraWithK)
+{
+    // starting with the result values from the test above.
+    real mfa = 3.;
+    real mfb = -4.;
+    real mfc = 6.;
+
+    const real vv = 1.;
+    const real v2 = 1.;
+
+    const real K = 1.;
+    const real Kinverse = 1 / K;
+
+    vf::lbm::backwardInverseChimeraWithK(mfa, mfb, mfc, vv, v2, K, Kinverse);
+
+    // resulting in the start values from the test above.
+    EXPECT_THAT(mfa, REAL_EQ(1.));
+    EXPECT_THAT(mfb, REAL_EQ(1.));
+    EXPECT_THAT(mfc, REAL_EQ(1.));
+}
+
+/*
+* Chimera
+*/
+TEST(ChimeraTest, forwardChimera)
+{
+    real mfa = 1;
+    real mfb = 1;
+    real mfc = 1;
+
+    const real vv = 1.;
+    const real v2 = 1.;
+
+    vf::lbm::forwardChimera(mfa, mfb, mfc, vv, v2);
+
+    EXPECT_THAT(mfa, REAL_EQ(3.));  // mfa + mfb + mfc
+    EXPECT_THAT(mfb, REAL_EQ(-3.)); // -(mfa + mfb + mfc)
+    EXPECT_THAT(mfc, REAL_EQ(5.));  // (mfa + mfc) + (mfa + mfb + mfc)
+}
+
+
+TEST(ChimeraTest, backwardChimera)
+{
+    // starting with the result values from the test above.
+    real mfa = 3.;
+    real mfb = -3.;
+    real mfc = 5.;
+
+    const real vv = 1.;
+    const real v2 = 1.;
+
+    vf::lbm::backwardChimera(mfa, mfb, mfc, vv, v2);
+
+    // resulting in the start values from the test above.
+    EXPECT_THAT(mfa, REAL_EQ(1.));
+    EXPECT_THAT(mfb, REAL_EQ(1.));
+    EXPECT_THAT(mfc, REAL_EQ(1.));
+}
+
+/*
+* ChimeraWithK
+*/
+TEST(ChimeraTest, forwardChimeraWithK)
+{
+    real mfa = 1;
+    real mfb = 1;
+    real mfc = 1;
+
+    const real vv = 1.;
+    const real v2 = 1.;
+
+    const real K = 1.;
+
+    vf::lbm::forwardChimeraWithK(mfa, mfb, mfc, vv, v2, K);
+
+    EXPECT_THAT(mfa, REAL_EQ(3.));  // mfa + mfb + mfc
+    EXPECT_THAT(mfb, REAL_EQ(-4.)); // -(mfa + mfb + mfc)
+    EXPECT_THAT(mfc, REAL_EQ(6.));  // (mfa + mfc) + (mfa + mfb + mfc)
+}
+
+
+TEST(ChimeraTest, backwardChimeraWithK)
+{
+    // starting with the result values from the test above.
+    real mfa = 3.;
+    real mfb = -4.;
+    real mfc = 6.;
+
+    const real vv = 1.;
+    const real v2 = 1.;
+
+    const real K = 1.;
+
+    vf::lbm::backwardChimeraWithK(mfa, mfb, mfc, vv, v2, K);
+
+    // resulting in the start values from the test above.
+    EXPECT_THAT(mfa, REAL_EQ(1.));
+    EXPECT_THAT(mfb, REAL_EQ(1.));
+    EXPECT_THAT(mfc, REAL_EQ(1.));
+}
diff --git a/src/lbm/CumulantChimera.cpp b/src/lbm/CumulantChimera.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..65dc9b1f82f409447fda54fc0bc5f460533aad1b
--- /dev/null
+++ b/src/lbm/CumulantChimera.cpp
@@ -0,0 +1,453 @@
+#include "CumulantChimera.h"
+
+#include <cmath>
+
+#include <basics/Core/DataTypes.h>
+#include <basics/Core/RealConstants.h>
+
+#include "constants/NumericConstants.h"
+#include "constants/D3Q27.h"
+
+#include "Chimera.h"
+#include "MacroscopicQuantities.h"
+
+namespace vf
+{
+namespace lbm
+{
+
+using namespace constant;
+
+
+////////////////////////////////////////////////////////////////////////////////////
+//! - 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}, C_{210}+C_{012}, 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}, C_{210}-C_{012}, 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}, C_{202}, C_{022}, C_{211}, C_{121}, 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}, C_{212}, C_{122}\f$: \f$\omega_9=O5=1.0\f$.
+//!  - Sixth order cumulant \f$ C_{222}\f$: \f$\omega_{10}=O6=1.0\f$.
+//////////////////////////////////////////////////////////////////////////
+__host__ __device__ void setRelaxationRatesK17(real omega, real &OxxPyyPzz, real &OxyyPxzz, real &OxyyMxzz, real &Oxyz,
+                                               real &O4, real &O5, real &O6)
+{
+    OxxPyyPzz = c1o1;
+
+    OxyyPxzz = c8o1 * (-c2o1 + omega) * (c1o1 + c2o1 * omega) / (-c8o1 - c14o1 * omega + c7o1 * omega * omega);
+    OxyyMxzz = c8o1 * (-c2o1 + omega) * (-c7o1 + c4o1 * omega) / (c56o1 - c50o1 * omega + c9o1 * omega * omega);
+    Oxyz     = c24o1 * (-c2o1 + omega) * (-c2o1 - c7o1 * omega + c3o1 * omega * omega) /
+                (c48o1 + c152o1 * omega - c130o1 * omega * omega + c29o1 * omega * omega * omega);
+
+    O4 = c1o1;
+
+    O5 = c1o1;
+
+    O6 = c1o1;
+}
+
+
+__host__ __device__ void setRelaxationRatesK15(real omega, real &OxxPyyPzz, real &OxyyPxzz, real &OxyyMxzz, real &Oxyz,
+                                               real &O4, real &O5, real &O6)
+{
+    OxxPyyPzz = c1o1;
+
+    OxyyPxzz = c1o1;
+    OxyyMxzz = c1o1;
+    Oxyz     = c1o1;
+
+    O4 = c1o1;
+
+    O5 = c1o1;
+
+    O6 = c1o1;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//! Cumulant K17 Kernel is based on \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>
+//! and \ref
+//! <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>
+//////////////////////////////////////////////////////////////////////////
+__host__ __device__ void cumulantChimera(KernelParameter parameter, RelaxationRatesFunctor setRelaxationRates)
+{
+    auto& distribution = parameter.distribution;
+    const auto omega = parameter.omega;
+    const auto* forces = parameter.forces;
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - 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>
+    //!
+    real mfcbb = distribution.f[dir::PZZ];
+    real mfabb = distribution.f[dir::MZZ];
+    real mfbcb = distribution.f[dir::ZPZ];
+    real mfbab = distribution.f[dir::ZMZ];
+    real mfbbc = distribution.f[dir::ZZP];
+    real mfbba = distribution.f[dir::ZZM];
+    real mfccb = distribution.f[dir::PPZ];
+    real mfaab = distribution.f[dir::MMZ];
+    real mfcab = distribution.f[dir::PMZ];
+    real mfacb = distribution.f[dir::MPZ];
+    real mfcbc = distribution.f[dir::PZP];
+    real mfaba = distribution.f[dir::MZM];
+    real mfcba = distribution.f[dir::PZM];
+    real mfabc = distribution.f[dir::MZP];
+    real mfbcc = distribution.f[dir::ZPP];
+    real mfbaa = distribution.f[dir::ZMM];
+    real mfbca = distribution.f[dir::ZPM];
+    real mfbac = distribution.f[dir::ZMP];
+    real mfccc = distribution.f[dir::PPP];
+    real mfacc = distribution.f[dir::MPP];
+    real mfcac = distribution.f[dir::PMP];
+    real mfaac = distribution.f[dir::MMP];
+    real mfcca = distribution.f[dir::PPM];
+    real mfaca = distribution.f[dir::MPM];
+    real mfcaa = distribution.f[dir::PMM];
+    real mfaaa = distribution.f[dir::MMM];
+    real mfbbb = distribution.f[dir::ZZZ];
+
+
+    const real drho = getDensity(distribution.f);
+    const real OOrho = c1o1 / (c1o1 + drho);    
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - 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>
+    //!
+    const real vvx = getIncompressibleVelocityX1(distribution.f) * OOrho + forces[0] * c1o2;
+    const real vvy = getIncompressibleVelocityX2(distribution.f) * OOrho + forces[0] * c1o2;
+    const real vvz = getIncompressibleVelocityX3(distribution.f) * OOrho + forces[0] * c1o2;
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    // calculate the square of velocities for this lattice node
+    const real vx2 = vvx*vvx;
+    const real vy2 = vvy*vvy;
+    const real vz2 = vvz*vvz;
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - 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
+    vf::lbm::forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36o1, c1o36);
+    vf::lbm::forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2,  c9o1,  c1o9);
+    vf::lbm::forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36o1, c1o36);
+    vf::lbm::forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2,  c9o1,  c1o9);
+    vf::lbm::forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2,  c9o4,  c4o9);
+    vf::lbm::forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2,  c9o1,  c1o9);
+    vf::lbm::forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36o1, c1o36);
+    vf::lbm::forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2,  c9o1,  c1o9);
+    vf::lbm::forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36o1, c1o36);   
+    ////////////////////////////////////////////////////////////////////////////////////
+    // Y - Dir
+    vf::lbm::forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2,  c6o1,  c1o6);
+    vf::lbm::forwardChimera(            mfaab, mfabb, mfacb, vvy, vy2);
+    vf::lbm::forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18o1, c1o18);
+    vf::lbm::forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2,  c3o2,  c2o3);
+    vf::lbm::forwardChimera(            mfbab, mfbbb, mfbcb, vvy, vy2);
+    vf::lbm::forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2,  c9o2,  c2o9);
+    vf::lbm::forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2,  c6o1,  c1o6);
+    vf::lbm::forwardChimera(            mfcab, mfcbb, mfccb, vvy, vy2);
+    vf::lbm::forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18o1, c1o18);   
+    ////////////////////////////////////////////////////////////////////////////////////
+    // X - Dir
+    vf::lbm::forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1);
+    vf::lbm::forwardChimera(            mfaba, mfbba, mfcba, vvx, vx2);
+    vf::lbm::forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3o1, c1o3);
+    vf::lbm::forwardChimera(            mfaab, mfbab, mfcab, vvx, vx2);
+    vf::lbm::forwardChimera(            mfabb, mfbbb, mfcbb, vvx, vx2);
+    vf::lbm::forwardChimera(            mfacb, mfbcb, mfccb, vvx, vx2);
+    vf::lbm::forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3o1, c1o3);
+    vf::lbm::forwardChimera(            mfabc, mfbbc, mfcbc, vvx, vx2);
+    vf::lbm::forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c3o1, c1o9); 
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - Setting relaxation rates for non-hydrodynamic cumulants (default values). Variable names and equations
+    real OxxPyyPzz;
+    real OxyyPxzz;
+    real OxyyMxzz;
+    real Oxyz;
+    real O4;
+    real O5;
+    real O6;
+
+    setRelaxationRates(omega, OxxPyyPzz, OxyyPxzz, OxyyMxzz, Oxyz, O4, O5, O6);
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - 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).
+    //!
+    const real A = (c4o1 + c2o1*omega - c3o1*omega*omega) / (c2o1 - c7o1*omega + c5o1*omega*omega);
+    const real B = (c4o1 + c28o1*omega - c14o1*omega*omega) / (c6o1 - c21o1*omega + c15o1*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.
+    real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) * OOrho;
+    real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) * OOrho;
+    real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) * OOrho;  
+    real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - c1o9*(drho   * OOrho));
+    real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - c1o9*(drho   * OOrho));
+    real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - c1o9*(drho   * OOrho));
+    ////////////////////////////////////////////////////////////
+    //5.
+    real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba *  mfabc)) + c1o3 * (mfbca + mfbac)) * OOrho;
+    real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba *  mfbac)) + c1o3 * (mfcba + mfabc)) * OOrho;
+    real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb *  mfcba)) + c1o3 * (mfacb + mfcab)) * OOrho;
+    ////////////////////////////////////////////////////////////
+    //6.
+    real CUMccc = mfccc + ((-c4o1 *  mfbbb * mfbbb
+        - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+        - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+        - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho
+        + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+        + c2o1 * (mfcaa * mfaca * mfaac)
+        + c16o1 *  mfbba * mfbab * mfabb) * OOrho * OOrho
+        - c1o3 * (mfacc + mfcac + mfcca) * OOrho
+        - c1o9 * (mfcaa + mfaca + mfaac) * OOrho
+        + (c2o1 * (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.
+    real mxxPyyPzz = mfcaa + mfaca + mfaac;
+    real mxxMyy = mfcaa - mfaca;
+    real mxxMzz = mfcaa - mfaac;
+    ////////////////////////////////////////////////////////////
+    //3.
+    real mxxyPyzz = mfcba + mfabc;
+    real mxxyMyzz = mfcba - mfabc;  
+    real mxxzPyyz = mfcab + mfacb;
+    real mxxzMyyz = mfcab - mfacb;  
+    real mxyyPxzz = mfbca + mfbac;
+    real 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.
+    //!
+    const real Dxy = -c3o1*omega*mfbba;
+    const real Dxz = -c3o1*omega*mfbab;
+    const real Dyz = -c3o1*omega*mfabb;
+    const real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 *  OxxPyyPzz * (mfaaa - mxxPyyPzz);
+    const real dyuy = dxux + omega * c3o2 * mxxMyy;
+    const real 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) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2  * dzuz);
+    mxxMyy    += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
+    mxxMzz    += omega * (-mxxMzz) - c3o1 * (c1o1 + 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
+    //! Set relaxation limiters for third order cumulants to default value \f$ \lambda=0.001 \f$ according to section 6 in \ref
+    //! - 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>
+    //!
+
+    const real qudricLimitP = c1o100;
+    const real qudricLimitM = c1o100;
+    const real qudricLimitD = c1o100;
+
+    real wadjust   = Oxyz + (c1o1 - Oxyz)*abs_internal(mfbbb) / (abs_internal(mfbbb) + qudricLimitD);
+    mfbbb    += wadjust * (-mfbbb);
+    wadjust   = OxyyPxzz + (c1o1 - OxyyPxzz)*abs_internal(mxxyPyzz) / (abs_internal(mxxyPyzz) + qudricLimitP);
+    mxxyPyzz += wadjust * (-mxxyPyzz);
+    wadjust   = OxyyMxzz + (c1o1 - OxyyMxzz)*abs_internal(mxxyMyzz) / (abs_internal(mxxyMyzz) + qudricLimitM);
+    mxxyMyzz += wadjust * (-mxxyMyzz);
+    wadjust   = OxyyPxzz + (c1o1 - OxyyPxzz)*abs_internal(mxxzPyyz) / (abs_internal(mxxzPyyz) + qudricLimitP);
+    mxxzPyyz += wadjust * (-mxxzPyyz);
+    wadjust   = OxyyMxzz + (c1o1 - OxyyMxzz)*abs_internal(mxxzMyyz) / (abs_internal(mxxzMyyz) + qudricLimitM);
+    mxxzMyyz += wadjust * (-mxxzMyyz);
+    wadjust   = OxyyPxzz + (c1o1 - OxyyPxzz)*abs_internal(mxyyPxzz) / (abs_internal(mxyyPxzz) + qudricLimitP);
+    mxyyPxzz += wadjust * (-mxyyPxzz);
+    wadjust   = OxyyMxzz + (c1o1 - OxyyMxzz)*abs_internal(mxyyMxzz) / (abs_internal(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 * (-c2o1*  mxxMyy + mxxMzz + mxxPyyPzz);
+    mfaac = c1o3 * (mxxMyy - c2o1* 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*(c1o1 / omega - c1o2) * (dyuy + dzuz) * c2o3 * A + (c1o1 - O4) * (CUMacc);
+    CUMcac = -O4*(c1o1 / omega - c1o2) * (dxux + dzuz) * c2o3 * A + (c1o1 - O4) * (CUMcac);
+    CUMcca = -O4*(c1o1 / omega - c1o2) * (dyuy + dxux) * c2o3 * A + (c1o1 - O4) * (CUMcca);
+    CUMbbc = -O4*(c1o1 / omega - c1o2) * Dxy           * c1o3 * B + (c1o1 - O4) * (CUMbbc);
+    CUMbcb = -O4*(c1o1 / omega - c1o2) * Dxz           * c1o3 * B + (c1o1 - O4) * (CUMbcb);
+    CUMcbb = -O4*(c1o1 / omega - c1o2) * Dyz           * c1o3 * B + (c1o1 - 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*((c3o1*mfcaa + c1o1) * mfabb + c6o1 * mfbba * mfbab) * OOrho;
+    mfbcb = CUMbcb + c1o3*((c3o1*mfaca + c1o1) * mfbab + c6o1 * mfbba * mfabb) * OOrho;
+    mfbbc = CUMbbc + c1o3*((c3o1*mfaac + c1o1) * mfbba + c6o1 * mfbab * mfabb) * OOrho; 
+    mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba)*c9o1 + c3o1 * (mfcaa + mfaca)) * OOrho - (drho *  OOrho))*c1o9;
+    mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab)*c9o1 + c3o1 * (mfcaa + mfaac)) * OOrho - (drho *  OOrho))*c1o9;
+    mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb)*c9o1 + c3o1 * (mfaac + mfaca)) * OOrho - (drho *  OOrho))*c1o9; 
+    //////////////////////////////////////////////////////////////////////////
+    //5.
+    mfbcc = CUMbcc + c1o3 *(c3o1*(mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb +    mfbba * mfabc)) + (mfbca + mfbac)) * OOrho;
+    mfcbc = CUMcbc + c1o3 *(c3o1*(mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab +    mfbba * mfbac)) + (mfcba + mfabc)) * OOrho;
+    mfccb = CUMccb + c1o3 *(c3o1*(mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca +    mfabb * mfcba)) + (mfacb + mfcab)) * OOrho; 
+    //////////////////////////////////////////////////////////////////////////
+    //6.
+    mfccc =	CUMccc - ((-c4o1 *  mfbbb * mfbbb
+            - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+            - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+            - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho
+            + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+                + c2o1 * (mfcaa * mfaca * mfaac)
+                + c16o1 *  mfbba * mfbab * mfabb) * OOrho * OOrho
+            - c1o3 * (mfacc + mfcac + mfcca) * OOrho
+            - c1o9 * (mfcaa + mfaca + mfaac) * OOrho
+            + (c2o1 * (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
+    vf::lbm::backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1);
+    vf::lbm::backwardChimera(            mfaba, mfbba, mfcba, vvx, vx2);
+    vf::lbm::backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3o1, c1o3);
+    vf::lbm::backwardChimera(            mfaab, mfbab, mfcab, vvx, vx2);
+    vf::lbm::backwardChimera(            mfabb, mfbbb, mfcbb, vvx, vx2);
+    vf::lbm::backwardChimera(            mfacb, mfbcb, mfccb, vvx, vx2);
+    vf::lbm::backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3o1, c1o3);
+    vf::lbm::backwardChimera(            mfabc, mfbbc, mfcbc, vvx, vx2);
+    vf::lbm::backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9o1, c1o9);    
+    ////////////////////////////////////////////////////////////////////////////////////
+    // Y - Dir
+    vf::lbm::backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2,  c6o1,  c1o6);
+    vf::lbm::backwardChimera(            mfaab, mfabb, mfacb, vvy, vy2);
+    vf::lbm::backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18o1, c1o18);
+    vf::lbm::backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2,  c3o2,  c2o3);
+    vf::lbm::backwardChimera(            mfbab, mfbbb, mfbcb, vvy, vy2);
+    vf::lbm::backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2,  c9o2,  c2o9);
+    vf::lbm::backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2,  c6o1,  c1o6);
+    vf::lbm::backwardChimera(            mfcab, mfcbb, mfccb, vvy, vy2);
+    vf::lbm::backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18o1, c1o18);  
+    ////////////////////////////////////////////////////////////////////////////////////
+    // Z - Dir
+    vf::lbm::backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36o1, c1o36);
+    vf::lbm::backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2,  c9o1,  c1o9);
+    vf::lbm::backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36o1, c1o36);
+    vf::lbm::backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2,  c9o1,  c1o9);
+    vf::lbm::backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2,  c9o4,  c4o9);
+    vf::lbm::backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2,  c9o1,  c1o9);
+    vf::lbm::backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36o1, c1o36);
+    vf::lbm::backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2,  c9o1,  c1o9);
+    vf::lbm::backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36o1, c1o36);
+
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    //! - 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>
+    //!
+    distribution.f[dir::MZZ] = mfcbb;
+    distribution.f[dir::PZZ] = mfabb;
+    distribution.f[dir::ZMZ] = mfbcb;
+    distribution.f[dir::ZPZ] = mfbab;
+    distribution.f[dir::ZZM] = mfbbc;
+    distribution.f[dir::ZZP] = mfbba;
+    distribution.f[dir::MMZ] = mfccb;
+    distribution.f[dir::PPZ] = mfaab;
+    distribution.f[dir::MPZ] = mfcab;
+    distribution.f[dir::PMZ] = mfacb;
+    distribution.f[dir::MZM] = mfcbc;
+    distribution.f[dir::PZP] = mfaba;
+    distribution.f[dir::MZP] = mfcba;
+    distribution.f[dir::PZM] = mfabc;
+    distribution.f[dir::ZMM] = mfbcc;
+    distribution.f[dir::ZPP] = mfbaa;
+    distribution.f[dir::ZMP] = mfbca;
+    distribution.f[dir::ZPM] = mfbac;
+    distribution.f[dir::MMM] = mfccc;
+    distribution.f[dir::PMM] = mfacc;
+    distribution.f[dir::MPM] = mfcac;
+    distribution.f[dir::PPM] = mfaac;
+    distribution.f[dir::MMP] = mfcca;
+    distribution.f[dir::PMP] = mfaca;
+    distribution.f[dir::MPP] = mfcaa;
+    distribution.f[dir::PPP] = mfaaa;
+    distribution.f[dir::ZZZ] = mfbbb;
+}
+
+
+}
+}
+
diff --git a/src/lbm/CumulantChimera.h b/src/lbm/CumulantChimera.h
new file mode 100644
index 0000000000000000000000000000000000000000..e8740c7d3f5b988a6fdc5c3b16ab6a90e0a28b83
--- /dev/null
+++ b/src/lbm/CumulantChimera.h
@@ -0,0 +1,34 @@
+#ifndef LBM_CUMULANT_CHIMERA_H
+#define LBM_CUMULANT_CHIMERA_H
+
+#ifndef __host__
+#define __host__
+#endif
+#ifndef __device__
+#define __device__
+#endif
+
+#include <basics/Core/DataTypes.h>
+
+#include "KernelParameter.h"
+
+namespace vf
+{
+namespace lbm
+{
+
+__host__ __device__ void setRelaxationRatesK17(real omega, real &OxxPyyPzz, real &OxyyPxzz, real &OxyyMxzz, real &Oxyz,
+                                               real &O4, real &O5, real &O6);
+
+__host__ __device__ void setRelaxationRatesK15(real omega, real &OxxPyyPzz, real &OxyyPxzz, real &OxyyMxzz, real &Oxyz,
+                                               real &O4, real &O5, real &O6);
+
+using RelaxationRatesFunctor = void(*)(real omega, real &OxxPyyPzz, real &OxyyPxzz, real &OxyyMxzz, real &Oxyz,
+                                       real &O4, real &O5, real &O6);
+
+
+__host__ __device__ void cumulantChimera(KernelParameter parameter, RelaxationRatesFunctor setRelaxationRates);
+
+}
+}
+#endif
diff --git a/src/lbm/KernelParameter.cpp b/src/lbm/KernelParameter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..15a0f9c445fa4fc7b1fba4b0482da29068b72951
--- /dev/null
+++ b/src/lbm/KernelParameter.cpp
@@ -0,0 +1,32 @@
+#include "KernelParameter.h"
+
+
+#include "MacroscopicQuantities.h"
+
+
+namespace vf
+{
+namespace lbm
+{
+
+
+
+inline __host__ __device__ real Distribution27::getDensity_() const
+{
+    return getDensity(f);
+}
+
+
+
+__host__ __device__ real abs_internal(real value)
+{
+#ifdef __CUDA_ARCH__
+    return ::abs(value);
+#else
+    return std::abs(value);
+#endif
+}
+
+
+}
+}
diff --git a/src/lbm/KernelParameter.h b/src/lbm/KernelParameter.h
new file mode 100644
index 0000000000000000000000000000000000000000..95226628110637f3794c8a1f7e6f6c1f6dda937b
--- /dev/null
+++ b/src/lbm/KernelParameter.h
@@ -0,0 +1,43 @@
+#ifndef LBM_KERNEL_PARAMETER_H
+#define LBM_KERNEL_PARAMETER_H
+
+#ifndef __host__
+#define __host__
+#endif
+#ifndef __device__
+#define __device__
+#endif
+
+#include <basics/Core/DataTypes.h>
+
+
+namespace vf
+{
+namespace lbm
+{
+
+struct Distribution27
+{
+    real f[27];
+
+    __host__ __device__ real getDensity_() const;
+};
+
+
+__host__ __device__ real abs_internal(real value);
+
+
+struct KernelParameter
+{
+    Distribution27& distribution;
+    real omega;
+    real* forces;
+};
+
+
+
+
+}
+}
+
+#endif
diff --git a/src/lbm/MacroscopicQuantities.h b/src/lbm/MacroscopicQuantities.h
new file mode 100644
index 0000000000000000000000000000000000000000..c37791294ff5b4edad21795f4ce0a32a18c5d236
--- /dev/null
+++ b/src/lbm/MacroscopicQuantities.h
@@ -0,0 +1,98 @@
+#ifndef LBM_CALCMAC_H
+#define LBM_CALCMAC_H
+
+#ifndef __host__
+#define __host__
+#endif
+#ifndef __device__
+#define __device__
+#endif
+
+#include <basics/Core/DataTypes.h>
+
+#include "constants/NumericConstants.h"
+#include "constants/D3Q27.h"
+
+namespace vf
+{
+namespace lbm
+{
+    
+////////////////////////////////////////////////////////////////////////////////////
+//! - 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>
+//!
+
+inline __host__ __device__ real getDensity(const real *const &f /*[27]*/)
+{
+    return ((f[dir::TNE] + f[dir::BSW]) + (f[dir::TSE] + f[dir::BNW])) + ((f[dir::BSE] + f[dir::TNW]) + (f[dir::TSW] + f[dir::BNE])) +
+           (((f[dir::NE] + f[dir::SW]) + (f[dir::SE] + f[dir::NW])) + ((f[dir::TE] + f[dir::BW]) + (f[dir::BE] + f[dir::TW])) +
+            ((f[dir::BN] + f[dir::TS]) + (f[dir::TN] + f[dir::BS]))) +
+           ((f[dir::E] + f[dir::W]) + (f[dir::N] + f[dir::S]) + (f[dir::T] + f[dir::B])) + f[dir::REST];
+}
+
+/*
+* Incompressible Macroscopic Quantities
+*/
+inline __host__ __device__ real getIncompressibleVelocityX1(const real *const &f /*[27]*/)
+{
+    return ((((f[dir::TNE] - f[dir::BSW]) + (f[dir::TSE] - f[dir::BNW])) + ((f[dir::BSE] - f[dir::TNW]) + (f[dir::BNE] - f[dir::TSW]))) +
+            (((f[dir::BE] - f[dir::TW]) + (f[dir::TE] - f[dir::BW])) + ((f[dir::SE] - f[dir::NW]) + (f[dir::NE] - f[dir::SW]))) + (f[dir::E] - f[dir::W]));
+}
+
+
+inline __host__ __device__ real getIncompressibleVelocityX2(const real *const &f /*[27]*/)
+{
+    return ((((f[dir::TNE] - f[dir::BSW]) + (f[dir::BNW] - f[dir::TSE])) + ((f[dir::TNW] - f[dir::BSE]) + (f[dir::BNE] - f[dir::TSW]))) +
+            (((f[dir::BN] - f[dir::TS]) + (f[dir::TN] - f[dir::BS])) + ((f[dir::NW] - f[dir::SE]) + (f[dir::NE] - f[dir::SW]))) + (f[dir::N] - f[dir::S]));
+}
+
+
+inline __host__ __device__ real getIncompressibleVelocityX3(const real *const &f /*[27]*/)
+{
+    return ((((f[dir::TNE] - f[dir::BSW]) + (f[dir::TSE] - f[dir::BNW])) + ((f[dir::TNW] - f[dir::BSE]) + (f[dir::TSW] - f[dir::BNE]))) +
+            (((f[dir::TS] - f[dir::BN]) + (f[dir::TN] - f[dir::BS])) + ((f[dir::TW] - f[dir::BE]) + (f[dir::TE] - f[dir::BW]))) + (f[dir::T] - f[dir::B]));
+}
+
+
+
+/*
+* Compressible Macroscopic Quantities
+*/
+inline __host__ __device__ real getCompressibleVelocityX1(const real *const &f27, const real& rho)
+{
+    return getIncompressibleVelocityX1(f27) / (rho + constant::c1o1);
+}
+
+
+inline __host__ __device__ real getCompressibleVelocityX2(const real *const &f27, const real& rho)
+{
+    return getIncompressibleVelocityX2(f27) / (rho + constant::c1o1);
+}
+
+
+inline __host__ __device__ real getCompressibleVelocityX3(const real *const &f27, const real& rho)
+{
+    return getIncompressibleVelocityX3(f27) / (rho + constant::c1o1);
+}
+
+/*
+* Pressure
+*/
+inline __host__ __device__ real getPressure(const real *const &f27, const real& rho, const real& vx, const real& vy, const real& vz)
+{
+    return (f27[dir::E] + f27[dir::W] + f27[dir::N] + f27[dir::S] + f27[dir::T] + f27[dir::B] + 
+    constant::c2o1 * (f27[dir::NE] + f27[dir::SW] + f27[dir::SE] + f27[dir::NW] + f27[dir::TE] + 
+                      f27[dir::BW] + f27[dir::BE] + f27[dir::TW] + f27[dir::TN] + f27[dir::BS] + 
+                      f27[dir::BN] + f27[dir::TS]) + 
+    constant::c3o1 * (f27[dir::TNE] + f27[dir::TSW] + f27[dir::TSE] + f27[dir::TNW] + 
+                      f27[dir::BNE] + f27[dir::BSW] + f27[dir::BSE] + f27[dir::BNW]) -
+    rho - (vx * vx + vy * vy + vz * vz) * (constant::c1o1 + rho)) * 
+    constant::c1o2 + rho; // times zero for incompressible case                 
+                          // Attention: op defined directly to op = 1 ; ^^^^(1.0/op-0.5)=0.5
+}
+
+}
+}
+
+#endif
diff --git a/src/lbm/MacroscopicQuantitiesTests.cpp b/src/lbm/MacroscopicQuantitiesTests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..52f89943a3e6a99fcab13eba22de9959229a289d
--- /dev/null
+++ b/src/lbm/MacroscopicQuantitiesTests.cpp
@@ -0,0 +1,71 @@
+#include <gmock/gmock.h>
+
+#include "MacroscopicQuantities.h"
+#include "constants/D3Q27.h"
+
+
+/*
+* given distributions, which are all one.
+*/
+real f[27] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
+
+using namespace vf::lbm;
+
+
+TEST(MacroscopicQuantitiesTest, check_density)
+{
+    const double density = getDensity(f);
+
+    const double expected_density = 27.;
+    ASSERT_THAT(density, testing::DoubleEq(expected_density));
+}
+
+TEST(MacroscopicQuantitiesTest, whenFsAreEqual_velocityInEachDirectionShouldBeZero)
+{
+    const double velocityX1 = getIncompressibleVelocityX1(f);
+    const double velocityX2 = getIncompressibleVelocityX2(f);
+    const double velocityX3 = getIncompressibleVelocityX3(f);
+
+    const double expected_velocity = 0.;
+    EXPECT_THAT(velocityX1, testing::DoubleEq(expected_velocity));
+    EXPECT_THAT(velocityX2, testing::DoubleEq(expected_velocity));
+    EXPECT_THAT(velocityX3, testing::DoubleEq(expected_velocity));
+}
+
+TEST(MacroscopicQuantitiesTest, givenAllFsAreOne_when_Eis2_velocityInX1ShouldBeOne)
+{
+    f[dir::E] = 2.;
+
+    const double velocityX1 = getIncompressibleVelocityX1(f);
+    const double velocityX2 = getIncompressibleVelocityX2(f);
+    const double velocityX3 = getIncompressibleVelocityX3(f);
+
+    const double expected_velocity_x1 = 1.;
+    const double expected_velocity_x2 = 0.;
+    const double expected_velocity_x3 = 0.;
+
+    EXPECT_THAT(velocityX1, testing::DoubleEq(expected_velocity_x1));
+    EXPECT_THAT(velocityX2, testing::DoubleEq(expected_velocity_x2));
+    EXPECT_THAT(velocityX3, testing::DoubleEq(expected_velocity_x3));
+}
+
+TEST(MacroscopicQuantitiesTest, givenAllFsAreOne_when_Nis2_velocityInX2ShouldBeOne)
+{
+    f[dir::N] = 2.;
+
+    const double velocity = getIncompressibleVelocityX2(f);
+
+    const double expected_velocity = 1.;
+    ASSERT_THAT(velocity, testing::DoubleEq(expected_velocity));
+}
+
+
+TEST(MacroscopicQuantitiesTest, givenAllFsAreOne_when_Tis2_velocityInX3ShouldBeOne)
+{
+    f[dir::T] = 2.;
+
+    const double velocity = getIncompressibleVelocityX3(f);
+
+    const double expected_velocity = 1.;
+    ASSERT_THAT(velocity, testing::DoubleEq(expected_velocity));
+}
diff --git a/src/lbm/constants/D3Q27.h b/src/lbm/constants/D3Q27.h
new file mode 100644
index 0000000000000000000000000000000000000000..0b2cbfdd44e84af590fa2c2be4bf319cbfd4c815
--- /dev/null
+++ b/src/lbm/constants/D3Q27.h
@@ -0,0 +1,71 @@
+#ifndef LBM_D3Q27_H
+#define LBM_D3Q27_H
+
+namespace vf
+{
+namespace lbm
+{
+namespace dir
+{
+
+static constexpr int E    = 0;
+static constexpr int W    = 1;
+static constexpr int N    = 2;
+static constexpr int S    = 3;
+static constexpr int T    = 4;
+static constexpr int B    = 5;
+static constexpr int NE   = 6;
+static constexpr int SW   = 7;
+static constexpr int SE   = 8;
+static constexpr int NW   = 9;
+static constexpr int TE   = 10;
+static constexpr int BW   = 11;
+static constexpr int BE   = 12;
+static constexpr int TW   = 13;
+static constexpr int TN   = 14;
+static constexpr int BS   = 15;
+static constexpr int BN   = 16;
+static constexpr int TS   = 17;
+static constexpr int TNE  = 18;
+static constexpr int TNW  = 19;
+static constexpr int TSE  = 20;
+static constexpr int TSW  = 21;
+static constexpr int BNE  = 22;
+static constexpr int BNW  = 23;
+static constexpr int BSE  = 24;
+static constexpr int BSW  = 25;
+static constexpr int REST = 26;
+
+static constexpr int PZZ = 0;
+static constexpr int MZZ = 1;
+static constexpr int ZPZ = 2;
+static constexpr int ZMZ = 3;
+static constexpr int ZZP = 4;
+static constexpr int ZZM = 5;
+static constexpr int PPZ = 6;
+static constexpr int MMZ = 7;
+static constexpr int PMZ = 8;
+static constexpr int MPZ = 9;
+static constexpr int PZP = 10;
+static constexpr int MZM = 11;
+static constexpr int PZM = 12;
+static constexpr int MZP = 13;
+static constexpr int ZPP = 14;
+static constexpr int ZMM = 15;
+static constexpr int ZPM = 16;
+static constexpr int ZMP = 17;
+static constexpr int PPP = 18;
+static constexpr int MPP = 19;
+static constexpr int PMP = 20;
+static constexpr int MMP = 21;
+static constexpr int PPM = 22;
+static constexpr int MPM = 23;
+static constexpr int PMM = 24;
+static constexpr int MMM = 25;
+static constexpr int ZZZ = 26;
+
+}
+}
+}
+
+#endif
diff --git a/src/lbm/cuda/CMakeLists.txt b/src/lbm/cuda/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..be16988a480650cbab416652655af9766bcf8ec7
--- /dev/null
+++ b/src/lbm/cuda/CMakeLists.txt
@@ -0,0 +1,12 @@
+project(lbmCuda LANGUAGES CUDA CXX)
+
+
+vf_add_library(NAME lbmCuda BUILDTYPE static PUBLIC_LINK basics FOLDER ../../lbm)
+
+
+set_target_properties(lbmCuda PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
+
+set_source_files_properties(../KernelParameter.cpp PROPERTIES LANGUAGE CUDA)
+
+set_source_files_properties(../CumulantChimera.cpp PROPERTIES LANGUAGE CUDA)
+set_source_files_properties(../BGK.cpp PROPERTIES LANGUAGE CUDA)
\ No newline at end of file